Android Sensor传感器系统架构初探

合集下载

Android 浅谈Sensor工作流程(一)

Android 浅谈Sensor工作流程(一)

Android 浅谈Sensor工作流程(一)我们使用sensor 接口一般只要注册一下SensorListener 像下面这样ApiDemo:mGraphView = new GraphView(this); mSensorManager.registerListener(mGraphView,....);这里的listener 是因为sensor 状态变化要产生变化的控件,然后在控件里重载on SensorChanged 和onAccuracyChanged 方法public void onSensorChanged(int sensor, float[] values) publicvoid onAccuracyChanged(int sensor, int accuracy) SensorManager Sensor 主体代码和流程在frameworks/base/core/java/android/hardware/SensorMan ager.java 里面 1.registerListener 其实是调用registerLegacyListener:java代码:public boolean registerListener(SensorListener listener, int sensors, int rate) {result = registerLegacyListener(...);}复制代码2. registerLegacyListener 其实就是构造一个LegacyListener 对象并将其加入HashMap 中去java代码:private boolean registerLegacyListener(int legacyType, int type,SensorListener listener, int sensors, intrate){legacyListener = newLegacyListener(listener);mLegacyListenersMap.put(listene r, legacyListener); //private HashMap< p> LegacyListener> mLegacyListenersMap}复制代码3. LegacyListener 做了2 件事一个是调用我们重载的那2 个接口还有一个就是将sensor 的数据刷到我们的设备显示界面上去java代码:private class LegacyListener implements SensorEventListener{LegacyListener(SensorListener target) {mTarget = target;mSensors = 0;}public voidonSensorChanged(SensorEvent event) {mapSensorDataToWindow();mTarget.onSensorChanged( ...);//private SensorListener mTarget;}public void onAccuracyChanged(Sensor sensor, int accuracy) {}}复制代码。

轻松学Android开发之Android传感器Sensor精品PPT课件

轻松学Android开发之Android传感器Sensor精品PPT课件
【示例12-4】下面通过一个具体的案例来演示重力 传感器的开发。
12.2.5 亮度传感器
亮度传感器(Light),主要用来检测设备周围光线 强度。光强单位是勒克斯(lux),其物理意义是照 射到单位面积上的光通量。
【示例12-5】下面通过一个具体的案例来演示亮度 传感器的开发。
12.3 小结
12.2.3 方向传感器
方向传感器(Orientation)简称为O-sensor,主要感应方位的变化。现在已 经被SensorManager.getOrientation()所取代,我们可以通过磁力计 MagneticField和加速度传感器Accelerometer来获得方位信息。该传感器同 样捕获三个参数,分别代表手机沿传感器坐标系的X轴、Y轴和Z轴转过的 角度。
本章内容主要讲解了Android系统中,常用传感器的 开发及应用。本章重点在于如何在真机上测试自己 开发的应用程序,我们开发的程序最终都是运行在 真机上,掌握真机测试十分重要。读者可以在掌握 了这些传感器的使用之后,自主开发一些传感器小 应用程序,更加深入地学习传感器的应用。
为方便学习与使用课件内容,
values[2]:roll旋转角,围绕Y轴的旋转角。由静止状态开始,左右翻转, 取值范围为-90度到90度。
【示例12-3】下面通过一个具体的案例来演示方向传感器的开发。
12.2.4 重力传感器
重力传感器(Gravity)简称GV-sensor,主要用于输 出重力数据。在地球上,重力数值为9.8,单位是 m/s^2。坐标系统与加速度传感器坐标系相同。当设 备复位时,重力传感器的输出与加速度传感器相同。
registerListener(SensorEventListener listener, Sensor sensor, int rate)方法注册监听。 rate支持的参数如下: Sensor.manager.SENSOR_DELAY_FASTEST:延迟0ms,; Sensor.manager.SENSOR_DELAY_GAME:延迟20ms,适合游戏的频率; Sensor.manager.SENSOR_DELAY_UI:延迟60ms,适合普通界面的频率; Sensor.manager.SENSOR_DELAY_NORMAL:延迟200ms,正常频率; (4)实现SensorEventListener接口中下列两个方法,监听并取得传感器Sensor的状态。

AndroidSensor传感器系统架构初探

AndroidSensor传感器系统架构初探

Android Sensor 传感器系统架构初探分类:Android系统2010-10-15 10:19 5438 人阅读评论(16)收藏举报1.体系结构2.数据结构3.四大函数本文以重力感应器装置G-sensor为例探索Android的各层次结构。

1.体系结构Android的体系结构可分为4个层次。

•第一层次底层驱动层,包括标准Linux , Android核心驱动,Android相关设备驱动,G-sensor的设备驱动程序即存在于此•第二层次Android标准C/C++库,包括硬件抽象层,Android各底层库,本地库,JNI•第三层次Android Java Framwork 框架层•第四层次Java应用程序本文重点关注硬件抽象层,JNI以及Framework 。

1.1硬件抽象层硬件抽象层通过例如open(), read(), write(), ioctl(), poll() 等函数调用的方式,与底层设备驱动程序进行交互,而这些函数调用是底层设备驱动程序事先准备好的。

用于交互的关键是文件描述符fd , fd通过open()打开G-sensor设备节点而得到,即fd=open ("/dev/bma220", O_RDONLY); 而/dev/bma220 这个设备节点是在底层设备驱动中注册完成的。

其他的函数调用如read(), write()等都通过该文件描述符fd对G-sensor设备进行操作。

1.2JNI (Java Native Interface)JNI层可以认为是整个体系结构中的配角,概括地讲,它就完成了一项任务,既实现从C++语言到Java语言的转换。

JNI层为Java Framework 层提供一系列接口,而这些接口函数的具体实现中,利用例如module->methods->open(), sSensorDevice->data_open(), sSensorDevice->poll() 等回调函数与硬件抽象层进行交互。

android驱动程序之-sensor

android驱动程序之-sensor

android驱动程序之-sensor上图是android系统架构图,从中可以得知,sensor必贯穿架构的各个层次。

按照架构层次,下⾯从五个⽅⾯来分析sensor架构:1. sensor架构之App层;2. sensor架构之Framework层;3. sensor架构之Libraries层;4. sensor架构之HAL层;5. sensor架构之Driver。

1. sensor架构之App层下⾯以g-sensor为例,写⼀个简单的apk,看⼀下sensor在App层到底是如何⼯作的,⼀般需要下⾯四个步骤来实现⼀个sensor应⽤。

Step1:通过getSystemService获取sensor服务,其实就是初始化⼀个SensorManager实例;1 SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);Step2:通过SensorManager的getDefaultSensor⽅法获取指定类型的传感器的sensor对象;1 Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); // 重⼒感应Step3:实现SensorEventListener接⼝的onSensorChanged和onAccuracyChanged⽅法;1 SensorEventListenerlsn = new SensorEventListener() {2public void onSensorChanged(SensorEvent e) {3//当传感器的值发⽣变化时,会执⾏这⾥4 }56public void onAccuracyChanged(Sensor s, int accuracy) {7//当传感器的精度变化时,会执⾏这⾥8 }9 };Step4:通过SensorManager的registerListener⽅法注册监听,获取传感器变化值。

androidsensor框架分析

androidsensor框架分析

androidsensor框架分析5,sensor数据流分析前面几章做了很多准备和铺垫,这章终于可以分析sensor数据的传输流程了。

主要步骤如下,1,服务端通过HAL从驱动文件节点中获取sensor数据。

2,服务端通过管道发送数据。

3,客户端通过管道读取数据。

4,客户端吐出数据。

5.1服务端获取数据启动sensor服务之后,就会调用SensorService.cpp的threadLoop方法,该方法首先不断调用SensorDevice.cpp的poll方法获取sensor数据,1.do {2.ssize_t count = device.poll(mSensorEventBuffer, numEventMax);然后遍历activeConnections变量,向每一个客户端发送一份sensor数据。

1.for (size_t i=0 ; i < numConnections; ++i) {2.if (activeConnections[i] != 0) {3.activeConnections[i]->sendEvents(mSensorEventBuffer, count, mSensorEventScratch,4.mMapFlushEventsToConnections);poll方法调用流程图如下,这些方法都很简单,没什么可论述的。

加速度sensor的readEvents调用流程图如下,1,fill方法Accelerometer.cpp 的readEvents中调用fill方法如下,ssize_t n = mInputReader.fill(data_fd);传入的data_fd是NativeSensorManager.h的SensorContext 结构体的变量。

见第二章2.1.2 小节。

fill方法如下,1.ssize_t InputEventCircularReader::fill(int fd)2.{3.size_t numEventsRead = 0;4.if (mFreeSpace) {5.const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event));6.if (nread<0 || nread % sizeof(input_event)) {7.// we got a partial event!!8.return nread<0 ? -errno : -EINVAL;9.}10.numEventsRead = nread / sizeof(input_event);11.if (numEventsRead) {12.mHead += numEventsRead;13.mFreeSpace -= numEventsRead;14.if (mHead > mBufferEnd) {15.size_t s = mHead - mBufferEnd;16.memcpy(mBuffer, mBufferEnd, s * sizeof(input_event));17.mHead = mBuffer + s;18.}19.}20.}21.return numEventsRead;22.}1.struct input_event* const mBuffer;2.struct input_event* const mBufferEnd;3.struct input_event* mHead;4.struct input_event* mCurr;5.ssize_t mFreeSpace;mBuffer表示未读事件;mHead表示未读事件的第一个,初始为缓冲区首部.mBufferEnd表示未读事件的最后一个,初始为缓冲区尾部.mCurr表示当前未读事件struct input_event结构体定义在kernel/include/uapi/linux/input.h中,1.struct input_event {2.struct timeval time;3.__u16 type;//类型,比如sensor,按键事件等4.__u16 code;5.__s32 value;//具体的数值6.};2,获取sensor值,1.while (count && mInputReader.readEvent(&event)) {2.int type = event->type;3.if (type == EV_ABS) {4.float value = event->value;5.if (event->code == EVENT_TYPE_ACCEL_X) {6.mPendingEvent.data[0] = value * CONVERT_ACCEL_X;7.} else if (event->code == EVENT_TYPE_ACCEL_Y) {8.mPendingEvent.data[1] = value * CONVERT_ACCEL_Y;9.} else if (event->code == EVENT_TYPE_ACCEL_Z) {10.mPendingEvent.data[2] = value * CONVERT_ACCEL_Z;11.}12.} else if (type == EV_SYN) {13.switch (event->code){14.case SYN_TIME_SEC:15.{16.mUseAbsTimeStamp = true;17.report_time = event->value*1000000000LL;18.}19.break;20.case SYN_TIME_NSEC:21.{22.mUseAbsTimeStamp = true;23.mPendingEvent.timestamp = report_time+event->value;24.}25.break;26.···27.mInputReader.next();首先获取加速度sensor三个方向上的值,然后获取对应的时间。

Android感应检测Sensor(简单介绍)

Android感应检测Sensor(简单介绍)

Android感应检测Sensor(简单介绍)2、Android感应检测管理----SensorManager感应检测功能:1、取得SensorManager使用感应检测Sensor首要先获取感应设备的检测信号,你可以调用Context.getSysteService(SENSER_SERVICE)方法来取得感应检测的服务2、实现取得感应检测Sensor状态的监听功能实现以下两个SensorEventListener方法来监听,并取得感应检测Sensor状态:1.//在感应检测到Sensor的精密度有变化时被调用到。

2.public void onAccuracyChanged(Senso sensor,int accurac y);3.//在感应检测到Sensor的值有变化时会被调用到。

4.public void onSensorChanged(SensorEvent event);3、实现取得感应检测Sensor目标各类的值实现下列getSensorList()方法来取得感应检测Sensor的值;1.List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_TE MPERATURE);4、注册SensorListener1.sm.regesterListener(SensorEventListener listener, Sensor sensor, int rate);第一个参数:监听Sensor事件,第二个参数是Sensor目标种类的值,第三个参数是延迟时间的精度密度。

延迟时间的精密度参数如下:因为感应检测Sensor的服务是否频繁和快慢都与电池参量的消耗有关,同时也会影响处理的效率,所以兼顾到消耗电池和处理效率的平衡,设置感应检测Sensor的延迟时间是一门重要的学问,需要根据应用系统的需求来做适当的设置。

感应检测Sensor的硬件检测组件收不同的厂商提供。

Android 系统Gsensor系统架构

Android 系统Gsensor系统架构

Android 系统Gsensor系统架构一、首先建立这样一个全局的观念:Android中sensor在Android系统架构中的位置及其工作。

方框图如下:从以上方框图中,可以看出Android中sensor在系统分为四层:驱动层(Sensor Driver)、硬件抽象层(Native)、中间层(Framework)、应用层(Java)。

硬件抽象层与中间层可以合并一起作为Framework层。

针对我们xx这里一个具体的Gsensor,下面将以具体的源码形式来讲解以上的这个系统框图。

二、驱动层(Sensor Driver Layer)芯片ADXL345为GSensor,至于硬件的具体工作原理,须分析ADXL345的DataSheet。

驱动源码位于:xx\custom\common\kernel\accelerometer\adxl345目录。

由于ADXL345是以I2C形式接口挂接到Linux系统,因此同时需要分析Linux的I2C子系统架构(略)。

其源码位于:1、xx\platform\xx\kernel\drivers\i2c2、kernel\drivers\i2c查看ADXL345.c文件,分析针对于其硬件工作原理的几个函数。

硬件初始化:[cpp] view plaincopystatic int adxl345_init_client(structi2c_client *client, int reset_cali) { structadxl345_i2c_data *obj = i2c_get_clientdata(client);int res = 0; adxl345_gpio_config();//配置GPIO口,这里由于不使用中断,所以将中断引脚配置成输入输出口。

res =ADXL345_CheckDeviceID(client); //检测设备ID,通过读ADXL345的DEVID寄存器if(res !=ADXL345_SUCCESS) { returnres; } res =ADXL345_SetPowerMode(client, false);//设置电源模式,ADXL345有几种电源模式,这里设置false值指不让芯片处于messure模式if(res != ADXL345_SUCCESS) { return res; }res = ADXL345_SetBWRate(client,ADXL345_BW_100HZ);//设置带宽,100Hz if(res != ADXL345_SUCCESS ) //0x2C-&gt;BW=100Hz{ return res; } //设置数据格式,具体见datasheet res =ADXL345_SetDataFormat(client,ADXL345_FULL_RES|ADXL345_RANGE_2G);if(res != ADXL345_SUCCESS) //0x2C-&gt;BW=100Hz{ return res; }gsensor_gain.x = gsensor_gain.y = gsensor_gain.z =obj-&gt;reso-&gt;sensitivity; //设置中断寄存器,关闭中断res = ADXL345_SetIntEnable(client, 0x00);//disable INT if(res !=ADXL345_SUCCESS) { return res; } if(0 != reset_cali){ /*reset calibration only in power on*/res = ADXL345_ResetCalibration(client);if(res != ADXL345_SUCCESS){ return res; } }#ifdef CONFIG_ADXL345_LOWPASSmemset(&amp;obj-&gt;fir, 0x00, sizeof(obj-&gt;fir));#endif return ADXL345_SUCCESS; } 函数的分析都注释在原理里,红色部分。

Android系统下sensor驱动架构简介及使用说明

Android系统下sensor驱动架构简介及使用说明

Sensor驱动架构简介及使用说明版本日期描述作者审核V1.02012-6-10针对各种sensor的共性与差异编写的统罗伟一架构,支持挂接重力传感器、地磁传感器、陀螺仪、光感、距离感应、温度感应等设备,可以很方便地兼容不同厂家的各种sensor。

V1.12012-8-9增加SENSOR自动兼容,所有SENSOR均可以同时选上,SENSOR自动探测和识别。

1.sensor架构简介1.1编写目的到目前为止,sensor的android硬件抽象层已经统一,但是各种产品和项目中仍用到了各种形形色色的传感器,并且驱动基本上是重新编写和调试一遍,然后重新解决一轮BUG。

调试的时间少则一天,多则数天,如果驱动写的不好,容易引入BUG。

鉴于这种情况,对所有sensor的共性与差异进行思考后发现,其实不同的sensor工作原理是相似的,仅有部分有差异,例如初始化、寄存器地址、上报方式、IOCTL等几个,其他的大部分都是相同的。

因此花了数天时间设计和编写了这套sensor架构,该架构特别注意以下几点:兼容性好、使用简单、结构清晰、可读性强。

1.2结构图整个代码存放于文件夹sensors下,包括两个主文件sensor-dev.c和sensor-i2c.c,几个芯片级文件夹accel、compass、gyro、lsensor、psensor、temperature。

其中,sensor-dev.c对sensor操作进行统一处理,包括驱动挂载、中断或轮训处理、IOCTL 处理、差异性接口的统一回调处理等,sensor-i2c.c是所有sensor的i2C操作接口,包括带寄存器和不带寄存器两种;accel目录下存放不同类型的gsensor;compass 目录下存放不同类型的地磁传感器;gyro目录下存放不同类型的陀螺仪;lsensor 目录下存放不同类型的光传感器;psensor目录下存放不同类型的距离传感器;temperature目录下存放不同类型的温度传感器。

Android中传感器Sensor的使用-电脑资料

Android中传感器Sensor的使用-电脑资料

Android中传感器Sensor的使用-电脑资料1.Sensor类型Android中有多种传感器,目前Android SDK支持的传感器有:光线传感器,旋转向量传感器,压力传感器,陀螺仪传感器,加速度传感器,重力传感器,方向传感器,磁场传感器,近程传感器等,。

但并不是所有手机都具有全部传感器,一般高端手机具有大多数传感器,毕竟传感器都需要money的,价格自然不菲。

2.Sensor实际应用那么在Android开发中,如何使用传感器,将传感器功能添加到Android应用中呢,例如微信的摇一摇,通过加速传感器,触发寻找附近的人;例如每次接听电话时,当手机靠近耳朵时,手机会黑屏,这就是光线传感器起作用。

3.Sensor使用步骤获取传感器管理对象SensorManager创建传感器事件接听器的类,该类必须实现android.hardware.SensorEventListner接口使用SensorManager.registerListener方法注册指定的传感器4.传感器事件接口SensorEventListner接口,该接口的onSensorChanged()和onAccuracyChanged()方法用于处理相应的传感器事件1 public interface SensorEventListener {23 //传感数据变化调用4 public void onSensorChanged(SensorEvent event);5 //传感器精准度变化时调用6 public void onAccuracyChanged(Sensor sensor, int accuracy);7 }5.简单代码实现定义SensorManager1 SensorManager sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);定义一个匿名内部类或者定义一个类实现SensorEventListner接口1 private SensorEventListener sensorEventListener=new SensorEventListener() {23 @Override4 public void onSensorChanged(SensorEvent event) {56 float[] values=event.values;7 float x = values[0];8 float y = values[1];9 float z = values[2];10 }11 @Override12 public void onAccuracyChanged(Sensor sensor, int accuracy) {1314 }15 };注册和关闭传感器监听事件@Overrideprotected void onResume() {super.onResume();if(sensorManager!=null){sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);}}@Overrideprotected void onPause() {super.onPause();if(sensorManager!=null){sensorManager.unregisterListener(sensorEventListener);}}。

深入理解AndroidSensor系统(4.0)

深入理解AndroidSensor系统(4.0)

深入理解AndroidSensor系统(4.0)转自/qianjin0703/article/details/7568641 曾几何时,本人写了一篇Android传感器初探"惊艳整个篮球场"...一转眼两年过去了,真是物逝人非,技术更新的快啊,如今都已经4.0巧克力冰激凌了...0. 总论本文希望分别从动态角度(应用程序进程)以及静态角度(框架体系架构)两方面来理解传感器系统。

1. 上层应用从编写应用程序的角度来看,比较简单,大体分如下4步,便可得到一个传感器实时上报的数值并作处理,1) 得到传感器服务 getSystemService(SENSOR_SERVICE);得到一个SensorManager,用来管理分配调度处理Sensor的工作,注意它并不服务运行于后台,真正属于Sensor的系统服务是SensorService,终端下#service list可以看到sensorservice: [android.gui.SensorServer]。

2) 得到传感器类型 getDefaultSensor(Sensor.TYPE_GRAVITY);当然还有各种千奇百怪的传感器,可以查阅Android官网API或者源码Sensor.java。

3) 注册监听器 SensorEventListener应用程序打开一个监听接口,专门处理传感器的数据,这个监听机制比较重要,被系统广泛使用。

4) 实现监听器的回调函数onSensorChanged, onAccuracyChanged例如对重力感应器的xyz值经算法变换得到左右上下前后方向等,就由这个回调函数实现。

1.1 进程空间一个应用程序对应一个虚拟机实例,一个进程和一个主线程,通过主线程控制四大组件。

要想得到传感器数据,须要开一个子线程,通过pol轮训的方式监听底层上报的数据,再由消息机制把数据发送给主线程处理。

换句话说,应用程序有两个任务:1)准备一个监听接口供主线程接受数据2)开启一个子线程接受底层数据并发送到主线程,而这些有关Sensor的具体任务,全部交给SensorManager统一管理。

Android物联网开发从入门到实战第10章Android传感器系统架构详解

Android物联网开发从入门到实战第10章Android传感器系统架构详解

硬件和驱动
第10章 Android传感器系统架构详解
10.3 Frameworks层详解
10.3.1 监听传感器的变化
文件SensorListener.java用于监听从Java应用层中传递过来的变化。
10.3.2 注册监听
(1)通过“getSystemService(SENSOR_SERVICE);”语句得到传感器服务。 (2)通过“getDefaultSensor(Sensor.TYPE_GRAVITY);”得到传感器类型。 (3)注册监听器 SensorEventListener。 (4)通过回调函数onSensorChanged和onAccuracyChanged实现实时监听。
第10章 Android传感器系统架构详解
10.4 JNI层详解
10.4.1 实现本地函数 10.4.2 处理客户端数据 10.4.3 处理服务端数据
第10章 Android传感器系统架构详解

第10章 Android传感器系统架构详解
10.1 Android传感器系统概述 10.2 Java层详解
Android应用
本地框架
屏幕方向管理 Sensor的Java类
本地框架 Sensor JNI和硬件抽象层
Android系统
加速度、磁场、温度等传感器设备

Android的传感器系统

Android的传感器系统

JAVA Sensor Class
SensorManager
SensorListener Sensor
SensorEventListener SensorEvent
Sensor JNI ( android.hardware.SensorManager )
Native Framework
Kernel Space
SENSOR_TYPE_ORIENTATION
3
SENSOR_TYPE_GYROSCOPE
4
SENSOR_TYPE_LIGHT
5
SENSOR_TYPE_PRESSURE
6
SENSOR_TYPE_TEMPERATURE
7
SENSOR_TYPE_PROXIMITY
8
第一部分 传感器系统综述
Java Framework
实现传感器系统核心的管理类 SensorManager Sensor.java :
单一传感器的描述性文件 Sensor SensorEvent.java :
表示传感器系统的事件类 SensorEvent SensorEventListener.java :
方向
TYPE_ORIENTATION
陀螺 光线(亮度)
TYPE_GYROSCOPE TYPE_LIGHT
压力 温度
TYPE_PRESSURE TYPE_TEMPERATURE
接近
TYPE_PROXIMITY
本地接口名称
数值
SENSOR_TYPE_ACCELEROMETER 1
SENSOR_TYPE_MAGNETIC_FIELD 2
Android 的传感器系统
Android 的传感器系统

android系统之sensor学习

android系统之sensor学习

android系统之sensor学习Sensor作为Android系统的一个输入设备,对Android设备来说是必不可少的。

Sensor主要包括G-Sensor、 LightsSensor、ProximitySensor、TemperatureSensor等。

这里主要对G-Sensor模块进行解析。

我的平台是AML8276,android系统是4.0.4,kernel是3.0,所用的gsensor是kionix_accel; 整个sensor的工作包括driver, HAL, framework(c/c++, java)和application层;首先我们从驱动driver开始,然后一层层向上看;一,驱动层在驱动层,内核需要增加和修改的部分包括:1,相应硬件模块驱动代码,包括两个文件,这里是kionix_accel.h, kionix_accel.c,分别将kionix_accel.h放到kernel/common/customer/include/linux/中,将kionix_accel.c放到kernel/customer/drivers/misc/中;2,编译目录(kernel/customer/drivers/misc/)下的Makefie 和KConfig,在KConfig中增加:config SENSORS_KXTJ2tristate "KXTJ2 accelerometer sensor driver"depends on I2ChelpSay yes here to support Kionix's KXTJ2 accelerometer sensor在MakeFile 下增加:obj-$(CONFIG_SENSORS_KXTJ2) += kionix_accel.o3,在平台编译配置文件中(也就是make menuconfig生成的),增加:CONFIG_SENSORS_KXTJ2=y------->指定编译到内核中,如果是m则编译成ko;4,在平台模块代码文件中(kernel/customer/boards/board-m6g17-t069.c),在相应的i2c 配置中,增加此模块:static struct i2c_board_info __initdata aml_i2c_bus_info_b[] = {........#ifdef CONFIG_SENSORS_KXTJ2{I2C_BOARD_INFO("kionix_accel", KIONIX_ACCEL_I2C_ADDR),//.irq = INT_GPIO_1,.platform_data = (void *) &kionix_accel_pdata,},#endif}经过以上几步操作以后,就可以将此模块驱动编译到内核中。

Android Sensors分析

Android Sensors分析

第4章Android Sensors HAL层分析4.1Sensor简要介绍Sensor是很常见的重要器件,比如在生活常见到的声控开关,电子温度计等。

手机与平板领域已经广泛使用sensor,大家在使用这些设备的时候也许没有意识到sensor的存在,但确实已经和sensor打交道了。

Android 1.5开始为开发人员提供了关于sensor的API,这样开发人员可以开发出更加优秀的应用程序。

4.1.1Android Sensors 种类在android系统里sensor的种类比较多。

在最新的Android的4.0里支持的sensor种类多达13种,其中有两种是Android4.0新增,下面会有介绍。

具体类型如表4- 1表4- 14.1.2Sensor在Android中的层次结构4.2Android Sensor Framework的实现Sensor在Android framework 层次中最主要的结构是SensorManager。

SensorManager与sensor的事件监听器注册、采样频率、事件采集都有关系。

下面会仔细分析SensorManager 是如何工作的。

这里说的SensorManager指的是framework java层的,如果是通过JNI调用非java层次的逻辑,这里会特别指出来。

4.2.1Sensor相应文件介绍4.2.2Sensor注册事件监听及采样频率Sensor方面的应用程序比较简单,只要实现一个listener的类,实现其中的方法,然后利用SensorManager将其某个具体的Sensor注册到服务中,之后的主要工作就是对获得传感器数据进行处理了。

下面会对应用程序如何注册sensor事件监听器以及如何设置采样频率进行分析。

下面这段程序是应用程序注册sensor事件监听器的语句。

SensorManager mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); mySensorManager.registerListener(mySensorListener,mySensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);应用程序是如何确定系统中存在哪些可以使用的sensor呢?仔细分析注册sensor事件监听器的语句可以发现在注册事件监听器时调用了SensorManager的getDefaultSensor()方法,那这一定和SensorManager有关系了。

如何理解Sensor架构-华清远见

如何理解Sensor架构-华清远见

如何理解Sensor架构?本篇文章来自华清远见嵌入式学院讲师:倪键树。

主要给大家讲解如何理解如何理解Sensor架构,希望看完后对新手有一定的帮助。

1、Android sensor架构Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)等。

Android实现传感器系统包括以下几个部分:各部分之间架构图如下:2、Sensor HAL层接口Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:hardware/libhardware/include/hardware/sensors.h对传感器类型的定义:传感器模块的定义结构体如下:该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个get_sensors_list函数,用于获取传感器的列表。

对任意一个sensor设备都会有一个sensor_t结构体,其定义如下:每个传感器的数据由sensors_event_t结构体表示,定义如下:其中,sensor为传感器的标志符,而不同的传感器则采用union方式来表示,sensors_vec_t结构体用来表示不同传感器的数据,sensors_vec_t定义如下:Sensor设备结构体sensors_poll_device_t,对标准硬件设备 hw_device_t结构体的扩展,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t结构体中,poll函数用来获取底层数据,调用时将被阻塞定义如下:控制设备打开/关闭结构体定义如下:3、Sensor HAL实现(以LM75温度传感器为例子) (1)打开设备流程图(2)实现代码分析在代码中含有两个传感器ADC电位器和LM75温度传感器,所以在sensor.c中,首先需要定义传感器数组device_sensor_list[],其实就是初始化struct sensor_t结构体,初始化如下:定义open_sensors函数,来打开Sensor模块,代码如下:在这个方法中,首先需要为hw_device_t分配内存空间,并对其初始化,设置重要方法的实现。

Android之传感器系统(Gsensor)

Android之传感器系统(Gsensor)

Android之传感器系统(Gsensor)最近在解关于Gsensor的Bug,Bug还没解掉,反而把Android 的Gsensor流程走了一遍。

好久不写博客了,不能偷懒啊,学了东西还是得总结一下,好让后来人不要费多少工夫,同时抛砖引玉,大家一起讨论一下,有什么错误我好纠正一下,对自己也是一种激励。

言归正传,本文主要从上层的Activity一直分析到kernel的driver,路比较长,不过我喜欢搞清楚架构。

目录:一、应用层的API;二、Framwork中的处理;三、C++中的JNI;四、Kernel的Gsensor-driver;一、应用层的API先看一个例子,这个例子是Gsensor的最简单应用,只是用来打印x,y,z的三个值:[java]view plaincopy1.public class main extends Activity {2.private float x, y, z;3.protected void onCreate(Bundle savedInstanceState) {4.super.onCreate(savedInstanceState);5.SensorManager mSensorManager= (SensorManager) get SystemService(SENSOR_SERVICE);6.Sensor sensor = mSensorManager.getDefaultSensor(Sens or.TYPE_GRAVITY);7.SensorEventListener lsn = new SensorEventListener() {8.9.public void onSensorChanged(SensorEvent e) {10.System.out.println(e.value[0]);11.System.out.println(e.value[1]);12.System.out.println(e.value[2]);13.}14.public void onAccuracyChanged(Sensor s, int accuracy ) {15.}16.};17.mSensorManager.registerListener(lsn, sensor, SensorM anager.SENSOR_DELAY_GAME);18.}这段代码中我们重点关注这几个类:SensorManager,SensorEvent;然后我们进入到Framework中看看这两个类是如何实现,它们都做了什么操作。

Sensor框架Framework层解读

Sensor框架Framework层解读

【Android】Sensor框架Framework层解读Sensor整体架构整体架构说明1.黄色部分表示硬件,它要挂在I2C总线上2.红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数据传到HAL层,准确说是HAL从Event读3.绿色部分表示动态库,它封装了整个Sensor的IPC机制,如SensorManager是客户端,SensorService是服务端,而HAL部分是封装了服务端对Kernel的直接访问4.蓝色部分就是我们的Framework和Application了,JNI负责访问Sensor的客户端,而Application就是具体的应用程序,用来接收Sensor返回的数据,并处理实现对应的UI效果,如屏幕旋转,打电话时灭屏,自动调接背光(这三个功能的具体实现会在以后分析)从android4.1开始,把SensorManager定义为一个抽象类,定义了一些主要的方法,该类主要是应用层直接使用的类,提供给应用层的接口SystemSensorManager.java继承于SensorManager,客户端消息处理的实体,应用程序通过获取其实例,并注册监听接口,获取sensor数据。

sensorEventListener接口用于注册监听的接口sensorThread是SystemSensorManager的一个内部类,开启一个新线程负责读取读取sensor数据,当注册了sensorEventListener接口的时候才会启动线程android_hardware_SensorManager.cpp负责与java层通信的JNI接口SensorManager.cppsensor在Native层的客户端,负责与服务端SensorService.cpp的通信SenorEventQueue.cpp消息队列服务端主要类SensorService.cpp服务端数据处理中心SensorEventConnection从BnSensorEventConnection继承来,实现接口ISensorEventConnection的一些方法,ISensorEventConnection在SensorEventQueue会保存一个指针,指向调用服务接口创建的SensorEventConnection对象Bittube.cpp在这个类中创建了管道,用于服务端与客户端读写数据apk注册监听器SensorManager mSensorManager =(SensorManager)getSystemService(SENSOR_SERVICE);Sensor mAccelerometer =mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);protected void onResume() {super.onResume();mSensorManager. registerListenerImpl (this, mAccelerometer,SensorManager.SENSOR_DELAY_NORMAL);}protected void onPause() {super.onPause();mSensorManager.unregisterListener(this);}public interface SensorEventListener {public void onSensorChanged(SensorEvent event);public void onAccuracyChanged(Sensor sensor, int accuracy);}View CodeActivity实现了SensorEventListener接口。

Sensor框架Framework层解读

Sensor框架Framework层解读

Sensor框架Framework层解读【Android】Sensor框架Framework层解读Sensor整体架构整体架构说明1.黄色部分表示硬件,它要挂在I2C总线上2.红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数据传到HAL层,准确说是HAL从Event读3.绿色部分表示动态库,它封装了整个Sensor的IPC机制,如SensorManager是客户端,SensorService是服务端,而HAL部分是封装了服务端对Kernel 的直接访问4.蓝色部分就是我们的Framework和Application了,JNI负责访问Sensor的客户端,而Application就是具体的应用程序,用来接收Sensor返回的数据,并处理实现对应的UI效果,如屏幕旋转,打电话时灭屏,自动调接背光(这三个功能的具体实现会在以后分析)从android4.1开始,把SensorManager定义为一个抽象类,定义了一些主要的方法,该类主要是应用层直接使用的类,提供给应用层的接口SystemSensorManager.java继承于SensorManager,客户端消息处理的实体,应用程序通过获取其实例,并注册监听接口,获取sensor数据。

sensorEventListener接口用于注册监听的接口sensorThread是SystemSensorManager的一个内部类,开启一个新线程负责读取读取sensor数据,当注册了sensorEventListener接口的时候才会启动线程android_hardware_SensorManager.cpp负责与java层通信的JNI接口SensorManager.cppsensor在Native层的客户端,负责与服务端SensorService.cpp 的通信SenorEventQueue.cpp消息队列服务端主要类SensorService.cpp服务端数据处理中心SensorEventConnection从BnSensorEventConnection继承来,实现接口ISensorEventConnection的一些方法,ISensorEventConnection在SensorEventQueue会保存一个指针,指向调用服务接口创建的SensorEventConnection对象Bittube.cpp在这个类中创建了管道,用于服务端与客户端读写数据apk注册监听器SensorManager mSensorManager =(SensorManager)getSystemService(SENSOR_SERVICE);Sensor mAccelerometer =mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELERO METER);protected void onResume() {super.onResume();mSensorManager. registerListenerImpl (this, mAccelerometer,SensorManager.SENSOR_DELAY_NORMAL);}protected void onPause() {super.onPause();mSensorManager.unregisterListener(this);}public interface SensorEventListener {public void onSensorChanged(SensorEvent event);public void onAccuracyChanged(Sensor sensor, int accuracy);}View CodeActivity实现了SensorEventListener接口。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

∙第一层次底层驱动层,包括标准Linux,Android核心驱动,Android相关设备驱动,G-sensor的设备驱动程序即存在于此∙第二层次Android标准C/C++库,包括硬件抽象层,Android各底层库,本地库,JNI∙第三层次Android Java Framwork框架层∙第四层次Java应用程序本文重点关注硬件抽象层,JNI以及Framework。

1.1 硬件抽象层硬件抽象层通过例如open(), read(), write(), ioctl(), poll()等函数调用的方式,与底层设备驱动程序进行交互,而这些函数调用是底层设备驱动程序事先准备好的。

用于交互的关键是文件描述符fd,fd通过open()打开G-sensor设备节点而得到,即fd = open ("/dev/bma220", O_RDONLY);而/dev/bma220这个设备节点是在底层设备驱动中注册完成的。

其他的函数调用如read(), write()等都通过该文件描述符fd对G-sensor设备进行操作。

1.2 JNI (Java Native Interface)JNI层可以认为是整个体系结构中的配角,概括地讲,它就完成了一项任务,既实现从C++语言到Java语言的转换。

JNI层为Java Framework层提供一系列接口,而这些接口函数的具体实现中,利用例如module->methods->open(),sSensorDevice->data_open(), sSensorDevice->poll()等回调函数与硬件抽象层进行交互。

而这些open(), poll()回调函数在硬件抽象层中具体实现。

1.3 Java FrameworkFramework层提供各种类和类的对象,可作为系统的守护进程运行,也可供上层应用程序的使用。

例如类SensorManager,它作为系统的守护进程在初始化的时候开始运行,其子类SensorThread中的子类SensorThreadRunnable通过sensors_data_poll()实现了对G-sensor数据的轮训访问,而sensors_data_poll()通过JNI层转换到硬件抽象层去具体实现poll()。

2 数据结构一般境况下,硬件抽象层对硬件的描述都分为control和data两大类。

2.1 sensors_control_context_tstruct sensors_control_context_t {struct sensors_control_device_t device;int fd;};struct sensors_control_device_t {struct hw_device_t common;int (*open_data_source)(struct sensors_control_device_t *dev);int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled); int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);int (*wake)(struct sensors_control_device_t *dev);};2.2 sensors_data_context_tstruct sensors_data_context_t {struct sensors_data_device_t device;int fd;};struct sensors_data_device_t {struct hw_device_t common;int (*data_open)(struct sensors_data_device_t *dev, int fd);int (*data_close)(struct sensors_data_device_t *dev);int (*poll)(struct sensors_data_device_t *dev,sensors_data_t* data);}struct hw_device_t {uint32_t tag; uint32_t version;struct hw_module_t* module;int (*close)(struct hw_device_t* device);};struct hw_module_t {uint32_t tag; uint16_t version_major; uint16_t version_minor;const char *id; const char *name; const char *author;struct hw_module_methods_t* methods;};struct hw_module_methods_t {int (*open)(const struct hw_module_t* module, const char* id,struct hw_device_t** device);};下文将通过对(*open), (*open_data_source), (*data_open)和(*poll)的代码分析,探索Android的各层次架构。

3 四大函数3.1 module->methods->open()1) FrameworkSensorService作为系统守护进程运行,其类的构造函数实现_sensors_control_init()。

2) JNI为_sensors_control_init()提供接口android_init(),并执行回调函数module->methods->open();3) 硬件抽象层具体实现(*open),该函数为所有G-sensor回调函数的指针赋值。

3.2 sSensorDevice->open_data_source()1) FrameworkSensorService作为系统守护进程运行,其类的一个公有成员ParcelFileDescriptor通过实现_sensors_control_open()得到设备的文件描述符。

2) JNI为_sensors_control_open()提供接口android_open(),并执行回调函数sSensorDevice->open_data_source();3) 硬件抽象层具体实现(*open_data_source),该函数通过打开G-sensor的设备节点得到文件描述符fd = open ("/dev/bma220", O_RDONLY);4) 设备驱动层通过misc_register()对G-sensor设备进行注册,建立设备节点。

3.3 sSensorDevice->data_open()1) FrameworkSensorManager作为系统守护进程运行,其子类SensorThreadRunnable的行为函数run()实现sensors_data_open()。

2) JNI为sensors_data_open()提供接口sensors_data_open(),并执行回调函数sSensorDevice->data_open();3) 硬件抽象层具体实现(*data_open),该函数的功能就是将已经得到的文件描述符fd复制一份到sensors_data_context结构体中的dev->fd,以便为处理数据的回调函数如(*poll)使用。

3.4 sSensorDevice->poll()1) FrameworkSensorManager作为系统守护进程运行,其子类SensorThreadRunnable的行为函数run()实现sensors_data_poll(values, status, timestamp),其目的是通过此函数得到从底层传上来的有关G-sensor的数据values, status和timestamp,再通过此类的一个行为函数listener.onSensorChangedLocked(sensorObject, values, timestamp, accuracy);为上层应用程序提供了得到G-sensor设备数据的接口函数。

2) JNI为sensors_data_poll()提供接口sensors_data_poll(),并执行回调函数sSensorDevice->poll(sSensorDevice, &data);其中,得到的data就是从底层传上来的G-sensor数据,然后通过下图的方式将data中对应的数据分别赋给values, status和timestamp。

3) 硬件抽象层具体实现(*poll),该函数通过ioctl()实现与底层驱动程序的交互。

ioctl(dev->fd, BMA220_GET_ORIENTATION, &orient_value);其中,dev->fd即刚才由(*data_open)得到的文件描述符,BMA220_GET_ORIENTATION 为ioctl的一个命令,具体实现由底层驱动程序完成,orient_value即得到的G-sensor数据,它通过下图的方式将相对应的数据赋给了data结构体中的values, status和time,从而最终实现了从底层到上层的数据通信。

4) 设备驱动层与硬件抽象层交互的read(), write(), ioctl()函数由设备驱动实现。

以ioctl()的一条命令BMA220_GET_ORIENTATION为例,通过bma220_get_orientation(data)得到G-sensor的数据data,然后将其从内核空间上传到用户空间的arg.。

相关文档
最新文档