Implementando USB HAL

A versão Android 8.0 transfere o manuseio de comandos USB dos scripts init para um daemon USB nativo para melhor configuração e confiabilidade do código. Para a configuração da função do gadget, scripts init (gatilhos de propriedade) são usados ​​para executar operações de gadget específicas do dispositivo.

Nas versões anteriores, essas configurações específicas do dispositivo eram obtidas por meio de scripts init específicos do dispositivo (usando gatilhos de propriedade). Mudar para um design de Camada de Abstração de Hardware (HAL) resulta em uma implementação muito mais limpa que resolve estes problemas:

  1. Operações como gravações nos nós sysfs do kernel podem falhar, mas não serem propagadas de volta ao código da estrutura que define o gatilho de propriedade. Como resultado, os frameworks assumem incorretamente que as operações foram bem-sucedidas, mesmo que tenham falhado silenciosamente.
  2. Os scripts init têm um número limitado de operações que podem ser executadas.

A versão do Android 12 adiciona suporte USB Gadget HAL para modelos de controle de rede (NCM) e chamadas de API que retornam o número da versão HAL e a velocidade do USB. Para obter mais informações sobre as chamadas de API disponíveis por meio do USB HAL, consulte o resumo do pacote android.hardware.usb .

HAL e agudos

Os scripts init específicos do dispositivo foram usados ​​como substitutos das camadas HAL para executar operações USB específicas do dispositivo. USB (por meio de ADB) é a interface principal para depuração de problemas do sistema. Ter um daemon nativo para realizar a configuração USB elimina a dependência do código da estrutura, portanto, mesmo que a estrutura trave, o USB deve estar em execução.

No modelo Treble também introduzido no Android 8.0, todos os HALs são isolados dos serviços do sistema e devem ser executados em seus próprios daemons nativos. Isso elimina a necessidade de ter um daemon USB exclusivo, já que a camada HAL também funciona como um daemon USB.

A implementação HAL padrão cuida de todos os dispositivos anteriores ao Android 8.0. Portanto, não haveria nenhum trabalho específico para dispositivos pré-Android 8.0. O Android 8.0 usa a interface HAL para consultar o status das portas USB e realizar trocas de funções de dados e de energia.

Implementação

A nova interface USB HAL precisa ser implementada em todos os dispositivos lançados no Android 8.0. A implementação padrão deve cuidar dos dispositivos anteriores ao Android 8.0. A implementação padrão é suficiente se o dispositivo usar a classe dual_role_usb para relatar o status da porta tipo c. Mudanças triviais podem ser necessárias em scripts USB específicos do dispositivo para transferir a propriedade dos nós typc-c para o sistema.