如何强制USB设备驱动程序调用特定的HCI控制器驱动程序?

时间:2018-10-12 04:03:48

标签: linux-kernel linux-device-driver

我研究了几个USB设备驱动程序代码,它们看起来必须与PCI设备关联,并且当在USB设备驱动程序中调用usb_submit_urb()时,urb结构已经与特定的HCI驱动程序相关联,然后usb_submit_urb()调用usb_hcd_submit_urb(),usb_hcd_submit_urb()将从参数urb提取hcd,然后调用urb-> enqueue(),该映射到特定的HCI驱动程序。

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表中列出的当前设备的驱动程序,但我想使用USB内核为NCM CDC设备驱动程序注册自定义的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   |
                                                           -------------------             -------------------

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的需求:您需要编写在Linux中标准USB协议栈之外运行的HCI驱动程序?因此,您不想在Linux usb-core中注册HCI吗?如果是,请编写HCI驱动程序,不要将其API注册到usb-core。使用哪个USB HCI驱动程序(和HCI HW)的AFAIK仅取决于您连接的物理USB端口。因此,如果您的系统具有多个USB HCI,则只需将USB设备插入给定的物理端口即可选择HCI。我记得在USB 2.0(ehci +配套控制器)中,可以将某些USB端口分配给ehci或uhci / ohci(使用某种多路复用器),但是现在使用xhci-我认为这是不可能的。主要是因为xhci不需要任何配套控制器。