Android Sensor框架简述(一)

Sensor整体框架

什么是Sensor?

Sensor就是所谓的传感器,比如AccelerometerSensor、MagneticSensor、OrientationSensor、ProximitySensor、LightSensor、Gyro等。

Sensor框架结构

黄色部分:硬件,在I2C总线上

红色部分:驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数据传到HAL层,准确说是HAL从Event读

绿色部分:动态库,它封装了整个Sensor的IPC机制,如SensorManager是客户端,SensorService是服务端,而HAL部分是封装了服务端对Kernel的直接访问

蓝色部分就是我们的FrameworkApplication了,JNI负责访问Sensor的客户端,而Application就是具体的应用程序,用来接收Sensor返回的数据,并处理实现对应的UI效果


SensorService启动

网络上很多sensor机制讲解的内容都是过时的了,新的android有了新的机制,这里讲的是Android5.0以上的版本

这里推荐一个较新的博客,关于Android5.0 Sensor机制 android-5.0 sensor工作原理—sensorservice的启动(一)
SensorService启动

启动SensorService的过程如上图所示,过程还是比较清晰的。


SensorDevice获取

SensorService的onFirstRef()函数创建了一个新的SensorDevice,接下来就来看看SensorDevice做了哪些工作。
SensorDevice获取描述

hw_get_module()

1
2
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);

这个函数主要是为了从的库文件获取参数,第一个参数是所获取的hardware模块的名字,第二个参数是获得的hw_module_t。如何获得的细节不在赘述。

hw_module_t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct sensors_module_t HAL_MODULE_INFO_SYM = {  
common:{
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: SENSORS_HARDWARE_MODULE_ID,
name: "SPRD Sensor module",
author: "Spreadtrum",
methods: &sensors_module_methods,
dso: 0,
reserved:{},
},
get_sensors_list:sensors__get_sensors_list,
};

static struct hw_module_methods_t sensors_module_methods = {
open: open_sensors
};

static int sensors__get_sensors_list(struct sensors_module_t *module,
struct sensor_t const **list)
{
*list = sSensorList;
return numSensors;
}

这是一个结构体,包含一个hw_module_t还包含一些接口,比如sensors__get_sensors_list和open_sensors等

sensors_open_1

1
2
3
4
5
static inline int sensors_open_1(const struct hw_module_t* module,
sensors_poll_device_1_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
}

这里的open函数就是上一步hw_get_module()获取的sensors_module_t所定义的sensors_module_methodsopen_sensors接口

open_sensors()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static int open_sensors(const struct hw_module_t* module, const char* id,  
struct hw_device_t** device)
{
int status = -EINVAL;
sensors_poll_context_t *dev = new sensors_poll_context_t();

memset(&dev->device, 0, sizeof(sensors_poll_device_t));

dev->device.common.tag = HARDWARE_DEVICE_TAG;
dev->device.common.version = 0;
dev->device.common.module = const_cast<hw_module_t*>(module);
dev->device.common.close = poll__close;
dev->device.activate = poll__activate;
dev->device.setDelay = poll__setDelay;
dev->device.poll = poll__poll;

*device = &dev->device.common;
status = 0;

return status;
}

sensors_poll_context_t()方法新建并初始化系统所有的sensor
然后对sensors_poll_device_t结构体的初始化,以及数据获取的API 接口的定义

get_sensors_list()

这个方法就是上述hw_get_module()获取的sensors_module_t的方法,获取的是HAL层初始化好的sensor的列表,并返回sensor的数量

activate()

最后是一个循环,把所有的sensor都通过activate激活。

调用HAL层sensor厂商添加的setEnable()方法来打开对应sensor。
通过open函数获取sensor在sysfs对应的文件节点,然后使用write函数往文件节点里面写1。

这就是activate的大概过程,代码不再贴出来。

至此,sensor全部启动完毕。

文章目录
  1. 1. Sensor整体框架
    1. 1.1. SensorService启动
    2. 1.2. SensorDevice获取
      1. 1.2.1. hw_get_module()
        1. 1.2.1.1. hw_module_t
      2. 1.2.2. sensors_open_1
        1. 1.2.2.1. open_sensors()
      3. 1.2.3. get_sensors_list()
      4. 1.2.4. activate()