Interface de HAL para UWB

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.

Inicialização da pilha UWB

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

Desinicialização da pilha UWB

Figura 2. Fluxo de chamada de desinicialização da pilha UWB (desativação da chave UWB)

Início e fim da sessão 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.

  1. Substituir código do país: código do país forçado por um comando adb shell (teste local ou automatizado).
  2. 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.
  3. Código do país do Wi-Fi: código do país recuperado pelo Wi-Fi (80211.ad).
  4. Ú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.
  5. Código do país do local: código do país recuperado do provedor de localização combinada LocationManager.
  6. 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 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 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 CORE_GET_CAPS_INFO_RSP retornar SUPPORTED_DIAGNOSTICS com um valor de 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 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 CORE_GET_CAPS_INFO_RSP retornar SUPPORTED_DIAGNOSTICS com um valor de 1 indicando que o recurso de relatórios de diagnóstico é compatível.

Definições de bit:

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

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:

  • 1: recurso compatível
  • 0: recurso não compatível
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:

  • 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 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:

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

Um valor de byte que indica o suporte ao relatório de diagnóstico.

Valores:

  • 1: recurso compatível
  • 0: recurso não compatível
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 1 na máscara de bits corresponde a um canal UWB específico.

Valores:

  • 0x01: suporte ao canal 5
  • 0x02: compatibilidade com o canal 6
  • 0x04: suporte ao canal 8
  • 0x08: suporte ao Canal 9
  • 0x10: suporte ao canal 10
  • 0x20: suporte ao canal 12
  • 0x40: suporte ao canal 13
  • 0x80: suporte ao canal 14

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.