Linux kernel USB核心如何决定将哪个HCI驱动程序用于USB设备驱动程序?

Linux kernel USB核心如何决定将哪个HCI驱动程序用于USB设备驱动程序?,linux-kernel,driver,Linux Kernel,Driver,我正在研究USB设备驱动程序代码。看起来它所做的只是填充一条URB消息,然后在匹配PCI供应商/产品ID时调用probe()后,调用usb_submit_URB()将消息传递给usb核心函数 但是,我无法弄清楚USB核心如何将设备驱动程序与正确的HCI驱动程序(xHCI、eHCI等)联系起来。。。我发现大多数HCI驱动程序都注册为具有唯一名称的平台驱动程序,即usb核心的标识符,用于关联设备驱动程序和主机驱动程序?当您使用usb 3.0时,内核使用xhci驱动程序,而不需要uhci、ohci或e

我正在研究USB设备驱动程序代码。看起来它所做的只是填充一条URB消息,然后在匹配PCI供应商/产品ID时调用probe()后,调用usb_submit_URB()将消息传递给usb核心函数


但是,我无法弄清楚USB核心如何将设备驱动程序与正确的HCI驱动程序(xHCI、eHCI等)联系起来。。。我发现大多数HCI驱动程序都注册为具有唯一名称的平台驱动程序,即usb核心的标识符,用于关联设备驱动程序和主机驱动程序?

当您使用usb 3.0时,内核使用xhci驱动程序,而不需要uhci、ohci或ehci驱动程序。在这种配置中,您只有一个hci驱动程序和一个hci主机。在USB 2.0时代早期,有两种可能的配置:

  • 带配套控制器的ehci(ohci或uhci)
  • 带有事务转换器(TT)的ehci
在第一种情况下,您需要同时安装两个驱动程序-例如ehci和uhci。在第二种情况下,只需要专用的ehci驱动程序

因此,当前只有xhci时,它将自己注册为linux系统中唯一的usb主机驱动程序。第二件事——它是主机驱动程序功能,可以从usb设备请求任何东西——所以usb主机生成对设备的任何请求,并负责维护设备的应答。xhci主机驱动程序为请求维护注册其中断和内存区域


我认为您需要从主机(xhci)的角度,而不是从设备的角度来看这个问题,因为主机是usb通信的主机,主机会发起任何请求。设备只回答这些请求。

感谢您的澄清。如果我需要编写自己的HCI,如何将其连接到设备驱动程序?linux内核中有什么具体的HCI代码我可以参考吗?我不确定HCI和设备驱动程序之间是否有任何直接连接,因为我现在不记得usb源的所有细节。也许urb->hcpriv是用来连接设备和HCI的?对不起,我现在没有足够的时间调查此事。我认为,如果你要编写自己的HCI驱动程序,你只需要在usb核心中正确注册它。