我应该使用 IOKit 或 DriverKIt(或 HIDDriverKit)为 macOS 中的 USB 或蓝牙多点触控设备编写驱动程序吗?

Should I use IOKit or DriverKIt (or HIDDriverKit) to write driver for USB or Bluetooth multi-touch device in macOS?

我打算为 USB 或蓝牙多点触控设备编写驱动程序,类似于 Mac 的 Apple Magic Trackpad 或 Logitech 触控板。

想法是所有 macOS 应用程序都可以使用此多点触控设备。新推出的DriverKit(或HIDDriverKit)要和应用程序捆绑,我还是用IOKit还是用DriverKit?

谢谢。

DriverKit 是围绕 IOKit 构建的——它只是它的另一个接口。所以我猜你的问题真的是你的驱动程序是否应该实现为:

  • DriverKit 系统扩展 (dext)
  • 内核扩展 (kext)
  • 其他

无论哪种方式,您都无法逃脱 IOKit,因为 USB 设备只能通过 IOKit 访问,并且 HID 堆栈也是基于它构建的。

蓝牙

据我所知,还没有用于 DriverKit 的蓝牙 API,至少目前还没有。 (截至 macOS 10.15.4)

因此,如果您的设备使用需要从头开始转换为 HID 事件源的自定义蓝牙协议,那么我认为您将无法使用 DriverKit,至少不能完全使用。

如果您的设备已经作为 HID 设备出现在系统中,但您的驱动程序需要重写 HID 报告,那么我认为可以使用 DriverKit 实现 - 至少值得研究。

将其作为 kext 实施肯定适用于所有情况,问题是任何新的 kext 在此阶段的保质期都非常有限。

USB

对于USB,更直接,有直接的DriverKit USB APIs。 USB HID 驱动程序是 DriverKit 支持的场景之一。因此,此时您绝对使用kext来实现针对macOS 10.15+的USB HID驱动程序。事实上,如果您确实开发了 USB HID kext,您的用户会定期看到一个糟糕的警告弹出窗口。

"Something Else?"

这让我们进入 "something else" 类别:您可以(几乎)完全在普通用户 space 中编写驱动程序作为使用用户 space 蓝牙和 USB 的守护进程API,然后将产生的 HID 事件注入系统。执行此操作的最佳方法可能最终是通过 DriverKit 驱动程序 - 因此您将有一个用户 space 守护进程执行大部分驱动程序逻辑,以及一个小型 DriverKit 驱动程序创建一个 "virtual" HID 设备只是将守护进程产生的事件传送到 HID 堆栈中。如果你需要支持旧的 OS 版本,这种方法中的 dext 的责任可以由 kext 承担,守护进程几乎不需要对所有 OS 版本的 运行 进行定制。

如果您的驱动程序将对原始输入数据进行大量复杂的处理,这可能是前进的方向,因为在 dext 或 kext 中实现此类逻辑并不理想。

要说哪种方法最好,我真的需要更多地了解该设备(这可能超出了 Stack Overflow 问题的范围……)。