UWB HAL 接口

AOSP 超宽带 (UWB) 堆栈使用 FiRa 定义的 UCI 接口 作为 HAL 表面。HAL 接口使用不透明管道(IUwbChip::sendUciMessage()IUwbClientCallback::onUciMessage())来发送和接收 UWB 命令接口 (UCI) 命令、响应和通知。所有 Android UWB 供应商都必须支持所有 FiRa 规范定义的消息。UWB 框架向后兼容,并且可以与设备上 UWB 供应商实现的任何 UCI 版本配合使用。由于 AOSP UWB 框架是一个 模块,因此它还可以选择性地为主要 FiRa 标准版本草案 UCI 规范中批准的更改请求 (CR) 添加支持。任何已实现的此类草案 CR 都可能会发生更改。

接口定义

UWB HAL 接口使用 stable AIDL 定义。主接口使用 android.hardware.uwb 包。

以下是 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);

}

来自 UWB 框架的 HAL 调用流程

以下图片说明了来自 UWB 框架的 UWB 堆栈初始化、UWB 堆栈反初始化以及 UWB 会话启动和停止过程的调用流程。

UWB stack initialization

图 1. UWB 堆栈初始化调用流程(UWB 开启)

UWB stack deinitialization

图 2. UWB 堆栈反初始化调用流程(UWB 关闭)

UWB session start and stop

图 3. UWB 会话启动/停止流程

UWB 国家/地区代码配置

如图 1 所示,UWB 框架在 UWB 堆栈初始化期间使用供应商空间 UCI 命令 ANDROID_SET_COUNTRY_CODE (GID=0xC, OID=0x1) 配置 UWB 国家/地区代码。UWB 框架尝试使用以下来源(按优先级顺序列出)确定 UWB 国家/地区代码。UWB 框架会在第一个确定国家/地区代码的来源处停止。

  1. 替换国家/地区代码:通过 adb shell 命令强制指定的国家/地区代码(本地或自动化测试)。
  2. 电话国家/地区代码:通过蜂窝网络检索的国家/地区代码。如果多个 SIM 卡返回不同的代码,则选择的国家/地区代码是不确定的。
  3. Wi-Fi 国家/地区代码:通过 Wi-Fi (80211.ad) 检索的国家/地区代码。
  4. 上次已知的电话国家/地区代码:上次通过蜂窝网络检索的已知国家/地区代码。如果多个 SIM 卡返回不同的代码,则选择的国家/地区代码是不确定的。
  5. 位置国家/地区代码:从 LocationManager 融合位置信息提供程序检索的国家/地区代码。
  6. OEM 默认国家/地区代码:设备制造商设置的国家/地区代码。

如果 UWB 框架无法确定 UWB 国家/地区代码,它会使用值 DEFAULT_COUNTRY_CODE ("00") 调用 ANDROID_SET_COUNTRY_CODE UCI 命令,并通知 UWB 应用 UWB 堆栈状态为 DISABLED。稍后,当 UWB 框架能够确定有效的国家/地区代码时,它会使用 ANDROID_SET_COUNTRY_CODE 命令配置新的国家/地区代码,并通知 UWB 应用 UWB 堆栈为 READY

如果由于某个国家/地区的当地法规而无法使用 UWB,则 UWB 控制器会返回 STATUS_CODE_ANDROID_REGULATION_UWB_OFF 状态代码。然后,UWB 框架会通知 UWB 应用 UWB 堆栈状态为 DISABLED

当用户前往其他国家/地区时,UWB 框架会使用 ANDROID_SET_COUNTRY_CODE UCI 命令配置新的国家/地区代码。根据 UWB 控制器返回的状态代码(基于新国家/地区的 UWB 法规),这可能会导致 UWB 堆栈状态发生变化。

FIRA UCI 规范定义的命令格式

有关 UCI 控制数据包的格式,请参阅 UCI 规范的第 4.4.2 节

接口版本控制

UCI 规范允许 UWB 供应商使用 UCI_GET_DEVICE_INFO_RSPUCI_GET_CAPS_INFO_RSP 命令公开设备实现的 UCI 堆栈版本。框架使用这些命令来获取设备的 UCI 版本,并据此更改其行为。

UWB 模块支持的草案 CR 列表

版本 #330810000 的 UWB 模块支持以下 FiRa 2.0 草案 CR

Android UCI 接口(FiRa 供应商部分)

UCI 规范为所有规范定义的消息定义了一组组标识符 (GID) 和操作码标识符 (OID)。该规范还保留了一组专门供供应商使用的 GID。AOSP UWB 堆栈将其中一些供应商 GID 和 OID 用于规范中未定义的特定于 Android 的命令。有关详情,请参阅 UCI 规范的第 8.4 节

Android 使用的这些供应商消息在 android.hardware.uwb.fira_android HAL 包中定义。

供应商接口版本控制

UWB 供应商必须通过 IUwbChip.getSupportedAndroidUciVersion() 公开设备上支持的 android.hardware.uwb.fira_android HAL 包的版本。框架使用此版本控制信息来处理向后兼容性。

Android GID 和 OID 列表

下表列出了 Android 的 GID 和 OID。GID 0xE0xF 保留供 Android OEM 使用。

GID OID 定义
ANDROID = 0xC ANDROID_GET_POWER_STATS = 0x0 命令和响应使用此项来获取与 UWB 功耗相关的统计信息。仅当 UwbVendorCapabilityTlvTypes.SUPPORTED_POWER_STATS_QUERY 设置为 1 时才受支持。
ANDROID_SET_COUNTRY_CODE = 0x1

用于设置当前的法规国家/地区代码(使用 SIM 卡或 Wi-Fi 确定,或由 OEM 硬编码)。国家/地区代码作为与 ISO-3166 国家/地区代码对应的 2 字节值发送。值 00 用于指示国家/地区代码未知。

ANDROID_RANGE_DIAGNOSTICS = 0x2 通知使用此项来获取 UWB 测距诊断统计信息。仅当 UwbVendorCapabilityTlvTypes.SUPPORTED_DIAGNOSTICS 设置为 1 时才受支持。
OEM = 0xE,0xF 0x00 - 0x3F 保留供 OEM 使用。

UCI 规范定义的消息的供应商扩展

本节介绍了 UCI 规范定义的消息的供应商扩展的详细信息。

SESSION_SET_APP_CONFIG_[CMD|RSP] 和 SESSION_GET_APP_CONFIG_[CMD|RSP]

以下是由 AOSP 堆栈在 APP_CONFIG 中的 TLV 供应商保留部分定义的类型长度值 (TLV)

  • GID:0001b(UWB 会话配置组)
  • OID:000011b (SESSION_SET_APP_CONFIG_CMD)
  • OID:000100b (SESSION_GET_APP_CONFIG_CMD)

下表列出了 UWB 会话配置消息的参数。

参数名称 长度
(八位字节)
标记
(ID)
供应商接口版本 说明
NB_OF_RANGE_MEASUREMENTS 1 0xE3 1 如果 AOA_RESULT_REQ 设置为 0xF0,则为交织比率。仅当 UwbVendorCapabilityTlvTypes.SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING 设置为 1 时才受支持。
NB_OF_AZIMUTH_MEASUREMENTS 1 0xE4 1
NB_OF_ELEVATION_MEASUREMENTS 1 0xE5 1
ENABLE_DIAGNOSTICS 1 0xE8 2

用于启用或停用诊断报告的 1 字节值。仅当 CORE_GET_CAPS_INFO_RSP 返回 SUPPORTED_DIAGNOSTICS 且值为 1(表示支持诊断报告功能)时,才配置此参数。

  • 1:已启用功能
  • 0:已停用功能

DIAGRAMS_FRAME_REPORTS_FIELDS 1 或 4 0xE9 2

用于配置诊断报告的 1 字节或 4 字节位掩码。此位掩码在 Android 14 或更高版本中为 1 字节,在 Android 13 或更低版本中为 4 字节。

仅当 CORE_GET_CAPS_INFO_RSP 返回 SUPPORTED_DIAGNOSTICS 且值为 1(表示支持诊断报告功能)时,才配置此参数。

位定义

  • b0 (0x01):激活 RSSI 字段
  • b1 (0x02):激活 AoA 字段
  • b2 (0x04):激活 CIR 字段

CORE_GET_CAPS_INFO_RSP

以下是由 AOSP 堆栈在 CAPS_INFO 中的 TLV 供应商保留部分定义的 TLV

  • GID:0000b(UWB 核心组)
  • OID:000011b (CORE_GET_CAPS_INFO_RSP)

下表列出了 UWB 功能消息的参数。

参数名称 长度
(八位字节)
标记
(ID)
供应商接口版本 说明
SUPPORTED_POWER_STATS_QUERY 1 0xC0 1

1 字节值,指示是否支持功耗统计信息查询。

  • 1:支持该功能
  • 0:不支持该功能
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING 1 0xE3 1

1 字节值,指示是否支持天线交织功能。

  • 1:支持该功能
  • 0:不支持该功能
SUPPORTED_MIN_RANGING_INTERVAL_MS 4 0xE4 2 4 字节值,指示支持的最小测距间隔(以毫秒为单位)。
SUPPORTED_RANGE_DATA_NTF_CONFIG 4 0xE5 2 4 字节位掩码,指示支持的 RANGE_DATA_NTF_CONFIG 值。位掩码,其中每个位对应于 SET_APP_CFG_CMDRANGE_DATA_NTF_CONFIG 中使用的值。
SUPPORTED_RSSI_REPORTING 1 0xE6 2

1 字节值,指示是否支持 RSSI 报告。

  • 1:支持该功能
  • 0:不支持该功能
SUPPORTED_DIAGNOSTICS 1 0xE7 2

1 字节值,指示是否支持诊断报告。

  • 1:支持该功能
  • 0:不支持该功能
SUPPORTED_MIN_SLOT_DURATION_RSTU 4 0xE8 2 4 字节值,指示支持的最小时隙持续时间(以 RSTU 为单位)。
SUPPORTED_MAX_RANGING_SESSION_NUMBER 4 0xE9 2 4 字节值,指示支持的最大 FiRa 测距会话数。
SUPPORTED_CHANNELS_AOA 2 0xEA 2

2 字节位掩码,用于指示支持 AoA 的通道。位掩码中的每个 1 对应于特定的 UWB 通道。

  • 0x01:支持通道 5
  • 0x02:支持通道 6
  • 0x04:支持通道 8
  • 0x08:支持通道 9
  • 0x10:支持通道 10
  • 0x20:支持通道 12
  • 0x40:支持通道 13
  • 0x80:支持通道 14

状态代码

以下是供应商空间中的状态代码。这些代码由 UWB 子系统 (UWBS) 在 UCI 响应(例如 SESSION_START_RSP)中返回。

状态代码 说明
STATUS_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT 0x52

当由于与其他 CCC 或 FiRa 测距会话冲突而无法启动当前测距会话时返回的状态代码。

STATUS_REGULATION_UWB_OFF 0x53

当由于 UWB 法规原因而无法启动当前测距会话时返回的状态代码。

SESSION_STATUS_NTF 中的状态更改原因代码

以下是在供应商空间中为 SESSION_STATUS_NTF 中 UWBS 返回的状态字段定义的状态更改原因代码。当测距会话的状态更改时(例如,从 ACTIVE 更改为 IDLE),UWBS 会发送此通知。

状态更改原因代码 说明
REASON_ERROR_INVALID_CHANNEL_WITH_AOA 0x80

会话状态已更改,因为配置的通道不支持 AoA 测距。

REASON_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT 0x81

会话状态已更改,因为与其他 CCC 或 FiRa 测距会话冲突。

REASON_REGULATION_UWB_OFF 0x82

会话状态已更改,因为由于法规原因,必须停用 UWB。