如何强制 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.
我查看了几个 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.