基于DWC2的USB驱动开发-IAD描述符详解 (qq.com)
IAD描述符用于一个设备功能关联多个接口,可以用于实现组合设备。
参考《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规范的)第一天起,关于是否应允许多功能设备每个逻辑功能使用一个以上接口,一直存在歧义。核心规范没有为每个功能含多个接口的情况提供任何特定的框架支持,但几个设备工作组(DWG)使用它们定义了设备类,并使用不同的方法来确定接口应如何组织在一起。DWG Common Class组在定义标准方法方面做了大量工作,但定义较晚,从未被采用,最终被停用
最近的USB 2.0 ECN接口关联描述符(IAD)通过在USB设备框架中定义一种标准方法来解决这个问题,该方法用于描述应该绑定到设备驱动程序的同一实例的接口(及其金额选设置)的关联。参考《InterfaceAssociationDescriptor_ecn.pdf》。
当连接到USB软件不理解IAD的系统时,使用IAD的新设备存在遗留问题(意味着与设备驱动程序的接口级绑定,而不是设备级绑定)。尽管IAD会被忽略,但由于USB系统软件无法将接口与驱动程序正确绑定,设备可能无法按预期工作。
USB核心团队已经分配了一个设备级类代码,该代码必须包含在使用IAD的设备实现中。
这提供了在设备枚举期间对启用IAD的设备的最简单检测,这将允许安装具有正确解析配置和为使能IAD的设备定位适当的驱动程序能力的专用功能驱动程序。
ECN即USB Engineering Change Notice,USB的工程变更通知。
《InterfaceAssociationDescriptor_ecn.pdf》此ECN定义了一个新的标准描述符和接口编号规则,允许设备描述哪一个接口和同一个设备功能关联。这允许操作系统将所有适当的接口绑定到同一驱动程序实例,即多个接口对应一个设备功能。
核心USB框架假设的基本配置模型是,设备上的接口和功能之间始终存在1:1的关联,即一个接口对应一个设备功能。系统软件是按照核心规范的意图设计的,并假设每个功能(和一个接口)有一个驱动程序(见下图)
一些设备类规范已经超过了核心USB规范框架,并定义了使用多个接口(即多个接口描述符)的设备功能。支持这一点的模型仍然只需要每个功能一个功能驱动程序,但也需要多个接口绑定到同一个驱动程序实例(见下图)。不幸的是,没有标准方法允许设备通过设备框架来描述配置中的哪些接口应该与相同的功能相关联。
此更改通知定义了设备框架的必要扩展,允许设备注释哪些接口与同一功能相关。这种设备框架扩展最终将被用于所有每个设备功能使用多个接口的设备。
对现有操作系统版本和现有设备类没有影响。系统软件会忽略新的描述符。他们描述的接口不会改变。使用多个接口来管理单个设备功能的设备的未来实现必须支持此功能。
操作系统当前不支持的设备类会对未来/新的设备实现产生影响。具体来说,如果一个设备实现包括多个功能单元(每个单元有多个接口),那么该设备将仅在支持此新描述符的操作系统实现上正确枚举
为了更容易地增强现有的操作系统实现,使其能够处理使用该描述符的设备,将分配设备类代码,目的是所有使用接口关联描述符的设备都将在其设备描述符中使用该类代码。这将允许轻松安装一个新的驱动程序,该驱动程序知道如何解析和枚举包括接口关联描述符的配置。IAD的分类代码将记录在usb.org网站上。
现有设备类工作组负责确定是否需要修改其单独的规范以使用或利用此新的框架扩展。
最终必须更新标准合规工具集(USBCV),以检查这些新描述符的格式(和使用)。
此外,必须为合规工具建立一些规则,以确定哪个设备应该使用这些描述符,并因未使用这些描述符而使其失败。
添加了新的IAD描述符类型11。
以下建议与以前的操作系统向后兼容。它保留了当前的接口定义,并添加了一个新的描述符类型。对于旧的操作系统版本,新的描述符将被忽略,旧的机制将占上风。对于新的操作系统版本,新的描述符将生效。
将以下内容添加到USB规格书2.0表9-6中(注意,核心规范目前定义的值为1-8。自发布以来,值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规格书2.0中P251中内容如下,即添加了类型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
|
以下是接口关联描述符的定义。在下一次规范修订更新时,应将其作为新的第9.6.6节(将当前第9.6.6章移至第9.6.7章,依此类推)。
接口关联描述符用于描述两个或多个接口与同一功能相关联。“关联”包括两个或多个接口及其所有可选设置接口。
对于需要多个接口的每个设备功能,设备必须使用接口关联描述符。
接口关联描述符总是作为GetDescriptor(configuration)请求返回的配置信息的一部分返回。无法使用GetDescriptor()或SetDescriptor()请求直接访问接口关联描述符。
接口关联描述符必须位于与其关联的接口的接口描述符集(包括所有可选设置)之前。
关联接口集中的所有接口编号必须是连续的。
表9-Z显示了标准接口关联描述符。
接口关联描述符包括函数类、子类和协议字段。这些字段中的值可以与任何一个相关接口的接口类、子类和协议值相同。
对于现有的设备类,优选的实现是使用关联接口列表中第一个接口的接口类、子类和协议字段值。
注意:由于此特定功能未包含在早期版本的USB规范中,因此现有的USB操作系统实现将如何支持使用此描述符的设备存在问题。强烈建议使用接口关联描述符的设备实现使用设备描述符中的多接口功能类代码。这允许简单而容易地识别这些设备,并允许在某些操作系统上安装升级驱动程序,该驱动程序可以解析和枚举包括接口关联描述符的配置。多接口函数类代码记录在http://www.usb.org/developers/docs网站
Table 9–Z. Standard Interface Association Descriptor
偏移
|
区域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
Number
|
描述符字节数.
|
1
|
bDescriptorType
|
1
|
Constant
|
INTERFACE ASSOCIATION 描述符即11.
|
2
|
bFirstInterface
|
1
|
Number
|
和该功能关联的第一个接口序号
|
3
|
bInterfaceCount
|
1
|
Number
|
和该功能关联的接口个数
|
4
|
bFunctionClass
|
1
|
Class
|
USB-IF分配的类编码.
|
5
|
bFunctionSubClass
|
1
|
SubClass
|
USB-IF分配的子类编码.
|
6
|
bFunctionProtocol
|
1
|
Protocol
|
USB-IF分配的协议编码. 这些代码由bFunctionClass和bFunctionSubClass字段的值限定。
|
7
|
iFunction
|
1
|
Index
|
描述该功能的字符串描述符索引
|
其中bFunctionClass ,bFunctionSubClass,bFunctionProtocol 的值需要根据具体的设备类文档确定
比如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
|
1. ------------------- IAD Descriptor --------------------
2.bLength : 0x08 (8 bytes)
3.bDescriptorType : 0x0B (Interface Association Descriptor)
4.bFirstInterface : 0x02 (Interface 2)
5.bInterfaceCount : 0x02 (2 Interfaces)
6.bFunctionClass : 0x01 (Audio)
7.bFunctionSubClass : 0x02 (Audio Streaming)
8.bFunctionProtocol : 0x00
9.iFunction : 0x08 (String Descriptor 8)
10. Language 0x0409 : "usb-audio"
11.Data (HexDump) : 08 0B 02 02 01 02 00 08 ........
1. ------------------- IAD Descriptor --------------------
2.bLength : 0x08 (8 bytes)
3.bDescriptorType : 0x0B (Interface Association Descriptor)
4.bFirstInterface : 0x00 (Interface 0)
5.bInterfaceCount : 0x02 (2 Interfaces)
6.bFunctionClass : 0x0E (Video)
7.bFunctionSubClass : 0x03 (Video Interface Collection)
8.bFunctionProtocol : 0x00 (PC_PROTOCOL_UNDEFINED)
9.iFunction : 0x05 (String Descriptor 5)
10. Language 0x0409 : "usb-webcam"
11.Data (HexDump) : 08 0B 00 02 0E 03 00 05 ........
1. ------------------- IAD Descriptor --------------------
2.bLength : 0x08 (8 bytes)
3.bDescriptorType : 0x0B (Interface Association Descriptor)
4.bFirstInterface : 0x04 (Interface 4)
5.bInterfaceCount : 0x02 (2 Interfaces)
6.bFunctionClass : 0x02 (Communications and CDC Control)
7.bFunctionSubClass : 0x02
8.bFunctionProtocol : 0x01
9.iFunction : 0x0A (String Descriptor 10)
10. Language 0x0409 : "usb-com"
11.Data (HexDump) : 08 0B 04 02 02 02 01 0A ........
使用IAD的设备必须使用下表中所示的示例设备描述符中定义的设备类bDeviceClass、子类bDeviceSubClass和协议代码bDeviceProtocol其他的参考USB2.0的规格书usb_20.pdf的Table 9-8. Standard Device Descriptor。这组类代码被定义为多接口功能设备类代码。
偏移
|
区域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
Number
|
描述字节数
|
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类代码的示例设备描述符
1. ---------------------- Device Descriptor ----------------------
2.bLength : 0x12 (18 bytes)
3.bDescriptorType : 0x01 (Device Descriptor)
4.bcdUSB : 0x200 (USB Version 2.0)
5.bDeviceClass : 0xEF (Miscellaneous)
6.bDeviceSubClass : 0x02
7.bDeviceProtocol : 0x01 (IAD - Interface Association Descriptor)
8.bMaxPacketSize0 : 0x40 (64 bytes)
9.idVendor : 0x2BC5 (Orbbec 3D Tech. Int'l Inc.)
10.idProduct : 0x0529
11.bcdDevice : 0x0200
12.iManufacturer : 0x01 (String Descriptor 1)
13. Language 0x0409 : "webcamvendor"
14.iProduct : 0x02 (String Descriptor 2)
15. Language 0x0409 : "webcamproduct"
16.iSerialNumber : 0x03 (String Descriptor 3)
17. Language 0x0409 : "00000000"
18.bNumConfigurations : 0x01 (1 Configuration)
19.Data (HexDump) : 12 01 00 02 EF 02 01 40 C5 2B 29 05 00 02 01 02 .......@.+).....
20. 03 01 ..
下图提供了一个示例,说明在典型的设备实现中如何使用IAD。
核心USB规范并没有指定从GetDescriptor(Configuration)请求返回的描述符集,应该如何构造的组织(位置关系)要求。
下图说明了如何组织这些描述符的推荐布局,以便主机软件可以轻松地解析它们,并明确地知道,要向每个功能驱动程序提供哪些描述符。
组织描述符集的一般方法是“按设备功能”对它们进行分组。这基本上意味着特定设备功能的所有描述符应始终位于“一起”(如图所示)。
此外,图中说明了描述符集应如何绑定到设备驱动程序。需要注意,对于类特定描述符应如何与IAD关联进行分组,可能存在特定(附加)要求。这些将在特定的设备类文档中指定,比如UVC参考《UVC 1.5 Class specification.pdf》Universal Serial Bus Device Class Definition for Video Devices Revision 1.5 August 9, 2012 P60。
(1)在示例框图的顶部,多接口功能设备类(Multi-Interface Function Device Class)设备,其设备描述符包括设备类bDeviceClass、子类bDeviceSubClashh和协议代码bDeviceProtocol,他们的值必须分别是0xEF(Misc),0x02(Common Class),0x01(IAD).
(2)接下来是配置描述符集。在高层次上,该特定配置包括三个设备功能。配置描述符和第一个接口或IAD描述符之间的任何描述符都应被视为“全局”,并传递给每个功能设备驱动程序(见示例)。
(3)第一个功能关联包括两个接口(包括所有类特定描述符和可选设置alternate settings)。第二设备功能是单个接口功能,并且不需要IAD。第三个设备功能与第一个类似。对于每个设备功能,系统软件必须向设备驱动程序提供“关联”中的所有描述符以及上述“全局”描述符。
(4)bInterface Count字段中的值必须包括预期集合中的所有接口。例如,假设一个多接口功能的接口编号为N到M。bFirstInterface字段值为N,bInterface Count的值则为(M-N)+1(因为关联中的所有接口都必须是数字连续的,所以算法(M-N)+1总是有效的)。注意,每个接口可以有零个或多个可选设置alternate settings,但可选设置不包括在bInterface Count的计算中。
(5)对于使用IAD的设备功能(如示例中的第一个和第三个功能),USB系统软件应构建“硬件标识符”,用于使用设备描述符中的idVendor和idProduct以及IAD中的bFirstInterface字段定位和加载设备驱动程序。此外,系统软件应使用IAD中的类代码字段(bFunctionClass、bFunctionSubClass、bFunctionProtocol)构建“兼容性标识符”。
使用接口关联描述符的示例设备框图
1.在一个设备功能需要关联多个接口时需要使用IAD描述符,比如UVC,UAC, 而一个配置描述符下可以使用多个IAD即实现了组合设备,比如UVC+UAC_CDC, 使用IAD时此时设备描述符的设备类bDeviceClass、子类bDeviceSubClashh和协议代码bDeviceProtocol,他们的值必须分别是0xEF(Misc),0x02(Common Class),0x01(IAD)。详见前面的实例。
2.IAD描述的内容参考前面的实例,bFunctionClass ,bFunctionSubClass,bFunctionProtocol 的值需要根据具体的设备类文档确定,可以参考前面的实例。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !