BSR = 0 的地址设备命令的 USB 事务错误完成代码

问题描述 投票:0回答:1

我正在为 xHCI 编写驱动程序,但我一直遇到地址分配问题。

这是我在做什么:

  1. 通过向 USBCMD.HCRST 写入 1 来重置控制器并等待 USBSTATUS.CONTROLLER_NOT_READY 标志清除。
  2. 将配置寄存器中启用的最大插槽设置为 16(这是我的 xHC 支持的最大值)。
  3. 在 64 字节对齐的内存位置上分配设备上下文基地址寄存器,并将该地址写入 dcbaap 寄存器。
  4. 分配暂存器缓冲区,将它们的地址写入一个数组,然后将该数组的地址写入 dcbaap 的第 0 个条目。
  5. 分配一个命令环并将其地址写入CRCR。
  6. 设置 R/S 位并等待控制器未就绪标志 CNR 清除。
  7. 分配事件环,事件环段表为一个表项,并将表的地址写入ERSTBA
  8. 然后软件一直等到设备连接到端口 12,我将设备连接到端口 12,我可以看到端口进入启用状态,如 PP、CCS、PED 为 1,PR 和 PLS 为 0。
  9. 提交启用插槽命令,我在事件环上收到一个事件,其中包含成功完成代码和插槽 ID。
  10. 分配输出和输入设备上下文数据结构并将它们初始化为有效值。
  11. 分配传输环并将其地址写入输入上下文。
  12. 提交 BSR = 1 的第一个地址设备命令,我在事件环上收到一个带有成功完成代码的事件。
  13. 这里出了问题:提交 BSR = 0 的第二个地址设备命令,我得到完成代码的 USB 事务错误。

在 xhci 规范版本 1.2 中,它表示 USB 事务错误是 USB3 DPP(数据包有效负载)错误的结果。我查看了 USB3.2 rev 1,它说 DPP 错误可能由于以下任何原因而发生:

1.CRC错误

2.民进党中止

3.民进党失踪

4.Setup DPH中的Data Length与实际数据payload长度不符

我已经尝试了大约 2-3 周,但一无所获。我确实在这里看到一篇帖子,其中有人遇到了 EHCI 的这个问题,他们通过减少延迟来修复它。我试图做类似的事情,但仍然没有解决它。

有谁知道为什么我会收到此错误或我该如何解决它?

我要注意的是,如果跳过第 8 步,继续启用插槽命令,我仍然会得到相同的结果。所以我仍然得到一个设备插槽,并且即使没有连接任何设备,我仍然得到一个成功的第一个 Address Device 命令。这让我觉得 USB 设备甚至没有说话?我使用的是拇指驱动器,我尝试了不同的拇指驱动器和不同的端口,但仍然是同样的问题。我在 SS 端口上使用 USB 3.0 拇指驱动器。

usb driver intel
1个回答
-3
投票

你找到解决问题的方法了吗? 我正在尝试实现一个裸机 xhci 驱动程序,我可以为一些设备(如大容量存储和鼠标)解决它,但它在几乎所有其他设备上都失败了。如果我执行 BSR = 1,它会成功,但是如果我想读取描述符或设置 BSR = 0,它会在我提到的那些设备之外的所有设备上失败。太令人沮丧了。如果你有解决办法,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.