【发布时间】:2014-02-27 11:10:46
【问题描述】:
我正在使用 libusb 与 Silicon Labs USB 转串行芯片组另一端的低速串行设备通信。 (MacOS 10.8.5 上的 Darwin 后端)。该设备有点像网络设备,因为它在逻辑上是半双工的,只有在被询问时才会发回数据。因此主机发送 12 个字节请求下一个数据包,设备发送回 68 个字节。这些是同步批量传输 - 最大 USB 数据包化为 64,因此它是连续的 64 和 4 字节 USB 传输。
我在 libusb 中看到了一个错误。时不时地,(实际上,这很常见),设备“极客”,而不是发回 68 个字节,而是发回 0 或 1 个字节,然后批量读取超时。真的没问题,主机只是再次发送相同的先前 12 字节数据包,再次请求相同的 68 字节块。有时这种情况发生得很好,但很多时候,主机看不到接下来的 68 字节数据包,随后对 libusb_bulk_transfer() 的调用也会超时,直到所有“重试”(在网络级别)都用尽并且传输失败。
我在上面放了一个 USB 分析器,我可以看到设备在“geek”和超时后返回 68 个字节,所以我知道它在总线上,但是 libusb 在随后的 libusb_bulk_transfer 调用中没有返回它们。
我大部分时间都在使用 libusb 1.0.8。我尝试升级到 libusb 1.0.9 并没有什么不同。
如果我用 ENABLE_DEBUG_LOGGING 编译 libusb,它很少发生。但是一旦我再次关闭它,它就会回来。这一切都很容易重复。 (仅供参考,我确实定义了 ENABLE_LOGGING)。这对我来说是 libusb 的某种时间问题。
如果我使用SI提供的内核驱动,我也可以得到trace,也可以看到“geek”,但是内核驱动恢复正常,并且返回了后续的68字节数据包。
我将开始在 libusb 源代码中四处寻找,但我希望其他人可能已经看到了这一点,或者可能对去哪里有一些更有经验的想法。
【问题讨论】:
-
您能找到/解决您描述的问题吗?我正在研究一个类似的问题,我怀疑问题出在内核发送(我不确定为什么)清除 USB 集线器的 TT 缓冲区的命令