将 DriverKit 驱动程序与合适的 USB 设备进行匹配
2021 年 3 月 15 日
软件驱动程序能帮助你的系统与鼠标、键盘、耳机等外接设备进行通信。将 DriverKit 驱动程序与 USB 设备匹配有几种不同的处理方式,确定正确的匹配类型可能会比较困难。为帮助你更快找到最合适的匹配类型,我们准备了这个快速开始指南,帮助你将驱动程序与合适的 USB 设备进行匹配。
Learn more about the USB Common Class Specification
Learn more about USB device architecture
探索 I/O 注册表
I/O 注册表是为你希望驱动程序支持的实体设备找到正确的 plist 键值的最快方式。Apple 提供了一款名为《I/O Registry Explorer》的 App,它是“Additional Tools for Xcode”工具包的一部分,可供下载。你也可以通过《终端》App 使用 ioreg
命令来使用 I/O 注册表。
Download I/O Registry Explorer
I/O 注册表提供了关于设备的信息,你可以连接到的接口,以及所有可能用来匹配的键值。你可以在《终端》App 内使用此命令查询注册表,获取你所需的全部信息。
// -b bolds the object name, nice to have
// -n lets us specify the name of the device we are trying to match
// -r shows us all of the sub-interfaces advertised under our device
// -l shows us all of the details for those sub-interfaces
ioreg -b -n “My Device Name” -r -l
如果你还不知道你希望支持的设备名称,将其连接到你的电脑,然后前往菜单栏的 Apple 菜单,选择“”>“关于本机”>“系统报告…”。打开报告后,前往 USB 版块。
一些设备可能会显示多个根条目:一部分属于 AppleUSBDevice
类,另一部分属于 IOUSBHostDevice
类。出于创建驱动程序的目的,你需要 IOUSBHostDevice
下出现的信息。记录在 IOUSBHostInterface
与 IOHIDInterface
类下的条目,稍后你会需要这些信息。
Learn more about the I/O Registry
如何识别与匹配 HID 设备
将设备与驱动程序匹配时,你可以通过 USB 属性匹配它们,或者如果你的设备兼容 HID,也可以通过 HID 匹配键值进行匹配。HID 属性提供了更通用的访问途径,允许你的驱动程序以更简单的方式支持更多设备。例如,你可以写出一个非常通用的驱动程序,支持所有兼容 HID 的鼠标,或者一个非常特别的驱动程序,仅支持某一只鼠标。相比之下,通过 USB 属性匹配则需要你提供你希望支持的每一只现有鼠标的具体信息。
你可以检查 I/O 注册表,查看你希望支持的设备是否兼容 HID。如果此设备支持 HID,它会显示 IOHIDInterface
类,与各种可以用来匹配到驱动程序的键和值,可包括 VendorID
,ProductID
,PrimaryUsagePage
和 PrimaryUsage
等项目。其中“Vendor ID”和“Product ID”是识别特定设备的键值,“Primary Usage Page”和“Primary Usage”键值则是设备类型的通用识别符。
使用之前提到的例子,如果你想创建支持所有连接到你的电脑的兼容 HID 鼠标的驱动程序,你需要匹配所有 PrimaryUsagePage
值为“1”(通用桌面)和 PrimaryUsage
值为“2”(鼠标)的设备。不过,如果你想匹配一个特定的鼠标,就只能根据它的 VendorID
和 ProductID
进行匹配了。
*注意:USBDriverKit
框架要求你申请使用特定的 VendorID
以与其进行匹配,但这仅限于匹配非 HID 设备时。在连接到兼容 HID 设备时,你可以随意使用任意 Vendor ID 进行匹配。
如何匹配非 HID USB 设备
如果你在为非 HID USB 设备构建驱动程序,你需要匹配到 IOUSBHostDevice
和 IOUSBHostInterfaces
类。
对于 IOUSBHostDevices
,你必须遵守特定的匹配方案,并提供列出的精确组合键中的一个。否则就不会出现匹配,驱动程序也无法正常工作。匹配按照降序排列,所以带有 Vendor ID 与 Product ID 组合的驱动程序在匹配设备时,相对基于设备类与子类进行匹配的驱动程序优先级更高
Learn more tips for matching USB drivers with macOS
记住,如果你准备使用 Vendor ID 与非 HID USB 设备进行匹配,你需要在向 Apple 申请 DriverKit 授权时指定该 Vendor ID 的访问权限。