Interface de HAL para UWB

A pilha ultra-wideband (UWB) do AOSP usa a interface UCI definida pelo FiRa como a superfície HAL. A interface HAL usa um tubo 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 pela especificação FiRa. O framework UWB é compatível com versões anteriores e funciona com qualquer versão de UCI implementada pelo fornecedor UWB no dispositivo. Como o framework UWB do AOSP é um módulo, ele também pode adicionar seletivamente suporte a solicitações de mudança (CRs, na sigla em inglês) aprovadas de especificações de UCI de rascunho direcionadas a principais versões de padrões FiRa. Todos os rascunhos de CR implementados estão sujeitos a mudanças.

Definição da interface

A interface HAL para UWB é definida usando a AIDL estável. A interface principal usa o pacote android.hardware.uwb.

Confira abaixo as duas interfaces principais do 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 chamada de HAL do framework de UWB

As imagens a seguir ilustram o fluxo de chamadas do framework UWB para a inicialização da pilha UWB, a desativação da pilha UWB e os processos de início e parada da sessão UWB.

Inicialização da pilha UWB

Figura 1. Fluxo de chamada de inicialização da pilha UWB (comutador UWB ativado)

Desativação da pilha UWB

Figura 2. Fluxo de chamada de desativação da pilha UWB (comutador da UWB desativado)

Início e interrupção da sessão de UWB

Figura 3. Fluxo de início/parada da sessão de UWB

Configuração do código de país da UWB

Conforme mostrado na Figura 1, o framework UWB configura o código de país da 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 de país da UWB usando as seguintes fontes (listadas em ordem de prioridade). O framework UWB para na primeira origem em que o código do país é determinado.

  1. Substituir o código do país: o código do país é forçado por um comando de shell adb (teste local ou automatizado).
  2. Código de país de telefonia: código de país recuperado por celular. Se houver vários cartões SIM que retornarem códigos diferentes, o código do país escolhido não será determinístico.
  3. Código do país do Wi-Fi: código do país recuperado pelo Wi-Fi (80211.ad).
  4. Último código de país de telefonia conhecido: o último código de país conhecido recuperado pelo celular. Se houver vários chips que retornam códigos diferentes, o código de país escolhido não será determinístico.
  5. Código do país do local: código do país recuperado do provedor de localização combinada LocationManager.
  6. Código de país padrão do OEM: código do país definido pelo fabricante do dispositivo.

Se o framework UWB não conseguir determinar um código de país UWB, ele 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. Depois, quando o framework de UWB conseguir determinar um código de país válido, ele vai configurar o novo código de país usando o comando ANDROID_SET_COUNTRY_CODE e notificar os apps de UWB de que a pilha UWB é READY.

Se a UWB não puder ser usada devido às regulamentações locais de um país, o controlador de UWB vai retornar o código de status STATUS_CODE_ANDROID_REGULATION_UWB_OFF. O framework UWB notifica os apps UWB de que o estado da pilha UWB é DISABLED.

Quando um usuário viaja para outro país, o framework UWB configura um novo código de país usando o comando UCI ANDROID_SET_COUNTRY_CODE. Dependendo do código de status retornado pelo controlador UWB (com base nas regulamentações do UWB no novo país), isso pode levar a uma mudança no estado da pilha UWB.

Formato de comando definido pela especificação FIRA UCI

Para saber 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 UCI permite que os fornecedores de UWB exponham a versão da pilha 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 rascunhos de respostas automáticas compatíveis com o módulo da UWB

Os seguintes rascunhos de CRs para FiRa 2.0 têm suporte do módulo UWB, versão #330810000:

Interface do UCI do Android (parte do fornecedor do FiRa)

A especificação UCI define um conjunto de identificadores de grupo (GIDs) e identificadores de opcode (OIDs) para todas as mensagens definidas pela 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 do fornecedor para comandos específicos do Android que não sã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 com suporte no dispositivo usando IUwbChip.getSupportedAndroidUciVersion(). O framework usa essas informações de versionamento para processar 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 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 do UWB. Suporte apenas se UwbVendorCapabilityTlvTypes.SUPPORTED_POWER_STATS_QUERY estiver definido como 1.
ANDROID_SET_COUNTRY_CODE = 0x1

Usado para definir o código de 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 de país ISO-3166. Um valor de 00 é usado para indicar que o código do país é desconhecido.

ANDROID_RANGE_DIAGNOSTICS = 0x2 Usado pela notificação para receber estatísticas de diagnóstico de alcance de UWB. Suporte apenas se UwbVendorCapabilityTlvTypes.SUPPORTED_DIAGNOSTICS for definido como 1.
OEM = 0xE,0xF 0x00 - 0x3F Reservado para uso do OEM.

Extensões do fornecedor para mensagens definidas pela especificação do 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]

Confira abaixo os valores de comprimento de tipo (TLVs) definidos pela pilha do AOSP na parte reservada do fornecedor dos TLVs no APP_CONFIG:

  • GID: 0001b (grupo de configuração da sessão 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 for definida como 0xF0. Suporte disponível apenas 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 a geração de relatórios de diagnóstico. Configure esse parâmetro somente quando CORE_GET_CAPS_INFO_RSP retornar SUPPORTED_DIAGNOSTICS com um valor 1 indicando que o recurso de relatórios de diagnóstico é compatível.

Valores:

  • 1: recurso ativado
  • 0: recurso desativado

DIAGRAMS_FRAME_REPORTS_FIELDS 1 ou 4 0xE9 2

Bitmask de 1 ou 4 bytes para configurar 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 versões anteriores.

Configure esse parâmetro somente quando o CORE_GET_CAPS_INFO_RSP retornar SUPPORTED_DIAGNOSTICS com um valor de 1, indicando que o recurso de geração de relatórios de diagnóstico é compatível.

Definições de bits:

  • b0 (0x01): Ativar campos RSSI
  • b1 (0x02): Ativar campos de AoA
  • b2 (0x04): ativar campos do CIR

CORE_GET_CAPS_INFO_RSP

Confira abaixo os TLVs definidos pela pilha AOSP na parte reservada do fornecedor dos TLVs em CAPS_INFO:

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

A tabela a seguir lista os parâmetros das mensagens de recursos do UWB.

Nome do parâmetro Comprimento
(octetos)
Tag
(IDs)
Versão da interface do fornecedor Descrição
SUPPORTED_POWER_STATS_QUERY 1 0xC0 1

Valor de 1 byte que indica suporte à consulta de estatísticas de energia.

Valores:

  • 1: recurso compatível
  • 0: recurso não compatível
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING 1 0xE3 1

Valor de 1 byte que indica suporte para o recurso de intertravamento de antena.

Valores:

  • 1: recurso compatível
  • 0: recurso não compatível
SUPPORTED_MIN_RANGING_INTERVAL_MS 4 0xE4 2 Valor de 4 bytes que indica o intervalo de alcance mínimo compatível em milissegundos.
SUPPORTED_RANGE_DATA_NTF_CONFIG 4 0xE5 2 Máscara de bits de 4 bytes que indica os valores RANGE_DATA_NTF_CONFIG compatíveis. Bitmask em que cada bit corresponde a valores usados em RANGE_DATA_NTF_CONFIG em SET_APP_CFG_CMD.
SUPPORTED_RSSI_REPORTING 1 0xE6 2

Valor de 1 byte que indica o suporte a relatórios RSSI.

Valores:

  • 1: recurso compatível
  • 0: recurso não compatível
SUPPORTED_DIAGNOSTICS 1 0xE7 2

Valor de 1 byte que indica o suporte para relatórios de diagnóstico.

Valores:

  • 1: recurso compatível
  • 0: recurso não compatível
SUPPORTED_MIN_SLOT_DURATION_RSTU 4 0xE8 2 Valor de quatro bytes indicando a duração mínima de slot compatível em RSTU.
SUPPORTED_MAX_RANGING_SESSION_NUMBER 4 0xE9 2 Valor de quatro bytes indicando o número máximo aceito de sessões de alcance FiRa.
SUPPORTED_CHANNELS_AOA 2 0xEA 2

Bitmask de 2 bytes para indicar os canais que oferecem suporte ao AoA. Cada 1 na máscara de bits corresponde a um canal UWB específico.

Valores:

  • 0x01: Compatível com o canal 5
  • 0x02: Compatível com o canal 6
  • 0x04: Compatível com o canal 8
  • 0x08: Compatível com o Channel 9
  • 0x10: Compatível com o canal 10
  • 0x20: canal 12 compatível
  • 0x40: canal 13 compatível
  • 0x80: Compatível com o canal 14

Códigos de status

Confira abaixo os códigos de status no espaço do fornecedor. Eles são retornados nas respostas do 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 CCC ou FiRa.

STATUS_REGULATION_UWB_OFF 0x53

Código de status retornado quando a sessão de medição atual não pode ser iniciada devido a regulamentações do UWB.

Código do motivo da alteração de estado em SESSION_STATUS_NTF

Confira a seguir os códigos de motivo da 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 detecção 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 foi alterado porque o canal configurado não oferece suporte ao posicionamento 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 CCC ou FiRa.

REASON_REGULATION_UWB_OFF 0x82

O estado da sessão foi alterado porque a UWB precisa ser desativada por um motivo regulamentar.