Estadísticas de potencia HAL

La energía del subsistema del dispositivo a menudo se mide y registra en un entorno de laboratorio para diversas condiciones de estado estable, como cuando la pantalla está encendida o el dispositivo está en un estado de energía inactivo. Esto funciona para subsistemas con un consumo de energía constante o en condiciones que se pueden medir fácilmente en entornos de laboratorio, pero no para ciertos casos de uso, como cuando una pantalla muestra un video.

IPower.hal 1.0 proporciona una interfaz para pasar sugerencias de energía y reportar datos acumulativos sobre métricas del estado de suspensión del subsistema. En Android 10 y versiones posteriores, la función de informes de estadísticas acumulativas reside en las API de recopilación de estadísticas de energía IPowerStats.hal y proporciona una forma de recuperar datos de uso de energía en el dispositivo. Esto reemplaza la parte de recopilación de estadísticas acumulativas de la interfaz IPower.hal , para una separación más clara de la funcionalidad.

Las lecturas del servicio IPowerStats no son periódicas. Ocurren en momentos clave, como cuando hay una caída de batería del 1%. Las lecturas son menos frecuentes cuando el consumo de batería es bajo y más frecuentes cuando es alto. Los datos se pueden enviar de vuelta a los servidores y se pueden utilizar en informes de errores para análisis y clasificación. Esto respalda los esfuerzos continuos para disminuir el consumo de energía y aumentar la duración de la batería.

IPower.hal y IPowerStats.hal

Tanto la interfaz IPower.hal como IPowerStats.hal están disponibles en Android 10, pero la funcionalidad de recopilación de estadísticas IPower.hal solo está disponible desde la interfaz IPowerStats.hal . La funcionalidad IPowerStats.hal incluye API para adquirir y utilizar datos recopilados de mediciones de energía en el dispositivo para dispositivos compatibles:

  • Realiza mediciones de energía a nivel de riel para clientes de baja frecuencia ( getRailInfo ) y de alta frecuencia ( streamEnergyData ), e informa la energía acumulada desde el arranque.
  • Informa información relacionada con cada PowerEntity compatible para la cual hay datos disponibles. Una PowerEntity es un subsistema de plataforma, periférico o dominio de energía que afecta el consumo total de energía del dispositivo.
  • Informa el conjunto de estados de entidades de energía ( getPowerEntityStateInfo ) para los cuales las entidades especificadas proporcionan datos de residencia y luego informa los datos acumulados para cada PowerEntity especificada.

Las API IPowerStats.hal son utilizadas por los siguientes clientes:

  • Statsd , para recopilar métricas de consumo de energía por riel.
  • Perfetto , para correlacionar el consumo de energía con la actividad de la CPU.
  • Batterystats , para mejorar la atribución de la batería mediante el uso de datos medidos en lugar de estimar el consumo de la batería a partir de constantes predefinidas en power_profile.xml.

Con Android 10 y versiones posteriores, el fabricante de un dispositivo puede elegir entre las funciones IPower.hal e IPowerStats.hal , pero todos los clientes deben recurrir a IPower.hal si IPowerStats.hal no está implementado.

Opciones de implementación de IPowerStats.hal

Solo las funciones IPower.hal están disponibles desde Android 7 hasta Android 9. Los dispositivos que se hayan actualizado a Android 10 deben tener un subsistema de monitoreo de energía de hardware u otros medios disponibles para monitorear y registrar estadísticas de energía. Algunos SoC recopilan estadísticas de uso de energía para usted, o usted puede obtener información de residencia del estado de la entidad de energía a través del software. El hardware de monitoreo de energía solo es necesario para admitir getRailInfo() , getEnergyData() y streamEnergyData() .

Si implementa IPowerStats.hal sin hardware de monitoreo de energía, getRailInfo(), getEnergyData() y streamEnergyData() devuelven NOT_SUPPORTED . De manera similar, getPowerEntityInfo(), getPowerEntityStateInfo() y getPowerEntityStateResidencyData() también pueden devolver NOT_SUPPORTED si no está previsto su uso.

Ejemplos de datos devueltos por las API de monitoreo ferroviario incluyen

  • El riel de alimentación de la pantalla consumió X µW.
  • El riel de alimentación del módem consumió Y µW.

Ejemplos de datos devueltos por las API de estado de suspensión del subsistema incluyen

  • El módem estuvo inactivo durante X ms.
  • El SoC estuvo en estado de colapso de energía durante Y ms.
  • La GPU estuvo en estado de suspensión durante Z ms.

Utilice un subsistema de monitoreo de energía de hardware

Si el diseño de su dispositivo tiene un subsistema de monitoreo de energía de hardware, implemente IPowerStats.hal creando un único nodo sysfs desde el cual PowerStats.hal pueda analizar datos o realizando una colección de llamadas al sistema de tipo ioctl .

Debe implementar su controlador de kernel de manera que evite el desbordamiento del acumulador. El algoritmo utilizado depende del diseño exclusivo del subsistema de monitoreo de energía del hardware, que debe proporcionar mediciones de corriente y voltaje del bus tanto instantáneas como promedio. El controlador del kernel debe capturar estos datos de una manera que no borre los acumuladores de energía y debe mantener los datos de energía acumulada para cada subriel desde el inicio, en forma de una variable de 64 bits que se incrementa con la lectura de energía de cada consulta del acumulador.

Las estadísticas de un componente determinado (u opcionalmente, de varios componentes) deben estar en un único nodo. Si bien este no es un uso convencional de sysfs (que normalmente limita cada nodo a un único valor), garantiza que todos los datos sean consistentes.

Guía de diseño

  • Mantenga la latencia baja (1 ms, máximo) al leer desde el nodo sysfs o al realizar llamadas al sistema.
  • Asegúrese de que la funcionalidad de estadísticas de soporte no aumente de manera mensurable el consumo de energía:
    • No aumente las reactivaciones del punto de acceso (AP) y/o del subsistema para realizar un seguimiento de parámetros como el tiempo pasado en modo de suspensión.
    • Transfiera estadísticas entre el procesador de aplicaciones y el firmware de manera oportunista con otro tráfico cuando sea posible.
  • Si es necesario, el subsistema puede utilizar las siguientes funciones del controlador:
    • Almacenamiento en caché interno de datos para evitar latencia/activaciones a expensas de datos ligeramente obsoletos.
    • Realizar una extrapolación cuando el subsistema está dormido, para proporcionar un tiempo de suspensión actualizado sin despertar el subsistema.

Elija componentes, subsistemas y estadísticas.

Al elegir qué componentes o subsistemas recopilar datos de IPowerStats.hal , seleccione cualquier cosa en el dispositivo que consuma una corriente significativa (5 mA o más) o que admita múltiples modos de consumo de energía, como los siguientes:

  • Subsistemas SoC individuales.
  • Subsistemas parcial o totalmente fuera del SoC, como el WiFi, el procesador de imagen o el procesador de seguridad.
  • Periféricos como LEDs de alta potencia y cámaras.
  • Dominios de potencia que utilizan diferentes modos (como el dominio de potencia para el SoC en su conjunto).

Personalización

Esta característica opcional se puede personalizar. Diseñe casos de uso y personalice su uso:

  • Decida qué rieles medir y con qué frecuencia hacerlo.
  • Decida cuándo leer los datos y cómo interpretarlos.
  • Decida qué acción tomar y cuándo tomarla, según sus datos.

Validación

Las pruebas VTS garantizan que se cumplan los requisitos de Android. Los comentarios en IPowerStats.hal se utilizan para verificar que un dispositivo cumple.

Por ejemplo, si llama a getRailInfo() y no devuelve nada, la prueba VTS falla porque no recibió información sobre los rieles monitoreados o un estado devuelto de SUCCESS . De manera similar, si recibió información ferroviaria, pero iba acompañada de una respuesta NON_SUPPORTED o FILE_SYSTEM_ERROR , eso también es un error. El VTS verifica que se cumplan las especificaciones del fabricante del dispositivo en el archivo HAL, utilizando los requisitos de los comentarios IPower.hal e IPowerStats.hal. A continuación se muestra un ejemplo de comentarios utilizados en las pruebas VTS:

/**
* Rail information:
* Reports information related to the rails being monitored.
*
* @return rails Information about monitored rails.
* @return status SUCCESS on success or NOT_SUPPORTED if
* feature is not enabled or FILESYSTEM_ERROR on filesystem nodes
* access error.
*/
getRailInfo()
generates(vec<e;RailInfo>e; rails, Status status);