DWC3 驱动程序¶
待办事项¶
阅读时请选择一些内容 :)
将中断处理程序转换为每个端点的线程 IRQ
事实证明,一些 DWC3 命令需要大约 1 毫秒才能完成。目前我们一直轮询直到命令完成,这很糟糕。
实现思路
dwc 核心为每个端点的中断实现了一个解复用 IRQ 芯片。中断号在探测期间分配,并且属于该设备。如果 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 工作,这些工作可能会休眠,例如等待命令完成。
延迟
由于中断线程具有高优先级,并且将在用户空间的普通任务之前运行(除非用户更改了优先级),因此不应该增加延迟。