【发布时间】:2015-12-15 18:21:26
【问题描述】:
我正在开发 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) .
【问题讨论】:
标签: macos usb device iokit dfu