【发布时间】:2019-03-17 05:54:47
【问题描述】:
我研究了几个 USB 设备驱动程序代码,看起来它们必须与 PCI 设备关联,当在 USB 设备驱动程序中调用 usb_submit_urb() 时,urb 结构已经与特定的 HCI 驱动程序关联,然后当usb_submit_urb() 调用 usb_hcd_submit_urb(),usb_hcd_submit_urb() 将从参数 urb 中获取 hcd 然后调用映射到特定 HCI 驱动程序的 urb->enqueue()。
int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
{
int status;
struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus);
......
......
if (likely(status == 0)) {
status = hcd->driver->urb_enqueue(hcd, urb, mem_flags);
在我的情况下,我需要编写一个 USB HCI 驱动程序来与需要从 USB 设备驱动程序隐藏的硬件通信,因此我无法更改 USB 设备驱动程序来搜索硬件的 PCI id... 在这种情况下有没有办法强制特定设备驱动程序与 USB HCI 驱动程序关联?
更新:
我根据讨论创建了两个图表。
图 #1 显示了内核中的当前 USB 模型,我从“lspci”输出中看到 xHCI 是我系统中唯一使用的主机控制器驱动程序。
图表#2 是一个提议的设计。虽然仍然允许 NCM CDC 设备驱动程序作为其 PCI 表中列出的当前设备的驱动程序,但我想为 NCM CDC 设备驱动程序使用 USB 内核注册我的自定义 HCI。定制的 HCI 与定制的硬件驱动程序对话,后者对用户空间隐藏定制的硬件信息(意味着没有 PCI 探针)。
我的自定义HCI需要解析从USB核心传下来的URB消息,并将它们映射到自定义硬件驱动提供的相应API。
我遇到的问题是,所有 USB 设备驱动程序默认使用 xHCI,我不确定如何告诉 USB 核心使用我定制的 HCI...即使我可能能够硬编码 USB 内核以强制从 NCM CDC USB 设备驱动程序到自定义 HCI 的所有流量,因为我无法向 NCM CDC 设备驱动程序提供 PCI productID/vendorID,如何触发 NCM CDC 设备驱动程序的 probe() 函数启动有吗?
Diagram #1 (Current kernel USB model):
----------------- ------------------ ------------------- -------------------
| NCM CDC | <----> | USB Core | <----> | xHCI | <----> | USB devices |
----------------- ------------------ ------------------- -------------------
Diagram #2 (proposed design):
----------------- ------------------ ----------------------------- -------------------------------- --------------------
| NCM CDC | <----> | USB Core | <-----> | Customized HCI | <----> | Customized Hardware driver | <----> | Customized HW |
----------------- ------------------ | ----------------------------- -------------------------------- --------------------
|
|
|
| ------------------- -------------------
|--->| xHCI | <----> | USB devices |
------------------- -------------------
【问题讨论】:
标签: linux-kernel linux-device-driver