Android UWB——UWB HAL接口

发布时间:2023年12月23日

?

在Android UWB技术的实现中,使用了AIDL来实现底层硬件的交互,本文简要介绍UWB HAL接口的相关代码实现。

??AIDL,Android Interface Definition Language,基于安卓平台的接口定义语言。
??在Android的UWB框架实现中(Android UWB——技术框架简介),UWB Native Stack部分使用了AIDL来实现UWB HAL AIDL接口,与UWB Vendor Stack的硬件底层进行交互。

UWB HAL接口

??AOSP框架UWB协议栈使用FiRa定义的UCI接口作为HAL surface。

??HAL接口使用IUwbChip::sendUciMessage()IUwbClientCallback::onUciMessage()来发送和接收UCI命令、应答和通知。关于UCI相关可以参考FiRa标准——UCI通用规范
??所有Android UWB供应商都需要支持FiRa规范定义的消息。UWB框架向后兼容,可与UWB供应商在设备上实施的任何UCI版本配合使用。由于AOSP UWB框架是一个模块,因此它可以选择性地从针对主要FiRa标准版本的UCI规范草案中添加对已批准变更请求(Change Requests, CRs)的支持。实施的任何此类CR草案都可能发生变化。

接口定义

??UWB HAL接口定义使用stable AIDL(@VintStability),主要接口使用包:android.hardware.uwb。
??以下是两个主要接口IUwbChip.aidlIUwbClientCallback.aidl

package android.hardware.uwb;
@VintfStability
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);
}

?可以看到前面说的sendUciMessage函数定义,通过该接口实现向底层发送UCI命令(CMD)。

package android.hardware.uwb;
@VintfStability
interface IUwbClientCallback {
  oneway void onUciMessage(in byte[] data);
  oneway void onHalEvent(in android.hardware.uwb.UwbEvent event, 
                         in android.hardware.uwb.UwbStatus status);
}

其中onUciMessage用于接收UCI应答和通知(RSP/NTF)。

另外,还有一个接口为IUwb,获取芯片列表以及获取具体某一芯片的访问。

package android.hardware.uwb;
@VintfStability
interface IUwb {
  List<String> getChips();
  android.hardware.uwb.IUwbChip getChip(String name);
}

来自UWB框架的HAL调用流程

UWB Stack初始化

UWB Stack初始化从图中可以看到,顶层UWB架构中调用IUwb.open()调用硬件抽象层接口。

  • UWB HAL通过onHalEvent()返回UWB架构,可以看到在接口定义时限定为oneway,也就是仅从UWB HAL传递到底层。
  • 然后继续调用coreInit。以及发送后续的UCI命令(通过sendUciMessage接口发送命令),到UWB Controller进行处理。
  • 然后,UWB Controller通过onUciMessage回调接口,将UCI的响应和通知(RSP或NTF)返回顶层UWB Framework。
  • 通过这一系列的操作,实现UWB Stack的初始化。
UWB stack deinit

在这里插入图片描述deinit流程相对简单很多,只需要调用IUwb.close接口即可,处理完成后,将调用设置的callback。

FiRa会话的启动和停止

在这里插入图片描述??在Android中UWB的实现,是基于FiRa联盟制定的标准,而在实现上,均通过UCI命令来实现。
FiRa会话的启动包括SESSION_INIT_CMD、APP_CONFIG_CMD、START_CMD。开始测距获得测距数据之后,通过UCI_MSG_RANGE_DATA_NTF得到测距数据,进而可以供上层应用使用。

FiRA UCI规范定义命令格式

接口版本控制

UCI规范允许UWB供应商使用UCI_GET_DEVICE_INFO_RSTUCI_GET_CAPS_INFO_RSP命令公开设备实现的UCI协议栈的版本。框架可以使用这些命令来获取设备的UCI版本并相应地更改其行为。

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

UCI规范为所有规范定义的消息定义了一组group标识符(GIDs)和操作码标识符(OIDs)。规范还保留了一组专门为供应商使用而保留的GID。AOSP UWB协议栈将其中一些未在规范中定义的供应商GID和OID用于Android特定命令(Android-specific commands)。

fira_android HAL

Android使用的这些供应商消息在android.hardware.uwb.fira_androidHAL包中定义。
当前来看,整体主要还是enum类型的值的定义。

package android.hardware.uwb.fira_android;
@Backing(type="int") @VintfStability
enum UwbVendorSessionInitSessionType {
    CCC = 0xA0,
    RADAR = 0xA1,
}

供应商接口版本控制

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

参考链接

1、Google 官方文档:UWB HAL接口

文章来源:https://blog.csdn.net/luo58614013/article/details/132777261
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。