A pilha de banda ultralarga (UWB) do
AOSP usa a
interface UCI definida pela FiRa
como a superfície HAL. A interface HAL usa um pipe opaco
(IUwbChip::sendUciMessage()
e IUwbClientCallback::onUciMessage()
) para enviar
e receber comandos, respostas e notificações da interface de comando UWB (UCI, na sigla em inglês).
Todos os fornecedores de UWB do Android precisam oferecer suporte a todas as mensagens definidas na especificação da FiRa. O framework UWB é compatível com versões anteriores e funciona com qualquer versão da UCI
implementada pelo fornecedor de UWB no dispositivo. Como a estrutura UWB do AOSP é um módulo, ela também pode adicionar seletivamente suporte para solicitações de mudança (CRs, na sigla em inglês) aprovadas de especificações UCI provisórias destinadas a grandes lançamentos de padrões da FiRa. Qualquer CR em rascunho implementada está sujeita a mudanças.
Definição de interface
A interface HAL para UWB é definida usando a
AIDL estável.
A interface principal usa o pacote android.hardware.uwb
.
Estas são as duas principais interfaces no pacote 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);
}
Fluxo de chamadas da HAL do framework UWB
As imagens a seguir ilustram o fluxo de chamadas do framework UWB para a inicialização e desinicialização da pilha UWB e os processos de início e interrupção da sessão UWB.
Figura 1. Fluxo de chamada de inicialização da pilha UWB (ativação da UWB)
Figura 2. Fluxo de chamada de desinicialização da pilha UWB (desativação da chave UWB)
Figura 3. Fluxo de início/parada de sessão de UWB
Configuração do código do país para UWB
Conforme mostrado na Figura 1, o framework UWB configura o código do país UWB
durante a inicialização da pilha UWB usando o comando UCI do espaço do fornecedor
ANDROID_SET_COUNTRY_CODE
(GID=0xC
, OID=0x1
). O framework UWB tenta
determinar o código do país UWB usando as seguintes fontes (listadas em ordem de
prioridade). O framework UWB para na primeira fonte em que o código do país é determinado.
- Substituir código do país: código do país forçado por um comando adb shell (teste local ou automatizado).
- Código do país da telefonia: código do país recuperado por celular. Se houver vários SIMs que retornam códigos diferentes, o código do país escolhido será não determinístico.
- Código do país do Wi-Fi: código do país recuperado pelo Wi-Fi (80211.ad).
- Último código do país de telefonia conhecido: o último código do país recuperado por celular. Se houver vários chips que retornam códigos diferentes, o código do país escolhido será não determinístico.
- Código do país do local: código do país recuperado do provedor de localização combinada
LocationManager
. - Código do país padrão do OEM: código do país definido pelo fabricante do dispositivo.
Se a estrutura UWB não conseguir determinar um código de país UWB, ela vai chamar o
comando UCI ANDROID_SET_COUNTRY_CODE
com um valor de
DEFAULT_COUNTRY_CODE ("00")
e notificar os apps UWB de que
o estado da pilha UWB é DISABLED
. Mais tarde, quando a estrutura UWB conseguir determinar um código de país válido, ela vai configurar o novo código usando o comando ANDROID_SET_COUNTRY_CODE
e notificar os apps UWB de que a pilha UWB está READY
.
Se a UWB não puder ser usada devido a regulamentações locais em um país, o controlador UWB vai retornar o código de status STATUS_CODE_ANDROID_REGULATION_UWB_OFF
. Em seguida, a estrutura UWB
notifica os apps UWB de que o estado da pilha UWB é DISABLED
.
Quando um usuário viaja para um país diferente, a estrutura UWB configura um novo código de país usando o comando ANDROID_SET_COUNTRY_CODE
UCI. Dependendo do
código de status retornado pelo controlador UWB (com base nas regulamentações de UWB no
novo país), isso pode levar a uma mudança no estado da pilha UWB.
Formato de comando definido pela especificação UCI da FIRA
Para saber mais sobre o formato dos pacotes de controle da UCI, consulte a seção 4.4.2 da especificação da UCI.
Controle de versões da interface
A especificação da UCI permite que os fornecedores de UWB exponham a versão da pilha da UCI
implementada pelo dispositivo usando os comandos UCI_GET_DEVICE_INFO_RSP
e
UCI_GET_CAPS_INFO_RSP
. O framework usa esses comandos para buscar a versão da UCI do dispositivo e mudar o comportamento de acordo com ela.
Lista de CRs de rascunho compatíveis com o módulo UWB
As seguintes CRs de rascunho para FiRa 2.0 são compatíveis com a versão #330810000 do módulo UWB:
Interface UCI do Android (parte do fornecedor da FiRa)
A especificação UCI define um conjunto de identificadores de grupo (GIDs) e identificadores de opcode (OIDs) para todas as mensagens definidas na especificação. A especificação também reserva um conjunto de GIDs exclusivamente para uso do fornecedor. A pilha UWB do AOSP usa alguns desses GIDs e OIDs de fornecedores para comandos específicos do Android que não estão definidos na especificação. Para mais detalhes, consulte a seção 8.4 da especificação UCI.
Essas mensagens do fornecedor usadas pelo Android são definidas no pacote HAL
android.hardware.uwb.fira_android
.
Controle de versões da interface do fornecedor
Os fornecedores de UWB precisam expor a versão do pacote HAL android.hardware.uwb.fira_android
compatível com o dispositivo usando
IUwbChip.getSupportedAndroidUciVersion()
. O framework usa essas informações de controle de versão para lidar com a compatibilidade com versões anteriores.
Lista de GIDs e OIDs do Android
A tabela a seguir lista os GIDs e OIDs para Android. Os GIDs 0xE
e 0xF
são reservados para uso de OEMs do Android.
GID | OID | Definição |
---|---|---|
ANDROID = 0xC |
ANDROID_GET_POWER_STATS = 0x0 |
Usado pelo comando e pela resposta para receber estatísticas relacionadas à energia de UWB.
Só é compatível se
UwbVendorCapabilityTlvTypes.SUPPORTED_POWER_STATS_QUERY
estiver definido como 1 . |
ANDROID_SET_COUNTRY_CODE = 0x1 |
Usado para definir o código do país regulamentar atual (determinado usando SIM ou Wi-Fi ou codificado pelo OEM). O código do país é enviado
como um valor de 2 bytes correspondente ao código do país ISO-3166. Um valor de |
|
ANDROID_RANGE_DIAGNOSTICS = 0x2 |
Usado pela notificação para receber estatísticas de diagnóstico de alcance UWB.
Só é compatível se UwbVendorCapabilityTlvTypes.SUPPORTED_DIAGNOSTICS estiver definido como 1 .
|
|
OEM = 0xE,0xF |
0x00 - 0x3F |
Reservado para uso do OEM. |
Extensões do fornecedor para mensagens definidas na especificação da UCI
Esta seção descreve detalhes das extensões do fornecedor para mensagens definidas pela especificação UCI.
SESSION_SET_APP_CONFIG_[CMD|RSP] e SESSION_GET_APP_CONFIG_[CMD|RSP]
A seguir, estão os valores de comprimento do tipo (TLVs, na sigla em inglês) definidos pela pilha do AOSP na
parte reservada pelo fornecedor dos TLVs em APP_CONFIG
:
- GID: 0001b (grupo de configuração da sessão de UWB)
- OID: 000011b (
SESSION_SET_APP_CONFIG_CMD
) - OID: 000100b (
SESSION_GET_APP_CONFIG_CMD
)
A tabela a seguir lista os parâmetros das mensagens de configuração de sessão de UWB.
Nome do parâmetro | Comprimento (octetos) |
Tag (IDs) |
Versão da interface do fornecedor | Descrição |
---|---|---|---|---|
NB_OF_RANGE_MEASUREMENTS |
1 | 0xE3 |
1 | Proporção de intercalação se AOA_RESULT_REQ estiver definido como 0xF0 . Só é compatível se o
UwbVendorCapabilityTlvTypes.SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING
estiver definido como 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 ativar ou desativar os relatórios de diagnóstico.
Configure esse parâmetro apenas quando Valores:
|
DIAGRAMS_FRAME_REPORTS_FIELDS |
1 ou 4 | 0xE9 |
2 | Bitmask de 1 ou 4 bytes para configurar o envio de relatórios de diagnóstico. Essa máscara de bits tem 1 byte no Android 14 ou mais recente e 4 bytes no Android 13 ou em versões anteriores. Configure esse parâmetro apenas quando o
Definições de bit:
|
CORE_GET_CAPS_INFO_RSP
Estes são os TLVs definidos pela pilha do AOSP na parte reservada ao fornecedor dos TLVs em CAPS_INFO
:
- GID: 0000b (grupo principal de UWB)
- OID: 000011b (
CORE_GET_CAPS_INFO_RSP
)
A tabela a seguir lista os parâmetros das mensagens de capacidade de UWB.
Nome do parâmetro | Comprimento (octetos) |
Tag (IDs) |
Versão da interface do fornecedor | Descrição |
---|---|---|---|---|
SUPPORTED_POWER_STATS_QUERY |
1 | 0xC0 |
1 | Um valor de byte que indica suporte para consulta de estatísticas de energia. Valores:
|
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING |
1 | 0xE3 |
1 | Um valor de 1 byte que indica suporte ao recurso de intercalação de antenas. Valores:
|
SUPPORTED_MIN_RANGING_INTERVAL_MS |
4 | 0xE4 |
2 | Valor de 4 bytes que indica o intervalo mínimo de alcance aceito em milissegundos. |
SUPPORTED_RANGE_DATA_NTF_CONFIG |
4 | 0xE5 |
2 | Máscara de bits de 4 bytes que indica os valores de RANGE_DATA_NTF_CONFIG compatíveis.
Máscara de bits em que cada bit corresponde aos valores usados em
RANGE_DATA_NTF_CONFIG em SET_APP_CFG_CMD . |
SUPPORTED_RSSI_REPORTING |
1 | 0xE6 |
2 | Um valor de 1 byte que indica a compatibilidade com relatórios de RSSI. Valores:
|
SUPPORTED_DIAGNOSTICS |
1 | 0xE7 |
2 | Um valor de byte que indica o suporte ao relatório de diagnóstico. Valores:
|
SUPPORTED_MIN_SLOT_DURATION_RSTU |
4 | 0xE8 |
2 | Valor de 4 bytes que indica a duração mínima aceita do slot em RSTU. |
SUPPORTED_MAX_RANGING_SESSION_NUMBER |
4 | 0xE9 |
2 | Valor de 4 bytes que indica o número máximo de sessões de alcance da FiRa compatíveis. |
SUPPORTED_CHANNELS_AOA |
2 | 0xEA |
2 | Máscara de bits de 2 bytes para indicar os canais compatíveis com AoA. Cada Valores:
|
Códigos de status
Confira abaixo os códigos de status no espaço do fornecedor. Elas são retornadas em
respostas da UCI (como SESSION_START_RSP
) pelo subsistema UWB (UWBS).
Código de status | Valor | Descrição |
---|---|---|
STATUS_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT |
0x52 |
Código de status retornado quando a sessão de alcance atual não pode ser iniciada devido a um conflito com outras sessões de alcance do CCC ou da FiRa. |
STATUS_REGULATION_UWB_OFF |
0x53 |
Código de status retornado quando a sessão de alcance atual não pode ser iniciada por motivos regulamentares de UWB. |
Código do motivo da mudança de estado em SESSION_STATUS_NTF
A seguir estão os códigos de motivo para mudança de estado definidos no espaço do fornecedor para
o campo de status retornado por um UWBS em SESSION_STATUS_NTF
. Essa notificação é enviada pelo UWBS quando o estado de uma sessão de alcance muda (por exemplo, de ACTIVE
para IDLE
).
Código do motivo da mudança de estado | Valor | Descrição |
---|---|---|
REASON_ERROR_INVALID_CHANNEL_WITH_AOA |
0x80 |
O estado da sessão mudou porque o canal configurado não é compatível com a estimativa de alcance de AoA. |
REASON_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT |
0x81 |
O estado da sessão mudou devido a um conflito com outras sessões de alcance do CCC ou da FiRa. |
REASON_REGULATION_UWB_OFF |
0x82 |
O estado da sessão mudou porque a UWB precisa ser desativada por um motivo regulamentar. |