USB标准请求

时间:2024-04-02 09:35:47

1.USB标准设备请求的结构

USB标准请求

1.1 标准请求
bmRequestType 的D6~D5为00的请求,USB协议定义了11个标准请求(bRequest),其名字与相应的bRequest的值如下表:
USB标准请求

表3.5.3是各个标准请求的结构及需要传输的数据,常用的几个请求有:GET_DESCRIPTOR、SET_ADDRESS和SET_CONFIGURATION。下面详细介绍这几个请求:
USB标准请求

1.2 GET_DESCRIPTOR 请求
USB标准请求

需要注意的是 wValue, wIndex, wLength 这三个域都是两字节的,在USB协议中规定,使用的是小段结构,即第字节在先,高字节在后。

wValue,的第一字节(字符)表示同一中描述类型(比如字符串描述符)中具体的某个描述符(如厂商或者产品字符),第二字节表示描述类型的编号。
wIndex,只在获取字符串描述符中表示语言的ID号,除此之外为0。
wLength,表示要求设备返回数据的字节数,设备实际返回可以比它小。

对于全速和低速模式 ,获取描述符的标准请求只有三种:获取设备、配置、字符串的描述符,另外的接口和端点描述符是跟随配置描述符一并返回的,不能单独请求返回。
USB标准请求

1.3 SET_ADDRESS 请求
当设备复位后,都使用默认地址0。主机从地址0的设备获取设备描述符,一旦收到第一次设备描述符之后,主机就会发送设置地址的请求,以尽量减少设备使用公共地址0的时间。
USB标准请求

1.4 SET_CONFIGURATION 请求
SET_CONFIGURATION和SET_ADDRESS请求很类似,区别是wValue的意义:SET_ADDRESS中,wValue的第一字节(低字节)表示设备的地址;SET_CONFIGURATION则为配置的值。该值与配置描述符的配置编号一致时,表示选中该配置,通常为1,因为大多数USB设备只有一种设置;若为0,则设备进入地址设置状态。
USB标准请求

获取描述符请求是在枚举过程中用得最多的一个请求,举一个主机的例子:

0x80, 0x06, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00
它是一个请求设备描述符的标准请求,请求的数据长度64字节。

2.描述符类型的实现

2.1 设备描述符的实现
每个设备必须有且仅有一个设备描述符,结构如表3.6.1所示。
USB标准请求

bLength,表示该描述符的长度,固定的,共18字节。

bDescriptorType,描述符的类型,取值如表3.5.5所示。

bcdUSB,设备使用的USB协议版本。USB1.1可以写成0x0110,小端结构:0x10,0x01;同理USB2.0可以写成0x0200,小端结构:0x00,0x02。

bDeviceClass,设备使用的类代码,一般为0。当为0时,bDeviceSubClass必须为0,bDeviceProtocol也应该为0。当为0xff,表示使用自定义设备类。

bDeviceSubClass,设备使用的子类代码。

bDeviceProtocol,设备使用的协议,为0时不用类所定义的协议,为0xff时使用自定义协议。需要结合设备类和设备子类使用才有意义。

bMaxPackSize0,端点0的最大包长。取值可以是8、16、32、64。

idVender,厂商ID。由USB协会分配,不能随意使用,此外主机驱动一般根据厂商ID、产品ID已经产品***来安装驱动程序。

idProduct,产品ID。

iManufacturer、iProduct、iSerialNumber,相应字符串的索引值,放在wValue的第一字节。为0时,表示没有。

bNumConfigurations,大部分USB设备只有一个配置,即该字段值为1。

代码如下:

/* USB Standard Device Descriptor,设备描述符 /
const uint8_t Virtual_Com_Port_DeviceDescriptor[] = {
0x12, /
bLength,该描述符长度(18字节) /
USB_DEVICE_DESCRIPTOR_TYPE, /
bDescriptorType,设备描述符为0x01 /
0x00, 0x02, /
bcdUSB = 2.00, 本设备使用的USB版本 /
0x02, /
bDeviceClass: CDC,类代码 /
0x00, /
bDeviceSubClass:子类代码 /
0x00, /
bDeviceProtocol:设备所使用的协议 /
0x40, /
bMaxPacketSize0:端点0最大包长 /
0x83, 0x04, /
idVendor = 0x0483:厂商ID /
0x40, 0x57, /
idProduct = 0x5740: 产品ID /
0x00, 0x02, /
bcdDevice = 2.00: 设备版本号 /
1, /
iManufacturer: 描述厂商的字符串索引 /
2, /
iProduct: 描述产品的字符串索引 /
3, /
iSerialNumber: 描述***的字符串索引 /
0x01 /
bNumConfigurations:可能的配置数 */
};

2.2 配置描述符的结构
USB标准请求

bmAtrributes:D7,保留必须为1。D6为供电方式,1表示设备自供电,0表示设备是总线供电的。D5为1时表示支持远程唤醒,0不支持。D4~D0,保留设为0。
2.3 接口描述符
USB标准请求

2.4 端点描述符
USB标准请求

bEndPointAddress:最高位D7为该端点的传输方向,1为主机输入(像Input的首字母),0为主机输出(像Output首字母)
bmAttributes:最低位D1~D0:表示传输类型,0为控制传输,1为等时传输,2为批量传输,3为中断传输。
如果该端点是非等时传输,D7-D2为0。否则,D3~D2表示同步的类型:0为无同步,1为异步,2为适配,3为同步。
       D5-D4表示用途:0为数据端点,1为反馈端点,2为暗含反馈的数据端点,3是保留值。D7~D6,保留。
bInterval:对于中断端点,表示查询的帧间隔数。

2.5 HID描述符的结构
USB鼠标属于HID类,HID类的设备在配置描述时还需要一个HID描述符,它是一个类描述符,应该跟在接口描述符后面。
USB标准请求

bLength:是该描述符的总长度,它的大小与该描述符中下级描述符的个数有关。例如只有一个下级描述符时,总长为 1+1+2+1+1+1+2=9字节。
bcdHID:使用USB HID1.1协议,因此为0x0110。
bCountryCode:美式键盘为33,即0x21。
bNumDescriptors:下级描述符的数量,至少为1。
bDescriptorType:下级描述符的类型,报告描述符的编号为0x22,物理描述符的编号为0x23。