Linux内核USB2.0驱动框架分析--设备描述符以及USB标准请求

一,在标准的USB请求命令中,经常会看到描述符(Descriptor),这是什么来的呢?

Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。它的作用就是通过命令来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以描述符也是十分重要的部分,要好好掌握

USB描述符类似USB外围设备的"身份证"一样,详细地记录着外围设备相关的一切信息(设备类型、厂商的ID和产品的ID、端点情况、本版本号等)。为了描述不同的数据,需要以不同的数据类型的USB描述符加以描述,共有11种类型,每种描述符的第一个字节描述该描述符包含的字节数目,第二个字节描述该描述符的类型。

USB1.1协议定义的标准描述符是:设备描述符,配置描述符、接口描述符、端点描述符和字符串描述符。
  在这里插入图片描述

1.1 设备描述符

设备描述符具有18字节的长度,并且是主机向设备请求的第一个描述符。包含的信息有:设备所使用的USB协议版本号,设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID)、设备版本号、厂商字符索引、产品字符索引、设备序列号索引、可能的配置数等。以下列出设备描述符的范围、数值以及各个字段的意义:

 struct _DEVICE_DEscriptOR_STRUCT

{
   

 BYTE bLength;          //设备描述符的字节数大小,为0x12
 BYTE bDescriptorType;  //描述符类型编号,为0x01
 WORD bcdUSB;           //USB版本号
 BYTE bDeviceClass;  //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型
                        //0x00不是在设备描述符中定义的,如HID
    BYTE bDeviceSubClass;   //usb分配的子类代码,同上,值由USB规定和分配的
    BYTE bDeviceProtocl;    //USB分配的设备协议代码,同上
    BYTE bMaxPacketSize0;   //端点0的最大包的大小
    WORD idVendor;          //厂商编号
    WORD idProduct;         //产品编号
    WORD bcdDevice;         //设备出厂编号
    BYTE iManufacturer;     //描述厂商字符串的索引
    BYTE iProduct;          //描述产品字符串的索引
    BYTE iSerialNumber;     //描述设备序列号字符串的索引
    BYTE bNumConfiguration; //可能的配置数量
}

 bLength: 表示描述符的长度,对于设备描述符来说,其值为18,即0x12。
 bDescriptorType: 描述符类型,对应表1中的值,设备描述符为0x01。
 bcdUSB:该设备遵循的USB版本号,以BCD码表示,USB1.1为0x0101,USB2.0为0x0200。
 bDeviceClass:该设备所属的标准设备类,USB协议中对常见的设备进行了分类。该字段值为0x01~0xFE时,表示是USB协议中已定义的设备类,常用的HID设备类编号为0x03,其它设备类编号参:http://www.usb.org/developers/defined_class
 bDeviceProtocol:用于表示USB设备类所采用的设备类协议,其值和bDeviceClass和bDeviceSubClass有关。当此 字段为0时,表示不使用任何设备类协议。如果该USB设备属于某个设备类和设备子类,则应该继续指明所采用的设备类协议。当该字段为0xFF时,表明设备 类协议由供应商自定义。
 bMaxPacketSize0:用于表示在USB设备中,端点0所支持最大数据包的长度,它以字节为单位。对于低速USB设 备,bMaxPacketSize0为8;对于全速USB设备,bMaxPacketSize0为8、16、32、64;对于高速USB设 备,bMaxPacketSize0为64。
 IdVendor:用于表示USB设备供应商的ID。USB组织中规定每种产品都必须包含一个供应商ID,这样可以使主机加载合适的驱动程序。
 idProduct:用于表示USB产品的ID,由设备供应商提供。idProduct用于表示特定的USB设备,在USB设备上电的时候可以帮助USB主机选择合适的驱动程序。
 bcdDevice:用于表示USB设备的版本号,它以BCD码的形式表示。一般来说bcdDevcie由设备供应商指定,在USB设备上电的时候可以帮助USB主机选择合适的驱动程序。
 iManufacturer:用于表示供应商字符串描述符的索引值。具体字符串的内容在后面字符串描述符中定义。如果没有供应商字符串,可以置0。
 iSerialNumber:用于表示设备序列号字符串描述符的索引值,如果没有,可以置为0。
 bNumConfigurations:用于表示该USB设备所支持的配置数。

1.2 配置描述符

配置描述符具有9字节长度,针对设备给予配置的信息,包括配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。以下列出配置描述符的范例、数值以及各个字段的意义。

 struct _CONFIGURATION_DEscriptOR_STRUCT

{
   

 BYTE bLength;          //配置描述符的长度,固定为9个字节
 BYTE bDescriptorType;  //描述符类型编号,为0x02
 WORD wTotalLength;     //配置所返回的所有数量的大小
 BYTE bNumInterface;    //此配置所支持的接口数量
 BYTE bConfigurationVale;   //Set_Configuration命令需要的参数值
 BYTE iConfiguration;       //描述该配置的字符串的索引值
 BYTE bmAttribute;          //供电模式的选择
 BYTE MaxPower;             //设备从总线提取的最大电流

}

 bLength:用于表示配置描述符的长度,固定为9个字节,即0x09。
 bDescriptorType:用于表示配置描述符的类型值,固定为0x02。
 wTotalLength:用于表示配置信息的总长度,包括配置描述符、接口描述符、端点描述符长度的总和。
 bNumInterfaces:用于表示配置所支持的接口数。一般来说,USB设备的接口至少有一个,因此其最小值为1。
 bConfigurationValue:用于表示USB设备的配置值。
 iConfiguration:用于指出配置字符串描述符的索引值。具体字符串的内容在后面字符串描述符中定义。如果没有配置字符串,可以置为0。
 bmAttributes:用于表示USB设备特性。bmAttributes是接位寻址的,第6位置1表示使用总线电源;第5位置1表示支持远程唤醒功能;该字段其他位均保留,一般来说,第0~4位置0即可,第7位置1即可。
 bMaxPower:用于表示USB设备运行时所需要消耗的总线电流,单位以2mA为基准。USB设备可以从USB总线上获得最大的电流为500mA,因此bMaxPower字段的最大值可以设置为250。

1.3 字符描述符

struct _STRING_DEscriptOR_STRUCT

{
   

 BYTE bLength;          //设备描述符的字节数大小,为0x12
 BYTE bDescriptorType;  //描述符类型编号,为0x03
 BYTE SomeDescriptor[36];          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤舟簔笠翁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值