DWC3 驱动程序

待办事项

请在阅读时选择一些事项:)

  • 将中断处理程序转换为按端点线程中断

    事实证明,某些 DWC3 命令需要约 1 毫秒才能完成。目前我们自旋等待命令完成,这很糟糕。

    实现思路

    • DWC 核心为每个端点的中断实现一个解复用中断芯片。中断号在探测期间分配并属于该设备。如果 MSI 提供按端点中断,则此虚拟中断芯片可以替换为“实际”中断。

    • 中断在 usb_ep_enable() 时请求/分配,在 usb_ep_disable() 时移除。最坏情况是 32 个中断,下限是 ep0/1 的两个中断。

    • dwc3_send_gadget_ep_cmd() 将在 wait_for_completion_timeout() 中休眠,直到命令完成。

    • 中断处理程序分为以下几部分

      • 设备的主处理程序遍历每个事件,并为事件调用 generic_handle_irq()。从 generic_handle_irq() 返回时,它确认事件计数器,以便中断(最终)消失。

      • 设备的线程处理程序 无

      • EP 中断的主处理程序读取事件并尝试处理它。所有需要休眠的操作都交给线程。事件保存在每个端点的数据结构中。我们可能需要注意,一旦将某些内容交给线程,就不要再处理事件,以免处理事件 X 优先级 Y(其中 X > Y)。

      • EP 中断的线程处理程序处理剩余的 EP 工作,这些工作可能会休眠,例如等待命令完成。

    延迟

    延迟不应增加,因为中断线程具有高优先级,并且将在用户空间中的普通任务之前运行(除非用户更改了优先级)。