La pila de banda ultraancha (UWB) del AOSP usa la interfaz de UCI definida por FiRa como la superficie de la HAL. La interfaz HAL usa una canalización opaca (IUwbChip::sendUciMessage()
y IUwbClientCallback::onUciMessage()
) para enviar y recibir comandos, respuestas y notificaciones de la interfaz de comandos de UWB (UCI).
Todos los proveedores de UWB para Android deben admitir todos los mensajes definidos en la especificación de FiRa. El framework de UWB es retrocompatible y funciona con cualquier versión de la UCI implementada por el proveedor de UWB en el dispositivo. Dado que el framework de UWB del AOSP es un módulo, también puede agregar de forma selectiva compatibilidad con las solicitudes de cambio (CR) aprobadas de las especificaciones de UCI en borrador destinadas a las principales versiones de los estándares de FiRa. Las CR de borrador que se implementen están sujetas a cambios.
Definición de la interfaz
La interfaz de la HAL de UWB se define con AIDL estable.
La interfaz principal usa el paquete android.hardware.uwb
.
A continuación, se muestran 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 de la HAL desde el framework de UWB
En las siguientes imágenes, se ilustra el flujo de llamadas del framework de UWB para la inicialización y la desinicialización de la pila de UWB, y los procesos de inicio y detención de la sesión de UWB.
Figura 1: Flujo de llamadas de inicialización de la pila de UWB (activación de UWB)
Figura 2: Flujo de llamadas de desinicialización de la pila de UWB (palanca de UWB desactivada)
Figura 3: Flujo de inicio y detención de la sesión de UWB
Configuración del código de país de UWB
Como se muestra en la Figura 1, el framework de UWB configura el código de país de UWB durante la inicialización de la pila de UWB con el comando UCI ANDROID_SET_COUNTRY_CODE
(GID=0xC
, OID=0x1
) del espacio del proveedor. El framework de UWB intenta determinar el código de país de UWB con las siguientes fuentes (que se enumeran en orden de prioridad). El framework de UWB se detiene en la primera fuente en la que se determina el código de país.
- Anulación del código de país: Código de país forzado a través de un comando de shell de adb (pruebas locales o automatizadas).
- Código de país de telefonía: Es el código de país que se recupera a través de la red celular. Si hay varias SIM que devuelven códigos diferentes, el código de país elegido no es determinístico.
- Código de país de Wi-Fi: Es el código de país recuperado a través de Wi-Fi (80211.ad).
- Último código de país de telefonía conocido: Es el último código de país recuperado a través de la red celular. Si hay varias SIM que devuelven códigos diferentes, el código de país elegido no es determinístico.
- Código de país de la ubicación: Es el código de país recuperado del proveedor de ubicación combinada
LocationManager
. - Código de país predeterminado del OEM: Es el código de país establecido por el fabricante del dispositivo.
Si el framework de UWB no puede determinar un código de país de UWB, llama al comando ANDROID_SET_COUNTRY_CODE
de la UCI con un valor de DEFAULT_COUNTRY_CODE ("00")
y notifica a las apps de UWB que el estado de la pila de UWB es DISABLED
. Más adelante, cuando el framework de UWB pueda determinar un código de país válido, configurará el nuevo código de país con el comando ANDROID_SET_COUNTRY_CODE
y notificará a las apps de UWB que la pila de UWB es READY
.
Si no se puede usar la UWB debido a las reglamentaciones locales de un país, el controlador de UWB devuelve el código de estado STATUS_CODE_ANDROID_REGULATION_UWB_OFF
. Luego, el framework de UWB notifica a las apps de UWB que el estado de la pila de UWB es DISABLED
.
Cuando un usuario viaja a un país diferente, el framework de UWB configura un nuevo código de país con el comando de UCI ANDROID_SET_COUNTRY_CODE
. Según el código de estado que devuelva el controlador de UWB (en función de las reglamentaciones de UWB del país nuevo), esto podría generar un cambio en el estado de la pila de UWB.
Formato de comando definido por la especificación de la UCI de la FIRA
Para conocer el formato de los paquetes de control de la UCI, consulta la sección 4.4.2 de la especificación de la UCI.
Control de versiones de la interfaz
La especificación de la UCI permite que los proveedores de UWB expongan la versión de la pila de la UCI implementada por el dispositivo con los comandos UCI_GET_DEVICE_INFO_RSP
y UCI_GET_CAPS_INFO_RSP
. El framework usa estos comandos para recuperar la versión de la UCI del dispositivo y cambiar su comportamiento según corresponda.
Lista de CR de borrador compatibles con el módulo de UWB
La versión #330810000 del módulo UWB admite los siguientes CRs preliminares para FiRa 2.0:
- CR 287
- API de SUS y compatibilidad con especificaciones de UCI para los requisitos de la interfaz de llave digital de CCC
Interfaz de UCI de Android (parte del proveedor de FiRa)
La especificación de la UCI define un conjunto de identificadores de grupo (GID) y de identificadores de opcode (OID) para todos los mensajes definidos en la especificación. La especificación también reserva un conjunto de GID exclusivamente para el uso del proveedor. La pila de UWB del AOSP usa algunos de estos GID y OID del proveedor para comandos específicos de Android que no se definen en la especificación. Para obtener más detalles, consulta la sección 8.4 de la especificación de la UCI.
Estos mensajes del proveedor que usa 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 de HAL de android.hardware.uwb.fira_android
compatible con el dispositivo a través de IUwbChip.getSupportedAndroidUciVersion()
. El framework usa esta información de versiones para controlar la retrocompatibilidad.
Lista de GIDs y OIDs de Android
En la siguiente tabla, se enumeran los GID y OID para Android. Los GID 0xE
y 0xF
están reservados para que los usen los OEM de Android.
GID | OID | Definición |
---|---|---|
ANDROID = 0xC |
ANDROID_GET_POWER_STATS = 0x0 |
Lo usan el comando y la respuesta para obtener estadísticas relacionadas con la potencia de UWB.
Solo se admite si UwbVendorCapabilityTlvTypes.SUPPORTED_POWER_STATS_QUERY se establece en 1 . |
ANDROID_SET_COUNTRY_CODE = 0x1 |
Se usa para establecer el código de país reglamentario actual (determinado con la SIM o Wi-Fi, o codificado por el OEM). El código de país se envía como un valor de 2 bytes que corresponde al código de país ISO-3166. Se usa un valor de |
|
ANDROID_RANGE_DIAGNOSTICS = 0x2 |
La notificación usa este método para obtener estadísticas de diagnóstico de rango de UWB.
Solo se admite si UwbVendorCapabilityTlvTypes.SUPPORTED_DIAGNOSTICS se establece en 1 .
|
|
OEM = 0xE,0xF |
0x00 - 0x3F |
Reservado para uso del OEM. |
Extensiones de proveedores para mensajes definidos en la especificación de la UCI
En esta sección, se describen los detalles de las extensiones del proveedor para los mensajes definidos en la especificación de UCI.
SESSION_SET_APP_CONFIG_[CMD|RSP] y SESSION_GET_APP_CONFIG_[CMD|RSP]
A continuación, se indican los valores de longitud del tipo (TLV) definidos por la pila del AOSP en la parte reservada para el proveedor de los TLV en APP_CONFIG
:
- GID: 0001b (grupo de configuración de la sesión de UWB)
- OID: 000011b (
SESSION_SET_APP_CONFIG_CMD
) - OID: 000100b (
SESSION_GET_APP_CONFIG_CMD
)
En la siguiente tabla, se enumeran los parámetros de los mensajes de configuración de la sesión de UWB.
Nombre del parámetro | Longitud (octetos) |
Etiqueta (IDs) |
Versión de la interfaz del proveedor | Descripción |
---|---|---|---|---|
NB_OF_RANGE_MEASUREMENTS |
1 | 0xE3 |
1 | Es la proporción de intercalado si AOA_RESULT_REQ se establece en 0xF0 . Solo se admite si UwbVendorCapabilityTlvTypes.SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING se establece en 1 . |
NB_OF_AZIMUTH_MEASUREMENTS |
1 | 0xE4 |
1 | |
NB_OF_ELEVATION_MEASUREMENTS |
1 | 0xE5 |
1 | |
ENABLE_DIAGNOSTICS |
1 | 0xE8 |
2 | Es un valor de 1 byte para habilitar o inhabilitar los informes de diagnóstico.
Configura este parámetro solo cuando Valores:
|
DIAGRAMS_FRAME_REPORTS_FIELDS |
1 o 4 | 0xE9 |
2 | Máscara de bits de 1 o 4 bytes para configurar los informes de diagnóstico. Esta máscara de bits tiene 1 byte en Android 14 o versiones posteriores y 4 bytes en Android 13 o versiones anteriores. Configura este parámetro solo cuando Definiciones de bits:
|
CORE_GET_CAPS_INFO_RSP
A continuación, se indican los TLV definidos por la pila de AOSP en la porción reservada para el proveedor de los TLV en CAPS_INFO
:
- GID: 0000b (grupo principal de UWB)
- OID: 000011b (
CORE_GET_CAPS_INFO_RSP
)
En la siguiente tabla, se enumeran los parámetros de los mensajes de capacidad de UWB.
Nombre del parámetro | Longitud (octetos) |
Etiqueta (IDs) |
Versión de la interfaz del proveedor | Descripción |
---|---|---|---|---|
SUPPORTED_POWER_STATS_QUERY |
1 | 0xC0 |
1 | Es un valor de 1 byte que indica la compatibilidad con la consulta de estadísticas de energía. Valores:
|
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING |
1 | 0xE3 |
1 | Valor de 1 byte que indica la compatibilidad con la función de intercalación de antenas. Valores:
|
SUPPORTED_MIN_RANGING_INTERVAL_MS |
4 | 0xE4 |
2 | Valor de 4 bytes que indica el intervalo mínimo admitido de medición en milisegundos. |
SUPPORTED_RANGE_DATA_NTF_CONFIG |
4 | 0xE5 |
2 | Máscara de bits de 4 bytes que indica los valores de RANGE_DATA_NTF_CONFIG admitidos.
Máscara de bits en la que cada bit corresponde a los valores que se usan 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 los informes de RSSI. Valores:
|
SUPPORTED_DIAGNOSTICS |
1 | 0xE7 |
2 | Valor de 1 byte que indica la compatibilidad con los informes de diagnóstico. Valores:
|
SUPPORTED_MIN_SLOT_DURATION_RSTU |
4 | 0xE8 |
2 | Valor de 4 bytes que indica la duración mínima admitida de la ranura en RSTU. |
SUPPORTED_MAX_RANGING_SESSION_NUMBER |
4 | 0xE9 |
2 | Valor de 4 bytes que indica la cantidad máxima admitida de sesiones de medición de distancia de FiRa. |
SUPPORTED_CHANNELS_AOA |
2 | 0xEA |
2 | Máscara de bits de 2 bytes para indicar los canales que admiten AoA. Cada Valores:
|
Códigos de estado
A continuación, se indican los códigos de estado en el espacio del proveedor. El subsistema de UWB (UWBS) las devuelve en las respuestas de la UCI (como SESSION_START_RSP
).
Código de error | Valor | Descripción |
---|---|---|
STATUS_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT |
0x52 |
Código de estado que se devuelve cuando no se puede iniciar la sesión de medición actual debido a un conflicto con otras sesiones de medición de CCC o FiRa. |
STATUS_REGULATION_UWB_OFF |
0x53 |
Código de estado que se devuelve cuando no se puede iniciar la sesión de rango actual debido a motivos reglamentarios relacionados con la UWB. |
Código de motivo de cambio de estado en SESSION_STATUS_NTF
A continuación, se indican los códigos de motivos de cambio de estado definidos en el espacio del proveedor para el campo de estado que devuelve un UWBS en SESSION_STATUS_NTF
. El UWBS envía esta notificación cuando cambia el estado de una sesión de medición de distancia (por ejemplo, de ACTIVE
a IDLE
).
Código del motivo del 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 de 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 CCC o de medición de distancia de FiRa. |
REASON_REGULATION_UWB_OFF |
0x82 |
El estado de la sesión cambió porque la UWB debe inhabilitarse por un motivo reglamentario. |