Cypress USB描述符的格式与含义

目录

1. USB设备描述符:DeviceDscr

2. 设备限定描述符:DeviceQualDscr

3. 配置描述符:HighSpeedConfigDscr/FullSpeedConfigDscr

4. 接口描述符:Interface Descriptor

5. 端点描述符:Endpoint Descriptor

6. 字符串描述符:StringDscr

7. 参考


    Cypress USB描述符表示了USB设备的特性,这些描述符中的字段均有固定的排列顺序,一般来说bLength为第一个字段,bDescriptorType为第二个字段。这些字段名称的前缀指出了该字段的的长度,有如下几类:

  • b表示一个字节(8bit);
  • w表示一个字(16bit);
  • bm表示按位寻址;
  • bcd表示采用二进制编码的10进制数;
  • i表示索引值;
  • id表示标示码。

1. USB设备描述符:DeviceDscr

USB设备描述符由14个字段组成,总长度固定为18个字节,格式如表1所示。

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

其中:db表示双字节大小为16bit;dw表示双字大小为32bit。

表1. 设备描述符

地址偏移量

字段名

长度/字节

说明

0

bLength

1

描述符的长度(12H字节)

1

bDescriporType

1

描述符类型值:设备描述符=01H

2

bcdUSB

2

USB规范版本号,用bcd码表示,2字节。例如2.0版本,值为0200H,用bcd码表示,低字节在前,高字节在后,表示为0002H;同理,1.1版本,则表示为1001H。

4

bDeviceClass

1

指明USB设备所属的设备类:

(1)=0,表示USB各接口相互独立工作,分属不通的设备类,具体信息在接口描述符中说明;

(2)=1~FEH,表明该USB设备属于某个明确的设备类,例如04H代表显示设备;

(3)=FFH,厂商自定义的设备类。

5

bDeviceSubClass

1

指明USB设备所述的设备子类。其值依赖bDeviceClass。

(1)=0,此时bDeviceClass必须首先为0;

(2)=1~FEH,详细的设备子类;

例如如果bDeviceClass=04H,是显示设备,则bDeviceSubClass=01H,表示CRT显示器;

(3)=FFH,厂家自定义。

 

6

bDevicePortcol

1

指明USB所使用的设备类协议。其值依赖bDeviceClass和bDeviceSubClass。

=0,表示该设备不使用任何设备类协议;

=1~FEH,则该USB必须属于某个明确的设备类和子设备类。如视频类协议(UVC),音频类协议(UAC)等;

=FFH,厂家自定义。

7

bMaxPacketSize0

1

指明该USB设备端点0控制传输所支持的最大数据包长度,对于低速设备端点0所支持最大数据包长度是8;全速设备是8、16、32、64;高速设备是64。

8

idVendor

2

供应商ID

10

idProduct

2

产品识别码

12

bcdDevice

2

指明USB设备版本号。

14

iManuFacture

1

厂商信息字符串索引值,没有时为0。这里为1,即下面的“Cypress”字符串。

15

iProduct

1

产品信息字符串索引值,没有时为0。后面的“EZ-USB”字符串。

16

iSerial

1

USB设备序列号信息字符串索引值,没有时为0。

17

bNumConfigurations

1

指明USB设备所支持的配置数。如果USB设备支持两种传输速率,则该字段指出的是该速率下的配置数,而不是两种速率下的配置数和。

2. 设备限定描述符:DeviceQualDscr

仅当该USB为高速USB设备,且设备既需支持高速(High Speed)又需支持全速(Full)时,就需要用到设备限定描述符。例如该高速USB设备目前工作于全速模式,则该描述符中包含高速模式的总体信息。

设备限定描述符,9个字段,共10字节。设备限定描述符格式见表2所示。

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 
表2. 设备限定描述符

地址偏移量

字段名

长度/字节

说明

0

bLength

1

描述符的长度(0AH字节)

1

bDescriporType

1

描述符类型值:设备限定描述符=06H

2

bcdUSB

2

USB规范版本号(BCD码)

4

bDeviceClass

1

类代码

5

bDeviceSubClass

1

子类代码

6

bDeviceProtocol

1

该设备所使用的设备类协议

7

bMaxPacketSize0

1

端点0控制传输所支持的最大数据包长度,单位字节。

8

bNumConfigurations

1

另一速率所支持的配置数。

9

bReserved

1

保留,必须为0。

3. 配置描述符:HighSpeedConfigDscr/FullSpeedConfigDscr

配置描述符包含8个字段,共9字节。所有的USB设备至少包含一个配置描述符,例如这里包含两个配置描述符高速HighSpeedConfigDscr和全速FullSpeedConfigDscr。配置描述符格式如表3所示。

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    100                                                ;; Power requirement (div 2 ma)
表3. 配置描述符

地址偏移量

字段名

长度/字节

说明

0

bLength

1

描述符长度(09H字节)

1

bDescriporType

1

描述符类型值:配置描述符=02H

2

wTotalLength LSB

1

指明配置信息总长度,2字节表示。为配置描述符,接口描述符,端点描述符,设备类定义描述符,供应商自定义描述符长度的和。在这里只有配置、接口和端点描述符。

3

wTotalLength MSB

1

同上

4

bNumInterface

1

指明该配置所支持的接口数,最小为1。

5

bConfigurationValue

1

指明该配置的配置值。例如这里值为1,在重枚举时,主机发送Setconfiguration(x),当x=1时,就调用该配置。

6

iConfiguration

1

该配置的字符串索引值,没有时为0。

7

bmAttributes

1

指明该配置的特性,8位。

b0~b4,保留,必须为0;

b5:远程唤醒选择。=1,支持远程唤醒;=0,不支持远程唤醒;

b6:是否总线电源选择。如果该USB设备外加了电源,=1,使用总线电源;=0,使用自供的电源;

b7:必须为1。

在主机设备请求case SC_GET_STATUS,case GS_DEVICE中获得该信息。

8

bMaxPower

1

总线供电时,该USB设备可获得的最大电流。单位2mA,所以最大值为250。如果该电流得不到满足,USB将不能使用这个配置。

4. 接口描述符:Interface Descriptor

    接口描述符有9个字段,共9字节。注意,主机不能用SetDescription和GetDescription来设置和读取接口描述符,它只能作为配置描述符的一部分信息返回,在主机发送case SC_GET_DESCRIPTOR,且case GD_CONFIGURATION时一并读取。所以我们看到,在fw.c文件中并没有对接口描述符的判断。

;; 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    6                         ;; 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
表4. 接口描述符

地址偏移量

字段名

长度/字节

说明

0

bLength

1

描述符长度(09H字节)

1

bDescriporType

1

描述符类型值:配置描述符=04H

2

bInterfaceNumber

1

指明该接口的接口号。

3

bAlternateSetting

1

指明接口的可替换设置值。

4

bNumberEndpoints

1

指明接口所使用的断点数,不包括端点0。

5

bInterfaceClass

1

指明接口所使用的设备类。

=0,保留;

=1~FEH,表明该接口属于某个明确的USB设备类;

=FFH,厂家自定义的设备类。

6

bInterfaceSubClass

1

该接口所属的USB设备子类。

7

bInterfaceProtocol

1

该接口所使用的设备类协议。

8

iInterface

1

接口字符串描述符的索引值,没有时为0。

5. 端点描述符:Endpoint Descriptor

端点描述符有6个字段,共7字节。和接口描述符一样,也不能由主机通过发送GetDedcription()请求读取,只能作为配置信息case GD_CONFIGURATION的一部分返回给主机。

;; Endpoint Descriptor
db    DSCR_ENDPNT_LEN         ;; Descriptor length
db    DSCR_ENDPNT             ;; Descriptor type
db    02H                     ;; Endpoint number, and direction
db    ET_BULK                 ;; Endpoint type
db    00H                     ;; Maximun packet size (LSB)
db    02H                     ;; Max packect size (MSB)
db    00H                     ;; Polling interval
表5. 端点描述符

地址偏移量

字段名

长度/字节

说明

0

bLength

1

描述符长度(07H字节)

1

bDescriporType

1

描述符类型值:配置描述符=05H

2

bEndpointAddress

1

指明端点的端点号及传输方向。

b0~b3:该端点的端点号。如0001端点1,0010端点2;

b4~b6:保留,必须为0;

b7:端点传输方向。1-IN传输;0-OUT传输

3

bmAttributes

1

指明端点的一些特性。

b0~b1:端点的传输类型。00-控制传输,01-同步传输,10-块传输,11-中断传输。

b2~b3:当该端点为同步端点时,这两位指出同步类型。00-非同步,01-异步,10-自适应,11-同步。

b4~b5:端点用法类型。00-数据端点,01-显示反馈端点,10-隐式反馈端点,11-保留。

b6~b7:保留,必须为0。

4

wMaxpacketSize LSB

1

指明端点所支持的最大数据包长度,共16位。

b0~b10:端点所支持的最大数据包长度。

b11~b12:当该端点为高速中断或同步端点时,这两位指出每小帧中最多传输的事务数。00-每小帧1次(默认),01-每小帧2次(附加一次),10-每小帧3次(附加2次),11-保留。

b13~b15:保留,必须为0。

5

wMaxpacketSize MSB

1

高8位。数据包大小为:0000 0010 0000 0000,取0~10位,还是0200,512字节。

6

bInterval

1

指明端点数据传输的访问间隔。

低速中断端点:=10~255ms;

全速中断端点:=1~255ms;

高速中断端点:=1~16,访问间隔为2(bInterval-1)(幂)×1us;

全速/高速同步端点:=1~16,访问间隔为2(bInterval-1)(幂)×1ms 和2(bInterval-1)(幂)×1us;

高速块/控制out端点:指明其最大NAK握手包发送速率。=0,表示该端点永远不会发出NAK握手包;=其他值,表示每个bInterval时间内,该端点最多只能发送一次NAK握手包。

其他类型端点:该字段无效。

6. 字符串描述符:StringDscr

    字符串描述符是可选的,用于保存一些供应商名称、产品序列号等文本信息。字符串描述符格式如表6所示。

表6. 字符串描述符

地址偏移量

字段名

长度/字节

说明

0

bLength

1

描述符长度(N+2字节)

1

bDescriporType

1

描述符类型值:配置描述符=03H

2

bString

N

Unicode编码的字符串

    这里的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:

说明:db  'C',00中'C'为8bit的ASCII码,'C',00为16bit的Unicode编码,用于字符编码转换!

7. 参考

[1] Cypress固件架构彻底解析及USB枚举 - walter的博客 - 与非博客 - 与非网

[2] 基本固件框架的追踪研读之描述符1 - molake10344 - CSDN博客

你可能感兴趣的:(USB开发,USB接口开发)