我正在开发 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)。