Реализация USB HAL

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

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

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

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

HAL и тройной

Сценарии 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 использует интерфейс HAL для запроса состояния USB-портов и выполнения ролей данных и ролей питания.

Выполнение

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