USB-标准设备请求

USB 标准设备请求

USB-标准设备请求_第1张图片

结构体定义

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;

bmRequestType

一个字节,使用结构体的位域表示

USB-标准设备请求_第2张图片

 

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;

bRequest

一个字节

USB-标准设备请求_第3张图片

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;

wValue

两个字节(LSB 低字节在前,高字节在后)

第一个字节 (低字节):表示索引号,用来选择同一种描述符中具体的某个描述符

第二个字节表述描述符的类型编号:各种描述符的类型标号如下所示

USB-标准设备请求_第4张图片

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;

wIndex

两个字节(LSB 低字节在前,高字节在后)

不同的请求对于其接收者,wValue 和 wIndex ,其各字段的意义是不一样的

  • 获取字符串描述符中,它表示字符串的语言 ID 号

wLength

两个字节(LSB 低字节在前,高字节在后)

请求设备返回的字节数,设备实际返回的字节数可以比该域指定的字节数少。

标准设备请求表

不同的请求对于其接收者,wValue 和 wIndex ,其各字段的意义是不一样的。下表是各个标准请求的结构以及数据过程需要传输的数据。其中第一列有的有多个,主要是最低 5 位不同,即表示接受者不同。有的请求只能发送到设备,而有的请求可以发送到设备、接口和端点。常用的几个请求为 GET_DESCRIPTOR、SET_ADDRESS 和  SET_CONFIGURATION。

USB-标准设备请求_第5张图片

数据抓包分析 

下面以 USB 鼠标为例,查看 USB 标准请求的数据如下所示

USB-标准设备请求_第6张图片

USB 标准请求数据为

  • 0x80 数据传输方向为设备到主机,标准请求,请求的接受者为设备
  • 0x06 获取描述符的请求
  • 0x00
  • 0x01 描述符类型为设备描述符
  • 0x00
  • 0x00
  • 0x40 请求的长度为 64 字节
  • 0x00

注意事项

  • 在 USB 协议中规定,使用的是小端结构,及低字节在先,高字节在后

你可能感兴趣的:(USB,USB,标准设备请求)