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



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

其想法是,所有macOS应用程序都可以使用这种多点触摸设备。由于新推出的DriverKit(或HIDDriverKit(将与应用程序捆绑在一起,我应该继续使用IOKit还是应该使用DriverKit?

谢谢。

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

  • DriverKit系统扩展(右旋(
  • 内核扩展(kext(
  • 其他的东西

无论哪种方式都无法逃离IOKit,因为USB设备只能通过IOKit访问,HID堆栈也建立在它之上。

蓝牙

据我所知,目前还没有蓝牙API可用于DriverKit,至少目前还没有。(自macOS 10.15.4起(

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

如果你的设备在系统中已经显示为HID设备,但你的驱动程序需要重写HID报告,那么我认为使用DriverKit实现是可能的——至少它值得研究。

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

USB

对于USB,它更简单,有直接的DriverKit USB API。USB HID驱动程序是DriverKit非常支持的场景之一。因此,在这一点上,您绝对应该而不是使用kext来实现针对macOS 10.15+的USB HID驱动程序。事实上,如果你开发了一个USB HID kext,你的用户会定期收到一个可怕的警告弹出窗口。

"还有什么?">

这就把我们带到了"其他东西"类别:您可以(几乎(完全在常规用户空间中使用用户空间蓝牙和USB API将驱动程序作为守护程序编写,然后将生成的HID事件注入系统。实现这一点的最佳方法可能最终是通过DriverKit驱动程序,因此您将有一个用户空间守护程序来执行大部分驱动程序逻辑,而一个小型DriverKit驱动程则创建一个"虚拟"HID设备,该设备只将守护程序产生的事件传送到HID堆栈中。如果您需要支持较旧的操作系统版本,那么在这种方法中,dext的责任可以由kext承担,守护进程几乎不需要定制就可以在所有操作系统版本上运行。

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

要说哪种方法是最好的,我真的需要了解更多关于该设备的信息(这可能超出了堆栈溢出问题的范围…(。

最新更新