U盘实现——U 盘枚举过程

文章目录

  • U 盘枚举过程
    • 代码地址
    • 配置描述符集合结构
    • 配置描述符集合实现
      • 配置描述符
      • 接口描述符
      • 输入端点描述符
      • 输出端点描述符

U 盘枚举过程

设备描述符,字符串描述符及设备限定描述符与 USB 鼠标实现 一致,这里仅介绍不同点。

代码地址

代码地址

配置描述符集合结构

USB - 描述符之间的关系 中可以知道,U 盘需要两个端点,一个输入端点和一个输出端点,且端点类型为 批量端点,所以此时的配置描述符集合结构为

{
    配置描述符,
    接口描述符,
    输出端点描述符,
    输入端点描述符
}

配置描述符集合实现

获取配置描述符

0x80 0x6 0x0 0x2 0x0 0x0 0xff 0x0
  • bmRequestType:0x80
    • 数据传输方向为 1,device-to-host
    • 标准请求
    • 请求的接收者为设备
  • bRequest:0x06
    • GET_DESCRIPTOR 获取描述符请求
  • wValue:0x0002(LSB)
    • 低位:0x02 配置描述符
    • 高位:0x00 索引号
  • wIndex:0x0000(LSB)
    • 低位:0x00
    • 高位:0x00
  • wLength:0xff
    • 低位:0xff 请求返回的字节数为 0xff,设备实际返回的字节数可以比该域指定的字节数少
    • 高位:0x00

配置描述符返回

0x9 0x2 0x20 0x0 0x1 0x1 0x0 0x80 0x32 0x9 0x4 0x0 0x0 0x2 0x8 0x6 0x50 0x0 0x7 0x5 0x1 0x2 0x40 0x0 0x0 0x7 0x5 0x81 0x2 0x40 0x0 0x0

配置描述符

  • 配置描述符 (0x9 0x2 0x20 0x0 0x1 0x1 0x0 0x80 0x32)
    • bLength:0x09
      • 描述符的长度。配置描述符的长度为 0x09。
    • bDescriptorType:0x02
      • 描述符的类型。配置描述符的类型编码为 0x02。
    • wTotalLength:0x0020
      • 整个配置描述符集合的总长度,包括配置描述符,接口描述符,输出端点描述符和输入端点描述符,低字节在前。
    • bNumInterfaces:0x01
      • 该配置所支持的接口数量。通常功能单一的设备只具有一个接口,而复合设备则具有多个接口 。
    • bConfigurationValue:0x01
      • 该配置的值。通常一个 USB 设备可以支持多个配置。
    • iConfiguration:0x00
      • 描述该配置的字符串的索引值,如果该值为 0 ,表示没有字符串。
    • bmAttributes:0x80
      • 用来描述设备的一些特性。
      • bit7 reserved(set to one)
      • bit5 remote wakeup
    • bMaxPower:0x32
      • 表示设备需要从总线获取的最大电流量,单位为 2 mA。

接口描述符

接口类代码表集

typedef enum
{
    USB_CLASS_UNSPECIFIED          = 0    ,
    USB_CLASS_AUDIO                = 1    ,
    USB_CLASS_CDC                  = 2    ,
    USB_CLASS_HID                  = 3    ,
    USB_CLASS_RESERVED_4           = 4    ,
    USB_CLASS_PHYSICAL             = 5    ,
    USB_CLASS_IMAGE                = 6    ,
    USB_CLASS_PRINTER              = 7    ,
    USB_CLASS_MSC                  = 8    ,
    USB_CLASS_HUB                  = 9    ,
    USB_CLASS_CDC_DATA             = 10   ,
    USB_CLASS_SMART_CARD           = 11   ,
    USB_CLASS_RESERVED_12          = 12   ,
    USB_CLASS_CONTENT_SECURITY     = 13   ,
    USB_CLASS_VIDEO                = 14   ,
    USB_CLASS_PERSONAL_HEALTHCARE  = 15   ,
    USB_CLASS_AUDIO_VIDEO          = 16   ,

    USB_CLASS_DIAGNOSTIC           = 0xDC ,
    USB_CLASS_WIRELESS_CONTROLLER  = 0xE0 ,
    USB_CLASS_MISC                 = 0xEF ,
    USB_CLASS_APPLICATION_SPECIFIC = 0xFE ,
    USB_CLASS_VENDOR_SPECIFIC      = 0xFF
}usb_class_code_t;

MSC 子类代码集

typedef enum
{
    MSC_SUBCLASS_RBC = 1 , ///
    MSC_SUBCLASS_SFF_MMC , ///
    MSC_SUBCLASS_QIC     , ///< QIC-157. Typically used by a tape device
    MSC_SUBCLASS_UFI     , ///
    MSC_SUBCLASS_SFF     , ///
    MSC_SUBCLASS_SCSI      ///< SCSI transparent command set
}msc_subclass_type_t;

MSC 传输协议集

typedef enum
{
    MSC_PROTOCOL_CBI              = 0 ,  ///
    MSC_PROTOCOL_CBI_NO_INTERRUPT = 1 ,  ///
    MSC_PROTOCOL_BOT              = 0x50 ///< Bulk-Only Transport
}msc_protocol_type_t;
  • 接口描述符 (0x9 0x4 0x0 0x0 0x2 0x8 0x6 0x50 0x0)
    • bLength:0x09
      • 描述符的长度。标准的 USB 接口描述符的长度为 9 字节
    • bDescriptorType:0x04
      • 描述符的类型。接口描述符的类型编码为 0x04
    • bInterfaceNumber:0x00
      • 接口的编号。当一个配置具有多个接口时,每个接口的编号都不同。第一个接口,编号为 0
    • bAlternateSetting:0x00
      • 接口的备用编号,为 0
    • bNumEndpoints:0x02
      • 非 0 端点的数目。U 盘需要一个批量输入端点和一个批量输出端点,所以为 2
    • bInterfaceClass:0x08
      • 该接口所使用的类。U 盘使用的子类代码为 0x08
    • bInterfaceSubClass:0x06
      • 该接口所使用的子类。U 盘使用 SCSI 子类代码集,即 0x06
    • bInterfaceProtocol:0x50
      • 接口使用仅批量传输协议,为 0x50
    • iInterface:0x00
      • 接口的字符串的索引值。没有,设置为 0

输入端点描述符

0x7 0x5 0x1 0x2 0x40 0x0 0x0
  • 端点描述符 (0x7 0x5 0x1 0x2 0x40 0x0 0x0)
    • bLength:0x07
      • 描述符的长度。标准的 USB 端点描述符的长度为 7 字节
    • bDescriptorType:0x05
      • 描述符的类型,端点描述符的类型编码为 0x05
    • bEndpointAddress:0x01
      • 端点的地址, 第 7 位表示数据方向,输出端点 D7 为 0。所以输入端点 1 的地址为 0x01
    • bmAttributes:0x02
      • D1~D0 为端点传输类型选择, 该端点为批量端点。批量端点的编号为 2。其它位保留为 0
    • wMaxPacketSize:0x0040
      • 该端点的最大包长,低位为 0x40。端点 1 的最大包长为 64 字节, LSB 低字节在前
    • bInterval:0x00
      • 对于中断端点,表示查询的帧间隔数,这里对批量端点无意义。

输出端点描述符

0x7 0x5 0x81 0x2 0x40 0x0 0x0
  • 端点描述符 (0x7 0x5 0x81 0x2 0x40 0x0 0x0)
    • bLength:0x07
      • 描述符的长度。标准的 USB 端点描述符的长度为 7 字节
    • bDescriptorType:0x05
      • 描述符的类型,端点描述符的类型编码为 0x05
    • bEndpointAddress:0x81
      • 端点的地址, 第 7 位表示数据方向,输出端点 D7 为 。所以输出端点 1 的地址为 0x81
    • bmAttributes:0x02
      • D1~D0 为端点传输类型选择, 该端点为批量端点。批量端点的编号为 2。其它位保留为 0
    • wMaxPacketSize:0x0040
      • 该端点的最大包长,低位为 0x40。端点 1 的最大包长为 64 字节, LSB 低字节在前
    • bInterval:0x00
      • 对于中断端点,表示查询的帧间隔数,这里对批量端点无意义。

你可能感兴趣的:(U盘,配置描述符,批量端点,BOT,MSC)