本文记录在某芯片平台上移植Gsensor 驱动和适配hal层的过程。
开发环境: android12 版本
- Gsensor 总体框架
- Gsensor驱动移植和调试
- Gsensor hal 层的移植和调试
一. Gsensor总体框架
传感器 Multi-HAL | Android Open Source Project (google.cn) Sensors Multi-HAL 2(适用于搭载 Android 10 或更高版本的设备)在 Sensors HAL 2 的基础上引入了多个抽象化功能,以便更轻松地与 HAL API 交互。 谷歌的说明 在不实际接触的时候是很难理解的。
这里要说明的是 图中 Sensor Hardware Interface 以独立进程存在
这个进程的bin文件位于 vendor/bin/hw 。
进程入口函数如下:
int main(int /* argc */, char** /* argv */) {
configureRpcThreadpool(1, true);
android::sp<ISensors> halProxy = new HalProxyV2_1();
if (halProxy->registerAsService() != ::android::OK) {
ALOGE("Failed to register Sensors HAL instance");
return -1;
}
joinRpcThreadpool();
return 1; // joinRpcThreadpool shouldn't exit
}
HalProxyV2_1 继承自 HalProxy
HalProxy::HalProxy() {
const char* kMultiHalConfigFile = "/vendor/etc/sensors/hals.conf";
initializeSubHalListFromConfigFile(kMultiHalConfigFile);
init();
}
kMultiHalConfigFile指向的文件 hals.conf 中存放子SensorHal的动态库。 hals.conf 的内容如下:
android.hardware.sensors@2.1-multihal-invensense.so
每家Gsensor厂家 给出的so 库的名字可能不一样。这里的so库文件对应上面SensorHal框架图的Sensors Hardware Module。
配置文件中除了支持绝对路径的精准查外,还支持在lib目录下根据给定动态库名字的方式进行查找。只要找到符合的动态库就调用dlopen打开并返回它的handle。后面通过操作handle就可以使用动态库中提供的各种资源了。
二. Gsensor驱动移植和调试
- 拷贝驱动文件到linux 源码目录
- 拷贝头文件到 linux源码目录下
- 添加编译配置
- 更新DTS
- 配置中断
- 测试驱动是否正常工作
三. Gsensor HAL 层的移植和调试
- 拷贝文件
- 增加编译脚本文件,增加安全策略
-
编译出android.hardware.sensors@2.1-multihal-invensense.so文件,每家厂商编译出的文件可能是不一样的。
- 修改 hals.conf 文件, 将hals.conf 的so库文件名改成 厂商代码编译出的so 库的文件名。并将 hals.conf 拷贝到 vendor/etc/sensors/ 目录下
- 用APP测试 是否能拿到 gsensor的数据
如果应用层能在 onSensorChanged 的回调用拿到sensor的数据 说明Gsensor从应用到驱动的通路打通了。