立即注册
查看: 1728|回复: 11

[瑞芯微RK资料] Rockchip_Sensors开发指南

已绑定手机
发表于 2022-6-9 11:07:51 | 显示全部楼层 |阅读模式 来自 广东省深圳市
一、概述
本文主要介绍rockchip sensors的架构和基本配置;最新的kernel4.4内核对sensors的架构做了一些修改,以满足Android的cts和vts测试要求;增加一个新的sensor驱动需做一些适配工作。

二、Android sensors 架构
1.jpg

三、Sensors hal 与 kernel driver 的通信框图
2.jpg

四、Rockchip sensors hal 介绍
代码路径:hardware/rockchip/sensor/st,支持最新的 SENSORS_DEVICE_API_VERSION_1_3 android sensors hal API接口。其实现的接口包括:
get_sensors_list - 返回所有传感器的列表
activate - 启动或停止传感器
batch - 设置传感器的参数,如采样率和最大报告延迟
setDelay - 仅用于 1.0 版本的 HAL,设置指定传感器的采样率
flush - 刷写指定传感器的 FIFO ,并在完成后报告刷写完成事件
poll - 返回可用的传感器事件
其中 flush接口并没有真正实现,因为要具体到硬件的 fifo 支持,由于我们支持的sensor型号多,无法做到统一接口实现,所以这里只是绕过,直接返回META_DATA_FLUSH_COMPLETE类型数据。

五、Rockchip sensors kernel driver 介绍
代码路径:kernel/drivers/input/sensors,其中 sensor-dev.c 是核心代码,整合了不同类型的 sensor,包括 accel, gyro, lsensor, psensor, compass 等。

六、新增一个 sensor 驱动流程
这里以增加一个最常用的 gsensor 为例,其他类型的 sensor 类似。Android hal 不需要任何修改,hal 的是按+-2G 的 Gsensor 量程,adc 16bit 来配置的,也就是 1G 对应的数值是 16384;所以 driver 层增加 gsensor 驱动,上报数值需要根据量程和 adc 的精度来适配。
具体步骤如下,以 mpu6500 acc 为例:
6.1 增加 sensor id
sensor-dev.c 中添加 sensor_id,其中”mpu6500_acc”字段与dts 中的compatible字段对应。
3.jpg
ACCEL_ID_MPU6500 定义在 include/linux/sensor-dev.h 中:
4.jpg

6.2 增加 gsensor chip 驱动
driver/input/sensors/accel/目录下增加相应驱动
1)实现 gsensor_mpu6500_ops 实例:
struct sensor_operate gsensor_mpu6500_ops = {
.name = "mpu6500_acc", //与 sensor-dev.c 中定义的名称一致
.type = SENSOR_TYPE_ACCEL, //sensor 类型是 gsensor
.id_i2c = ACCEL_ID_MPU6500, //定义在include/linux/sensor-dev.h 中
.read_reg = MPU6500_ACCEL_XOUT_H, //读取 gsensor 数据的起始寄存器地址
.read_len = 6, //需要读取的 gsensor 数据的字节数
.id_reg = MPU6500_WHOAMI, //芯片唯一 ID 寄存器
.id_data = MPU6500_DEVICE_ID, //芯片 ID 值
.precision = MPU6500_PRECISION, //采样 gsensor 数据的adc 位数
.......

6.3 修改 gsensor range 和上报数据转化
不同厂家的gsensor 在量程和精度上都会有差异,为了兼容不同厂家的 gsensor 芯片,同时做到不修改 android hal 层代码,只修改驱动,来达到简化客户开发的目的,我们必须把不同量程,不同精度的 gsensor 转换成统一标准的数据上报给 hal 层代码。
上节提到,HAL 层是以量程为+-2G,adc 16bit 的标准来上报的 gsensor 数据,以此标准不同的 gsensor 需要做适配。举例如下:
1)mpu6500 +- 2G 16bit adc
Mpu6500 的 adc 位数是 16bit 的,初始化的时候设置的量程是+-2G,那么寄存器读出来的数值范围为:+-32768,并且与上层 hal 层匹配,所以只要把寄存器读出来的值直接上报即可;
struct sensor_operate gsensor_mpu6500_ops = {
.name = "mpu6500_acc",
.type = SENSOR_TYPE_ACCEL,
.id_i2c = ACCEL_ID_MPU6500,
.read_reg
......

更多详细内容请下载附件查看
游客,如果您要查看本帖隐藏内容请回复
已绑定手机
发表于 2022-6-9 11:49:50 | 显示全部楼层 来自 广东省深圳市
谢谢分享
已绑定手机
发表于 2022-6-9 16:51:14 | 显示全部楼层 来自 江苏省徐州市
好东东,谢谢分享!!!!
发表于 2022-6-9 23:30:48 | 显示全部楼层 来自 上海市
谢谢分享
已绑定手机
发表于 2022-6-9 23:31:15 | 显示全部楼层 来自 上海市
学习学习
已绑定手机
发表于 2022-6-10 08:26:45 | 显示全部楼层 来自 浙江省嘉兴市
好资料,看看先
已绑定手机
发表于 2022-6-14 09:03:04 | 显示全部楼层 来自 江苏省南京市
谢谢分享
已绑定手机
发表于 2023-1-9 16:45:51 | 显示全部楼层 来自 湖北省武汉市
好资料,看一下。。。。。。
已绑定手机
发表于 2023-7-14 10:46:14 | 显示全部楼层 来自 广东省深圳市
楼主威武,感谢分享
已绑定手机
发表于 2023-12-26 14:45:24 | 显示全部楼层 来自 广东省清远市
感谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表