Implementando USB HAL

A versão Android 8.0 move o manuseio de comandos USB de scripts de init para um daemon USB nativo para melhor configuração e confiabilidade de código. Para a configuração da função Gadget, os scripts de init (gatilhos de propriedade) são usados ​​para realizar 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 de init específicos do dispositivo (usando acionadores de propriedade). A mudança para um design HAL (Hardware Abstraction Layer) 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 podem ser propagadas de volta para o código de estruturas que define o gatilho de propriedade. Como resultado, as estruturas assumem incorretamente que as operações foram bem-sucedidas, embora tenham falhado silenciosamente.
  2. scripts init têm um número limitado de operações que podem ser executadas.

A versão Android 12 adiciona suporte a USB Gadget HAL para Network Control Models (NCM) e chamadas de API que retornam o número da versão HAL e a velocidade 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 de init específicos do dispositivo foram usados ​​como uma substituição das camadas HAL para executar operações USB específicas do dispositivo. USB (através do ADB) é uma interface primária para depurar problemas do sistema. Ter um daemon nativo para executar a configuração USB elimina a dependência do código do framework, portanto, mesmo que o framework falhe, o USB deve estar em execução.

Sob o modelo Treble também introduzido no Android 8.0, todos os HALs são isolados dos serviços do sistema e precisam 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 pré-Android 8.0. Portanto, não haveria nenhum trabalho específico de dispositivo para os 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ção de dados e função 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 de dispositivos pré-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. Alterações triviais podem ser necessárias em scripts USB específicos do dispositivo para transferir a propriedade dos nós typc-c para o sistema.