超时后用libusb丢失输入数据

时间:2014-02-03 19:44:07

标签: macos libusb darwin

我正在使用libusb与Silicon Labs USB转串口芯片组另一端的低速串行设备进行通信。 (Darwin后端MacOS 10.8.5)。该设备有点像网络设备,因为它在逻辑上是半双工的,只有在被要求时才会发回数据。因此主机发送12个字节要求下一个数据包,设备发回68个字节。这些是同步批量传输 - 最大USB打包为64,因此它是连续的64和4字节USB传输。

我在libusb中看到了一个错误。每隔一段时间,(实际上,它经常),设备“极客”,而不是发回68字节,它发回0或1字节,然后批量读取超时。实际上不是问题,主机只是再次发送相同的前12字节数据包,再次请求相同的68字节块。有时这种情况发生得很好,但很多时候,主机看不到下一个68字节的数据包,随后对libusb_bulk_transfer()的调用也会超时,直到所有“重试”(在网络级别)已经用尽并且转移失败。

我已经在其上放了一个USB分析器,我可以看到设备在“极客”和超时之后返回68个字节,所以我知道它在总线上,但libusb不会在随后的libusb_bulk_transfer调用中返回它们。

我一直在使用libusb 1.0.8。我尝试升级到libusb 1.0.9并没有任何区别。

如果我使用ENABLE_DEBUG_LOGGING编译libusb,很少发生。但是一旦我再次关闭它,它就会回来。这一切都很容易重复。 (仅供参考我确实定义了ENABLE_LOGGING)。这告诉我,这是与libusb有关的时间问题。

如果我使用SI提供的内核驱动程序,我也可以获得跟踪,也可以看到“geek”,但内核驱动程序恢复正常,并返回后续的68字节数据包。

我会开始在libusb源代码中探索,但我希望其他人可能已经看过这个或者可能有一些更有经验的想法在哪里看。

1 个答案:

答案 0 :(得分:0)

我最终找到了Apple USB列表中的其他人如何解决这个问题。超时后,数据切换值似乎“不同步”。因此主机将拒绝具有错误数据切换值的传入数据包。所以,即使我没有得到一个管道档位,我也可以通过调用(* ClearPipeStallBothEnds)或实际上通过libusb_clear_halt()来双方“重置”他们的数据切换值

我现在每次获得批量读取超时时都会这样做,并且工作正常。