【问题标题】:How can I force a USB device driver to call a specific HCI controller driver?如何强制 USB 设备驱动程序调用特定的 HCI 控制器驱动程序?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我实际上需要使用 USB 核心,因为我希望一些现有的 USB 设备驱动程序将它们的流量转发到我的 HCI 驱动程序。我确实听说过您最近提到的有关 USB 2.0 的一些信息,就我而言,我更喜欢在客户端(vhci_hcd.c)上编写一个 USB/IP VHCI,但希望它可以被 USB 设备驱动程序访问,而不是用户空间程序 + ioctl ()...
    • 恐怕我还是不明白你的意思。问题是:您有一些带有 USB 设备的硬件,并且您想在此硬件上编写作为 USB-over-IP 解决方案的虚拟 HCI?那么你想通过 IP 协议来控制你的 HCI 吗?
    • 对不起,我的 HCI 驱动程序不需要 IP。我需要做的是将流量从 NCM CDC 设备驱动程序路由到我的 HCI 类,我的 HCI 类应该解析 URB 查询并调用硬件驱动程序 API 以将模拟输出提供回 NCM CDC 设备驱动程序。我无权访问硬件驱动程序代码。所以我的 HCI 类实际上不能直接与任何硬件对话,也不能将自己置于 PCI 总线中以被 NCM CDC 驱动程序检测到......我在想更糟糕的情况我可以导出我的 VHCI 符号和硬代码 usb_hcd_submit_urb( ) 通过 usb_hcd 指向我的 HCI...有意义吗?
    • 我不确定我是否正确理解了您的需求。在这种情况下,您的想法的一些详细图片会有所帮助。如果您尝试使用 NCM CDC 设备(eth-over-usb?),那么您需要物理 USB 设备和物理 USB 主机。请记住,usb-host 始终是任何 USB 通信的发起者,您可以编写自己的驱动程序而不是 NCM CDC 或修改此 CDC 驱动程序,您可以对请求执行任何操作。关于您的问题-我不确定这对于生产软件是否是个好主意。出于测试目的、调试或一些研究 - 可能,但不适用于生产。
    • 如果您可以画一些图并指定 USB 控制器(USB 设备和/或 USB 主机)在哪里。也许有了这张照片我会帮助你。
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多