Реализация 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 и высокие частоты

Сценарии 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 для сообщения о состоянии порта type-c. Для передачи прав собственности на узлы typc-c в систему могут потребоваться тривиальные изменения в USB-скриптах для конкретных устройств.