sensor
Android的sensor架构如下
sensor大致流程:APP–>Framework—>lib—>HAL层,HAL层以下部分,不同平台实现方式不同,可能会是HAL—>Kernel也可能是HAL–>VENDOR—>kernel,本文主要分析HAL层及HAL层之上的内容.HAL层下的部分,不同平台的处理方式会有所差异,有些平台HAL层之后直接对接Kernel的input子系统,有些是HAL—>QMI—>SSC,这里不对这部分做说明,关注AOSP部分.
背景知识
在进入代码之前,先简单描述一些相关背景知识点
传感器
Android传感器框架中包括物理传感器和虚拟传感器两大类
- 物理传感器
表示物理特性和状态的传感器包括加速度计、陀螺仪、指南针、温度计、气压计、光传感器、心率计等等 - 虚拟传感器
旋转矢量、重力方向、线性加速度等,这些传感器的数据是依据物理传感器的数据,经过融合算法后计算得出的.(有些计步器是根据加速度计计算获得的,这种计步器也算是虚拟传感器)
这两类传感器单次数据量比较小,目前种类有30多个(sensor.h中查阅),市场中还存在一些其他传感器,如相机中的sensor,指纹传感器,触摸传感器.因其功能复杂且特殊被放在单独模块中处理,并不包含在传感器框架中,物理传感器和虚拟传感器对于应用程序来说,没有什么区别,AOSP部分已将这部分做了一致处理..
对于常用的九轴传感器原理,融合算法,对比分析,可以看之前整理的文章9轴传感器
上报方式
不同的传感器的上报方式不同,根据实际情况进行设定,目前支持有四种上报方式
- 连续模式
传感器持续不断的上报数据,这种上报方式适用于加速度计、陀螺仪这样的传感器,使用它们时,往往需要实时(200HZ~1KHZ)连续的上报. - 变化模式
当传感器数据经过一段时间发生变化后,才上报,常见的是心率计和计步器 - 单次模式
当传感器检测到某种事件时触发,例如红外传感器,在检测到人靠近时,触发上报. - 特定上报模式
用于支持特定需求的上报,较少使用.
唤醒传感器和唤醒传感器
所谓的唤醒是指是否能够唤醒SOC处理器来处理事件,当SOC处于挂起状态时,唤醒传感器可以将SOC唤醒处理必要的事件.另外同一个传感器可以同时被定义为唤醒传感器和非唤醒传感器.两者相对独立.
多个应用共同访问同一个传感器
- 应用A以100HZ速率访问传感器X,应用B以200HZ速率访问传感器X,最终传感器上报速率以较高的为准,即200HZ
- 多个应用设定了报告延迟时间,又可能会超过所设定的延迟时间
- 不支持多个应用对同一个传感器设定不同模式(例如:一个设定”高精度”,另一个设定”低功耗”)
- 应用不能将传感器数据下发(应用只向下发送控制命令,而不下发数据),否则其他应用可能接收到应用下发的错误数据.
融合算法
Android平台可以依赖原始的9轴数据(加速度计、陀螺仪、指南针),融合出旋转矢量、重力和线性加速度传感器给应用程序使用,当然如果有能力可以自己实现更好的融合算法.