android传感器(sensor)分析(以mma8451重力感应器为基础)

本文深入探讨了Android 4.0系统中的传感器架构,从应用程序层到内核驱动层逐一解析。特别以MMA8451重力感应器为例,详细阐述了sensor在各个层级的工作原理,包括SensorService、SensorManager、JNI、HAL层以及kernel层的驱动实现。通过对probe函数和event发送函数的分析,揭示了传感器数据的获取和处理过程。
摘要由CSDN通过智能技术生成
一、前言

 传感器是现在手机上不可或缺的的一部分,到了android4.0系统总共支持13类的传感器分别为

#define SENSOR_TYPE_ACCELEROMETER       1
#define SENSOR_TYPE_MAGNETIC_FIELD      2
#define SENSOR_TYPE_ORIENTATION         3
#define SENSOR_TYPE_GYROSCOPE           4
#define SENSOR_TYPE_LIGHT               5
#define SENSOR_TYPE_PRESSURE            6
#define SENSOR_TYPE_TEMPERATURE         7   
#define SENSOR_TYPE_PROXIMITY           8
#define SENSOR_TYPE_GRAVITY             9
#define SENSOR_TYPE_LINEAR_ACCELERATION 10
#define SENSOR_TYPE_ROTATION_VECTOR     11
#define SENSOR_TYPE_RELATIVE_HUMIDITY   12
#define SENSOR_TYPE_AMBIENT_TEMPERATURE 13

对于这么多类别的传感器,android提供一个统一的架构来方便开发者使用。我们下面就要来分析这个架构。
本文以飞思卡尔mma8451 三轴重力感应器为基础来分析的。传感器架构遵循了标准的android架构,包括应用程序层-> framework层->jni层->hal层->内核空间->设备驱动。
对于应用程序层,framework层和jni层我们仅仅做简单的介绍,重点放在分析hal层、内核空间和驱动中,因为作为一个驱动工程师这才是重点!

 
二、架构分析
 1.应用程序层
 从网上找到一个android应用程序访问传感器的方法,流程如下

//1、取得重力感应器Sensor对象
//在 Activity 中定义以下成员变量:
private SensorManager mManager = null;
private Sensor mSensor = null;
//以下代码加入到 onCreate() 方法中:
mManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);  //创建SensorManager
mSensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到重力感应器
//2、创建监听器
//在 Activity 中定义以下成员变量:
private SensorEventListener mListener = null;
//以下代码加入到 onCreate() 方法中:
mListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
public void onSensorChanged(SensorEvent event) {
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
doSomething(x, y, z);
}
};
//3、注册监听器
//以下代码加入到 onResume() 方法中:
mManager.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_GAME);
//这里 SENSOR_DELAY_GAME 还可以是以下常量:
//SENSOR_DELAY_FASTEST
//SENSOR_DELAY_UI
//SENSOR_DELAY_NORMAL
//4、取消监听器
//以下代码加入到 onPause() 方法中:
mManager.unregisterListener(mListener);
参考:http://www.oschina.net/code/snippet_12_687

从上面流程来看,首先我们要获取sensorservice,然后创建一个SensorManager,再从SensorManager从获取到具体传感器
最后创建一个监听来监听这个传感器的事件。因此下面来看framework层。

2.framework层
SensorService代码在android\frameworks\base\services\sensorservice\SensorService.cpp中,
app中通过getSystemService()方法可以访问到getSystemService
SensorManager代码在android\frameworks\base\core\java\android\hardware\SensorManager.java中,
他是sensor事件的总管理器,包括打开设备读取事件 分发事件等功能


3jni层
jni层主要包含两个文件
android\frameworks\base\core\jni\android_hardware_SensorManager.cpp//主要是method的注册,为java提供下层访问接口
android\frameworks\base\services\sensorservice\SensorDevice.cpp//主要是动态链接库访问,jni层和hal层访问方式是通过
动态链接库来实现的,这个文件里实现了动态链接库的打开,和访问函数封装等一些操作

4.hal层
在这个层里,我们主要就分析动态链接库的实现的主要功能有哪些
这个库实现代码在android\hardware\imx\libsensors\sensors.cpp中它的入口代码为:

struct sensors_module_t HAL_MODULE_INFO_SYM = {
        common: {
                tag: HARDWARE_MODULE_TAG,
                version_major: 1,
                version_minor: 1,
                id: SENSORS_HARDWARE_MODULE_ID,
                name: "Freescale Sensor module",
                author: "Freescale Semiconductor Inc.",
                methods: &sensors_module_methods,//链接库的操作集
        },
        get_sensors_list
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值