USB:如果在器件模式下的 DMA 传输期间接收到 USB 复位,DMA 将挂起
详细信息:
USB 控制器包含一个 DMA 主器件端口,用于在系统存储器之间传输数据。如果在 DMA 传输处于活动状态时接收到总线复位(对超高速器件进行 2.0 复位或温复位/热复位),则该 DMA 主器件端口可能无法正确终止传输。这可能会锁定 DMA 主器件。
USB 主机可发出 USB 2.0 总线复位或超高速温复位/热复位,以响应 USB 器件的异常操作。USB 主机将首先尝试通过事务重试从错误情况(例如数据包中的 CRC 错误)恢复,然后再发出复位。在此期间,控制器中的 USB 数据缓冲区将暂时不可用于新 DMA 传输。这为完成待处理的 DMA 传输提供了机会。以下方面会影响 DMA 处于活动状态时接收复位的概率:
- 主机检测器件异常行为所需的时间。
- 主机重试事务所需的时间,以及器件响应重试所需的时间。
- 主机发起复位信号传输所需的时间。
- 器件完成所有可用片上缓冲区的待处理传输所需的时间。
如果系统延迟极高,则可能会在 DMA 传输仍在进行或待处理时接收到复位。
该问题会影响所有速度,但发生概率非常低。
该问题仅影响器件模式。
权变措施:
以下两个选项可用于从这种不太可能发生的情况中恢复。发生 DMA 锁定后,需要进行 USB 子系统复位才能恢复。
选项 1:使用其他系统级机制来检测锁定并复位 USB 子系统。如果 DMA 在复位后锁定,主机将无法枚举该器件。主机可再次重试复位该器件,但后续重试将失败,因为总线复位不足以从 DMA 锁定中恢复。枚举失败后,主机软件必须将问题提交到系统层面,以便可以使用备选机制将锁定情况传递给器件。
选项 2:以下软件权变措施可用于检测 DMA 锁定和复位子系统。以下是权变措施程序。
- 当总线复位后发生第一个描述符缺失中断时,软件会检查 AXI 是否空闲。可通过读取 DMA_AXI_CAP 寄存器中的 AXI_IDLE MMR 位来检查 AXI 状态。如果 AXI 空闲,软件将继续执行步骤 2。如果 AXI 未空闲,软件将继续执行步骤 6。
- 按照以下步骤启动虚拟 DMA 传输。
- 配置虚拟 IN1 端点。
- 为 IN1 准备 TRB 和数据包。为该传输使能完成中断 (IOC)。
- 触发 IN1 的门铃
- 启动 T2 计时器,其中 T2 < 50ms。如果 DMA 未挂起,建议的 T2 时间为 40ms,以便 DMA 有足够的时间完成虚拟传输
- 等待 IOC 中断。如果接收到 IOC 中断,则继续执行步骤 3。如果 T2 计时器到期且未收到 IOC,则继续执行步骤 6。
- 通过读取控制器寄存器空间中的 BUF_ADDR、BUF_DATA 和 BUF_CTRL MMR,检查 IN1 数据是否正确。如果数据正确,则继续执行步骤 5。如果数据不正确,则继续执行步骤 6。
- 如果到达此步骤,则 DMA 主器件不会挂起。软件可以继续执行进一步的编程,为 SETUP 数据包提供服务。可以退出权变措施流程。
- 如果到达此步骤,则 DMA 主器件会挂起。软件执行以下步骤以从挂起中恢复 USB 子系统:
- 强制器件断开连接。
- 启动 T1 计时器,其中 T1 >= 200ms。T1 需要大于 200ms,主机才能识别到器件断开连接。如果系统可以承受更长的停机时间,则可以使用更高的 T1 延迟。在极罕见的情况下,此延迟后的任何 USB 传输仍处于挂起状态,复位子系统可能会锁定系统总线并导致芯片完全复位。较高的 T1 延迟提供更多的时间等待任何待处理的系统总线传输完成。
- 软件使用相应的 LPSC 发起 USB 子系统的强制复位。
- 等待直至 T1 计时器到期。
- 按照上电复位后在器件模式下设置 USB 所执行的相同步骤,重新启动 USB 子系统。