typedef struct __attribute__ ((packed)){
union {
struct __attribute__ ((packed)) {
uint8_t recipient : 5; ///< Recipient type usb_request_recipient_t.
uint8_t type : 2; ///< Request type usb_request_type_t.
uint8_t direction : 1; ///< Direction type. usb_dir_t
} bmRequestType_bit;
uint8_t bmRequestType;
};
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
} usb_control_request_t;
一个字节,使用结构体的位域表示
typedef enum
{
USB_DIR_OUT = 0,
USB_DIR_IN = 1,
USB_DIR_IN_MASK = 0x80
}usb_dir_t;
typedef enum
{
USB_REQ_TYPE_STANDARD = 0,
USB_REQ_TYPE_CLASS,
USB_REQ_TYPE_VENDOR,
USB_REQ_TYPE_INVALID
}usb_request_type_t;
typedef enum
{
USB_REQ_RCPT_DEVICE =0,
USB_REQ_RCPT_INTERFACE,
USB_REQ_RCPT_ENDPOINT,
USB_REQ_RCPT_OTHER
}usb_request_recipient_t;
一个字节
typedef enum
{
USB_REQ_GET_STATUS = 0 ,
USB_REQ_CLEAR_FEATURE = 1 ,
USB_REQ_RESERVED = 2 ,
USB_REQ_SET_FEATURE = 3 ,
USB_REQ_RESERVED2 = 4 ,
USB_REQ_SET_ADDRESS = 5 ,
USB_REQ_GET_DESCRIPTOR = 6 ,
USB_REQ_SET_DESCRIPTOR = 7 ,
USB_REQ_GET_CONFIGURATION = 8 ,
USB_REQ_SET_CONFIGURATION = 9 ,
USB_REQ_GET_INTERFACE = 10 ,
USB_REQ_SET_INTERFACE = 11 ,
USB_REQ_SYNCH_FRAME = 12
}usb_request_code_t;
两个字节(LSB 低字节在前,高字节在后)
第一个字节 (低字节):表示索引号,用来选择同一种描述符中具体的某个描述符
第二个字节表述描述符的类型编号:各种描述符的类型标号如下所示
typedef enum
{
USB_DESC_DEVICE = 0x01,
USB_DESC_CONFIGURATION = 0x02,
USB_DESC_STRING = 0x03,
USB_DESC_INTERFACE = 0x04,
USB_DESC_ENDPOINT = 0x05,
USB_DESC_DEVICE_QUALIFIER = 0x06,
USB_DESC_OTHER_SPEED_CONFIG = 0x07,
USB_DESC_INTERFACE_POWER = 0x08,
USB_DESC_OTG = 0x09,
USB_DESC_DEBUG = 0x0A,
USB_DESC_INTERFACE_ASSOCIATION = 0x0B,
USB_DESC_BOS = 0x0F,
USB_DESC_DEVICE_CAPABILITY = 0x10,
USB_DESC_FUNCTIONAL = 0x21,
// Class Specific Descriptor
USB_DESC_CS_DEVICE = 0x21,
USB_DESC_CS_CONFIGURATION = 0x22,
USB_DESC_CS_STRING = 0x23,
USB_DESC_CS_INTERFACE = 0x24,
USB_DESC_CS_ENDPOINT = 0x25,
USB_DESC_SUPERSPEED_ENDPOINT_COMPANION = 0x30,
USB_DESC_SUPERSPEED_ISO_ENDPOINT_COMPANION = 0x31
}usb_desc_type_t;
两个字节(LSB 低字节在前,高字节在后)
不同的请求对于其接收者,wValue 和 wIndex ,其各字段的意义是不一样的
两个字节(LSB 低字节在前,高字节在后)
请求设备返回的字节数,设备实际返回的字节数可以比该域指定的字节数少。
不同的请求对于其接收者,wValue 和 wIndex ,其各字段的意义是不一样的。下表是各个标准请求的结构以及数据过程需要传输的数据。其中第一列有的有多个,主要是最低 5 位不同,即表示接受者不同。有的请求只能发送到设备,而有的请求可以发送到设备、接口和端点。常用的几个请求为 GET_DESCRIPTOR、SET_ADDRESS 和 SET_CONFIGURATION。
下面以 USB 鼠标为例,查看 USB 标准请求的数据如下所示
USB 标准请求数据为
- 0x80 数据传输方向为设备到主机,标准请求,请求的接受者为设备
- 0x06 获取描述符的请求
- 0x00
- 0x01 描述符类型为设备描述符
- 0x00
- 0x00
- 0x40 请求的长度为 64 字节
- 0x00