USB基础---设备、配置、接口、端点和字符串描述符
USB设备用描述符报告他们的属性,一个描述符是一个已定义格式的数据结构体。每个描述符以一个表示描述符长度的字节和一个表示描述符类型的字节开始。
USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主机分析返回来的数据,判断出该设备是哪一种USB设备,建立相应的数据链接通道。那么USB描述符信息到底是一个什么样的数据呢,USB协议中有详细描述。
USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备的都提供不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需要从其中选定一个),配置由多个接口组成。
在USB协议中,接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象,一个功能复杂的USB设备可以具有多个接口。设备接口是端点的汇集(Collection)。例如,USB扬声器可以包含一个音频接口以及对旋钮和按钮的接口。一个配置中的所有接口可以同时有效,并可被不同的驱动程序连接。每个接口可以有备用接口,以提供不同质量的服务参数。
端点是USB通信的最基本形式,每一个USB设备接口在主机看来就是一个端点的集合。主机只能通过端点与设备进行通信,以使用设备的功能。在USB系统中每一个端点都有唯一的地址,这是由设备地址和端点号给出的。每个端点都有一定的属性,其中包括传输方式、总线访问频率、带宽、端点号和数据包的最大容量等。一个USB端点只能在一个方向上承载数据,从主机到设备(输出端点)或者从设备到主机(输入端点),因此端点可看作是一个单向的管道。端点0通常为控制端点,用于设备初始化参数等。只要设备连接到USB上并且上电,端点0就可以被访问。端点1、2等一般用作数据端点,存放主机与设备间往来的数据。
这种层次化配置信息在设备中通过一组标准的描述符来描述。
kernel\msm-3.18\include\uapi\linux\usb\ch9.h定义了这些描述符
kernel\msm-3.18\include\uapi\linux\usb\ch11.h----有usb hub相关的定义
- 设备描述符
设备描述符描述USB设备的通用信息,它包括适用于设备的全局信息和所有的设备配置。一个USB设备只有一个设备描述符。
bLength:表示描述符长度。
bDescriptorType:描述符类型
USB HUB描述符类型值为29H。
bcdUSB:
BCD(Binary-Coded Decimal二进制码十进制数)版本号(USB总线版本号),bcdUSB的值是0xJJMN (JJ – major version number, M – minor version number, N – sub-minor version number)。比如版本2.13用0x0213表示,版本2.0用0x0200表示。
bDeviceClass:
由USB-IF(USB Implementers Forum)分配的设备类代码,比如USB HUB为HUB_CLASSCODE (09H)。
如果该字段为0x00,表示由接口描述符来指定(有可能该USB设备是一个复合设备,USB设备的各个接口相互独立,分别属于不同的设备类)。如果是0x01~0xfe,表示为USB-IF定义的设备类,例如0x03为HID设备,0x09为HUB设备。如果是0xff,表示由厂商自定义设备类型。
bDeviceSubClass:
USB子类代码,由USB-IF分配,如果bDeviceClass为0x00,那么该字段也必须为 0x00,其它情况可以参考USB关于对于USB Device Class的定义。如果bDeviceClass,则bDeviceSubClass的值由USB-IF分配;如果bDeviceClass为0xFF,则bDeviceSubClass的值的值由厂家自定义。
bDeviceProtocol
协议代码,由USB-IF分配,如果bDeviceClass和bDeviceSubClass定义为0x00,那么该字段也必须为0x00。如果该字段为0xFF,则设备使用厂家自定义的值。
bMaxPacketSize0
端点0最大包大小,只有8、16、32或64有效。
idVendor
USB-IF分配的厂商ID
IdProduct
厂商自行指定的产品ID
BcdDevice
设备编号。
iManufacturer
用于描述厂商的字符串描述符索引
iProduct
用于描述产品的字符串描述符索引
iSerialNumber
用于描述产品***的字符串描述符索引,注意,所有的字符串描述符是可选的,如果没有字符串描述符,指定这些索引为0x00
bNumConfigurations
配置描述符数量
比如我们主板上USB设备描述符信息如下,具体每项的意义后面再深入去对应起来学习
2. 配置描述符
配置描述符描述关于特定设备的配置信息。当host请求配置描述符,它下面所有相关的接口和端点描述符也一起返回。
bLength: 配置描述符长度,配置描述符长度为9字节大小。
bDescriptorType: 描述符类型,配置描述符类型为0x02。
wTotalLength: 配置描述符信息总的大小,包括接口描述符、端点描述符等等。
bNumInterfaces: 此配置支持的USB接口数量。
bConfigurationValue: 当使用SetConfiguration和GetConfiguration请求时所指定的配置索引值。
iConfiguration: 描述配置的字符串描述符索引。
bmAttributes: 供电配置,位详细定义如下:
D7 保留,必须置1
D6 自供电模式
D5 远程唤醒
D4~D0 保留
如果设备描述符支持远程唤醒,D5要设置为1
bMaxPower: 最大功耗,以2mA为单位,例如0x32为50*2=100mA。
3. 接口描述符
接口描述符描述一个配置下的特定接口,当一个配置支持多个接口,那一个接口下的所有端点描述符经常是作为一个配置描述符下的一部分返回。接口描述符不能使用GetDescriptor() 或SetDescriptor()请求直接访问。
bLength: 描述符长度,接口描述符长度为9个字节。
bDescriptorType: 描述符类型,接口描述符的类型为0x04。
bInterfaceNumber: 该接口编号,接口编号从0开始分配,当一个配置有多个接口时,就用该字段来区分不同的接口。
bAlternateSetting: USB设备配置与USB配置描述符是一一对应的, 即一个配置只能有一个配置描述符。虽然由bInterfaceNumber字段可知, 每一个接口都有一个惟一确定的接口编号, 但是一个接口却可以由不只一个接口描述符来描述它。USB 允许多个接口描述符来描述同一个接口, 且这些描述符都可通过命令切换。此字段就是每一个这类描述符惟一的编号。USB可通过调用这个字段来切换描述同一个接口的不同描述符。控制传输中的Get_Inter face 命令可以用来得到目前正在使用的描述一个确定接口的接口描述符的编号, 即此字段。而Set_Inte rface 命令则以此字段值为参数, 用来使相应的接口描述符描述某个确定的接口
bNumEndpoints: 端点数量,不包括端点0。
bInterfaceClass:USB-IF分配的类代码,0预览未来使用,0xFF表示接口类是厂家自定义,其他值由USB-IF指定。
bInterfaceSubClass:USB-IF分配的子类代码,由bInterfaceClass字段限制。
bInterfaceProtocol: 如果一个接口支持特定类请求,此代码标识由特定设备类定义的协议,如果该字段为0,设备部在此接口不使特定类的协议,如果该字段为0xFF,设备为此接口使用厂家自定义协议。
iInterface: 描述该接口的字符串描述符索引。
4. 端点
端点描述符包含的信息被host用来决定每个端点所需带宽,一个端点描述符经常作为通过GetDescriptor(Configuration)请求配置信息的一部分被获取。一个端点描述用GetDescriptor() or SetDescriptor()请求直接访问。端点0没有描述符。
bLength: 描述符长度,这里有两个值如果是audio设备的端点,那么端点描述符长度就为9个字节,对于其它设备端点,端点描述符长度就为7个字节。
bDescriptorType: 描述符类型,端点描述符类型为0x05。
bEndpointAddress: 端点地址,详细定义如下:
D7 端点方向
0 OUT端点
1 IN端点
D6~D4 保留
D3~D0 端点编号
bmAttributes: 端点类型,详细定义如下:
D5~D4 用途
00 数据端点
01 反馈端点
10 隐式反馈数据端点
11 保留
D3~D2 同步类型
00 非同步
01 异步
10 自适应
11 同步
D1~D0 传输类型
00 控制传输
01 同步传输
10 块传输
11 中断传输
如果该端点不是同步端点,D5~D2保留且必须置0。
wMaxPacketSize: 端点所支持最大数据包的长度,详细定义如下:
D10~D0 最大数据包长度
D12~D11
其余位保留且必须置0。
bInterval:端点数据传输的访问时间间隔。对于全速/低速的中断端点,取值范围为 1~255,对于高速中断端点,取值范围为1~16,详细定义可以参考USB协议。
5. 字符串描述符
字符描述符是可选的,如果一个设备不支持字符串描述符,设备描述符、配置描述符和接口描述符中对字符串描述符的引用必须设置为0.
下图是我们产品/sys/kernel/debug/usb/devices的内容
参考链接:
USB2.0协议标准描述符
https://blog.****.net/hushiganghu/article/details/54929066
USB描述符【整理】
https://www.cnblogs.com/Daniel-G/p/3993904.html