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.
总结:
在使用 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 教程中描述的完全一样。这是分配设备地址的枚举序列的一部分: