【发布时间】:2018-02-17 14:36:14
【问题描述】:
我正在为 Linux 4.15.x 编写 USB OTG 外设驱动程序。我在为我的 OTG 外围设备设置地址时遇到了一些问题。
在外围 USB 端,我收到以下字节的设置地址:0x0、0x5、0x14、0x0、0x0、0x0、0x0、0x0。这意味着我应该在我的外围设备中设置给定的地址。但可能我做错了什么,因为在设置给定地址后,我的外围 USB 设备停止从 USB 总线接收任何内容。我的意思是我没有通过 USB 收到进一步的请求。
同时在 PC(USB 主机端)我有日志:
Device not responding to setup address.
Device not accepting address 54, error -71
问题在于 USB 设置地址请求和 PC(USB 主机)端的错误消息不同。
为什么这些数字不同?为什么 PC 会在日志中报告它试图用它实际发送的不同地址枚举我的 USB 设备?
有什么想法吗?我错过了什么吗?
【问题讨论】:
-
您确定您的设备完全响应了 SetAddress 吗? -71 是 EPROTO,这似乎发生在设备没有响应时 - 正如您所观察到的,这将使主机停止与它交谈。您是否还能够捕获 USB 协议跟踪,以查看总线上到底发生了什么,以及那里缺少什么以提供进一步调试的线索?
-
不幸的是我不确定,因为我没有 USB 协议分析器。在内核日志中,有 4 或 5 条这样的带有设置地址的消息,所以我假设我的驱动程序根本没有确认设置地址。但是仍然 - 为什么这些地址不同的原因是什么?
-
您可以尝试使用Wireshark 捕获主机上的 USB 流量。之前的任何 SetAddress 是否包含您在设备端看到的值?也许您中间的 Hub 没有正确响应?
-
我试图用 tcpdump 捕获它,我可以在 pcap 中看到来自主机的 get_device_descriptor 请求和我的响应(来自我的驱动程序)。但是在 pcap 中没有任何 set_address 请求或响应。好像我必须手动破解 linux hcd 驱动程序。