我正在尝试编写一个基于内核源代码中现有 vhci_hcd 的 VHCI 驱动程序。我最初的想法是编写一个 USB 驱动程序来使用由 USB 核心桥接的 VHCI 代码。
我能够加载 VHCI 驱动程序(基于退出 vhci_hcd)并看到从“lsusb”输出创建的虚拟集线器,并且默认情况下 deviceID/productID 已由 USB 核心创建。但是,我无法根据 deviceID/productID 将 USB 驱动程序连接到 VHCI(即使 ID 匹配,也无法触发 USB 驱动程序中的probe() 函数)。
有谁知道这是否是预期的行为? USB 驱动程序只能连接到真正的 HCI 而不能连接到 VHCI 吗?
答案1
初步回答:
让我们尝试理清假设,也许我们可以澄清问题。
我想编写一个 USB 驱动程序来与 VHCI 通信,而不是通过 sysfs 或 ioctl 与其通信的用户空间程序)
“USB 驱动程序”到底是什么意思?实现特定设备(例如 USB 摄像头)的内核驱动程序?这将是一个“USB 小工具驱动程序”,内核已经有很多这样的驱动程序,所以看看他们的代码。如果您想测试小工具驱动程序,则需要dummy_hdc
,它会创建一个虚拟根集线器,其中将包含内核小工具驱动程序代表的所有设备。
VHCI 项目专门用于允许用户空间(虚拟)设备的 USB 驱动程序。如果您不想要“通过 sysfs 或 ioctl 与之对话的用户空间程序”,那么 VHCI 是错误的选择。
据我了解,VHCI 类似于连接到真实硬件的 OHCI/UHCI 代码。
是的,它提供了一个根集线器;到目前为止它是相似的。
USB 驱动程序与 USB 核心通信,最终与 OHCI/UHCI 通信,然后与硬件通信
你在这里失去了我。您在谈论哪些“USB 驱动程序”?您的意思是允许计算机和用户与(真正的)USB 设备交互的内核驱动程序吗?例如usb_storage
,这使得 USB 大容量存储设备可见为/dev/sd*
等?它们完全独立于 VHCI 用户空间驱动程序或 USB 小工具内核驱动程序。
为了能够使用这些驱动程序,您必须以真实 USB 总线上的真实 USB 设备的形式提供它们的对应部分,或通过 提供作为内核小工具驱动程序的模拟 USB 设备dummy_hdc
,或通过 VHCI 提供用户空间驱动程序。
因此,如果您真正的问题是:“我有这个新的 USB 设备,它最终应该是真正的硬件,我想为其编写一个 Linux 内核驱动程序,但首先我想测试它。”那么你需要二驱动程序:一个是您要开发的内核驱动程序,另一个是模拟尚不存在的设备的虚拟伙伴。您可以在内核空间(小工具驱动程序)或用户空间(VHCI)中执行此操作。