Macos 超时后libusb缺少输入数据

Macos 超时后libusb缺少输入数据,macos,libusb,darwin,Macos,Libusb,Darwin,我正在使用libusb与Silicon Labs USB到串行芯片组另一端的低速串行设备进行通信。(MacOS 10.8.5上的达尔文后端)。该设备有点像一个网络设备,因为它在逻辑上是半双工的,并且只有在被要求时才发送数据。所以主机发送12字节请求下一个数据包,设备发回68字节。这些是同步批量传输-最大USB packetize为64,因此是连续的64字节和4字节USB传输 我在libusb中看到一个bug。每隔一段时间(事实上,这是非常常见的),设备“极客”,并不是发回68字节,而是发回0或1

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

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

我在上面放了一个USB分析仪,我可以看到设备在“极客”和超时后返回68字节,所以我知道它在总线上,但libusb在随后的libusb_bulk_传输调用中不会返回它们

我大部分时间都在使用libusb1.0.8。我尝试升级到libusb1.0.9,结果没有什么不同

如果我使用ENABLE_DEBUG_日志编译libusb,这种情况很少发生。但一旦我再次关掉它,它就会回来。这一切都很容易重复。(仅供参考,我确实定义了ENABLE_日志记录)。这对我来说是libusb的时间问题

如果我使用SI提供的内核驱动程序,我也可以得到一个跟踪,也可以看到“极客”,但内核驱动程序恢复良好,随后返回68字节的数据包


我将开始查看libusb源代码,但我希望其他人可能已经看到了这一点,或者可能对在哪里查找有更丰富的经验。

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


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

您能找到/修复您描述的问题吗?我正在研究一个类似的问题,我怀疑问题在于内核发送(我不知道为什么)一个命令来清除usb集线器的TT缓冲区