Interfaz UWB HAL

La pila de banda ultra ancha (UWB) de AOSP utiliza la interfaz UCI definida por FiRa como superficie HAL. La interfaz HAL utiliza una tubería opaca ( IUwbChip::sendUciMessage() y IUwbClientCallback::onUciMessage() ) para enviar y recibir comandos, respuestas y notificaciones de la interfaz de comandos UWB (UCI). Todos los proveedores de Android UWB deben admitir todos los mensajes definidos por la especificación FiRa. El marco UWB es compatible con versiones anteriores y funciona con cualquier versión de UCI implementada por el proveedor de UWB en el dispositivo. Debido a que el marco AOSP UWB es un módulo , también puede agregar selectivamente soporte para solicitudes de cambio (CR) aprobadas a partir de borradores de especificaciones UCI destinadas a las principales versiones de estándares de FiRa. Cualquier borrador de CR implementado está sujeto a cambios.

Definición de interfaz

La interfaz UWB HAL se define utilizando AIDL estable . La interfaz principal utiliza el paquete android.hardware.uwb .

Las siguientes son las dos interfaces principales del paquete android.hardware.uwb .

IUwbChip.aidl

package android.hardware.uwb;

interface IUwbChip {

 String getName();

 void open(in android.hardware.uwb.IUwbClientCallback clientCallback);

 void close();

 void coreInit();

 void sessionInit(int sessionId);

 int getSupportedAndroidUciVersion();

 int sendUciMessage(in byte[] data);

}

IUwbClientCallback.aidl

package android.hardware.uwb;

interface IUwbClientCallback {

 oneway void onUciMessage(in byte[] data);

 oneway void onHalEvent(in android.hardware.uwb.UwbEvent event, in android.hardware.uwb.UwbStatus status);

}

Flujo de llamadas HAL desde el marco UWB

Las siguientes imágenes ilustran el flujo de llamadas desde el marco de trabajo de UWB para la inicialización de la pila de UWB, la desinicialización de la pila de UWB y los procesos de inicio y detención de sesiones de UWB.

Inicialización de la pila UWB

Figura 1. Flujo de llamadas de inicialización de la pila UWB (activación de UWB)

Desinicialización de la pila UWB

Figura 2. Flujo de llamadas de desinicialización de la pila UWB (desactivación de UWB)

Inicio y parada de sesión UWB

Figura 3. Flujo de inicio/detención de sesión UWB

Configuración del código de país UWB

Como se muestra en la Figura 1, el marco UWB configura el código de país UWB durante la inicialización de la pila UWB utilizando el comando UCI del espacio del proveedor ANDROID_SET_COUNTRY_CODE (GID= 0xC , OID= 0x1 ). El marco UWB intenta determinar el código de país UWB utilizando las siguientes fuentes (enumeradas en orden de prioridad). El marco UWB se detiene en la primera fuente donde se determina el código de país.

  1. Anular código de país: código de país forzado mediante un comando adb shell (prueba local o automatizada).
  2. Código de país de telefonía: Código de país recuperado a través del celular. Si hay varias SIM que devuelven códigos diferentes, el código de país elegido no es determinista.
  3. Código de país Wi-Fi: Código de país recuperado a través de Wi-Fi (80211.ad).
  4. Último código de país de telefonía conocido: último código de país conocido recuperado a través del celular. Si hay varias SIM que devuelven códigos diferentes, el código de país elegido no es determinista.
  5. Código de país de ubicación: código de país recuperado del proveedor de ubicación fusionado LocationManager .
  6. Código de país predeterminado del OEM: código de país establecido por el fabricante del dispositivo.

Si el marco UWB no puede determinar un código de país UWB, llama al comando UCI ANDROID_SET_COUNTRY_CODE con un valor de DEFAULT_COUNTRY_CODE ("00") y notifica a las aplicaciones UWB que el estado de la pila UWB está DISABLED . Más adelante, cuando el marco UWB puede determinar un código de país válido, configura el nuevo código de país usando el comando ANDROID_SET_COUNTRY_CODE y notifica a las aplicaciones UWB que la pila UWB está READY .

Si no se puede utilizar UWB debido a las regulaciones locales de un país, el controlador UWB devuelve el código de estado STATUS_CODE_ANDROID_REGULATION_UWB_OFF . Luego, el marco UWB notifica a las aplicaciones UWB que el estado de la pila UWB está DISABLED .

Cuando un usuario viaja a un país diferente, el marco UWB configura un nuevo código de país usando el comando UCI ANDROID_SET_COUNTRY_CODE . Dependiendo del código de estado devuelto por el controlador UWB (según las regulaciones de UWB en el nuevo país), esto podría provocar un cambio en el estado de la pila de UWB.

Formato de comando definido por la especificación FIRA UCI

Para conocer el formato de los paquetes de control UCI, consulte la sección 4.4.2 de la especificación UCI .

Versionado de la interfaz

La especificación UCI permite a los proveedores de UWB exponer la versión de la pila UCI implementada por el dispositivo mediante los comandos UCI_GET_DEVICE_INFO_RSP y UCI_GET_CAPS_INFO_RSP . El marco utiliza estos comandos para obtener la versión UCI del dispositivo y cambiar su comportamiento en consecuencia.

Lista de proyectos de CR respaldados por el módulo UWB

Los siguientes borradores de CR para FiRa 2.0 son compatibles con la versión del módulo UWB #330810000:

Interfaz UCI de Android (parte del proveedor de FiRa)

La especificación UCI define un conjunto de identificadores de grupo (GID) e identificadores de código de operación (OID) para todos los mensajes definidos por la especificación. La especificación también reserva un conjunto de GID reservados exclusivamente para uso del proveedor. La pila AOSP UWB utiliza algunos de estos GID y OID de proveedores para comandos específicos de Android que no están definidos en la especificación. Para más detalles, consulte la sección 8.4 de la especificación UCI .

Estos mensajes de proveedores utilizados por Android se definen en el paquete HAL android.hardware.uwb.fira_android .

Control de versiones de la interfaz del proveedor

Los proveedores de UWB deben exponer la versión del paquete HAL android.hardware.uwb.fira_android compatible con el dispositivo a través de IUwbChip.getSupportedAndroidUciVersion() . El marco utiliza esta información de versiones para manejar la compatibilidad con versiones anteriores.

Lista de GID y OID de Android

La siguiente tabla enumera los GID y OID para Android. Los GID 0xE y 0xF están reservados para que los utilicen los OEM de Android.

GID OID Definición
ANDROID = 0xC ANDROID_GET_POWER_STATS = 0x0 Utilizado por el comando y la respuesta para obtener estadísticas relacionadas con la energía UWB. Solo se admite si UwbVendorCapabilityTlvTypes.SUPPORTED_POWER_STATS_QUERY está establecido en 1 .
ANDROID_SET_COUNTRY_CODE = 0x1

Se utiliza para configurar el código regulatorio de país actual (determinado mediante SIM o Wi-Fi, o codificado por el OEM). El código de país se envía como un valor de 2 bytes correspondiente al código de país ISO-3166. Se utiliza un valor de 00 para indicar que se desconoce el código de país.

ANDROID_RANGE_DIAGNOSTICS = 0x2 Utilizado por la notificación para obtener estadísticas de diagnóstico de alcance UWB. Solo se admite si UwbVendorCapabilityTlvTypes.SUPPORTED_DIAGNOSTICS está establecido en 1 .
OEM = 0xE,0xF 0x00 - 0x3F Reservado para uso OEM.

Extensiones de proveedores a mensajes definidos por la especificación UCI

Esta sección describe detalles de las extensiones de proveedores para mensajes definidos por especificaciones UCI.

SESSION_SET_APP_CONFIG_[CMD|RSP] y SESSION_GET_APP_CONFIG_[CMD|RSP]

Los siguientes son los valores de longitud de tipo (TLV) definidos por la pila AOSP en la parte reservada por el proveedor de los TLV en APP_CONFIG :

  • GID: 0001b (grupo de configuración de sesión UWB)
  • OID: 000011b ( SESSION_SET_APP_CONFIG_CMD )
  • OID: 000100b ( SESSION_GET_APP_CONFIG_CMD )

La siguiente tabla enumera los parámetros para los mensajes de configuración de sesión UWB.

Nombre del parámetro Longitud
(octetos)
Etiqueta
(identificaciones)
Versión de la interfaz del proveedor Descripción
NB_OF_RANGE_MEASUREMENTS 1 0xE3 1 Relación de entrelazado si AOA_RESULT_REQ se establece en 0xF0 . Solo se admite si UwbVendorCapabilityTlvTypes.SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING está establecido en 1 .
NB_OF_AZIMUTH_MEASUREMENTS 1 0xE4 1
NB_OF_ELEVATION_MEASUREMENTS 1 0xE5 1
ENABLE_DIAGNOSTICS 1 0xE8 2

Valor de 1 byte para habilitar o deshabilitar los informes de diagnóstico. Configure este parámetro solo cuando CORE_GET_CAPS_INFO_RSP devuelva SUPPORTED_DIAGNOSTICS con un valor de 1 que indica que se admite la función de informes de diagnóstico.

Valores:

  • 1 : función habilitada
  • 0 : función deshabilitada

DIAGRAMS_FRAME_REPORTS_FIELDS 1 o 4 0xE9 2

Máscara de bits de 1 o 4 bytes para configurar informes de diagnóstico. Esta máscara de bits es de 1 byte en Android 14 o superior y de 4 bytes en Android 13 o inferior.

Configure este parámetro solo cuando CORE_GET_CAPS_INFO_RSP devuelva SUPPORTED_DIAGNOSTICS con un valor de 1 que indica que se admite la función de informes de diagnóstico.

Definiciones de bits:

  • b0 (0x01) : Activar campos RSSI
  • b1 (0x02) : Activar campos AoA
  • b2 (0x04) : Activar campos CIR

CORE_GET_CAPS_INFO_RSP

Los siguientes son los TLV definidos por la pila AOSP en la parte reservada por el proveedor de los TLV en CAPS_INFO :

  • GID: 0000b (grupo principal UWB)
  • OID: 000011b ( CORE_GET_CAPS_INFO_RSP )

La siguiente tabla enumera los parámetros para los mensajes de capacidad UWB.

Nombre del parámetro Longitud
(octetos)
Etiqueta
(identificaciones)
Versión de la interfaz del proveedor Descripción
SUPPORTED_POWER_STATS_QUERY 1 0xC0 1

Valor de 1 byte que indica compatibilidad con la consulta de estadísticas de energía.

Valores:

  • 1 : función compatible
  • 0 : función no compatible
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING 1 0xE3 1

Valor de 1 byte que indica compatibilidad con la función de entrelazado de antena.

Valores:

  • 1 : función compatible
  • 0 : función no compatible
SUPPORTED_MIN_RANGING_INTERVAL_MS 4 0xE4 2 Valor de 4 bytes que indica el intervalo de alcance mínimo admitido en milisegundos.
SUPPORTED_RANGE_DATA_NTF_CONFIG 4 0xE5 2 Máscara de bits de 4 bytes que indica los valores RANGE_DATA_NTF_CONFIG admitidos. Máscara de bits donde cada bit corresponde a los valores utilizados en RANGE_DATA_NTF_CONFIG en SET_APP_CFG_CMD .
SUPPORTED_RSSI_REPORTING 1 0xE6 2

Valor de 1 byte que indica la compatibilidad con informes RSSI.

Valores:

  • 1 : función compatible
  • 0 : función no compatible
SUPPORTED_DIAGNOSTICS 1 0xE7 2

Valor de 1 byte que indica la compatibilidad con informes de diagnóstico.

Valores:

  • 1 : función compatible
  • 0 : función no compatible
SUPPORTED_MIN_SLOT_DURATION_RSTU 4 0xE8 2 Valor de 4 bytes que indica la duración mínima de ranura admitida en RSTU.
SUPPORTED_MAX_RANGING_SESSION_NUMBER 4 0xE9 2 Valor de 4 bytes que indica el número máximo admitido de sesiones de alcance FiRa.
SUPPORTED_CHANNELS_AOA 2 0xEA 2

Máscara de bits de 2 bytes para indicar los canales que admiten AoA. Cada 1 en la máscara de bits corresponde a un canal UWB específico.

Valores:

  • 0x01 : Canal 5 compatible
  • 0x02 : Canal 6 compatible
  • 0x04 : Canal 8 compatible
  • 0x08 : Canal 9 compatible
  • 0x10 : canal 10 compatible
  • 0x20 : canal 12 compatible
  • 0x40 : canal 13 compatible
  • 0x80 : canal 14 compatible

Códigos de estado

Los siguientes son los códigos de estado en el espacio del proveedor. Estos se devuelven en respuestas UCI (como SESSION_START_RSP ) por el subsistema UWB (UWBS).

Código de estado Valor Descripción
STATUS_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT 0x52

Código de estado devuelto cuando la sesión de alcance actual no se puede iniciar debido a un conflicto con otras sesiones de alcance de CCC o FiRa.

STATUS_REGULATION_UWB_OFF 0x53

Código de estado devuelto cuando la sesión de alcance actual no se puede iniciar debido a motivos regulatorios de UWB.

Código de motivo de cambio de estado en SESSION_STATUS_NTF

Los siguientes son los códigos de motivo de cambio de estado definidos en el espacio del proveedor para el campo de estado devuelto por una UWBS en SESSION_STATUS_NTF . La UWBS envía esta notificación cuando el estado de una sesión de alcance cambia (por ejemplo, de ACTIVE a IDLE ).

Código de motivo de cambio de estado Valor Descripción
REASON_ERROR_INVALID_CHANNEL_WITH_AOA 0x80

El estado de la sesión cambió porque el canal configurado no admite el rango AoA.

REASON_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT 0x81

El estado de la sesión cambió debido a un conflicto con otras sesiones de alcance de CCC o FiRa.

REASON_REGULATION_UWB_OFF 0x82

El estado de la sesión cambió porque la UWB debe deshabilitarse por una razón regulatoria.