在USB协议中,将USB作为一个配置、端点和接口的集合。USB设备的描述符包括标准描述符、HID描述符和Hub描述符。这里主要介绍USB标准设备描述符。
1、设备描述符DeviceDscr
用于表示USB设备的总体信息,一个USB设备只能有一个设备描述符。
bcdUSB,的格式是0xAABC,其中AA是主版本号,B是次版本号,C是子次版本号(注意USB数据传输过程中,是先传低字节再传高字节),例如USB2.0,应设置成0200H,而在描述符的数据结构中就应该写成0002H;高字节表示整数,低字节的高四位代表十分位,低字节的低四位代表百分位,例如USB1.1,应该设置成0110H,而不是0101H,而在描述符的数据结构中就应该写成1001H。
bDeviceClass,该字段值为0时,表示USB设备的各个接口相互独立,分别属于不同的设备类,在USB固件接口描述符中将进一步定义;该字段在1~FEH之间时,表示USB协议中定义的某个设备类;该字段为FFH时,表示是供应商自定义的设备类:
可以看出,除非特殊需要(09H、EFH、FFH),都可以将其设置成00H,然后再在接口描述符中设定设备类型:
bDeviceSubClass,如果bDeviceClass是0,该字段也必须是0;该字段是FFH时,表示由供应商自定义子类。
bMaxPacketSize0 ,对于低速设备端点0所支持最大数据包长度是8;全速设备是8、16、32、64;高速设备是64。
idVendor 、idProduct,是主机为其加载合适的驱动程序;
看一下设备描述符的源代码:
DeviceDscr:
db DSCR_DEVICE_LEN ;; Descriptor length
db DSCR_DEVICE ;; Decriptor type
dw 0002H ;; Specification Version (BCD)
db 00H ;; Device class
db 00H ;; Device sub-class
db 00H ;; Device sub-sub-class
db 64 ;; Maximum packet size
dw 0B404H ;; Vendor ID
dw 0410H ;; Product ID (Sample Device)
dw 0000H ;; Product version ID
db 1 ;; Manufacturer string index
db 2 ;; Product string index
db 0 ;; Serial number string index
db 1 ;; Number of configurations
2、配置描述符 ConfigDscr
wTotalLength ,用于表示配置信息的总长度,包括配置描述符、接口描述符和端点描述符长度的总和。
bConfigurationValue ,表明 Get Configuration and Set Configuration requests的配置,必须≥1 。
不懂啊
iConfiguration ,指出用于描述该配置的字符串描述符的索引值,如果没有配置字符串,可以置为0 。
bmAttributes ,(按位寻址)用于表示USB设备的配置特性,BIT6 = 1表示使用总线电源,BIT5 = 1表示支持远程唤醒;其他位保留,一般来说,BIT4~BIT0置0即可,BIT7置1即可。
HighSpeedConfigDscr:
db DSCR_CONFIG_LEN ;; Descriptor length
db DSCR_CONFIG ;; Descriptor type
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) mod 256 ;; Total Length (LSB)
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) / 256 ;; Total Length (MSB)
db 1 ;; Number of interfaces
db 1 ;; Configuration number
db 0 ;; Configuration string
db 10000000b ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu)
db 50 ;; Power requirement (div 2 ma)
3、字符串描述符 StringDscr
字符串描述符是可选的,用于保存一些供应商名称、产品序列号等文本信息。
这里的bString,实际上是由两种情况构成:bSTRING 或者wLANGID。
对于字符串0,是一个或多个语言标识码(16BIT),比如U.S. English (0409h) ;对于其他字符串描述符则是一个Unicode UTF-16 LE字符串,这种编码格式下,大部分字符被编成16BIT,这种编码的低字节是字符的ASCII吗
StringDscr:
StringDscr0:
db StringDscr0End-StringDscr0 ;; String descriptor length
db DSCR_STRING
db 09H,04H
StringDscr0End:
StringDscr1:
db StringDscr1End-StringDscr1 ;; String descriptor length
db DSCR_STRING
db 'C',00
db 'y',00
db 'p',00
db 'r',00
db 'e',00
db 's',00
db 's',00
StringDscr1End:
StringDscr2:
db StringDscr2End-StringDscr2 ;; Descriptor length
db DSCR_STRING
db 'E',00
db 'Z',00
db '-',00
db 'U',00
db 'S',00
db 'B',00
StringDscr2End:
难道字符串的“索引值”,是字符串书写的自然顺序!
4、接口描述符
接口是端点的集合,负责完成该USB设备的特定功能
bNumEndpoints ,是端点0以外的本接口使用的所有端点。
;; Interface Descriptor
db DSCR_INTRFC_LEN ;; Descriptor length
db DSCR_INTRFC ;; Descriptor type
db 0 ;; Zero-based index of this interface
db 0 ;; Alternate setting
db 4 ;; Number of end points
db 0ffH ;; Interface class
db 00H ;; Interface sub class
db 00H ;; Interface sub sub class
db 0 ;; Interface descriptor string index
5、端点描述符 Endpoint Descriptor
用于指出设备端点的特性,包括所支持的传输类型、传输方向等信息。
bEndpointAddress ,BIT7表示端点的传输方向,BIT7 = 1:IN;
BIT7 = 0 :OUT。BIT3~BIT0表示端点号。其余位均保留,必须置0.
上面的这段代码的所设置的端点如下:
6、设备限定描述符
DeviceQualDscr:
db DSCR_DEVQUAL_LEN ;; Descriptor length
db DSCR_DEVQUAL ;; Decriptor type
dw 0002H ;; Specification Version (BCD)
db 00H ;; Device class
db 00H ;; Device sub-class
db 00H ;; Device sub-sub-class
db 64 ;; Maximum packet size
db 1 ;; Number of configurations
db 0 ;; Reserved