Linux中USB描述符详解-wxc-2018-03-31
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USB描述符的作用
USB 设备第一次连接到主机时, 要接收主机枚举( Enumera tion) 和配置(Configuration) , 目的是让主机知道设备功能、是哪一类的USB 设备、占用多少资源、使用了哪些传输方式以及传输的数据量等等。只有主机完全确认了这些信息后, 设备才能真正开始工作。这些信息是通过存储在设备中的USB 描述符来体现的。因此, 这种USB 描述符也可以看作是USB 设备的身份证明。
描述符(Descriptor )是一个完整的数据结构, 存储在USB 设备中, 用于描述一个USB 设备的所有属性。USB主机通过一系列命令要求设备发送这些信息。
USB描述符的种类
描述符分为三大类:标准描述符、设备类描述符、厂商描述符。
三种描述符的类型值bDescriptorType:
设备的类别bDeviceClass
接口类别bInterfaceClass
Linux中各种描述符的定义
在include/linux/usb/Ch9.h中定义
USB设备描述符:
struct usb_device_descripto r {
__u8 bLength; //此描述符的字节数
__u8 bDescriptorType; //描述符的类型(此处应为0x01,即设备描述符) __le16 bcdUSB; // USB版本号(BCD 码)
__u8 bDeviceClass; //设备的类别---可查看上表格
__u8 bDeviceSubClass; //设备子类码:这些码值的具体含义根据bDeviceClass 域来看。
__u8 bDeviceProtocol;
/*协议码
这些码的值视bDeviceClass 和bDeviceSubClass 的值而定。如果设备支持设备类相关的
协议,此码标志了设备类的值。如果此域的值为零,则此设备不支持设备类相关的协议,然
而,可能它的接口支持设备类相关的协议。如果此域的值为FFH,此设备使用厂商定义的议。*/ __u8 bMaxPacketSize0; //端点0的最大包大小(仅8,16,32,64为合法值)
__le16 idVendor; //厂商标志(由USB-IF组织赋值)
__le16 idProduct; //产品标志(由厂商赋值)
__le16 bcdDevice; //设备版本号(BCD 码)
__u8 iManufacturer; //描述厂商信息的字符串描述符的索引值。
__u8 iProduct; //描述产品信息的字串描述符的索引值。
__u8 iSerialNumber; //描述设备序列号信息的字串描述符的索引值。
__u8 bNumConfigurations; //可能的配置描述符数目
}
USB配置描述符
配置描述符中包含了配置描述符本身的长度、所有配置信息的总长度、供电方式及远
程唤醒、供电量。
如果主机发出标准命令Get_Descriptor要求获得设备的某个配置描述符时,该配置应用的所有信息都将发给主机,它包括:该标准配置符本身、该配置所包含的所有接口、端点描述符及设备类描述符和厂商描述符。
struct usb_config_descriptor {
__u8 bLength; //此描述符的字节数
__u8 bDescriptorType; //配置描述表类型(此处为0x02)
__le16 wTotalLength; //此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述符),即:将要返回的配置信息总长度。
__u8 bNumInterfaces; //此配置所支持的接口个数
__u8 bConfigurationValue;//在SetConfiguration()请求中用作参数来选定此配置。
__u8 iConfiguration;//描述此配置的字串描述符的索引
__u8 bmAttributes;
/*
配置特性:
D7:保留(设为1)
D6:自给电源
D5:远程唤醒
D4..0:保留(设为1)
一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量。并
设置D6为1。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到。
*/
__u8 bMaxPower; //在此配置下的总线电源耗费量。以2mA 为一个单位。
}
【说明1:】配置描述符也包含了个用于描述符该配置的字符串描述符索引iConfiguration,这说明将有个字符串描述符为其准备。
【说明2:】枚举的过程可分为4个状态阶段:接入状态阶段、缺省状态阶段、地址状态阶段、设置状态阶段,各状态阶段任务如下:
接入状态阶段-----------主机检测到新设备接入后,将复位总线(释放总线于空闲状态)。
缺省状态阶段-----------主机利用0x00地址访问新接入的设备,读取部分描述符后,会分配个设备地址。
地址状态阶段-----------主机再次复位总线,然后用新分配的地址获取设备所有的描述符。
设置状态阶段-----------主机根据设备的描述符,会对设备作些相关的配置。
【说明3:】bCongfigurationValue-----------USB设备的配置值。用于存放主机执行SetConfiguration 命令的设置值。当主机发送GetConfiguration命令时,设备将向主机返回1个字节的配置值。然而,USB 设备处于不同的状态时,对GetConfigration的请求也有不同的响应:
1.> 在枚举阶段,若设备处于地址状态时,对GetConfigration的请求返回为0;
2.> 在枚举阶段,若设备处于默认状态(缺省状态)时,对GetConfigration的请求视为无效;
3.> 在枚举阶段,若设备处于配置状态时,对GetConfigration的请求将返回bConfigurationValue字段的值(该值可能是配置描述符的默认值,也可能是USB主机的设置值,这要看在执行GetConfigration命令前是否执行了SetConfigration命令)。
因为主机要执行SetConfigration命令,所以bCongfigurationValue的默认值没什么用。实际上主机给bCongfigurationValue赋值后,bCongfigurationValue值就充当配置描述符的编号,用以区分不同的配置,因为一个设备可能有多个配置。
USB接口描述符
struct usb_interface_descriptor {
__u8 bLength; //描述符的size
__u8 bDescriptorType; //描述符的类型,接口描述符类型为0x04