一、SENSOR HAL 2.1
Sensors HAL 2.0 适用于搭载 Android 10 及更高版本的新设备和升级设备。Sensors HAL 2.0 基于Sensors HAL 1.0构建
但与 1.0 版有几个关键的区别,这使得它无法向后兼容。Sensors HAL 2.0 使用快速消息队列(FMQ)将传感器事件从 HAL 发送到 Android 传感器框架。
Sensors HAL 2.1 适用于搭载 Android 11 及更高版本的新设备和升级设备。Sensors HAL 2.1 是 Sensors HAL 2.0 的迭代升级版本,公开了HINGE_ANGLE传感器类型,并更新了各种方法来接受 HINGE_ANGLE
类型。
先梳理一下整体流程
二、HAL接口
我是做BSP部分,对上层不感兴趣,就直接从HAL层开始了,Sensors HAL 2.1 文档的主要来源位于 HAL 定义内,该定义位于:hardware/interfaces/sensors/2.1/ISensors.hal。
1、初始化
Sensors HAL 必须先由 Android sensor framework初始化,然后才能调用。
frameworks/native/services/sensorservice/SensorDevice.cpp
从native层调用connectHidlService()连接service,再调用initializeSensorList();进行初始化
上代码:
SensorDevice::SensorDevice()
: mHidlTransportErrors(20),
mRestartWaiter(new HidlServiceRegistrationWaiter()),
mEventQueueFlag(nullptr),
mWakeLockQueueFlag(nullptr),
mReconnecting(false) {
if (!connectHidlService()) {
return;
}
initializeSensorList();
mIsDirectReportSupported =
(checkReturnAndGetStatus(mSensors->unregisterDirectChannel(-1)) != INVALID_OPERATION);
}
connectHidlService中,会分别先去加载sensorhal2.1,失败后再去加载2.0,然后才是1.0。
初始化调用流程如下
SensorDevice::SensorDevice()
–>connectHidlService()
------>connectHidlServiceV2_1()
--------->V2_1::ISensors::getService()
----hidl—>hardware/interfaces/sensors/2.1/multihal/service.cpp ->new HalProxyV2_1();
---------------->HalProxy::HalProxy()
--------------------->getHandleForSubHalSharedObject() // 读取hals.comfig文件,并打开对应的so库。
--------------------->dlsym(handle, “sensorsHalGetSubHal_2_1”) // 返回sensorsHalGetSubHal_2_1函数指针,该函数功能:获取so版本,并返回sensor hal的实现的静态变量
--------->initializeHidlServiceV2_1()
–>initializeSensorList();
--------->mSensors->getSensorsList() //获取sensor list
--------->mSensors->activate() //激活sensor
注:在getService中,一般会在sensorhal2.1的目录中找到两个service,分别是default和multihal,multihal就是支持多个hal,default就只支持一个,所以一般都是走multihal这个,通过.mk文件中添加multihal的库用于编译,在getservice时,就会走multihal链路
数据流程上报流程后续有时间再分析