将 DriverKit 驱动程序与合适的 USB 设备进行匹配

紫色背景上的一台打印机,一把键盘和一台相机

软件驱动程序能帮助你的系统与鼠标、键盘、耳机等外接设备进行通信。将 DriverKit 驱动程序与 USB 设备匹配有几种不同的处理方式,确定正确的匹配类型可能会比较困难。为帮助你更快找到最合适的匹配类型,我们准备了这个快速开始指南,帮助你将驱动程序与合适的 USB 设备进行匹配。

DriverKit

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 下出现的信息。记录在 IOUSBHostInterfaceIOHIDInterface 类下的条目,稍后你会需要这些信息。

Learn more about the I/O Registry

如何识别与匹配 HID 设备

将设备与驱动程序匹配时,你可以通过 USB 属性匹配它们,或者如果你的设备兼容 HID,也可以通过 HID 匹配键值进行匹配。HID 属性提供了更通用的访问途径,允许你的驱动程序以更简单的方式支持更多设备。例如,你可以写出一个非常通用的驱动程序,支持所有兼容 HID 的鼠标,或者一个非常特别的驱动程序,仅支持某一只鼠标。相比之下,通过 USB 属性匹配则需要你提供你希望支持的每一只现有鼠标的具体信息。

你可以检查 I/O 注册表,查看你希望支持的设备是否兼容 HID。如果此设备支持 HID,它会显示 IOHIDInterface 类,与各种可以用来匹配到驱动程序的键和值,可包括 VendorIDProductIDPrimaryUsagePagePrimaryUsage 等项目。其中“Vendor ID”和“Product ID”是识别特定设备的键值,“Primary Usage Page”和“Primary Usage”键值则是设备类型的通用识别符。

使用之前提到的例子,如果你想创建支持所有连接到你的电脑的兼容 HID 鼠标的驱动程序,你需要匹配所有 PrimaryUsagePage 值为“1”(通用桌面)和 PrimaryUsage 值为“2”(鼠标)的设备。不过,如果你想匹配一个特定的鼠标,就只能根据它的 VendorIDProductID 进行匹配了。


*注意:USBDriverKit 框架要求你申请使用特定的 VendorID 以与其进行匹配,但这仅限于匹配非 HID 设备时。在连接到兼容 HID 设备时,你可以随意使用任意 Vendor ID 进行匹配。


如何匹配非 HID USB 设备

如果你在为非 HID USB 设备构建驱动程序,你需要匹配到 IOUSBHostDeviceIOUSBHostInterfaces 类。

对于 IOUSBHostDevices,你必须遵守特定的匹配方案,并提供列出的精确组合键中的一个。否则就不会出现匹配,驱动程序也无法正常工作。匹配按照降序排列,所以带有 Vendor ID 与 Product ID 组合的驱动程序在匹配设备时,相对基于设备类与子类进行匹配的驱动程序优先级更高

Learn more tips for matching USB drivers with macOS

记住,如果你准备使用 Vendor ID 与非 HID USB 设备进行匹配,你需要在向 Apple 申请 DriverKit 授权时指定该 Vendor ID 的访问权限。

Resources

Requesting Entitlements for DriverKit Development