如何强制 USB 设备 driver 调用特定的 HCI 控制器 driver?

How can I force a USB device driver to call a specific HCI controller driver?

我查看了几个 USB 设备 driver 代码看起来它们必须与 PCI 设备相关联,并且当 usb_submit_urb() 在 USB 设备 driver 中被调用时, urb结构体已经关联了特定的HCIdriver,那么当usb_submit_urb()调用usb_hcd_submit_urb()时,usb_hcd_submit_urb()会从参数urb中取出hcd,然后调用urb->enqueue() 映射到特定的 HCI driver.

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 driver 来与需要从 USB 设备隐藏的硬件对话 driver,所以我无法更改 USB 设备 driver搜索硬件的 PCI ID...在这种情况下,有什么方法可以强制特定设备 driver 与 USB HCI driver 相关联吗?

更新:

我根据讨论创建了两个图表。

图 #1 显示了内核中的当前 USB 模型,我从 'lspci' 输出中看到 xHCI 是我系统中唯一使用的主机控制器 driver。

图 #2 是提议的设计。虽然仍然允许 NCM CDC 设备 driver 作为其 PCI 表中列出的当前设备的 driver 工作,但我想为 NCM CDC 设备 driver 注册带有 USB 核心的自定义 HCI。自定义 HCI 与自定义硬件 driver 对话,后者对用户 space 隐藏自定义硬件信息(意味着没有 PCI 探测)。

我定制的HCI需要解析从USB核心传递下来的URB消息,并将它们映射到定制硬件提供的相应APIdriver。

我遇到的问题是,所有 USB 设备 driver 都默认使用 xHCI,我完全不确定如何告诉 USB 核心使用我自定义的 HCI。 . 即使我可能能够硬编码 USB 核心以强制从 NCM CDC USB 设备 driver 到自定义 HCI 的所有流量,因为我将无法向 NCM CDC 设备 [=36] 提供 PCI productID/vendorID =],我怎样才能触发 NCM CDC 设备 driver 的 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   |
                                                           -------------------             -------------------

如果我正确理解了您的需求:您需要编写一个 HCI 驱动程序,它将在 Linux 中的标准 USB 堆栈之外工作?所以你不想在 Linux usb-core 中注册你的 HCI?如果是 - 只需编写 HCI 驱动程序并且不要将他的 API 注册到 usb-core。据我所知,使用哪个 USB HCI 驱动程序(和 HCI 硬件)仅取决于您连接的物理 USB 端口。因此,如果您的系统具有多个 USB HCI,那么您只需将 USB 设备插入给定的物理端口即可 select HCI。正如我记得在 USB 2.0(ehci + 配套控制器)中,可以将一些 USB 端口分配给 ehci 或 uhci/ohci(使用某种多路复用器),但现在使用 xhci - 我认为这是不可能的。主要是因为xhci不需要任何companion controller.