本文轉(zhuǎn)自公眾號,歡迎關(guān)注
基于DWC2的USB驅(qū)動開發(fā)-IAD描述符詳解 (qq.com)
一.前言
IAD描述符用于一個設(shè)備功能關(guān)聯(lián)多個接口,可以用于實現(xiàn)組合設(shè)備。
二.參考文檔
參考《iadclasscode_r10.pdf》
USB Interface Association Descriptor Device Class Code and use Model Revision 1.0 July 23,2003
直接在https://www.usb.org/documents下搜索”USB Interface Association Descriptor Device Class Code”下載


參考《InterfaceAssociationDescriptor_ecn.pdf》
下載地址https://www.usb.org/sites/default/files/iadclasscode_r10.pdf
三.概述
從(USB規(guī)范的)第一天起,關(guān)于是否應(yīng)允許多功能設(shè)備每個邏輯功能使用一個以上接口,一直存在歧義。核心規(guī)范沒有為每個功能含多個接口的情況提供任何特定的框架支持,但幾個設(shè)備工作組(DWG)使用它們定義了設(shè)備類,并使用不同的方法來確定接口應(yīng)如何組織在一起。DWG Common Class組在定義標準方法方面做了大量工作,但定義較晚,從未被采用,最終被停用
最近的USB 2.0 ECN接口關(guān)聯(lián)描述符(IAD)通過在USB設(shè)備框架中定義一種標準方法來解決這個問題,該方法用于描述應(yīng)該綁定到設(shè)備驅(qū)動程序的同一實例的接口(及其金額選設(shè)置)的關(guān)聯(lián)。參考《InterfaceAssociationDescriptor_ecn.pdf》。
當連接到USB軟件不理解IAD的系統(tǒng)時,使用IAD的新設(shè)備存在遺留問題(意味著與設(shè)備驅(qū)動程序的接口級綁定,而不是設(shè)備級綁定)。盡管IAD會被忽略,但由于USB系統(tǒng)軟件無法將接口與驅(qū)動程序正確綁定,設(shè)備可能無法按預期工作。
USB核心團隊已經(jīng)分配了一個設(shè)備級類代碼,該代碼必須包含在使用IAD的設(shè)備實現(xiàn)中。
這提供了在設(shè)備枚舉期間對啟用IAD的設(shè)備的最簡單檢測,這將允許安裝具有正確解析配置和為使能IAD的設(shè)備定位適當?shù)尿?qū)動程序能力的專用功能驅(qū)動程序。
3.1 IAD的來源背景
ECN即USB Engineering Change Notice,USB的工程變更通知。
《InterfaceAssociationDescriptor_ecn.pdf》此ECN定義了一個新的標準描述符和接口編號規(guī)則,允許設(shè)備描述哪一個接口和同一個設(shè)備功能關(guān)聯(lián)。這允許操作系統(tǒng)將所有適當?shù)慕涌诮壎ǖ酵或?qū)動程序?qū)嵗?即多個接口對應(yīng)一個設(shè)備功能。
核心USB框架假設(shè)的基本配置模型是,設(shè)備上的接口和功能之間始終存在1:1的關(guān)聯(lián),即一個接口對應(yīng)一個設(shè)備功能。系統(tǒng)軟件是按照核心規(guī)范的意圖設(shè)計的,并假設(shè)每個功能(和一個接口)有一個驅(qū)動程序(見下圖)

一些設(shè)備類規(guī)范已經(jīng)超過了核心USB規(guī)范框架,并定義了使用多個接口(即多個接口描述符)的設(shè)備功能。支持這一點的模型仍然只需要每個功能一個功能驅(qū)動程序,但也需要多個接口綁定到同一個驅(qū)動程序?qū)嵗ㄒ娤聢D)。不幸的是,沒有標準方法允許設(shè)備通過設(shè)備框架來描述配置中的哪些接口應(yīng)該與相同的功能相關(guān)聯(lián)。

此更改通知定義了設(shè)備框架的必要擴展,允許設(shè)備注釋哪些接口與同一功能相關(guān)。這種設(shè)備框架擴展最終將被用于所有每個設(shè)備功能使用多個接口的設(shè)備。
3.2對軟件的影響
對現(xiàn)有操作系統(tǒng)版本和現(xiàn)有設(shè)備類沒有影響。系統(tǒng)軟件會忽略新的描述符。他們描述的接口不會改變。使用多個接口來管理單個設(shè)備功能的設(shè)備的未來實現(xiàn)必須支持此功能。
操作系統(tǒng)當前不支持的設(shè)備類會對未來/新的設(shè)備實現(xiàn)產(chǎn)生影響。具體來說,如果一個設(shè)備實現(xiàn)包括多個功能單元(每個單元有多個接口),那么該設(shè)備將僅在支持此新描述符的操作系統(tǒng)實現(xiàn)上正確枚舉
為了更容易地增強現(xiàn)有的操作系統(tǒng)實現(xiàn),使其能夠處理使用該描述符的設(shè)備,將分配設(shè)備類代碼,目的是所有使用接口關(guān)聯(lián)描述符的設(shè)備都將在其設(shè)備描述符中使用該類代碼。這將允許輕松安裝一個新的驅(qū)動程序,該驅(qū)動程序知道如何解析和枚舉包括接口關(guān)聯(lián)描述符的配置。IAD的分類代碼將記錄在usb.org網(wǎng)站上。
現(xiàn)有設(shè)備類工作組負責確定是否需要修改其單獨的規(guī)范以使用或利用此新的框架擴展。
3.3合規(guī)性測試影響
最終必須更新標準合規(guī)工具集(USBCV),以檢查這些新描述符的格式(和使用)。
此外,必須為合規(guī)工具建立一些規(guī)則,以確定哪個設(shè)備應(yīng)該使用這些描述符,并因未使用這些描述符而使其失敗。
四.IAD描述符
4.1描述符類型
添加了新的IAD描述符類型11。
以下建議與以前的操作系統(tǒng)向后兼容。它保留了當前的接口定義,并添加了一個新的描述符類型。對于舊的操作系統(tǒng)版本,新的描述符將被忽略,舊的機制將占上風。對于新的操作系統(tǒng)版本,新的描述符將生效。
將以下內(nèi)容添加到USB規(guī)格書2.0表9-6中(注意,核心規(guī)范目前定義的值為1-8。自發(fā)布以來,值9和10的分配如下所述)。
Descriptor Types
|
Value
|
DEVICE
|
1
|
CONFIGURATION
|
2
|
STRING
|
3
|
INTERFACE
|
4
|
ENDPOINT
|
5
|
DEVICE_QUALIFIER
|
6
|
OTHER_SPEED_CONFIGURATION
|
7
|
INTERFACE_POWER
|
8
|
OTG
|
9
|
DEBUG
|
10
|
INTERFACE_ASSOCIATION
|
11
|
USB規(guī)格書2.0中P251中內(nèi)容如下,即添加了類型11的IAD描述符類型。
Table 9-5. Descriptor Types
Descriptor Types
|
Value
|
DEVICE
|
1
|
CONFIGURATION
|
2
|
STRING
|
3
|
INTERFACE
|
4
|
ENDPOINT
|
5
|
DEVICE_QUALIFIER
|
6
|
OTHER_SPEED_CONFIGURATION
|
7
|
INTERFACE_POWER1
|
8
|
4.2IAD描述符內(nèi)容
以下是接口關(guān)聯(lián)描述符的定義。在下一次規(guī)范修訂更新時,應(yīng)將其作為新的第9.6.6節(jié)(將當前第9.6.6章移至第9.6.7章,依此類推)。
接口關(guān)聯(lián)描述符用于描述兩個或多個接口與同一功能相關(guān)聯(lián)?!瓣P(guān)聯(lián)”包括兩個或多個接口及其所有可選設(shè)置接口。
對于需要多個接口的每個設(shè)備功能,設(shè)備必須使用接口關(guān)聯(lián)描述符。
接口關(guān)聯(lián)描述符總是作為GetDescriptor(configuration)請求返回的配置信息的一部分返回。無法使用GetDescriptor()或SetDescriptor()請求直接訪問接口關(guān)聯(lián)描述符。
接口關(guān)聯(lián)描述符必須位于與其關(guān)聯(lián)的接口的接口描述符集(包括所有可選設(shè)置)之前。
關(guān)聯(lián)接口集中的所有接口編號必須是連續(xù)的。
表9-Z顯示了標準接口關(guān)聯(lián)描述符。
接口關(guān)聯(lián)描述符包括函數(shù)類、子類和協(xié)議字段。這些字段中的值可以與任何一個相關(guān)接口的接口類、子類和協(xié)議值相同。
對于現(xiàn)有的設(shè)備類,優(yōu)選的實現(xiàn)是使用關(guān)聯(lián)接口列表中第一個接口的接口類、子類和協(xié)議字段值。
注意:由于此特定功能未包含在早期版本的USB規(guī)范中,因此現(xiàn)有的USB操作系統(tǒng)實現(xiàn)將如何支持使用此描述符的設(shè)備存在問題。強烈建議使用接口關(guān)聯(lián)描述符的設(shè)備實現(xiàn)使用設(shè)備描述符中的多接口功能類代碼。這允許簡單而容易地識別這些設(shè)備,并允許在某些操作系統(tǒng)上安裝升級驅(qū)動程序,該驅(qū)動程序可以解析和枚舉包括接口關(guān)聯(lián)描述符的配置。多接口函數(shù)類代碼記錄在http://www.usb.org/developers/docs網(wǎng)站
Table 9–Z. Standard Interface Association Descriptor
偏移
|
區(qū)域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
Number
|
描述符字節(jié)數(shù).
|
1
|
bDescriptorType
|
1
|
Constant
|
INTERFACE ASSOCIATION 描述符即11.
|
2
|
|
1
|
Number
|
和該功能關(guān)聯(lián)的第一個接口序號
|
3
|
bInterfaceCount
|
1
|
Number
|
和該功能關(guān)聯(lián)的接口個數(shù)
|
4
|
bFunctionClass
|
1
|
Class
|
USB-IF分配的類編碼.
|
5
|
bFunctionSubClass
|
1
|
SubClass
|
USB-IF分配的子類編碼.
|
6
|
bFunctionProtocol
|
1
|
Protocol
|
USB-IF分配的協(xié)議編碼. 這些代碼由bFunctionClass和bFunctionSubClass字段的值限定。
|
7
|
iFunction
|
1
|
Index
|
描述該功能的字符串描述符索引
|
其中bFunctionClass ,bFunctionSubClass,bFunctionProtocol 的值需要根據(jù)具體的設(shè)備類文檔確定
比如UVC參考《UVC 1.5 Class specification.pdf》Universal Serial Bus Device Class Definition for Video Devices Revision 1.5 August 9, 2012 P60
Table 3-1 Standard Video Interface Collection IAD
Offset
|
Field
|
Size
|
Value
|
Description
|
0
|
bLength
|
1
|
Number
|
Size of this descriptor, in bytes: 8
|
1
|
bDescriptorType
|
1
|
Constant
|
INTERFACE ASSOCIATION
|
2
|
bFirstInterface
|
1
|
Number
|
Interface number of the first
|
3
|
bInterfaceCount
|
1
|
Number
|
Number of contiguous VideoStreaming
|
4
|
bFunctionClass
|
1
|
Class
|
CC_VIDEO. Video Interface Class
|
5
|
bFunctionSubClass
|
1
|
SubClass
|
SC_VIDEO_INTERFACE_COLLECT
|
6
|
bFunctionProtocol
|
1
|
Protocol
|
Not used. Must be set to
|
7
|
iFunction
|
1
|
Index
|
Index of a string descriptor that
|
4.3UAC的IAD實例
1. -------------------IADDescriptor--------------------
2.bLength:0x08(8bytes)
3.bDescriptorType:0x0B(InterfaceAssociationDescriptor)
4.bFirstInterface:0x02(Interface2)
5.bInterfaceCount:0x02(2Interfaces)
6.bFunctionClass:0x01(Audio)
7.bFunctionSubClass:0x02(AudioStreaming)
8.bFunctionProtocol:0x00
9.iFunction:0x08(StringDescriptor8)
10.Language0x0409:"usb-audio"
11.Data(HexDump) :080B020201020008 ........
4.4UVC的IAD實例
1. -------------------IADDescriptor--------------------
2.bLength:0x08(8bytes)
3.bDescriptorType:0x0B(InterfaceAssociationDescriptor)
4.bFirstInterface:0x00(Interface0)
5.bInterfaceCount:0x02(2Interfaces)
6.bFunctionClass:0x0E(Video)
7.bFunctionSubClass:0x03(VideoInterfaceCollection)
8.bFunctionProtocol:0x00(PC_PROTOCOL_UNDEFINED)
9.iFunction:0x05(StringDescriptor5)
10.Language0x0409:"usb-webcam"
11.Data(HexDump) :080B00020E030005 ........
4.5CDC的IAD實例
1. -------------------IADDescriptor--------------------
2.bLength:0x08(8bytes)
3.bDescriptorType:0x0B(InterfaceAssociationDescriptor)
4.bFirstInterface:0x04(Interface4)
5.bInterfaceCount:0x02(2Interfaces)
6.bFunctionClass:0x02(CommunicationsandCDCControl)
7.bFunctionSubClass:0x02
8.bFunctionProtocol:0x01
9.iFunction:0x0A(StringDescriptor10)
10.Language0x0409:"usb-com"
11.Data(HexDump) :080B04020202010A ........
五.使用IAD時的設(shè)備描述符
5.1使用IAD時的設(shè)備描述符
使用IAD的設(shè)備必須使用下表中所示的示例設(shè)備描述符中定義的設(shè)備類bDeviceClass、子類bDeviceSubClass和協(xié)議代碼bDeviceProtocol其他的參考USB2.0的規(guī)格書usb_20.pdf的Table 9-8. Standard Device Descriptor。這組類代碼被定義為多接口功能設(shè)備類代碼。
偏移
|
區(qū)域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
Number
|
描述字節(jié)數(shù)
|
1
|
bDescriptorType
|
1
|
Constant
|
見usb_20.pdf的Table 9-8. Standard Device Descriptor
|
2
|
bcdUSB
|
2
|
BCD
|
|
4
|
bDeviceClass
|
1
|
EFH
|
Miscellaneous Device Class
|
5
|
bDeviceSubClass
|
1
|
02H
|
Common Class
|
6
|
bDeviceProtocol
|
1
|
01H
|
Interface Association Descriptor
|
7
|
bMaxPacketSize0
|
1
|
Number
|
見usb_20.pdf的Table 9-8. Standard Device Descriptor
|
8
|
idVendor
|
2
|
ID
|
|
10
|
idProduct
|
2
|
ID
|
|
12
|
bcdDevice
|
2
|
BCD
|
|
14
|
iManufacturer
|
1
|
Index
|
|
15
|
iProduct
|
1
|
Index
|
|
16
|
iSerialNumber
|
1
|
Index
|
|
17
|
bNumConfigurations
|
1
|
Index
|
使用IAD類代碼的示例設(shè)備描述符
5.2使用IAD的設(shè)備描述符實例
1. ----------------------DeviceDescriptor----------------------
2.bLength:0x12(18bytes)
3.bDescriptorType:0x01(DeviceDescriptor)
4.bcdUSB:0x200(USBVersion2.0)
5.bDeviceClass:0xEF(Miscellaneous)
6.bDeviceSubClass:0x02
7.bDeviceProtocol:0x01(IAD-InterfaceAssociationDescriptor)
8.bMaxPacketSize0:0x40(64bytes)
9.idVendor:0x2BC5(Orbbec3DTech.Int'lInc.)
10.idProduct:0x0529
11.bcdDevice:0x0200
12.iManufacturer:0x01(StringDescriptor1)
13.Language0x0409:"webcamvendor"
14.iProduct:0x02(StringDescriptor2)
15.Language0x0409:"webcamproduct"
16.iSerialNumber:0x03(StringDescriptor3)
17.Language0x0409:"00000000"
18.bNumConfigurations:0x01(1Configuration)
19.Data(HexDump) :12010002EF020140C52B290500020102 .......@.+).....
20. 0301 ..
六.IAD使用模型
下圖提供了一個示例,說明在典型的設(shè)備實現(xiàn)中如何使用IAD。
核心USB規(guī)范并沒有指定從GetDescriptor(Configuration)請求返回的描述符集,應(yīng)該如何構(gòu)造的組織(位置關(guān)系)要求。
下圖說明了如何組織這些描述符的推薦布局,以便主機軟件可以輕松地解析它們,并明確地知道,要向每個功能驅(qū)動程序提供哪些描述符。
組織描述符集的一般方法是“按設(shè)備功能”對它們進行分組。這基本上意味著特定設(shè)備功能的所有描述符應(yīng)始終位于“一起”(如圖所示)。
此外,圖中說明了描述符集應(yīng)如何綁定到設(shè)備驅(qū)動程序。需要注意,對于類特定描述符應(yīng)如何與IAD關(guān)聯(lián)進行分組,可能存在特定(附加)要求。這些將在特定的設(shè)備類文檔中指定,比如UVC參考《UVC 1.5 Class specification.pdf》Universal Serial Bus Device Class Definition for Video Devices Revision 1.5 August 9, 2012 P60。
(1)在示例框圖的頂部,多接口功能設(shè)備類(Multi-Interface Function Device Class)設(shè)備,其設(shè)備描述符包括設(shè)備類bDeviceClass、子類bDeviceSubClashh和協(xié)議代碼bDeviceProtocol,他們的值必須分別是0xEF(Misc),0x02(Common Class),0x01(IAD).
(2)接下來是配置描述符集。在高層次上,該特定配置包括三個設(shè)備功能。配置描述符和第一個接口或IAD描述符之間的任何描述符都應(yīng)被視為“全局”,并傳遞給每個功能設(shè)備驅(qū)動程序(見示例)。
(3)第一個功能關(guān)聯(lián)包括兩個接口(包括所有類特定描述符和可選設(shè)置alternate settings)。第二設(shè)備功能是單個接口功能,并且不需要IAD。第三個設(shè)備功能與第一個類似。對于每個設(shè)備功能,系統(tǒng)軟件必須向設(shè)備驅(qū)動程序提供“關(guān)聯(lián)”中的所有描述符以及上述“全局”描述符。
(4)bInterface Count字段中的值必須包括預期集合中的所有接口。例如,假設(shè)一個多接口功能的接口編號為N到M。bFirstInterface字段值為N,bInterface Count的值則為(M-N)+1(因為關(guān)聯(lián)中的所有接口都必須是數(shù)字連續(xù)的,所以算法(M-N)+1總是有效的)。注意,每個接口可以有零個或多個可選設(shè)置alternate settings,但可選設(shè)置不包括在bInterface Count的計算中。
(5)對于使用IAD的設(shè)備功能(如示例中的第一個和第三個功能),USB系統(tǒng)軟件應(yīng)構(gòu)建“硬件標識符”,用于使用設(shè)備描述符中的idVendor和idProduct以及IAD中的bFirstInterface字段定位和加載設(shè)備驅(qū)動程序。此外,系統(tǒng)軟件應(yīng)使用IAD中的類代碼字段(bFunctionClass、bFunctionSubClass、bFunctionProtocol)構(gòu)建“兼容性標識符”。

使用接口關(guān)聯(lián)描述符的示例設(shè)備框圖
七.總結(jié)
1.在一個設(shè)備功能需要關(guān)聯(lián)多個接口時需要使用IAD描述符,比如UVC,UAC, 而一個配置描述符下可以使用多個IAD即實現(xiàn)了組合設(shè)備,比如UVC+UAC_CDC, 使用IAD時此時設(shè)備描述符的設(shè)備類bDeviceClass、子類bDeviceSubClashh和協(xié)議代碼bDeviceProtocol,他們的值必須分別是0xEF(Misc),0x02(Common Class),0x01(IAD)。詳見前面的實例。
2.IAD描述的內(nèi)容參考前面的實例,bFunctionClass ,bFunctionSubClass,bFunctionProtocol 的值需要根據(jù)具體的設(shè)備類文檔確定,可以參考前面的實例。
審核編輯黃宇
-
接口
+關(guān)注
關(guān)注
33文章
8885瀏覽量
152972 -
usb
+關(guān)注
關(guān)注
60文章
8066瀏覽量
269661 -
IAD
+關(guān)注
關(guān)注
0文章
5瀏覽量
9177 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
210
發(fā)布評論請先 登錄
相關(guān)推薦
基于DWC2的USB驅(qū)動開發(fā)-0x01開篇介紹與新思DWC2 USB2.0控制器簡介

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

基于DWC2的USB驅(qū)動開發(fā)-USB復位詳解

基于DWC2的USB驅(qū)動開發(fā)-USB連接詳解

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

基于DWC2的USB驅(qū)動開發(fā)-數(shù)據(jù)不能發(fā)送問題分析案例

基于DWC_ether_qos的以太網(wǎng)驅(qū)動開發(fā)-描述符鏈表介紹

USB描述符詳解
usb標準描述符之技巧
USB HID報告及報告描述符簡介
USB設(shè)備鍵值表描述符說明資料免費下載

USB各描述符之間的依賴是怎么樣的

科普一下什么是USB的描述符
基于DWC_ether_qos的以太網(wǎng)驅(qū)動開發(fā)-描述符格式介紹

評論