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 , ///<Reduced Block Commands (RBC) T10 Project 1240-D
    MSC_SUBCLASS_SFF_MMC , ///<SFF-8020i, MMC-2 (ATAPI). Typically used by a CD/DVD device
    MSC_SUBCLASS_QIC     , ///< QIC-157. Typically used by a tape device
    MSC_SUBCLASS_UFI     , ///<UFI. Typically used by Floppy Disk Drive (FDD) device
    MSC_SUBCLASS_SFF     , ///<SFF-8070i. Can be used by Floppy Disk Drive (FDD) device
    MSC_SUBCLASS_SCSI      ///< SCSI transparent command set
}msc_subclass_type_t;

MSC 传输协议集

typedef enum
{
    MSC_PROTOCOL_CBI              = 0 ,  ///<Control/Bulk/Interrupt protocol (with command completion interrupt)
    MSC_PROTOCOL_CBI_NO_INTERRUPT = 1 ,  ///<Control/Bulk/Interrupt protocol (without command completion interrupt)
    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
      • 对于中断端点,表示查询的帧间隔数,这里对批量端点无意义。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值