<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于DWC2的USB驅動開發-設備類驅動框架

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

本文轉自公眾號,歡迎關注
基于DWC2的USB驅動開發-設備類驅動框架 (qq.com)

一.前言

從軟件頂層,從數據流的角度來看USB的通訊,我們可以看到主要有兩類通訊,一類是”控制”相關,一類是”數據流”相關,前者一般通過控制端點0進行,而后者通過接口綁定的其他端點進行。其實這是一種常用的通訊設計范式,不是USB獨有,我們在其他自定義應用協議設計時也可以參考。比如ftp協議,服務器即使用21命令端口建立連接,其他端口傳輸數據,所以可以看到一些設計哲學都是相通的。

至于控制和數據流其實都是一個邏輯上的通道,管道的概念,不一定要物理區分。比如我們只有一個串口,可以定義串口幀,通過幀頭的標志區分,就可以虛擬任意個邏輯管道。類似的USB設備的端點和主機的管道也是同樣的概念。

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

這一篇我們就從框架上,對我們后面要實現的設備協議棧進行整體設計,主要是考慮好數據結構,和操作模型,至于細節后面邊寫驅動,邊調試設備,邊修改優化。

二.框架設計

USB的設計初衷就是功能對應接口,即一個功能對應一個接口,接口里綁定端點,注意這里的端點是抽象概念比如終端和單元這些概念,邏輯上是一樣的。

但是隨著應用的復雜化和功能需求的多元化,后面出現了多功能設備,比如一個攝像頭有視頻也有音頻既是攝像頭也是喇叭也可能是麥克風,那么就需要多個接口來對應多個功能,于是UBS規范添加了IAD接口關聯描述符來聚合某個功能的接口。一個功能也不限制于一個接口了,也可能有多個接口,然后一個設備也可以有多個功能。

即由以下簡單的拓撲結構

圖片

變為了以下更復雜的拓撲結構,多了一層IAD做功能聚合對應一個功能,而IAD下面也可以有多個接口,接口下面有多個端點,注意這里的端點是抽象的概念,也可能是比如UVC里的終端和單元等。

圖片

那么看到上述圖形第一個想到的概念是什么呢,上述圖形就是一個鏈表結構,一層鏈接一層。

我們設備類驅動位于哪一層呢,從上可以看到設備類即對應功能那么就是IAD這一層。

那么我們的設備類驅動框架就應該是上圖改為如下

我們需要

定義驅動層實例,并提供接口可以綁定類實例

定義類層實例,并提供接口可以綁定接口實例

定義接口層實例,并提供接口可以綁定端口實例

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

定義屬性實例,比如音量設置對應的CS,數據長度,操作類似是GET還是SET,SET GET回調等
圖片

至此恭喜你已經完成設備驅動框架的設計,看起來是多么的簡單簡潔,這就是抽象的威力,了解USB協議頂層邏輯很容易就抽象出該框架,并沒有復雜的思想和邏輯,也不需要使用復雜的技術,要說到技術那么上面使用一個單向鏈表足矣。

三.數據結構設計

上面我們對框架進行了設計,也就是房屋的框架設計階段完成了,現在去構建各個構建了,比如類模型就可以對應各個功能區怎么設計,比如地下室,停車場怎么設計,

接口模型則對應具體的功能區內的各個模塊的設計,比如停車場如何設計自動閘門,如何設計車位布局,端點模型就對應具體車位的設計了,比如車位大小,標志,附屬充電樁,編號等。

每個模型對應的數據結構的屬性和行為可能不同,但是有一點相同即都是通過單向鏈表連接同層實例,并且指向下一層鏈表。

比如對應接口的設計

具體設計這里就不再講了,每個人自行設計時考慮,可以后面邊寫驅動邊完善,但是可以肯定的是一定包括以下幾個元素:

屬性部分

行為部分

指向下一個同層實例的指針

指向下一層實例的鏈表頭指針

比如如下對于設備類數據結構的設計,即包含了上述4部分

/**


* struct usbd_dev_class


* 設備類節點


*/


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);


  /* 同級鏈接 */


  struct usbd_dev_class* next;


  /* 下一層鏈接 */


  itf_t *itf_list;


} usbd_dev_class;

四.總結

以上進行了設備類驅動框架性的設計,我們遵循自頂向下的設計思路,先設計框架,=然后再填充框架,當然框架不可能一開始設計的就合理,我們后續實際調試具體的設備時可能發現需要修改,我們迭代即可,但是現在開始就需要考慮可擴展性,以便將來迭代擴展。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    59

    文章

    7508

    瀏覽量

    259767
  • 驅動開發
    +關注

    關注

    0

    文章

    129

    瀏覽量

    12021
  • 驅動框架
    +關注

    關注

    0

    文章

    14

    瀏覽量

    4011
  • DWC2
    +關注

    關注

    0

    文章

    35

    瀏覽量

    105
收藏 人收藏

    評論

    相關推薦

    基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2.0控制器簡介

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2
    的頭像 發表于 05-08 18:10 ?3466次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x01開篇介紹與新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器簡介

    基于DWC2USB驅動開發-0x02 DWC2 USB2.0 IP功能特征介紹

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

    基于DWC2USB驅動開發-0x0C 驅動框架設計

    以上從整體上設計了整個的驅動框架,重點考慮可移植性,可維護性等原則,借鑒面向對象的一些設計思想和原則。同時提供了一些調試方案供參考。前面磨刀已經磨了很久了,后面我們就開始正式進入編程階段了。
    的頭像 發表于 06-05 17:15 ?1118次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x0C <b class='flag-5'>驅動</b><b class='flag-5'>框架</b>設計

    基于DWC2USB驅動開發-IAD描述符詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-IAD描述符詳解 (qq.com) 一.? 前言 IAD描述符用于一個設備功能關聯多
    的頭像 發表于 06-27 08:45 ?4w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-IAD描述符詳解

    基于DWC2USB驅動開發-USB復位詳解

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-USB復位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們詳細介紹了
    的頭像 發表于 07-07 11:18 ?1.8w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>復位詳解

    基于DWC2USB驅動開發-USB連接詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-USB連接詳解 (qq.com) 一.前言 ? 之前一直在閱讀手冊,規格書,練習招式
    的頭像 發表于 07-07 08:46 ?2571次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>連接詳解

    基于DWC2USB驅動開發-高速設備枚舉為全速設備問題案例分析

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-高速設備枚舉為全速設備問題案例分析 (q
    的頭像 發表于 07-10 17:12 ?925次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-高速<b class='flag-5'>設備</b>枚舉為全速<b class='flag-5'>設備</b>問題案例分析

    基于DWC2USB驅動開發-發送相關的寄存器DMA寄存器詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-發送相關的寄存器DMA寄存器詳解 (qq.com) 前言 如下寄存器DIEPxxx,對應IN端點,和發送數據相關,這一篇先介紹和
    的頭像 發表于 07-16 16:42 ?1043次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-發送相關的寄存器DMA寄存器詳解

    基于DWC2USB驅動開發-USB包詳解

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

    基于DWC2USB驅動開發-數據不能發送問題分析案例

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-數據不能發送問題分析案例 (qq.com) ? 一.前言 ? ? ? ?對于驅動
    的頭像 發表于 08-08 09:43 ?1314次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-數據不能發送問題分析案例

    RK3399平臺上USB控制器和PHY的連接方式和配置說明

    。USB2.0 OTG對應的控制器是DWC2。USB2.0 OTG使用的是Synopsys 方案,即使用DWC2控制器同時實現Host和Device功能,
    發表于 05-12 17:46

    如何對基于hal庫的DWC2 USB IP進行調試呢

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

    《Linux設備驅動開發詳解》第20章、USB主機與設備驅動

    《Linux設備驅動開發詳解》第20章、USB主機與設備驅動
    發表于 10-27 11:04 ?8次下載
    《Linux<b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>詳解》第20章、<b class='flag-5'>USB</b>主機與<b class='flag-5'>設備</b><b class='flag-5'>驅動</b>

    USB設備驅動的詳細資料概述

    介紹USB設備在WDM中的開發框架。由于操作系統的USB總線驅動程序提供了豐富的功能調用,因此
    發表于 05-07 18:20 ?9次下載
    <b class='flag-5'>USB</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>的詳細資料概述

    基于DWC2USB驅動開發-抽絲剝繭再論切換到狀態階段標志DOEPINTn.StsPhseRcvd

    本文轉自公眾號系列文章,歡迎關注 基于DWC2USB驅動開發-USB包詳解 (qq.com) 一.前言 前面我們對SETUP完成標志DOE
    的頭像 發表于 07-24 18:04 ?954次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-抽絲剝繭再論切換到狀態階段標志DOEPINTn.StsPhseRcvd
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>