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

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

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

科普一下什么是USB的描述符

單片機匠人 ? 來源:單片機匠人 ? 作者: 黃忠老師 ? 2021-12-02 14:41 ? 次閱讀

USB只是一個總線,只提供一個數(shù)據(jù)通路而已。USB總線驅(qū)動程序并不知道一個設(shè)備具體如何操作,有哪些行為。具體的一個設(shè)備實現(xiàn)什么功能,要由設(shè)備自己來決定。那么,USB主機是如何知道一個設(shè)備的功能以及行為呢?這就要通過描述符來實現(xiàn)了。那么什么是USB的描述符呢?其實就是一些傳遞的協(xié)議信息,比如設(shè)備的類型、廠商ID、產(chǎn)品ID、端點情況、版本號等信息。

既然描述符是協(xié)議信息,那么不同的版本也會有所不同,比如USB1.1協(xié)議定義的標準描述符有設(shè)備描述符、配置描述符、接口描述符、端點描述符、字符串描述符、類特殊描述符以及廠商自定義的描述符。那么USB2.0協(xié)議中又增加了兩個新的標準描述符有設(shè)備限定符描述符和其他速度配置描述符。隨著USB協(xié)議版本的提升,大家知道都是為了提升速度和可靠度,讓用戶有更快更高效的體驗。那么USB1.1是全速設(shè)備,現(xiàn)在我們一起看下USB1.1協(xié)議定義的描述符吧。

一個USB設(shè)備只有一個設(shè)備描述符。設(shè)備描述符里決定了該設(shè)備有多少種配置,每種配置都有一個配置描述符;而在每個配置描述符中又決定了該配置里有多少個接口,每個接口都有一個接口描述符;在接口描述符里又定義了該接口有多少個端點,每個端點都有一個端點描述符;端點描述符定義了端點的大小、類型等。

如果有類特殊描述符,它跟在相應(yīng)的接口描述符之后。由此可以看出,USB的描述符之間的關(guān)系是一層一層的,最上一層是設(shè)備描述符,接下來是配置描述符,再下來是接口描述符,最下面是端點描述符。在主機獲取描述符時,首先獲取設(shè)備描述符,接著再獲取配置描述符,然后根據(jù)配置描述符中的配置集合的總長度,一次將配置描述符、接口描述符、類特殊描述符(如果有)、端點描述符一次讀回。對于字符串描述符,是單獨獲取的。主機通過發(fā)送獲取字符串描述符的請求以及描述符的索引號、語言ID來獲取對應(yīng)的字符串描述符。

l 設(shè)備描述符主要記錄的信息有:設(shè)備所使用的USB協(xié)議版本號、設(shè)備類型、端點0的最大包大小、廠商ID(VID)和產(chǎn)品ID(PID)、設(shè)備版本號、廠商字符串索引、產(chǎn)品字符串索引、設(shè)備序列號索引、可能的配置數(shù)等。

l 配置描述符主要記錄的信息有:配置所包含的接口數(shù)、配置的編號、供電方式、是否支持遠程喚醒、電流需求量等。

l 接口描述符主要記錄的信息有:接口的編號、接口的端點數(shù)、接口所使用的類、子類、協(xié)議等。

l 端點描述符主要記錄的信息有:端點號及方向、端點的傳輸類型、最大包長度、查尋時間間隔等。

l 字符串描述符主要是提供一些方便人們閱讀的信息,它不是必需的。

說了半天,也許你還沒搞清楚到底設(shè)備、配置、接口、端點等這些是什么東西。不要急,這些東西的確是有點暈人。特別是剛接觸時,這么多的內(nèi)容很容易讓人搞混,或者似乎是懂了,然后再想想,似乎又沒懂……這些所說的設(shè)備,就是一個實實在在的USB設(shè)備,例如一個USB鼠標。設(shè)備有一個設(shè)備地址,USB主機依靠這個設(shè)備地址來訪問設(shè)備。而在設(shè)備內(nèi)部還會分的更細。

它會分出一些端點出來,例如端點0、端點1等。就是說,如果USB主機要和USB設(shè)備通信,光有設(shè)備地址是不夠的,還需要一個端點地址。有了設(shè)備地址和端點地址,就能準確地對端點發(fā)送和讀取數(shù)據(jù)了。好比你要去找8號教學(xué)樓的605教室,8號樓就是設(shè)備地址,而605教室就是端點地址。而配置和接口,是為了更方便地管理端點而抽象出來的概念。一個設(shè)備可以有多個配置,但是同一時刻只能有一個配置有效。每個配置下又可以有多個接口。當我們需要不同的功能時,只要選擇不同的配置即可。

拿剛才的教學(xué)樓來說,我們可以把它分成兩個配置:平時上課用和考試用??荚囉脮r,全部的教室都拿來作考場(即該配置下只有一個接口,接口下有很多端點---教室);而平時上課用時,分成兩類(即該配置下有兩個接口,每個接口下有一些端點---教室):教師休息室和上課的課室。教師休息室和課室是不能共用的(這在USB中也是如此,同一個端點號不能出現(xiàn)在同一個配置下的兩個或者更多個不同的接口中)。但是平時用來做課室或者休息室的教室,考試時都可以拿來作考場(這在USB中也是如此,同一個端點號可用在不同的配置中)。

具有多個接口并由接口來實現(xiàn)功能的設(shè)備把它叫做USB復(fù)合設(shè)備,例如一個USB音頻設(shè)備,它具有一個音頻控制接口,另外還可能具有一到多個音頻流或MIDI流接口。在主機端會把USB復(fù)合設(shè)備的每個接口當作一個功能設(shè)備來看待。像常見的USB鼠標、U盤等,通常是單一的設(shè)備,即一個設(shè)備下只有一個配置描述符、一個接口描述符。

總結(jié)一下:由端點構(gòu)成一個接口(或者反過來說,接口是端點的集合),由接口又構(gòu)成一個配置(反過來說,配置是接口的集合),再由配置構(gòu)成一個設(shè)備(設(shè)備是配置的集合)。學(xué)習(xí)USB,一定要把這些關(guān)系理清楚了,才能按照需要構(gòu)造出一個合格的USB設(shè)備。如果一個設(shè)備的各種描述符成功返回了,那么可以說已經(jīng)成功了大半。相反,只要描述符出現(xiàn)一點問題,哪怕只是一個bit的錯誤,都可能造成設(shè)備無法識別或者無法正常工作。

編輯:jq

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

    關(guān)注

    60

    文章

    7947

    瀏覽量

    264795
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6034

    瀏覽量

    136037
  • MIDI
    +關(guān)注

    關(guān)注

    0

    文章

    75

    瀏覽量

    15663

原文標題:什么是USB的描述符?

文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    esp32-s2-soala-v1.2如何獲取攝像頭描述符

    descriptors from PC side,eg. run `lsusb -v` in linux, 請問我該如何獲得所需usb描述符?
    發(fā)表于 06-27 06:48

    二維PDMA可以使用描述符鏈嗎?

    我正在嘗試使用二維描述符連鎖。 編寫了些二維描述符鏈的代碼。 但我有些疑問,比如 1.二維 PDMA 可以使用描述符鏈嗎? 2.如果
    發(fā)表于 05-31 08:16

    制作了usb小pcb,在pc上總是顯示請求usb設(shè)備描述符失敗,為什么?

    我按照cyusb3-kit003電路圖 自己制作了usb小pcb但是在pc上總是顯示請求usb設(shè)備描述符失敗,我測量了所有供電以及配置管腳都是正確的。
    發(fā)表于 05-29 07:46

    FX3無法設(shè)置最小/最大比特率描述符值,為什么?

    我正試圖通過 FX3 以 5200*3900 分辨率、15fps 的速度從我的 fpga 傳輸視頻數(shù)據(jù)流,但無法設(shè)置最小/最大比特率描述符值,因為描述符大小只有 32 位。 描述符的預(yù)期值應(yīng)該是
    發(fā)表于 05-21 06:36

    STM32 USB的字符串描述符不能顯示是哪里的問題?

    最近用STM32做了USB 的HID類設(shè)備,設(shè)備描述符中有指定廠商字符串索引、產(chǎn)品字符串索引、序列號索引。在獲取字符串的代碼部分也發(fā)現(xiàn)確實執(zhí)行了,但是插上電腦后卻沒有我想要的字符串,有哪位高手能指點
    發(fā)表于 04-30 08:13

    STM32CUBEMX配置生成的個HID設(shè)備,電腦提示設(shè)備描述符請求失敗,為什么?

    如題,win10。 用最新的 STM32CUBEMX 配置生成的 個HID設(shè)備編譯正常。時鐘48MHz 也正常 電腦提示 設(shè)備描述符請求失敗 有沒有遇到類似問題的朋友?
    發(fā)表于 04-10 06:05

    STM32F103在官方USB的MSC程序基礎(chǔ)上修改為CDC+MSC的組合設(shè)備,出現(xiàn)設(shè)備描述符請求失敗的原因?

    STM32F103在官方USB的MSC程序基礎(chǔ)上修改為CDC+MSC的組合設(shè)備,出現(xiàn)設(shè)備描述符請求失敗問題;抓包發(fā)現(xiàn)PC主機配置描述符數(shù)據(jù)和設(shè)置的數(shù)據(jù)不
    發(fā)表于 04-07 06:34

    CDC+MSC設(shè)備連接不了PC,顯示設(shè)備描述符請求失敗的原因?

    USB組合設(shè)備:CDC+MSC,設(shè)備連接不了PC,顯示設(shè)備描述符請求失?。挥镁W(wǎng)上其它成功的例程測試,不是該情況就是只能使用U盤無法用虛擬串口,請問這是什么問題呢
    發(fā)表于 04-03 06:44

    USB OTG發(fā)送設(shè)備描述符失敗是什么原因呢?

    能收到SETUP包,并解析數(shù)據(jù)跑到發(fā)送設(shè)備描述符,給FIFO寫數(shù)據(jù)也正確,但波形上就發(fā)了個數(shù)據(jù)出去,這會是什么原因呢?
    發(fā)表于 03-11 06:29

    CYUSB3014設(shè)備描述符路變成2路,windows不識別是怎么解決?

    使用CyUSB3014+WM8960(音頻Codec),來實現(xiàn)USB聲卡的功能,通過修改的USB設(shè)備描述符, 變成兩路音頻,發(fā)現(xiàn)windows不識別。之前的1路是沒問題。(見附件one channel and two chann
    發(fā)表于 02-28 07:38

    為FX3應(yīng)用程序?qū)崿F(xiàn)可變USB配置描述符,開始編譯程序時報錯怎么解決?

    我正在嘗試為我的 FX3 應(yīng)用程序?qū)崿F(xiàn)可變 USB 配置描述符,以允許在不同條件包含不同的功能。 為此,我創(chuàng)建了個 uint8_t 指針并使用 malloc 分配正確的內(nèi)存量,然后
    發(fā)表于 02-26 06:58

    CYUSB3KIT-003開發(fā)板cyfxusbuart例程,配置描述符無效枚舉失敗的原因?

    系統(tǒng):win11 驅(qū)動已正常安裝,出廠默認例程在I2C啟動及USB啟動均可正常運行。 選擇USB啟動,下載cyfxusbuart固件后,設(shè)備管理器顯示配置描述符無效。 請問是否為驅(qū)
    發(fā)表于 02-23 06:02

    USB字符串描述符里面的序列號字符串到底是什么東西?

    在設(shè)備描述符里面,有個表示序列號字符串描述符的編號,請問這個序列號字符串的描述符是什么東西呢? 廠商字符串和設(shè)備字符串都能理解,而且在電腦的“設(shè)備與打印機”里面都找到了。但請問這個
    發(fā)表于 01-24 08:06

    在Win,如何獲取對應(yīng)插入的USB設(shè)備描述符呢?

    各位大佬,請問在Win,如何獲取對應(yīng)插入的USB設(shè)備描述符呢?
    發(fā)表于 01-24 07:33

    請問SPI DMA描述符列表如何單次觸發(fā)?

    },{ SpiTxDesptr[0], X, X,X,X}}; 其中X代表些配置信息。 請問如何數(shù)據(jù)流可實現(xiàn),單次觸發(fā)SPIDMA描述符個元素,手動觸發(fā)三次 不斷手動輪詢實現(xiàn)。 即 手動
    發(fā)表于 01-12 08:07