0

我正在开发 USB 设备的驱动程序和应用程序,以通过 DFU 更新固件。我有正常工作的 USB 设备。之后我尝试更新设备的固件,并在下载固件时拔下 USB 电缆。下载按预期失败。之后,我插入 USB 设备,它处于产品 0xffff 的 DFU 模式,因为固件已损坏。我尝试再次开始更新,每次调用 IOUSBDevice::DeviceRequest 都会返回 0xe000404f 错误(kIOUSBPipeStalled - 管道已停止,需要清除错误)。

我用 USB Prober 进行了检查,处于 DFU 模式的设备没有任何端点。我不确定它是如何工作的,但看起来在调用 DeviceRequest 时使用了管道零。所以也许我应该调用类似于管道零的 ClearPipeStall 的东西来与固件损坏的 DFU 模式下的设备一起工作?我该怎么做?如果我的假设是错误的,我该如何解决这个问题?在 DFU 模式下插入设备后,我不执行任何 I/O 操作,我只是像往常一样获取 pid/vid 并找到 IOUSBDevice 对象和 IOUSBInterface(DFU 接口)对象。

在 El Capitan 上,我使用 IOUSBHostInterface::deviceRequest() 并且它也返回一个错误(但错误代码不同,我丢失了代码并且现在无法获取它,因为我在我的 Mac 上安装了 Mavericks)。

4

1 回答 1

0

kIOUSBPipeStalled 错误的一个可能原因是您的 DFU 引导加载程序处于奇怪的状态,它要么无法完成端点 0 上的任何控制传输,要么使用 STALL 数据包响应它们。STALL 数据包通常意味着设备不支持传输。

您可以尝试使用硬件 USB 协议分析器(例如Beagle 12)来查看总线上实际发生的情况。

我认为调用 ClearPipeStall 不会帮助解决这个问题,但我不确定。

于 2015-12-17T00:12:31.420 回答