Manejo de conexión en caliente

Las capacidades de visualización (como los modos de visualización y los tipos HDR admitidos) pueden cambiar dinámicamente en dispositivos que tienen pantallas conectadas externamente (con HDMI o DisplayPort), como decodificadores de Android TV (STB) y over-the-top (OTT). dispositivos. Este cambio puede ocurrir como resultado de una señal HDMI de conexión en caliente, como cuando el usuario cambia de una pantalla a otra o inicia el dispositivo sin una pantalla conectada. Android 12 y versiones posteriores incluyen cambios en el marco para manejar las capacidades de visualización dinámica y conexión en caliente.

Esta página describe el manejo de las conexiones en caliente de pantalla y los cambios en las capacidades de pantalla en la implementación de Composer HAL. Además, analiza cómo gestionar el framebuffer asociado y prevenir condiciones de carrera en estas situaciones.

Actualizar capacidades de visualización

Esta sección describe cómo el marco de Android maneja los cambios en las capacidades de visualización iniciadas por Composer HAL.

Antes de que Android pueda manejar correctamente los cambios en las capacidades de visualización, el OEM debe implementar Composer HAL de manera que utilice onHotplug(display, connection=CONNECTED) para notificar al marco de cualquier cambio en las capacidades de visualización. Una vez implementado, Android maneja los cambios en las capacidades de visualización de la siguiente manera:

  1. Al detectar un cambio en las capacidades de visualización, el marco recibe una notificación onHotplug(display, connection=CONNECTED) .
  2. Al recibir la notificación, el marco elimina su estado de visualización y lo recrea con las nuevas capacidades de HAL mediante los métodos getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities y getDisplayCapabilities .
  3. Después de que el marco recrea un nuevo estado de visualización, envía la devolución de llamada onDisplayChanged a las aplicaciones que están escuchando dichos eventos.

El marco reasigna los framebuffers en eventos onHotplug(display, connection=CONNECTED) posteriores. Consulte Administración de framebuffers del cliente para obtener más información sobre cómo administrar correctamente la memoria de framebuffers para evitar fallas durante la asignación de nuevos framebuffers.

Manejar escenarios de conexión comunes

Esta sección cubre cómo manejar adecuadamente varios escenarios de conexión en sus implementaciones cuando la pantalla principal está conectada y desconectada.

Al haber sido creado para dispositivos móviles, el marco de Android no tiene soporte integrado para una pantalla principal desconectada. En cambio, HAL debe reemplazar la pantalla principal con una pantalla de marcador de posición en sus interacciones con el marco en el caso de que una pantalla principal esté físicamente desconectada.

Los siguientes escenarios pueden ocurrir en STB y dongles de TV que tienen pantallas conectadas externamente que se pueden desconectar. Para implementar la compatibilidad con estos escenarios, utilice la información de la siguiente tabla:

Guión Manejo
No hay pantalla conectada en el momento del arranque
  • Envíe una señal onHotplug(display, connection=CONNECTED) desde Composer HAL al marco.
  • Reemplace el estado de visualización física dentro de Composer HAL con un estado de visualización de marcador de posición.
La pantalla principal está físicamente conectada
La pantalla principal está físicamente desconectada
  • Envíe otro evento onHotplug(display, connection=CONNECTED) desde Composer HAL al marco.
  • Reemplace el estado de visualización física dentro de Composer HAL con un estado de visualización de marcador de posición. La visualización del marcador de posición debe tener un modo de visualización único, de modo que el marco envíe la devolución de llamada onDisplayChanged a las aplicaciones (porque el conjunto de modos admitidos ha cambiado). Este modo de pantalla única debe coincidir con el último modo activo de la pantalla física antes de la desconexión, para que las aplicaciones no reciban eventos de cambio de configuración .

Utilice ID de configuración secuenciales para evitar condiciones de carrera

Pueden surgir condiciones de carrera si Composer HAL actualiza las configuraciones de visualización admitidas simultáneamente con el marco que llama setActiveConfig o setActiveConfigWithConstraints . La solución es implementar Composer HAL para usar ID secuenciales y evitar este problema.

Esta sección describe cómo podrían ocurrir las condiciones de carrera, seguida de detalles sobre cómo implementar Composer HAL para que utilice ID secuenciales para evitar tales condiciones.

Considere la siguiente secuencia de eventos, cuando NO se asignan nuevos ID secuenciales a las nuevas configuraciones de pantalla, lo que provoca una condición de carrera:

  1. Los ID de configuración de pantalla admitidos son:

    • identificación=1 , 1080x1920 60 Hz
    • identificación=2 , 1080x1920 50 Hz
  2. El marco llama setActiveConfig(display, config=1) .

  3. Al mismo tiempo, Composer HAL procesa un cambio de configuraciones de pantalla y actualiza su estado interno a un nuevo conjunto de configuraciones de pantalla, que se muestra a continuación:

    • identificación=1 , 2160x3840 60 Hz
    • identificación=2 , 2160x3840 50 Hz
    • identificación=3 , 1080x1920 60 Hz
    • identificación=4 , 1080x1920 50 Hz
  4. Composer HAL envía un evento onHotplug al marco para notificar que el conjunto de modos admitidos ha cambiado.

  5. Composer HAL recibe setActiveConfig(display, config=1) (del paso 2).

  6. HAL interpreta que el marco ha solicitado un cambio de configuración a 2160x3840 60 Hz , aunque en realidad se deseaba 1080x1920 60 Hz .

El proceso que utiliza asignaciones de ID no secuenciales termina aquí con una mala interpretación del cambio de configuración deseado.

Configurar Composer HAL para usar ID secuenciales

Para evitar tales condiciones de carrera, el OEM debe implementar Composer HAL de la siguiente manera:

  • Cuando Composer HAL actualiza las configuraciones de pantalla admitidas, asigna nuevas ID secuenciales a las nuevas configuraciones de pantalla.
  • Cuando el marco llama setActiveConfig o setActiveConfigWithConstraints con un ID de configuración no válido, Composer HAL ignora la llamada.

Estos pasos sirven para prevenir condiciones de carrera como se muestra en la siguiente discusión.

Considere la siguiente secuencia de eventos, cuando se asignan nuevos ID secuenciales a las nuevas configuraciones de pantalla:

  1. Los ID de configuración de pantalla admitidos son:

    • identificación=1 , 1080x1920 60 Hz
    • identificación=2 , 1080x1920 50 Hz
  2. El marco llama setActiveConfig(display, config=1) .

  3. Cuando se procesa un cambio de configuraciones de pantalla, el siguiente conjunto de ID de configuración se asigna a partir del siguiente entero no utilizado, como se muestra a continuación:

    • identificación=3 , 2160x3840 60 Hz

    • identificación=4 , 2160x3840 50 Hz

    • identificación=5 , 1080x1920 60 Hz

    • identificación=6 , 1080x1920 50 Hz

  4. Composer HAL envía un evento onHotplug al marco para notificar que el conjunto de modos admitidos ha cambiado.

  5. Composer HAL recibe setActiveConfig(display, config=1) (del paso 2).

  6. Composer HAL ignora la llamada porque la identificación ya no es válida.

  7. El marco recibe y procesa el evento onHotplug del paso 4. Llama al Composer HAL usando las funciones getDisplayConfigs y getDisplayAttribute . Con estas funciones el framework identifica el nuevo ID (5) para la resolución y frecuencia de actualización deseadas de 1080x1920 y 60 Hz.

  8. El marco envía otro evento setActiveConfig con un ID actualizado de 5.

  9. Composer HAL recibe setActiveConfig(display, config=5) del paso 5.

  10. HAL interpreta correctamente que el marco ha solicitado un cambio de configuración a 1080x1920 60 Hz.

Como se muestra en el ejemplo anterior, el proceso que utiliza asignaciones de ID secuenciales garantiza que se evite la condición de carrera y se actualice el cambio de configuración de visualización correcto.