【问题标题】:DeviceRequest of IOUSBDevice returns 0xe000404f on OS XIOUSBDevice 的 DeviceRequest 在 OS X 上返回 0xe000404f
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2014-11-23
      • 2012-04-04
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多