我是靠谱客的博主 热心可乐,这篇文章主要介绍android sensor架构和原理分析---转载做学习记录,现在分享给大家,希望可以做个参考。

原文地址请点击此处
本文主要描述了在android2.3平台G-sensor相关软硬件的体系架构和实现原理,按照Applications、Framework、HAL、Driver和Hardware五大层次分别介绍。

1.系统架构 (Architecture)

1.1 Android体系架构图

在这里插入图片描述

1.2 Sensor子系统架构图

在这里插入图片描述
· Application Framework
Sensor应用程序通过Sensor应用框架来获取sensor数据,应用框架层的Sensor Manager通过JNI与C++层进行通信。
· Sensor Libraries
Sensor中间层主要由Sensor Manager、Sensor service和Sensor硬件抽象层组成。
· Input Subsystem
通用的Linux输入框架专为与键盘、鼠标和触摸屏等输入设备而设计,并定义了一套标准事件集合。Sensor输入子系统采用采用了通用的Linux输入框架,它通过/sys/class/input节点和用户空间进行交互。
· Event Dev
Evdev提供了一种访问/dev/input/eventX输入设备事件的通用方法。
· AccelerometerDriver
此驱动通过SIRQ和I2C总线与MMA7660模组进行通信。SIRQ用来产生传感器事件中断。

2 应用 (Applications)

2.1 应用开发五步曲

(1) 获取传感器管理器对象;

复制代码
1
2
mSensorManager =(SensorManager) getSystemService(SENSOR_SERVICE);

(2) 获取传感器对象;

复制代码
1
2
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

(3) 定义事件监听器;

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
mEventListener =new SensorEventListener() { @Override publicvoid onSensorChanged(SensorEvent event) { float[] values = event.values; mTextView.setText("Accelerometer:" + values[0] +", " + values[1] +", " + values[2]); } @Override publicvoidonAccuracyChanged(Sensor sensor,int accuracy) { } };

(4) 注册事件监听器;

复制代码
1
2
3
4
5
6
protectedvoid onResume() { super.onResume(); mSensorManager.registerListener(mEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL); }

(5) 卸载事件监听器;

复制代码
1
2
3
4
5
protectedvoid onPause() { super.onPause(); mSensorManager.unregisterListener(mEventListener); }

3 框架 (Framework)

3.1 工作模型

在这里插入图片描述
3.1.1 SensorManager的创建
在这里插入图片描述
nativeClassInit(): 初始化Native类信息;
sensors_module_init(): 创建Native SensorManager实例,从SensorService读取Sensor设备列表;
sensors_module_get_next_sensor(): 从SensorService读取下一个Sensor设备;

3.1.2 SensorThread数据接收处理
在这里插入图片描述
sensors_create_queue(): 创建和SensorService共享的消息队列;
sensors_data_poll(): 从消息队列中读取SensorService发过来的消息;

3.1.3 SensorService的工作原理
在这里插入图片描述
SensorDevice::poll(): 调用HAL接口读取数据;
SensorEventConnection::sendEvents(): 往消息队列中写入消息,SensorThread后续会读取该消息;

3.1.4 SensorDevice对HAL的访问
在这里插入图片描述

4 硬件抽象层 (HAL)

在这里插入图片描述
在linux操作系统中,应用同硬件之间的交互都是通过设备驱动来实现,Android系统为了降低应用开发人员开发难度,屏蔽硬件差异,定义出硬件抽象层,为开发人员提供获取各种设备相关的信息的接口。

4.1 Sensors HAL关键流程

4.1.1 打开Sensor设备
在这里插入图片描述
SensorBase ::openInput() : 打开input子系统的sensor消息文件句柄;
ioctl(EVIOCGABS(…)) : 获取ABS_X/ABS_Y/ABS_Z的加速度;

4.1.2 轮循Sensor事件
在这里插入图片描述
InputEventCircularReader::fill(): 调用read()从input子系统中读取事件放入环形缓冲区;
InputEventCircularReader::readEvent(): 从环形缓冲区中读取事件;
InputEventCircularReader::next(): 移动环形缓冲区当前指针;

5.2 Sensors HAL关键数据结构

5.2.1 sensors_module_t

复制代码
1
2
3
4
5
6
7
8
9
10
11
struct sensors_module_t { struct hw_module_t common; /** * Enumerate all available sensors. The list is returned in "list". * @return number of sensors in the list */ int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t const** list); };

hw_get_module()会加载HAL模块,并返回HAL入口数据结构(hw_module_t)。HAL_MODULE_INFO_SYM默认是“HAL”,在hw_get_module中用dlsym获取。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
const 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 = "MMA7660 Sensors Module", .author = "The Android Open Source Project", .methods = &sensors_module_methods, }, .get_sensors_list = sensors__get_sensors_list };

5.2.2 hw_module_methods_t

复制代码
1
2
3
4
static struct hw_module_methods_t sensors_module_methods = { .open = open_sensors };

5.2.3 sensors_poll_context_t

复制代码
1
2
3
4
5
6
7
8
9
10
struct sensors_poll_context_t { struct sensors_poll_device_t device; // must be first sensors_poll_context_t(); ~sensors_poll_context_t(); int activate(int handle, int enabled); int setDelay(int handle, int64_t ns); int pollEvents(sensors_event_t* data, int count); int handleToDriver(int handle); };

5.2.4 sensors_poll_device_t

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
struct sensors_poll_device_t { struct hw_device_t common; int (*activate)(struct sensors_poll_device_t *dev, int handle, int enabled); int (*setDelay)(struct sensors_poll_device_t *dev, int handle, int64_t ns); int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t* data, int count); };

5.2.5 sensor_t:定义传感器的基本参数

复制代码
1
2
3
4
5
6
7
static const struct sensor_t sSensorList[] = { { "MMA7660 3-axis Accelerometer", "Freescale Semiconductor", 1, SENSORS_HANDLE_BASE+ID_A, SENSOR_TYPE_ACCELEROMETER, 3.0f*9.81f, (3.0f*9.81f)/64.0f, 0.35f, 0, { } }, };
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
struct sensor_t { const char* name; const char* vendor; int version; int handle; int type; float maxRange; float resolution; float power; int32_t minDelay; void* reserved[8]; };

在学习中进步,如有错误,请多多批评指正

最后

以上就是热心可乐最近收集整理的关于android sensor架构和原理分析---转载做学习记录的全部内容,更多相关android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部