Должен ли я использовать IOKit или DriverKIt (или HIDDriverKit) для написания драйвера для устройства Multi-Touch USB или Bluetooth в macOS?

Я планирую написать драйвер для мультисенсорного устройства USB или Bluetooth, аналогичного Apple Magic Trackpad или Logitech trackpad для Mac.

Идея состоит в том, что все приложения macOS могут использовать это устройство multi-touch. Поскольку недавно представленный DriverKit (или HIDDriverKit) должен быть связан с приложениями, следует ли мне по-прежнему использовать IOKit или мне следует использовать DriverKit?

Спасибо.

1 ответ

Решение

DriverKit построен на основе IOKit - это просто еще один интерфейс к нему. Итак, я думаю, ваш вопрос действительно в том, должен ли ваш драйвер быть реализован как:

  • Системное расширение DriverKit (dext)
  • Расширение ядра (kext)
  • Что-то другое

В любом случае вы не избежите IOKit, потому что USB-устройства доступны только через IOKit, и стек HID также построен на нем.

Bluetooth

Насколько мне известно, API Bluetooth для использования с DriverKit не существует, по крайней мере, пока. (Начиная с macOS 10.15.4)

Поэтому, если ваше устройство использует настраиваемый протокол Bluetooth, который необходимо превратить в источник событий HID с нуля, я не думаю, что вы сможете использовать DriverKit, по крайней мере, не исключительно.

Если ваше устройство уже отображается в системе как HID-устройство, но вашему драйверу необходимо переписать отчеты HID, я думаю, что его можно реализовать с помощью DriverKit - по крайней мере, стоит изучить.

Реализация его как kext определенно будет работать во всех случаях, проблема в том, что у любых новых kexts на этом этапе будет очень ограниченный срок хранения.

USB

Для USB все проще, есть прямые USB API DriverKit. Драйверы USB HID - один из сценариев, хорошо поддерживаемых DriverKit. Поэтому вам определенно не следует использовать kext для реализации драйвера USB HID, нацеленного на macOS 10.15+, на данном этапе. Фактически, если бы вы разработали USB HID kext, вашим пользователям периодически отображалось бы ужасное всплывающее окно с предупреждением.

"Что-то другое?"

Это подводит нас к категории "что-то еще": вы можете написать драйвер (почти) полностью в обычном пользовательском пространстве в качестве демона, используя интерфейсы Bluetooth и USB в пользовательском пространстве, а затем внедрить созданные HID-события обратно в систему. Лучшим способом сделать это может быть драйвер DriverKit - так что у вас будет демон пользовательского пространства, выполняющий большую часть логики драйвера, и небольшой драйвер DriverKit, создающий "виртуальное" HID-устройство, которое просто передает события, производимые демон в HID стек. Если вам нужно поддерживать более старые версии ОС, ответственность за декст в этом подходе может взять на себя kext, при этом демону практически не нужно настраивать для работы во всех версиях ОС.

Если ваш драйвер будет выполнять много сложной обработки необработанных входных данных, это может быть шагом вперед, поскольку реализация такой логики в dext или kext не идеальна.

Чтобы сказать, какой подход лучше, мне действительно нужно знать гораздо больше об устройстве (и это может выходить за рамки вопроса о переполнении стека…).

Другие вопросы по тегам