Implementación de USB HAL

La versión Android 8.0 traslada el manejo de los comandos USB desde los scripts init a un demonio USB nativo para una mejor configuración y confiabilidad del código. Para la configuración de la función Gadget, se utilizan scripts init (activadores de propiedad) para realizar operaciones de gadget específicas del dispositivo.

En versiones anteriores, estas configuraciones específicas del dispositivo se lograban mediante scripts init específicos del dispositivo (mediante activadores de propiedades). Pasar a un diseño de capa de abstracción de hardware (HAL) da como resultado una implementación mucho más limpia que resuelve estos problemas:

  1. Operaciones como las escrituras en los nodos sysfs del kernel podrían fallar pero no propagarse al código del marco que establece el activador de propiedad. Como resultado, los marcos asumen incorrectamente que las operaciones han tenido éxito a pesar de que han fallado silenciosamente.
  2. Los scripts init tienen un número limitado de operaciones que pueden ejecutarse.

La versión de Android 12 agrega compatibilidad con USB Gadget HAL para modelos de control de red (NCM) y llamadas API que devuelven tanto el número de versión de HAL como la velocidad del USB. Para obtener más información sobre las llamadas API disponibles a través de USB HAL, consulte el resumen del paquete android.hardware.usb .

HAL y agudos

Los scripts init específicos del dispositivo se utilizaron como sustitución de las capas HAL para realizar operaciones USB específicas del dispositivo. USB (a través de ADB) es una interfaz principal para depurar problemas del sistema. Tener un demonio nativo para realizar la configuración USB elimina la dependencia del código del marco, por lo que incluso si el marco falla, el USB debería estar ejecutándose.

Según el modelo Treble también introducido en Android 8.0, todos los HAL están aislados de los servicios del sistema y deben ejecutarse en sus propios demonios nativos. Esto elimina el requisito de tener un demonio USB exclusivo, ya que la capa HAL también funciona como un demonio USB.

La implementación HAL predeterminada se encarga de todos los dispositivos anteriores a Android 8.0. Por lo tanto, no habría ningún trabajo específico para los dispositivos anteriores a Android 8.0. Android 8.0 utiliza la interfaz HAL para consultar el estado de los puertos USB y realizar intercambios de roles de datos y de energía.

Implementación

Es necesario implementar una nueva interfaz USB HAL en todos los dispositivos que se inicien con Android 8.0. La implementación predeterminada debería ocuparse de los dispositivos anteriores a Android 8.0. La implementación predeterminada es suficiente si el dispositivo usa la clase dual_role_usb para informar el estado del puerto tipo c. Es posible que se requieran cambios triviales en scripts USB específicos del dispositivo para transferir la propiedad de los nodos typc-c al sistema.