Android UWB——UWB HAL接口

13 篇文章 0 订阅
6 篇文章 0 订阅

在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接口

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝卜D大哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值