0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC2的USB驱动开发-IAD描述符详解

嵌入式USB开发 来源:嵌入式Lee 作者:嵌入式Lee 2023-06-27 08:45 次阅读

本文转自公众号,欢迎关注

基于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”下载

ecd0b3ca-1483-11ee-9c1d-dac502259ad0.png

ed1bf88a-1483-11ee-9c1d-dac502259ad0.png

参考《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的设备定位适当的驱动程序能力的专用功能驱动程序。

3.1 IAD的来源背景

ECN即USB Engineering Change Notice,USB的工程变更通知。

《InterfaceAssociationDescriptor_ecn.pdf》此ECN定义了一个新的标准描述符和接口编号规则,允许设备描述哪一个接口和同一个设备功能关联。这允许操作系统将所有适当的接口绑定到同一驱动程序实例,即多个接口对应一个设备功能。

核心USB框架假设的基本配置模型是,设备上的接口和功能之间始终存在1:1的关联,即一个接口对应一个设备功能。系统软件是按照核心规范的意图设计的,并假设每个功能(和一个接口)有一个驱动程序(见下图)

ed338400-1483-11ee-9c1d-dac502259ad0.png

一些设备类规范已经超过了核心USB规范框架,并定义了使用多个接口(即多个接口描述符)的设备功能。支持这一点的模型仍然只需要每个功能一个功能驱动程序,但也需要多个接口绑定到同一个驱动程序实例(见下图)。不幸的是,没有标准方法允许设备通过设备框架来描述配置中的哪些接口应该与相同的功能相关联。

ed667bda-1483-11ee-9c1d-dac502259ad0.png

此更改通知定义了设备框架的必要扩展,允许设备注释哪些接口与同一功能相关。这种设备框架扩展最终将被用于所有每个设备功能使用多个接口的设备。

3.2对软件的影响

对现有操作系统版本和现有设备类没有影响。系统软件会忽略新的描述符。他们描述的接口不会改变。使用多个接口来管理单个设备功能的设备的未来实现必须支持此功能。

操作系统当前不支持的设备类会对未来/新的设备实现产生影响。具体来说,如果一个设备实现包括多个功能单元(每个单元有多个接口),那么该设备将仅在支持此新描述符的操作系统实现上正确枚举

为了更容易地增强现有的操作系统实现,使其能够处理使用该描述符的设备,将分配设备类代码,目的是所有使用接口关联描述符的设备都将在其设备描述符中使用该类代码。这将允许轻松安装一个新的驱动程序,该驱动程序知道如何解析和枚举包括接口关联描述符的配置。IAD的分类代码将记录在usb.org网站上。

现有设备类工作组负责确定是否需要修改其单独的规范以使用或利用此新的框架扩展。

3.3合规性测试影响

最终必须更新标准合规工具集(USBCV),以检查这些新描述符的格式(和使用)。

此外,必须为合规工具建立一些规则,以确定哪个设备应该使用这些描述符,并因未使用这些描述符而使其失败。

四.IAD描述符

4.1描述符类型

添加了新的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

4.2IAD描述符内容

以下是接口关联描述符的定义。在下一次规范修订更新时,应将其作为新的第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分配的类编码.
不能写0
0xFF表示厂商自定义
其他值由USB-IF分配.

5

bFunctionSubClass

1

SubClass

USB-IF分配的子类编码.
bFunctionClass 不为FFH 则所有值都由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
Descriptor.

2

bFirstInterface

1

Number

Interface number of the first
VideoControl interface that is
associated with this function.

3

bInterfaceCount

1

Number

Number of contiguous VideoStreaming
interfaces that are associated with this
function. The count includes the first
VideoControl interface and all its
associated VideoStreaming interfaces.

4

bFunctionClass

1

Class

CC_VIDEO. Video Interface Class
code (assigned by the USB). See
section A.1, "Video Interface Class
Code".

5

bFunctionSubClass

1

SubClass

SC_VIDEO_INTERFACE_COLLECT
ION. Video Interface Subclass code.
Assigned by this specification. See
section A.2, "Video Interface Subclass
Codes".

6

bFunctionProtocol

1

Protocol

Not used. Must be set to
PC_PROTOCOL_UNDEFINED.

7

iFunction

1

Index

Index of a string descriptor that
describes this interface. This must be
used for the device (function) name and
be implemented in US English
(LANGID = 0x0409) at the minimum.

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时的设备描述符

5.1使用IAD时的设备描述符

使用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类代码的示例设备描述符

5.2使用IAD的设备描述符实例

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使用模型

下图提供了一个示例,说明在典型的设备实现中如何使用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)构建“兼容性标识符”。

ed790430-1483-11ee-9c1d-dac502259ad0.png

使用接口关联描述符的示例设备框图

七.总结

1.在一个设备功能需要关联多个接口时需要使用IAD描述符,比如UVC,UAC, 而一个配置描述符下可以使用多个IAD即实现了组合设备,比如UVC+UAC_CDC, 使用IAD时此时设备描述符的设备类bDeviceClass、子类bDeviceSubClashh和协议代码bDeviceProtocol,他们的值必须分别是0xEF(Misc),0x02(Common Class),0x01(IAD)。详见前面的实例。

2.IAD描述的内容参考前面的实例,bFunctionClass ,bFunctionSubClass,bFunctionProtocol 的值需要根据具体的设备类文档确定,可以参考前面的实例。


审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148486
  • usb
    usb
    +关注

    关注

    59

    文章

    7432

    浏览量

    258161
  • IAD
    IAD
    +关注

    关注

    0

    文章

    5

    浏览量

    9066
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    98
收藏 人收藏

    评论

    相关推荐

    基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2.0控制器简介

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2
    的头像 发表于 05-08 18:10 3159次阅读
    基于<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 6131次阅读
    基于<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驱动开发-USB复位详解

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-USB复位详解 (qq.com) 一.前言
    的头像 发表于 07-07 11:18 1.6w次阅读
    基于<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>复位<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-USB连接详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-USB连接详解 (qq.com) 一.前
    的头像 发表于 07-07 08:46 2310次阅读
    基于<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>连接<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-设备类驱动框架

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-设备类驱动框架 (qq.com) 一.前言 从软件顶层,从数据流的角度来看
    的头像 发表于 07-16 15:56 667次阅读
    基于<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>框架

    基于DWC2USB驱动开发-数据不能发送问题分析案例

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-数据不能发送问题分析案例 (qq.com)   一.前言        对于驱动
    的头像 发表于 08-08 09:43 1126次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-数据不能发送问题分析案例

    基于DWC_ether_qos的以太网驱动开发-描述符链表介绍

    本文转自公众号欢迎关注 一.描述符概述 1.0 前言 对于DWC Ethernet QoS驱动的编写来说,初始化完成之后,核心操作就是DMA的描述符链表配置(linked list
    的头像 发表于 08-30 09:39 2713次阅读
    基于<b class='flag-5'>DWC</b>_ether_qos的以太网<b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>描述符</b>链表介绍

    USB描述符详解

    对于实现USB功能的项目,不管是实现CDC,大容量存储、HID等都必须使用实现USB标准描述符,从而实现USB枚举过程。这里共享一个USB
    发表于 06-12 14:46

    USB摄像头的描述符驱动程序有什么关系吗?

    (1)USB摄像头的描述符是摄像头的固有属性吗?是摄像头出厂后,描述符的信息就确定了吗?(2)能不能介绍下描述符
    发表于 06-16 16:24

    UBL UBOOT 描述符

       在DM368的开发包目录下/psp/flash-utils/DM36x/GNU:执行make 可以省成UBL:ubl_DM36x_nand.bin ;我想问的是如何添加UBL 的描述符?烧写到
    发表于 06-21 08:48

    USB设备检测过程的USB设备的描述符

    USB 设备的总体信息,它是枚举过程中主机从设备读取的第一个描述符。设备描述符总共有 18 个字节,分为 14 个字段,如表 6-5 所示。(2)配置
    发表于 11-12 09:23

    FX2的多个配置描述符

    配置2。我是否需要连接的USB使用u***cs为了新的DirectSound描述符配置可看吗?为什么不能thecontrolcenter或控制台看到其他配置描述符? 以上来自于百度翻
    发表于 04-19 09:19

    怎么使用USB PSoC Creator组件来改变USB描述符

    描述符(例如供应商ID、产品ID、接口数量)。我正试图通过使用USB PSoC Creator(USB全速)组件来改变USB描述符。但是在主
    发表于 06-12 10:05

    USB2660i发出USB描述符,没有从USB Hub获取正确的描述符

    正确地加载——然后,在调试USB描述符时,我们知道USB集线器没有正确地发送描述符以说明连接的是什么类型的设备。CE专用于SDIO桥接应用的第二SD卡插槽。SDIO桥接用定制固件是可能
    发表于 09-20 08:13

    USB描述符之间的依赖是怎么样的

    USB 是个通用的总线,端口都是统一的。但是USB 设备却各种各样,例如USB 鼠标, USB键盘, U盘等等,那么USB 主机是如何识别出
    发表于 07-23 16:53 8次下载
    <b class='flag-5'>USB</b>各<b class='flag-5'>描述符</b>之间的依赖是怎么样的