Implementar a HAL de USB

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

Em versões anteriores, essas configurações específicas do dispositivo eram feitas com scripts init específicos do dispositivo (usando acionadores de propriedade). A migração para um design de camada de abstração de hardware (HAL, na sigla em inglês) 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 são propagadas de volta ao código dos frameworks que define o gatilho da propriedade. Como resultado, os frameworks presumem incorretamente que as operações foram concluídas, 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 à HAL de gadget USB para modelos de controle de rede (NCM, na sigla em inglês) e chamadas de API que retornam o número da versão da HAL e a velocidade do USB. Para mais informações sobre as chamadas de API disponíveis no HAL de USB, consulte o resumo do pacote android.hardware.usb.

HAL e Treble

Os scripts init específicos do dispositivo foram usados como substituição das camadas HAL para realizar operações USB específicas do dispositivo. O USB (pelo ADB) é uma interface principal para depurar problemas do sistema. Ter um daemon nativo para realizar a configuração USB elimina a dependência do código do framework. Assim, mesmo que o framework falhe, o USB vai continuar funcionando.

No modelo Treble, também introduzido no Android 8.0, todos os HALs são isolados dos serviços do sistema e precisam ser executados nos 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 padrão da HAL cuida de todos os dispositivos anteriores ao Android 8.0. Portanto, não haveria nenhum trabalho específico do dispositivo para os dispositivos anteriores ao Android 8.0. O Android 8.0 usa a interface HAL para consultar o status das portas USB e realizar trocas de função de dados e de energia.

Implementação

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