Documentation / translations / zh_CN / usb / dwc3.rst


Based on kernel version 7.2. Page generated on 2026-08-20 08:41 EST.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_CN.rst

:Original: Documentation/usb/dwc3.rst

:翻译:

 白钶凡 Kefan Bai <baikefan@leap-io-kernel.com>

:校译:


=========
DWC3 驱动
=========


待办
~~~~

阅读时如果想顺手认领点任务,可以从下面挑一项 :)

- 将中断处理程序改为每个端点各自使用线程化 IRQ

  事实证明,有些 DWC3 命令大约需要 ``~1 ms`` 才能完成。
  当前代码会一直自旋等待命令完成,这种设计并不好。

  实现思路:

  - DWC 核心实现了一个按端点对中断进行解复用的 IRQ 控制器。
    中断号在探测(``probe``)阶段分配,并归属于该设备。
    如果硬件通过 ``MSI`` 为每个端点提供独立中断,
    那么这个“虚拟”IRQ 控制器就可以被真实的端点中断取代。

  - 在调用 ``usb_ep_enable()`` 时请求并分配中断资源,
    在调用 ``usb_ep_disable()`` 时释放中断资源。
    最坏情况下需要 32 个中断,最少是 ``ep0/1`` 的两个中断。
  - ``dwc3_send_gadget_ep_cmd()`` 将在 ``wait_for_completion_timeout()``
    中休眠,直到命令完成。
  - 中断处理程序分为以下几个部分:

    - 设备级主中断处理程序
      遍历每个事件,并对其调用 ``generic_handle_irq()``。
      从 ``generic_handle_irq()`` 返回后,确认事件计数器,使中断最终消失。

    - 设备级线程化处理程序
      无。

    - 端点中断的主处理程序
      读取事件并尽量处理它。凡是需要睡眠的操作都交给线程处理。
      事件保存在每个端点的数据结构中。
      还要注意,一旦把某项工作交给线程处理,
      就不要再在主处理程序里处理它,
      以免出现优先级反转之类的问题。

    - 端点中断的线程化处理程序
      处理剩余的端点工作,这些工作可能会睡眠,例如等待命令完成。

  延迟:

   不应增加延迟,因为中断线程具有较高优先级,
   会在普通用户态任务之前运行
   (除非用户更改了调度优先级)。