USB 设备枚举正确,但我从未看到 bRequest 等于 SET_ADDRESS 的设置事务

USB device is enumerated correctly, but I never see a Setup transaction with bRequest equal to SET_ADDRESS

总结:
在使用 wireshark 捕获 USB 流量时,我看到设备在插入时正确枚举,但我从未看到主机分配的 USB 地址。

详情:
我在 Windows 10 和 Linux 以及几种类型的 USB 设备上都试过了。
我插入一个设备,并使用 Wireshark 捕获 USB 流量。我希望看到一个设置事务,数据包包含 bRequest = 0x05 (SET_ADDRESS) 和包含要分配的地址的 wValue 字。但我从来没有看到这个。 wireshark 捕获确实显示了我预期的其他流量,例如设备的“GET DESCRIPTOR”请求和响应,但没有 SET_ADDRESS。 我拥有的最简单的设备是 USB 1.1 鼠标,下面是 wireshark 捕获(仅摘要行)。

No.     Time           Source                Destination           Protocol Length Info
  1 0.000000       1.1.1                 host                  USB      66     URB_INTERRUPT in
  2 0.000013       host                  1.1.1                 USB      64     URB_INTERRUPT in
  3 0.000029       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
  4 0.000040       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
  5 0.000093       host                  1.1.0                 USBHUB   64     CLEAR_FEATURE Request  [Port 7: C_PORT_CONNECTION]
  6 0.000102       1.1.0                 host                  USBHUB   64     CLEAR_FEATURE Response [Port 7: C_PORT_CONNECTION]
  7 0.000107       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
  8 0.000111       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
  9 0.025302       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 10 0.025316       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 11 0.051308       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 12 0.051322       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 13 0.077299       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 14 0.077313       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 15 0.103306       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 16 0.103319       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 17 0.103370       host                  1.1.0                 USBHUB   64     SET_FEATURE Request    [Port 7: PORT_RESET]
 18 0.103377       1.1.0                 host                  USBHUB   64     SET_FEATURE Response   [Port 7: PORT_RESET]
 19 0.154307       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 20 0.154321       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 21 0.205298       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 22 0.205312       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 23 0.205319       host                  1.1.0                 USBHUB   64     CLEAR_FEATURE Request  [Port 7: C_PORT_RESET]
 24 0.205324       1.1.0                 host                  USBHUB   64     CLEAR_FEATURE Response [Port 7: C_PORT_RESET]
 25 0.256351       host                  1.0.0                 USB      64     GET DESCRIPTOR Request DEVICE
 26 0.257055       1.0.0                 host                  USB      82     GET DESCRIPTOR Response DEVICE
 27 0.257095       host                  1.1.0                 USBHUB   64     SET_FEATURE Request    [Port 7: PORT_RESET]
 28 0.257108       1.1.0                 host                  USBHUB   64     SET_FEATURE Response   [Port 7: PORT_RESET]
 29 0.307248       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 30 0.307259       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 31 0.358299       host                  1.1.0                 USBHUB   64     GET_STATUS Request     [Port 7]
 32 0.358313       1.1.0                 host                  USBHUB   68     GET_STATUS Response    [Port 7]
 33 0.358319       host                  1.1.0                 USBHUB   64     CLEAR_FEATURE Request  [Port 7: C_PORT_RESET]
 34 0.358325       1.1.0                 host                  USBHUB   64     CLEAR_FEATURE Response [Port 7: C_PORT_RESET]
 35 0.420304       host                  1.49.0                USB      64     GET DESCRIPTOR Request DEVICE
 36 0.421084       1.49.0                host                  USB      82     GET DESCRIPTOR Response DEVICE
 37 0.421113       host                  1.49.0                USB      64     GET DESCRIPTOR Request CONFIGURATION
 38 0.421678       1.49.0                host                  USB      73     GET DESCRIPTOR Response CONFIGURATION
 39 0.421696       host                  1.49.0                USB      64     GET DESCRIPTOR Request CONFIGURATION
 40 0.422754       1.49.0                host                  USB      98     GET DESCRIPTOR Response CONFIGURATION
 41 0.422773       host                  1.49.0                USB      64     GET DESCRIPTOR Request STRING
 42 0.423173       1.49.0                host                  USB      68     GET DESCRIPTOR Response STRING
 43 0.423189       host                  1.49.0                USB      64     GET DESCRIPTOR Request STRING
 44 0.424279       1.49.0                host                  USB      100    GET DESCRIPTOR Response STRING
 45 0.424297       host                  1.49.0                USB      64     GET DESCRIPTOR Request STRING
 46 0.424955       1.49.0                host                  USB      78     GET DESCRIPTOR Response STRING
 47 0.425460       host                  1.49.0                USB      64     SET CONFIGURATION Request
 48 0.425747       1.49.0                host                  USB      64     SET CONFIGURATION Response
 49 0.425778       host                  1.49.0                USB      64     GET DESCRIPTOR Request STRING
 50 0.426997       1.49.0                host                  USB      104    GET DESCRIPTOR Response STRING
 51 0.427139       host                  1.49.0                USBHID   64     SET_IDLE Request
 52 0.427345       1.49.0                host                  USBHID   64     SET_IDLE Response
 53 0.427389       host                  1.49.0                USBHID   64     GET DESCRIPTOR Request HID Report
 54 0.428913       1.49.0                host                  USBHID   116    GET DESCRIPTOR Response HID Report
 55 0.429551       host                  1.49.1                USB      64     URB_INTERRUPT in
 56 0.487331       1.49.1                host                  USB      64     URB_INTERRUPT in
 57 0.496308       host                  1.49.1                USB      64     URB_INTERRUPT in

正如预期的那样,主机正在与集线器(在总线 1,地址 1)通信,然后突然在事务 35 中,主机可以与地址 49 处的设备(鼠标)通信。 (我通过查看在事务 36 中捕获的响应来验证这一点,其中包含鼠标的 idVendor 和 idProduct。)
到目前为止我看到的每个文档都说设备地址是由主机分配的,使用类型为 SET_ADDRESS 的设置事务。然而这里有 none。此外,地址 49 (0x31) 未出现在事务 35 中使用该地址之前的任何数据包中。

在 Windows 10 和 Linux 上都可以看到同样的行为。它出现在各种设备上:鼠标、TI 开发板和 USB 耳机。所有设备枚举,可用,并以合理的 USB 地址结束。

我不明白设备如何获取其 USB 地址。我错过了什么?

背景: 总是有人问“你为什么要这样做?”。我正在为支持 USB 的 TI 处理器编写嵌入式代码。我正在调试一些流量,有一次我决定回到基础,跟踪整个启动序列。 SET_ADDRESS 不见了,然后我发现它在其他设备上也不见了。 我想知道为什么。也许其他 transactions/packets 也不见了?

经过更多的搜索和试验,我有了答案。

简短答案: Wireshark 无法显示 USB 地址分配事务,因为它未被 wireshark 使用的 lower-level 库捕获。

全文: 出于某种原因,wireshark 使用的 USB 库似乎没有捕获地址分配。这些库的 Windows 版本 usbpcap 承认 web page 上的这一限制和其他限制。我没有找到 Linux 版本的类似免责声明,但我怀疑相同的技术限制会影响两个版本,这就是为什么我在 Windows 或 Linux.

为了验证 USB 设备枚举是否正常工作,即使没有被 wireshark 捕获,我在 TI ARM 开发板上编写了一个 USB 设备,该开发板上的引脚位于 D+ 和 D- USB 信号线上。我附加了一个逻辑分析仪并捕获了枚举序列。结果与每个 USB 教程中描述的完全一样。这是分配设备地址的枚举序列的一部分: 在令牌数据包(具有设置数据包 ID,仍然使用地址 0,端点 0)之后,具有 DATA0 PID 的设置数据包在其有效载荷中包含预期的 bRequest 字节 0x05(SET_ADDRESS),后跟 wValue 的低字节,在此示例中等于分配的地址 0x26。在查看像这样的捕获时,不要忘记最低有效字节和位排在第一位。因此,为了理解每个字节,您需要在转换为十六进制值之前翻转位流 byte-by-byte。所以 01100100b 变成 0010 0110 或 0x26.