0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于DWC2的USB驅(qū)動(dòng)開發(fā)-設(shè)備類驅(qū)動(dòng)框架

嵌入式USB開發(fā) ? 來源:嵌入式USB開發(fā) ? 作者:嵌入式USB開發(fā) ? 2023-07-16 15:56 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開發(fā)-設(shè)備類驅(qū)動(dòng)框架 (qq.com)

一.前言

從軟件頂層,從數(shù)據(jù)流的角度來看USB的通訊,我們可以看到主要有兩類通訊,一類是”控制”相關(guān),一類是”數(shù)據(jù)流”相關(guān),前者一般通過控制端點(diǎn)0進(jìn)行,而后者通過接口綁定的其他端點(diǎn)進(jìn)行。其實(shí)這是一種常用的通訊設(shè)計(jì)范式,不是USB獨(dú)有,我們?cè)谄渌远x應(yīng)用協(xié)議設(shè)計(jì)時(shí)也可以參考。比如ftp協(xié)議,服務(wù)器即使用21命令端口建立連接,其他端口傳輸數(shù)據(jù),所以可以看到一些設(shè)計(jì)哲學(xué)都是相通的。

至于控制和數(shù)據(jù)流其實(shí)都是一個(gè)邏輯上的通道,管道的概念,不一定要物理區(qū)分。比如我們只有一個(gè)串口,可以定義串口幀,通過幀頭的標(biāo)志區(qū)分,就可以虛擬任意個(gè)邏輯管道。類似的USB設(shè)備的端點(diǎn)和主機(jī)的管道也是同樣的概念。

所以我們一定要有頂層思維模式,抽象思維模式,尤其對(duì)于USB復(fù)雜的應(yīng)用層協(xié)議,一定要理清楚其上層邏輯。在驅(qū)動(dòng)編寫時(shí)只有摸清其框架,才能進(jìn)行抽象,才能進(jìn)行驅(qū)動(dòng)程序的編寫。否則一上來就陷入到具體的設(shè)備的具體的協(xié)議內(nèi)容中很快就會(huì)迷失,驅(qū)動(dòng)也會(huì)寫的不具備移植性。畢竟每一個(gè)設(shè)備類的規(guī)格書都有100頁以上,這么多設(shè)備,協(xié)議文檔就多如牛毛,更不用說里面涉及的各種細(xì)節(jié),所以有頂層框架性的理解很重要。比如對(duì)于UAC設(shè)備我們不需要一上來就去關(guān)注音量如何設(shè)置,而是先要了解其所有的屬性的操作是否有一定的框架即共性,是否可以抽象為編程的數(shù)據(jù)結(jié)構(gòu)模型,操作模型。否則雖然能直接根據(jù)手冊(cè),一個(gè)字節(jié)一個(gè)字節(jié)解析,但是結(jié)果是對(duì)于每一個(gè)屬性都要這樣單獨(dú)解析,代碼將不具備通用性,且變得很冗余,不可維護(hù),增加一個(gè)屬性就需要改代碼,這不是驅(qū)動(dòng)的設(shè)計(jì)方式,當(dāng)然一些小型的嵌入式系統(tǒng)沒有驅(qū)動(dòng)層的考慮有可能也會(huì)這么直接做,但是那畢竟是特定應(yīng)用場(chǎng)景上的。

這一篇我們就從框架上,對(duì)我們后面要實(shí)現(xiàn)的設(shè)備協(xié)議棧進(jìn)行整體設(shè)計(jì),主要是考慮好數(shù)據(jù)結(jié)構(gòu),和操作模型,至于細(xì)節(jié)后面邊寫驅(qū)動(dòng),邊調(diào)試設(shè)備,邊修改優(yōu)化。

二.框架設(shè)計(jì)

USB的設(shè)計(jì)初衷就是功能對(duì)應(yīng)接口,即一個(gè)功能對(duì)應(yīng)一個(gè)接口,接口里綁定端點(diǎn),注意這里的端點(diǎn)是抽象概念比如終端和單元這些概念,邏輯上是一樣的。

但是隨著應(yīng)用的復(fù)雜化和功能需求的多元化,后面出現(xiàn)了多功能設(shè)備,比如一個(gè)攝像頭有視頻也有音頻既是攝像頭也是喇叭也可能是麥克風(fēng),那么就需要多個(gè)接口來對(duì)應(yīng)多個(gè)功能,于是UBS規(guī)范添加了IAD接口關(guān)聯(lián)描述符來聚合某個(gè)功能的接口。一個(gè)功能也不限制于一個(gè)接口了,也可能有多個(gè)接口,然后一個(gè)設(shè)備也可以有多個(gè)功能。

即由以下簡(jiǎn)單的拓?fù)浣Y(jié)構(gòu)

圖片

變?yōu)榱艘韵赂鼜?fù)雜的拓?fù)浣Y(jié)構(gòu),多了一層IAD做功能聚合對(duì)應(yīng)一個(gè)功能,而IAD下面也可以有多個(gè)接口,接口下面有多個(gè)端點(diǎn),注意這里的端點(diǎn)是抽象的概念,也可能是比如UVC里的終端和單元等。

圖片

那么看到上述圖形第一個(gè)想到的概念是什么呢,上述圖形就是一個(gè)鏈表結(jié)構(gòu),一層鏈接一層。

我們?cè)O(shè)備類驅(qū)動(dòng)位于哪一層呢,從上可以看到設(shè)備類即對(duì)應(yīng)功能那么就是IAD這一層。

那么我們的設(shè)備類驅(qū)動(dòng)框架就應(yīng)該是上圖改為如下

我們需要

定義驅(qū)動(dòng)層實(shí)例,并提供接口可以綁定類實(shí)例

定義類層實(shí)例,并提供接口可以綁定接口實(shí)例

定義接口層實(shí)例,并提供接口可以綁定端口實(shí)例

定義端口實(shí)例,并提供接口可以綁定屬性實(shí)例

定義屬性實(shí)例,比如音量設(shè)置對(duì)應(yīng)的CS,數(shù)據(jù)長(zhǎng)度,操作類似是GET還是SET,SET GET回調(diào)等
圖片

至此恭喜你已經(jīng)完成設(shè)備驅(qū)動(dòng)框架的設(shè)計(jì),看起來是多么的簡(jiǎn)單簡(jiǎn)潔,這就是抽象的威力,了解USB協(xié)議頂層邏輯很容易就抽象出該框架,并沒有復(fù)雜的思想和邏輯,也不需要使用復(fù)雜的技術(shù),要說到技術(shù)那么上面使用一個(gè)單向鏈表足矣。

三.數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

上面我們對(duì)框架進(jìn)行了設(shè)計(jì),也就是房屋的框架設(shè)計(jì)階段完成了,現(xiàn)在去構(gòu)建各個(gè)構(gòu)建了,比如類模型就可以對(duì)應(yīng)各個(gè)功能區(qū)怎么設(shè)計(jì),比如地下室,停車場(chǎng)怎么設(shè)計(jì),

接口模型則對(duì)應(yīng)具體的功能區(qū)內(nèi)的各個(gè)模塊的設(shè)計(jì),比如停車場(chǎng)如何設(shè)計(jì)自動(dòng)閘門,如何設(shè)計(jì)車位布局,端點(diǎn)模型就對(duì)應(yīng)具體車位的設(shè)計(jì)了,比如車位大小,標(biāo)志,附屬充電樁,編號(hào)等。

每個(gè)模型對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)的屬性和行為可能不同,但是有一點(diǎn)相同即都是通過單向鏈表連接同層實(shí)例,并且指向下一層鏈表。

比如對(duì)應(yīng)接口的設(shè)計(jì)

具體設(shè)計(jì)這里就不再講了,每個(gè)人自行設(shè)計(jì)時(shí)考慮,可以后面邊寫驅(qū)動(dòng)邊完善,但是可以肯定的是一定包括以下幾個(gè)元素:

屬性部分

行為部分

指向下一個(gè)同層實(shí)例的指針

指向下一層實(shí)例的鏈表頭指針

比如如下對(duì)于設(shè)備類數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),即包含了上述4部分

/**


* struct usbd_dev_class


* 設(shè)備類節(jié)點(diǎn)


*/


typedef struct usbd_dev_class {


  /* 屬性部分 */


  uint8_t id;                            


  char* name;


  /* 行為部分 */


  void (*init)(void *dwc);


  void (*deinit)(void *dwc);


  void (*setup)(void *dwc, ureq_t setup);


  void (*setitf)(void *dwc, ureq_t setup);


  /* 同級(jí)鏈接 */


  struct usbd_dev_class* next;


  /* 下一層鏈接 */


  itf_t *itf_list;


} usbd_dev_class;

四.總結(jié)

以上進(jìn)行了設(shè)備類驅(qū)動(dòng)框架性的設(shè)計(jì),我們遵循自頂向下的設(shè)計(jì)思路,先設(shè)計(jì)框架,=然后再填充框架,當(dāng)然框架不可能一開始設(shè)計(jì)的就合理,我們后續(xù)實(shí)際調(diào)試具體的設(shè)備時(shí)可能發(fā)現(xiàn)需要修改,我們迭代即可,但是現(xiàn)在開始就需要考慮可擴(kuò)展性,以便將來迭代擴(kuò)展。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7773

    瀏覽量

    262385
  • 驅(qū)動(dòng)開發(fā)

    關(guān)注

    0

    文章

    130

    瀏覽量

    12036
  • 驅(qū)動(dòng)框架
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    4016
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    110
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x01開篇介紹與新思DWC2 USB2.0控制器簡(jiǎn)介

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-0x01開篇介紹與新思DWC2 USB2
    的頭像 發(fā)表于 05-08 18:10 ?4178次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-0x01開篇介紹與新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器簡(jiǎn)介

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x02 DWC2 USB2.0 IP功能特征介紹

    DWC2即新思(Synopsys )的DesignWare? Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。從linux的內(nèi)核源碼驅(qū)動(dòng)中就帶
    的頭像 發(fā)表于 05-09 10:09 ?8323次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介紹

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x0C 驅(qū)動(dòng)框架設(shè)計(jì)

    以上從整體上設(shè)計(jì)了整個(gè)的驅(qū)動(dòng)框架,重點(diǎn)考慮可移植性,可維護(hù)性等原則,借鑒面向?qū)ο蟮囊恍┰O(shè)計(jì)思想和原則。同時(shí)提供了一些調(diào)試方案供參考。前面磨刀已經(jīng)磨了很久了,后面我們就開始正式進(jìn)入編程階段了。
    的頭像 發(fā)表于 06-05 17:15 ?1536次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-0x0C <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>框架</b>設(shè)計(jì)

    基于DWC2USB驅(qū)動(dòng)開發(fā)-IAD描述符詳解

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-IAD描述符詳解 (qq.com) 一.? 前言 IAD描述符用于一個(gè)設(shè)備功能關(guān)聯(lián)多
    的頭像 發(fā)表于 06-27 08:45 ?4.8w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-IAD描述符詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-USB復(fù)位詳解

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB復(fù)位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們?cè)敿?xì)介紹了
    的頭像 發(fā)表于 07-07 11:18 ?4.1w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>USB</b>復(fù)位詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-USB連接詳解

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB連接詳解 (qq.com) 一.前言 ? 之前一直在閱讀手冊(cè),規(guī)格書,練習(xí)招式
    的頭像 發(fā)表于 07-07 08:46 ?3229次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>USB</b>連接詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-高速設(shè)備枚舉為全速設(shè)備問題案例分析

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-高速設(shè)備枚舉為全速設(shè)備問題案例分析 (q
    的頭像 發(fā)表于 07-10 17:12 ?1160次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-高速<b class='flag-5'>設(shè)備</b>枚舉為全速<b class='flag-5'>設(shè)備</b>問題案例分析

    基于DWC2USB驅(qū)動(dòng)開發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解 (qq.com) 前言 如下寄存器DIEPxxx,對(duì)應(yīng)IN端點(diǎn),和發(fā)送數(shù)據(jù)相關(guān),這一篇先介紹和
    的頭像 發(fā)表于 07-16 16:42 ?1406次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-發(fā)送相關(guān)的寄存器DMA寄存器詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-USB包詳解

    不管什么通訊協(xié)議,比如UART,SPI,USB等等,不管是并口還是串口,不管是同步還是異步,我們從抽象的角度去看,其本質(zhì)都是一樣的。都是先定義物理信號(hào),物理信號(hào)可能是差分,單端,電流驅(qū)動(dòng)電壓驅(qū)動(dòng)等等
    的頭像 發(fā)表于 07-23 17:11 ?2185次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>USB</b>包詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-控制傳輸中斷相關(guān)寄存器

    本篇講解Scatter/Gather DMA模式下控制傳輸相關(guān)的寄存器??刂苽鬏斒?b class='flag-5'>USB驅(qū)動(dòng)的核心部分,控制傳輸調(diào)通了驅(qū)動(dòng)就完成了一大半,而驅(qū)動(dòng)的核心又是中斷的處理。
    的頭像 發(fā)表于 07-24 00:07 ?2073次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-控制傳輸中斷相關(guān)寄存器

    基于DWC2USB驅(qū)動(dòng)開發(fā)-數(shù)據(jù)不能發(fā)送問題分析案例

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-數(shù)據(jù)不能發(fā)送問題分析案例 (qq.com) ? 一.前言 ? ? ? ?對(duì)于驅(qū)動(dòng)
    的頭像 發(fā)表于 08-08 09:43 ?1808次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-數(shù)據(jù)不能發(fā)送問題分析案例

    如何對(duì)基于hal庫(kù)的DWC2 USB IP進(jìn)行調(diào)試呢

    背景之前適配 DWC2 USB IP 的時(shí)候,主要是基于 st 的 hal 庫(kù)來走的,當(dāng)時(shí)我就對(duì)他們的 hal 庫(kù)代碼不滿,只是無奈,迫于時(shí)間就沒重構(gòu),果不其然,usb bug 一堆,隨意舉例,這還
    發(fā)表于 06-14 15:23

    USB設(shè)備驅(qū)動(dòng)的詳細(xì)資料概述

    介紹USB設(shè)備在WDM中的開發(fā)框架。由于操作系統(tǒng)的USB總線驅(qū)動(dòng)程序提供了豐富的功能調(diào)用,因此
    發(fā)表于 05-07 18:20 ?9次下載
    <b class='flag-5'>USB</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的詳細(xì)資料概述

    HDF驅(qū)動(dòng)框架USB DDK的解析與開發(fā)指導(dǎo)

    HDF(Hardware Driver Foundation)驅(qū)動(dòng)框架是HarmonyOS硬件生態(tài)開放的基礎(chǔ),為開發(fā)者提供了驅(qū)動(dòng)加載、驅(qū)動(dòng)
    的頭像 發(fā)表于 03-30 10:16 ?2018次閱讀

    基于DWC2USB驅(qū)動(dòng)開發(fā)-抽絲剝繭再論切換到狀態(tài)階段標(biāo)志DOEPINTn.StsPhseRcvd

    本文轉(zhuǎn)自公眾號(hào)系列文章,歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB包詳解 (qq.com) 一.前言 前面我們對(duì)SETUP完成標(biāo)志DOE
    的頭像 發(fā)表于 07-24 18:04 ?1233次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-抽絲剝繭再論切換到狀態(tài)階段標(biāo)志DOEPINTn.StsPhseRcvd