原文地址请点击此处
本文主要描述了在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
2mSensorManager =(SensorManager) getSystemService(SENSOR_SERVICE);
(2) 获取传感器对象;
1
2mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
(3) 定义事件监听器;
1
2
3
4
5
6
7
8
9
10
11
12mEventListener =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
6protectedvoid onResume() { super.onResume(); mSensorManager.registerListener(mEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL); }
(5) 卸载事件监听器;
1
2
3
4
5protectedvoid 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
11struct 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
13const 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
4static 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
10struct 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
13struct 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
7static 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
13struct 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内容请搜索靠谱客的其他文章。
发表评论 取消回复