在Android UWB技术的实现中,使用了AIDL来实现底层硬件的交互,本文简要介绍UWB HAL接口的相关代码实现。
AIDL,Android Interface Definition Language,基于安卓平台的接口定义语言。
在Android的UWB框架实现中,UWB Native Stack部分使用了AIDL来实现UWB HAL AIDL接口,与UWB Vendor Stack的硬件底层进行交互。UWB Framework与UWB HAL AIDL接口。
UWB HAL接口
AOSP框架UWB协议栈使用FiRa定义的UCI接口作为HAL surface。
HAL接口使用IUwbChip::sendUciMessage()和IUwbClientCallback::onUciMessage()来发送和接收UCI命令、应答和通知。
所有Android UWB供应商都需要支持FiRa规范定义的消息。UWB框架向后兼容,可与UWB供应商在设备上实施的任何UCI版本配合使用。由于AOSP UWB框架是一个模块,因此它可以选择性地从针对主要FiRa标准版本的UCI规范草案中添加对已批准变更请求(Change Requests, CRs)的支持。实施的任何此类CR草案都可能发生变化。
来自UWB框架的HAL调用流程
初始化硬件抽象层接口
顶层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的初始化。
FiRa会话的开始与结束
在Android中UWB的实现,是基于FiRa联盟制定的标准,而在实现上,均通过UCI命令来实现。
FiRa会话的启动包括SESSION_INIT_CMD、APP_CONFIG_CMD、START_CMD。开始测距获得测距数据之后,通过UCI_MSG_RANGE_DATA_NTF得到测距数据,进而可以供上层应用使用。