Как реализовать USB HAL

В Android 8.0 обработка команд USB перенесена из скриптов initв собственный демон USB для более эффективной настройки и надежности кода. Для настройки функции гаджета используются скрипты init (триггеры свойств), которые выполняют операции гаджета, относящиеся к устройству.

В предыдущих версиях эти конфигурации для конкретных устройств создавались с помощью скриптов init для конкретных устройств (с использованием триггеров свойств). Переход на аппаратно-зависимый уровень (HAL) позволяет решить эти проблемы и упростить реализацию.

  1. Операции, такие как запись в узлы sysfs ядра, могут завершиться неудачно, но не передаваться обратно в код фреймворка, который устанавливает триггер свойства. В результате фреймворки ошибочно считают, что операции выполнены успешно, хотя на самом деле они завершились с ошибкой.
  2. В скриптах init можно выполнять ограниченное количество операций.

В Android 12 добавлена поддержка USB Gadget HAL для моделей управления сетью (NCM) и вызовов API, которые возвращают номер версии HAL и скорость USB. Дополнительную информацию о вызовах API, доступных через USB HAL, можно найти в кратком описании пакета android.hardware.usb.

HAL и Treble

Скрипты init, предназначенные для определенных устройств, использовались вместо уровней HAL для выполнения операций с USB, относящихся к определенным устройствам. USB (через ADB) – основной интерфейс для отладки системных проблем. Наличие нативного демона для настройки USB устраняет зависимость от кода фреймворка, поэтому даже в случае сбоя фреймворка USB должен работать.

В модели Treble, которая также появилась в Android 8.0, все HAL изолированы от системных сервисов и должны работать в собственных демонах. Это позволяет отказаться от использования отдельного демона USB, поскольку уровень HAL может выполнять функции демона USB.

Реализация HAL по умолчанию поддерживает все устройства с версиями ОС, предшествующими Android 8.0. Поэтому для устройств с ОС более ранней версии, чем Android 8.0, не будет никаких задач, связанных с устройством. В Android 8.0 для запроса статуса портов USB и выполнения переключения ролей данных и питания используется интерфейс HAL.

Реализация

Новый интерфейс USB HAL должен быть реализован на каждом устройстве, запускаемом на Android 8.0. Реализация по умолчанию должна поддерживать устройства с Android 8.0 и более ранних версий. Реализация по умолчанию подходит, если устройство использует класс dual_role_usb для передачи статуса порта USB-C. Для передачи права собственности на узлы typc-c системе могут потребоваться незначительные изменения в скриптах USB для устройств.