Chinaunix首页 | 论坛 | 博客
  • 博客访问: 294030
  • 博文数量: 65
  • 博客积分: 185
  • 博客等级: 入伍新兵
  • 技术积分: 609
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-06 21:41
个人简介

好好学习,天天向上

文章分类

全部博文(65)

文章存档

2022年(3)

2021年(25)

2020年(1)

2019年(3)

2016年(2)

2015年(3)

2014年(14)

2013年(7)

2012年(7)

我的朋友

分类: LINUX

2015-05-14 11:27:42

原文地址:USB中的描述符详解[二] 作者:轨迹16

USB描述符的分类与介绍

USB的符述符分为几类?有人可能会答:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符等。但这里说的不是这样的。上面的几类描述符属于USB标准描述符。另外还有HID描述符和Hub描述符。所以分类是这样的:
1. 标准描述符
            1) 设备描述符
             2) 配置描述符
             3) 字符串描述符
             4) 接口描述符
             5) 端点描述符
             6) 设备限定描述符
             7) 其他速率配置描述符
2. HID描述符
3. Hub描述符

1.5 端点描述符

端点描述符用于指出USB端点的特性,包括其所支持的传输类型、传输方向等信息。USB中规定,端点0没有端点描述符,其余端点必须包含端点描述符。端点描述符由6个字段组成,共7个字节。其格式如下:

 各字段含义:
 bLength:用于表示端点描述符的长度,固定为7字节,即0x07。
 bDescriptorType:用于表示接口描述符的类型值,固定为0x05。
 bEndpointAddress:用于表示端点的端点号以及端点的数据传输方向。第七位表示端点的数据传输方向,0表示OUT数据传输,1表示IN数据传输;第0~位表示端点号,例如001B表示端点1、010B表示端点2;其余位均保留,必须置0。
 bmAttributes:用于表示端点的特性。其中第0位和第1位表示端点的数据传输类型,00B表示控制传输、01B表示同步传输、10B表示块传 输、11B表示中断传输;如果是同步传输,第2位和第3位表示同步类型,00B表示非同步、01B表示异步、10B表示自适应、11B表示同步;第4、5 位表示端点的用法类型,00B表示数据端点、01B表示显示反馈端点、10B表示隐匿反馈端点、11B保留。其余位保留。
 wMaxPacketSize:用于表示端点所支持最大数据包的长度。其中第0~10位表示数据包的长度,第11位和12位指出每小帧最多传输的事务数,其余位均保留,必须置0。
 bInterval:用于指定端点数据传输的访问间隔。低速中断端点,取值范围为10~255,对应的访问间隔为10~255ms;对于全速中断端点,取值范围为1~255,对应的访问间隔为1~255ms;对于其他端点,可以参阅USB相关协议。

1.6 设备限定描述符

设备限定描述符用于指定另一传输速率下该设备的总体信息,如果高速USB设备既需要采用高速传输又需要全速传输,则它必须支持设备限定描述符(Device_Qualifier)。设备限定描述符包含9个字段,长度固定为10个字节。其格式如下:

 各字段含义:
 bLength:用于表示设备限定描述符的长度,为固定值0x0a。
 bDescriptorType:用于表示设备限定描述符的类型值,固定为0x06。
 bcdUSB:用于表示USB设备及其描述符所遵循的USB规范版本,以BCD码的形式表示,其值必须在版本2.0以上。
 bDeviceClass:用于表示USB设备所属的设备类。该字段值在1~0xFE之间的时候,表示为USB定义的某个设备类,如0x03表示HID设 备类。当为0时,表示USB设备的各个接口互相独立,分别属于不同的设备类,在接口描述符中会进一步说明。当为0xFF时,表示该设备为供应商自定义的。
 bDeviceSubClass:用于表示USB设备所采用的设备类协议,它对USB设备类进行了更详细的定义。例如,对于前面的HID设备类,只有一个 子类代码0x01。而对于显示设备类(0x04)子类代码0x01表示CRT显示器、0X02表示平面显示器、0x03表示3D显示器。当 bDeviceClass=0时,该字段也必须为0;当该字段为0xFF时,表示由供应商自定义的设备子类。
 bDeviceProtocol:用于表示USB设备所采用的设备类协议,其值和bDeviceClass及bDevcieSubClass的值有关。当 该字段为0时,表示不使用任何设备协议。如果该USB设备属于某个设备类和设备子类,则应该继续指明所采用的设备类协议。当该字段为0xFF时,表示由供 应商自定义设备类协议。
 bMaxPacketSize0:用于表示USB设备端点0支持最大数据包的长度,它以字节为单位。对于低速USB设备,bMaxPacketSize0 为8,对于全速USB设备,bMaxPacketSize0为8、16、32或64;对于高速USB设备bMaxPacketSize0为64。
 bNumConfigurations:表示USB设备另一个速率所支持的配置数。
 bReserved:保留项,要置0。

1.7 其他速率配置描述符

其他速率配置描述符用于指定另一传输速率下该设备的配置信息,如果高速USB设备既需要采用高速传输又需要全速传输,则它必须支持其他速率配置描述符。其他速率配置描述符包含8个字段,长度固定为9个字节。其格式如下:

 各字段含义:
 bLength:描述符的长度,固定为0x09。
 bDescriptorType:描述符类型,固定为0x07。
 wTotalLength:用于表示其他速率配置信息的总长度,包括配置描述符、接口描述符、端点描述符、设备类定义描述符和供应商自定义描述符的总和。
 bNumInterfaces:用于表示其他速率配置所支持的接口数。
 bConfigurationValue:用于表示其他速率配置值。
 iConfiguration:用于指出配置字符串描述符的索引值,具体字符串的内容在字符串描述符中定义。如果没有配置字符串,可以置0。
 bmAttributes:用于表示配置特性。它量按位寻址的,第6位置1表示使用总线电源;第5位置1表示支持远程唤醒功能;该字段的其他位均保留,一般来说,第0~4位应该置0,第7位应该置1。

 bMaxPower:用于表示USB设备运行时所需要消耗的总线电流,单位以2mA为基准。USB设备可以从USB总线上获得最大电流为500mA,因此该字段的最大值为250。

 

2 HID描述符

USB设备中有一大类就是HID设备,即Human Interface Devices,人机接口设备。这类设备包括鼠标、键盘等,主要用于人与计算机进行交互。它是USB协议最早支持的一种设备类。HID设备可以作为低速、 全速、高速设备用。由于HID设备要求用户输入能得到及时响应,故其传输方式通常采用中断方式。
在USB协议中,HID设备的定义放置在接口描述符中,USB的设备描述符和配置描述符中不包含HID设备的信息。因此,对于某些特定的HID设备,可以定义多个接口,只有其中一个接口为HID设备类即可。
当定义一个设备为HID设备时,其设备描述符应为:

 其接口描述符应该:

             bInterfaceClass=0x03

另外(接口描述符):
对无引导的HID设备,子类代码bInterfaceSubClass应置0,此时bInterfaceProtocol无效,置零即可。即为:

            bInterfaceClass=0x03
            bInterfaceSubClass=0
            bInterfaceProtocol=0

对支持引导的USB设备,子类代码bInterfaceSubClass应置1,此时bInterfaceProtocol可以为1或2,1表示键盘接口,3表示鼠标接口。其参考设置如下:

            bInterfaceClass=0x03
            bInterfaceSubClass=1
            bInterfaceProtocol=1或2

HID设备支持USB标准描述符中的五个:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。除此之外,HID设备还有三种特殊的描 述符:HID描述符、报告描述符、物理描述符。一个USB设备只能支持一个HID描述符,但可以支持多个报告描述符,而物理描述符则可以有也可以没有。

2.1 HID描述符

HID描述符用于识别HID设备中所包含的额外描述符,例如报告描述符或物理描述符等。其格式如下:

 各字段含义:

bLength:HID描述符长度。
bDescriptorType:HID描述符类型,值为0x21。
bcdHID:HID设备所遵循的HID版本号,为4位16进制的BCD码数据。1.0即0x0100,1.1即0x0101,2.0即0x0200。
bCountryCode:HID设备国家/地区代码。
bNumDescriptor:HID设备支持的其他设备描述符的数量。由于HID设备至少需要包括一个报告描述符,故其值至小为0x01。
bDescriptorType:HID描述符附属的类别描述符长度。
bDescriptorType/wDescriptorLength:可选字段,用于表示HID描述符附属的类别描述符类型及长度。
2.2 报告描述符
HID设备的报告描述符是一种数据报表,主要用于定义HID设备和USB主机之间的数据交换格式,HID设备报告描述符的类型值为0x22。
报告描述符使用自定义的数据结构,用于传输特定的数据包。例如对于键盘,需要在数据包中指明按键的值,报告描述符把这些数据打包发给主机,主机对发来的数据进行处理。它有四个组成部分,其格式如下:

 各字段含义:
bSize:占用两个位,指示数据部分,即[data]字段的长度,00b表没有数据字节,01b表只有一个数据字节,10b表示有两个数据字节,11b表有4个数据字节。
bType:数据项类型,用于指明数据项的类型。00b主数据类型,01b全局数据类型,10b局部数据类型,11b保留。
bTag:数据项标签,用于指明数据项的功能。报告描述符需要包含的数据项标签有:输入输出数据项标签、用法数据项标签、用法页数据项标签、逻辑最小和最大值数据项标签、报告大小数据项标签以及报告计数数据项标签。
[data]:数据字节,随着前面bSize定义的大小而变化。

2.3 物理描述符

HID设备的物理描述符主要用于报告物理设备的激活信息,其类型值为0x23,它是可选的,对大部分设备不需要使用此描述符。



http://blog.csdn.net/wavemcu/article/details/7250615


阅读(4271) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~