?
在Android UWB技术的实现中,使用了AIDL来实现底层硬件的交互,本文简要介绍UWB HAL接口的相关代码实现。
??AIDL,Android Interface Definition Language,基于安卓平台的接口定义语言。
??在Android的UWB框架实现中(Android UWB——技术框架简介),UWB Native Stack部分使用了AIDL来实现UWB HAL AIDL接口,与UWB Vendor Stack的硬件底层进行交互。
??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.aidl
与IUwbClientCallback.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架构中调用IUwb.open()
调用硬件抽象层接口。
onHalEvent()
返回UWB架构,可以看到在接口定义时限定为oneway,也就是仅从UWB HAL传递到底层。coreInit
。以及发送后续的UCI命令(通过sendUciMessage
接口发送命令),到UWB Controller进行处理。onUciMessage
回调接口,将UCI的响应和通知(RSP或NTF)返回顶层UWB Framework。deinit流程相对简单很多,只需要调用IUwb.close
接口即可,处理完成后,将调用设置的callback。
??在Android中UWB的实现,是基于FiRa联盟制定的标准,而在实现上,均通过UCI命令来实现。
FiRa会话的启动包括SESSION_INIT_CMD、APP_CONFIG_CMD、START_CMD。开始测距获得测距数据之后,通过UCI_MSG_RANGE_DATA_NTF
得到测距数据,进而可以供上层应用使用。
UCI规范允许UWB供应商使用UCI_GET_DEVICE_INFO_RST
和UCI_GET_CAPS_INFO_RSP
命令公开设备实现的UCI协议栈的版本。框架可以使用这些命令来获取设备的UCI版本并相应地更改其行为。
UCI规范为所有规范定义的消息定义了一组group标识符(GIDs)和操作码标识符(OIDs)。规范还保留了一组专门为供应商使用而保留的GID。AOSP UWB协议栈将其中一些未在规范中定义的供应商GID和OID用于Android特定命令(Android-specific commands)。
Android使用的这些供应商消息在android.hardware.uwb.fira_android
HAL包中定义。
当前来看,整体主要还是enum类型的值的定义。
package android.hardware.uwb.fira_android;
@Backing(type="int") @VintfStability
enum UwbVendorSessionInitSessionType {
CCC = 0xA0,
RADAR = 0xA1,
}
UWB供应商必须通过IUwbChip.getSupportedAndroidUciVersion()
设备上支持的android.hardware.uwb.fira_android
HAL包版本。框架使用此版本信息来处理向后兼容性。
1、Google 官方文档:UWB HAL接口。