前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >USB 描述符和 USB 枚举

USB 描述符和 USB 枚举

作者头像
Jasonangel
发布2023-08-22 13:55:17
5990
发布2023-08-22 13:55:17
举报
文章被收录于专栏:嵌入式Linux系统开发

1. USB 设备状态切换图

2. 标准设备请求

2.1 SETUP 事务的数据格式

Host 使用控制传输来识别设备、设置设备地址、启动设备的某些特性,对于控制传输,它首先发出"setup 事务",如下:

在"setup事务"中,

  • SETUP 令牌包:用来通知设备,"要开始传输了"
  • DATA0 数据包:它含有固定的格式,用来告诉设备"是读还是写"、"读什么"、"写什么"

Host 通过 DATA0 数据包发送 8 字节数据给设备,它的格式如下图所示:

2.2 标准设备请求

控制传输的建立事务中,可以使用下列格式的数据:

上表中各个"宏"取值如下:

2.2 设备/配置/接口/端点

在 SETUP 事务的数据里,表示了要访问的是什么:Device?Interface?Endpoint?

对于一个 USB 设备,它可以多种配置(Configuration)。比如 4G 上网卡就有 2 种配置:U 盘、上网卡。第 1 次把 4G 上网卡插入电脑时,它是一个 U 盘,可以按照里面的程序。装好程序后,把它再次插入电脑,它就是一个上网卡。驱动程序可以选择让它工作于哪种配置,同一时间只能有一种配置。大多数的USB设备只有一种配置。

一个配置下,可以有多个接口(Interface),接口等同于功能(Function)。比如USB 耳机有两个接口(功能):声音收发、按键控制。

一个接口,可能有多个设置(Setting),比如默认设置下它使用较低的带宽,可以选择其他设置以使用更高带宽。

一个接口,由一个或多个端点(Endpoint)组成。端点 0 属于整个设备的,端点 0是双向的。接口还可以有其他端点,这些端点是单向的,要么是批量(Bulk)端点、要么是中断(Interrupt)端点、要么是同步(Isochronous)端点。

3. 描述符

怎么描述设备、配置、接口、端点?使用描述符(Descriptors),有设备描述符、配置描述符、接口描述符、端点描述符。所谓描述符,就是一些格式化的数据,用来描述信息。一个 USB 设备,

  • 只有一个设备描述符:用来表示设备的 ID、它有多少个配置、它的端点 0 一次最大能传输多少字节数据
  • 可能有多个配置描述符:用来表示它有多少个接口、供电方式、最大电流
  • 一个配置描述符下面,可能有多个接口描述符:用来表示它是哪类接口、有几个设置(Setting)、有几个端点
  • 一个接口描述符符下面,可能有多个端点描述符:用来表示端点号、方向(IN/OUT)、类型(批量/中断/同步)

还有一些字符串描述符(String descriptors),它用可读的文字来描述设备,是可选的。

3.1 设备描述符

3.2 配置描述符

3.3 接口描述符

3.4 端点描述符

3.5 示例

在 Ubuntu 中可以执行lsusb -v查看 USB 设备的描述符信息:

代码语言:javascript
复制
$ sudo lsusb -v

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 Unused
  bDeviceProtocol         0 Full speed (or root) hub
  bMaxPacketSize0        64
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0002 2.0 root hub
  bcdDevice            5.04
  iManufacturer           3 Linux 5.4.0-124-generic ehci_hcd
  iProduct                2 EHCI Host Controller
  iSerial                 1 0000:02:03.0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           25
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval              12

4. 设备枚举过程示例

使用"usbprotocolsuite"打开,可以看到设备的枚举过程:

  • 使用控制传输,读取设备信息(设备描述符):第一次读取时,它只需要得到8 字节数据,因为第 8 个数据表示端点 0 能传输的最大数据长度。
  • Host 分配地址给设备,然后把新地址发给设备:
  • 使用新地址,重新读取设备描述符,设备描述符长度是 18:
  • 读取配置描述符:它传入的长度是 255,想一次性把当前配置描述符、它下面的接口描述符、端点描述符全部读出来
  • 读取字符描述符
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式Linux系统开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. USB 设备状态切换图
  • 2. 标准设备请求
    • 2.1 SETUP 事务的数据格式
      • 2.2 标准设备请求
        • 2.2 设备/配置/接口/端点
        • 3. 描述符
          • 3.1 设备描述符
            • 3.2 配置描述符
              • 3.3 接口描述符
                • 3.4 端点描述符
                  • 3.5 示例
                  • 4. 设备枚举过程示例
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档