USB组合设备 Interface Association Descriptor (IAD)
Communication Device Class,简称CDC USB Compound Device,USB复合设备 USB Composite Device,USB组合设备
摘要 USB复合设备 Compound Device内嵌Hub和多个Function,每个Function都相当于一个独立的USB外设,有自己的PID/VID。 USB组合设备Composite Device内只有一个Function,只有一套PID/VID,通过将不同的interface定义为不同的类来实现多个功能的组合。
正文
Compound Device内嵌Hub和多个Function,每个Function都相当于一个独立的USB外设,有自己的PID/VID。 Composite Device内只有一个Function,只有一套PID/VID,通过将不同的interface定义为不同的类来实现多个功能的组合。
很多人认为一个USB接口上实现多个设备,就是指复合设备,其实,这是不确切的, 虽然USB Compound Device和USB Composite Device都会被百度翻译为USB复合设备。
在一个USB接口上实现多个设备有2中方法, 一种是Compound Device,就是复合设备; 另一种是Composite Device,就是组合设备。
在USB2.0的标准协议中,定义如下: When multiple functions are combined with a hub in a single package, they are referred to as a compound device. A device that has multiple interfaces controlled independently of each other is referred to as a composite device.
所以,复合设备其实就是几个设备通过一个USB Hub形成的单一设备; 组合设备也就是具有多个接口的设备,每个接口代表一个独立的设备。 显然,如果是想同样的功能的话,组合设备的方法要简单很多(可以去看一下USB2.0协议中,USB2.0 Hub的复杂度)。
参见 USB Descriptors USB复合设备一般用Interface Association Descriptor(IAD)实现,就是在要合并的接口前加上IAD描述符。
IAD描述符:
typedef struct _USBInterfaceAssociationDescriptor {
BYTE bLength: 0x08 //描述符大小
BYTE bDescriptorType: 0x0B //IAD描述符类型
BYTE bFirstInterface: 0x00 //起始接口
BYTE bInterfaceCount: 0x02 //接口数
BYTE bFunctionClass: 0x0E //类型代码
BYTE bFunctionSubClass: 0x03 //子类型代码
BYTE bFunctionProtocol: 0x00 //协议代码
BYTE iFunction: 0x04 //描述字符串索引
}
https://blog.csdn.net/u013256018/article/details/61947232 https://blog.csdn.net/u012028275/article/details/109790166
USB Interface Association Descriptor (IAD) IAD是Interface Association Descriptor,功能是把多个接口定义为一个类设备。 Windows下,IAD和Composite设备在设备管理器中没有什么区别,甚至使用的驱动也都是Composite驱动
IAD是Interface Association Descriptor,功能是把多个接口定义为一个类设备。这个描述符是最新更新的,基本在书上是看不到的。
多说无益,自己看http://www.microsoft.com/whdc/archive/IAD.mspx。用起来非常简单的。
Windows下,IAD和Composite设备在设备管理器中没有什么区别,甚至使用的驱动也都是Composite驱动。 Linux下,确实能发现这个设备,不过我用IAD实现的CDC并没有自动装载到ttyACM0,这个就以后研究了。
USB2.0规范(The Universal Serial Bus Specification, revision 2.0)没有支持该描述符,不支持将设备的多个接口分组到单个设备功能中。该描述符是由USB-IF发布工程更改通知Engineering Change Notification (ECN),《USB ECN : Interface Association Descriptor》定义了该描述符与功能。
Windows系统从Microsoft Windows XP Service Pack 2 (SP2)版本开始支持IAD。