我研究了几个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 |
------------------- -------------------
答案 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不需要任何配套控制器。