我研究了几个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 I。在这种情况下,有没有办法强迫特定的设备驱动程序与USB驱动程序相关联?
更新:
我在讨论的基础上创建了两张图表。
图1显示了内核中当前的USB模型,我从'lspci‘输出中看到,xHCI是在我的系统中使用的唯一主机控制器驱动程序。
图2是一个建议的设计。虽然仍然允许NCM设备驱动程序作为PCI表中列出的当前设备的驱动程序,但我想为NCM设备驱动程序注册我的定制HCI。定制的HCI与定制的硬件驱动程序对话,该驱动程序从用户空间隐藏定制的硬件信息(这意味着没有PCI探针)。
我的定制HCI需要解析从USB核心传递下来的URB消息,并将它们映射到由定制硬件驱动程序提供的相应API中。
我的问题是,它看起来xHCI是默认使用的所有USB设备驱动程序,我不知道如何告诉USB核心使用我的定制HCI在所有.即使我可能能够硬编码USB核来强制所有流量从NCM CDC USB设备驱动程序到自定义的HCI,因为我无法向NCM CDC设备驱动程序提供PCI产品I/供应商I,我如何才能触发NCM CDC设备驱动程序的探测()功能呢?
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 |
------------------- -------------------发布于 2018-10-12 04:49:34
如果我正确理解了您的需求:您需要编写一个HCI驱动程序,它将在Linux标准USB堆栈之外工作?所以你不想在Linux核中注册你的HCI?如果是,只需编写HCI驱动程序,不要将他的API注册到usb核心。AFAIK使用的USB HCI驱动程序(和HCI HW)只取决于您连接的物理USB端口。因此,如果您有多个USB系统,那么您可以选择HCI,只需将USB设备插入给定的物理端口即可。我记得在USB2.0 (ehci +配套控制器)中,有可能将一些USB端口分配给ehci或uhci/ohci (使用某种mux),但现在使用xhci -我认为这是不可能的。主要是因为xhci不需要任何同伴控制器。
https://stackoverflow.com/questions/52772094
复制相似问题