Android中G-Sensor相关流程Word文件下载.doc

上传人:b****3 文档编号:15403346 上传时间:2022-10-30 格式:DOC 页数:7 大小:73KB
下载 相关 举报
Android中G-Sensor相关流程Word文件下载.doc_第1页
第1页 / 共7页
Android中G-Sensor相关流程Word文件下载.doc_第2页
第2页 / 共7页
Android中G-Sensor相关流程Word文件下载.doc_第3页
第3页 / 共7页
Android中G-Sensor相关流程Word文件下载.doc_第4页
第4页 / 共7页
Android中G-Sensor相关流程Word文件下载.doc_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

Android中G-Sensor相关流程Word文件下载.doc

《Android中G-Sensor相关流程Word文件下载.doc》由会员分享,可在线阅读,更多相关《Android中G-Sensor相关流程Word文件下载.doc(7页珍藏版)》请在冰豆网上搜索。

Android中G-Sensor相关流程Word文件下载.doc

//JayLinaddforGsensor

structlis331dl_platform_datalisGsensor_platform_data={

.name="

lis331dl"

.pin_clk=0,

.pin_data=0,

.open_drain=1,

.interrupt=IRQ_EINT(3),

};

该结构变量在i2c_devs1[]__initdata中被引用。

/kernel/arch/arm/mach-s3c6410/mach-ur6410.c中需要包含lis331dl.h。

在rootfs/system/etc/init.board.sh的最后一行加上mknod/dev/sensorioctlc51201&

创建节点供ioctl使用。

编译后的sensor.so放在/rootfs/system/lib/hw下。

sensor.so和driver之间通过ioctl实现对G-sensor的状态控制。

ioctl的命令编号定义在头文件sensorioctl.h中,分别放在

kernel/include/linux下

androidsourcecode/hardware/libhardware/include/hardware下

供driver和sensor.so使用。

G-sensordriver工作的大致流程:

系统开机后,先加载i2c总线驱动,然后加载设备驱动。

在设备驱动中的init函数中通过调用i2c_add_driver(&

lis331dl_i2c_driver)注册i2c_driver;

此函数将driver注册到i2c_bus_type的总线上,此总线的匹配规则是利用i2c_client的名称和

i2c_driver中id_table中的名称作匹配。

其中i2c_client是注册板载信息是系统自动创建的,注册板载信息的过程就是在/kernel/arch/arm/mach-s3c6410/mach-ur6410.c文件中i2cchanel1的结构变量i2c_devs1[]__initdata中需要添加G-sensor的设备信息。

当匹配成功时,i2c_driver中的probe()函数开始执行。

Probe()函数主要完成以下功能:

1.从i2c_client结构中得到初始化信息

2.创建G-sensor的工作队列

2.注册input_device设备

3.读取ChipID

4.设置寄存器,使能G-sensor

5.设置并启动中断

当G-sensor上报数据的时候会触发中断,然后在中断处理函数中提交一个报值的任务到队列中并禁止中断。

在工作队列中读数G-sensor的数据并上报到input子系统中,最后使能中断。

2.android上层应用apk到G-sensordriver的大致流程:

Android对于Sensor的API定义在hardware/libhardware/include/hardware/sensor.h中,要求在sensor.so提供以下8个API函数

[控制方面]

int(*open_data_source)(structsensors_control_device_t*dev);

int(*activate)(structsensors_control_device_t*dev,inthandle,intenabled);

int(*set_delay)(structsensors_control_device_t*dev,int32_tms);

int(*wake)(structsensors_control_device_t*dev);

[数据方面]

int(*data_open)(structsensors_data_device_t*dev,intfd);

int(*data_close)(structsensors_data_device_t*dev);

int(*poll)(structsensors_data_device_t*dev,sensors_data_t*data);

[模块方面]

int(*get_sensors_list)(structsensors_module_t*module,structsensor_tconst**list);

在Java层Sensor的状态控制由SensorService来负责,它的java代码和JNI代码分别位于:

frameworks/base/services/java/com/android/server/SensorService.java

frameworks/base/services/jni/com_android_server_SensorService.cpp

在Java层Sensor的数据控制由SensorManager来负责,它的java代码和JNI代码分别位于:

frameworks/base/core/java/android/hardware/SensorManager.java

frameworks/base/core/jni/android_hardware_SensorManager.cpp

androidframework中与sensor通信的是sensorService.java和sensorManager.java。

sensorService.java的具体通信是通过JNI调用sensorService.cpp中的方法实现的。

sensorManager.java的具体通信是通过JNI调用sensorManager.cpp中的方法实现的。

sensorService.cpp和sensorManger.cpp通过hardware.c与sensor.so通信。

其中sensorService.cpp实现对sensor的状态控制,sensorManger.cpp实现对sensor的数据控制。

sensor.so通过ioctl控制sensordriver的状态,通过打开sensordriver对应的设备文件读取G-sensor采集的数据。

androidSDK提供了4个类来于sensor通信,分别为sensor,sensorEvent,sensorEventListener,sensorManager.其中sensorEventListener用来在sensorManager中注册需要监听的sensor类型。

sensorManager.java提供registrater(),unregistrater()接口供sensorEventListener使用。

sensorManager.java不断轮询从sensor.so中取数据。

取到数据后送给负责监听此类型sensor的sensorEventListener.java。

sensorEventListener.java通过在sensorManager.java中注册可以监听特定类型的sensor传来的数据。

系统启动时执行systemProcess,会启动sensorService.java,在sensorService.java的构造函数中调用JNI方法_sensor_control_init()。

sensorService.cpp中相应的方法android_int()会被执行。

该函数会调用hardware.c中的方法hw_get_module()此函数又通过调用load()函数在system/lib/hw下查找sensor.so

查找时会根据harware.c中定义好的sensor.*.so的扩展名的顺序查找,找到第一个匹配的时候即停止,并将该sensor.so中定义好的一个全局变量HAL_MODULE_INFO_SYM带回。

该变量包含的一个

重要信息是它的一个成员结构变量中包含的一个函数指针open,该指针所指函数会对一个device结构变量赋值,从而带出sensorService.cpp和sensorManager.cpp与sensor通信所需要的全部信息。

device结构变量有两种变体分别供sensorService.cpp和sensorManaer.cpp使用。

其中主要是一些函数指针指向与sensor通信的函数。

sensorService.cpp和sensorManager.cpp在得到HAL_MODULE_INFO_SYM结构后都会调用sensors.h的inline函数open()通过HAL_MODULE_INFO_SYM的open函数指针将所需的device信息取回。

系统在启动activityManager.java时,它会启动sensorManager.java,它也会调用hardware.c中的方法hw_get_module()带回HAL_MODULE_INFO_SYM。

3.关于Rotate的实现:

系统启动windowManger.java时,它会启动phoneWindowManager.java,该类有一个内部类myOrientationListener扩展自windowOrientationListener.java。

windowOrientationListener.java是一个辅助类,当device的方向发生变化时,供windowManger.java调用,用来接收数据。

windowOrientationListener.java内部在sensorManger.java中进行了注册,它回监听G-sensor传来的数据,即x,y,z方向的加速度,收到数据后经过转换处理,若满足Roate条件则调用

IwindowManager接口的实现类windowManagerService.java中的setRotation()方法实现转屏。

SensorManager通过polling的方式从设备得到Sensor数据,Sensor数据的结构定义在sensor.h里,

其中SensorManager只处理了vector.v,vector.status,time三个域,分发给已注册的对这些消息的监听者

比如第一项vector.v包含x,y,z三个方向的信息值,就是由WindowOrientataionLister注册的,

当SensorManager获取到这三个值之后,会传递给WindowOrientataionLister,后者代码位于:

frameworkd/base/core/java/android/view/WindowOrientationListener.java

WindowOrientataionLister接收到这三个值之后,会计算出设备对应的orientation,并且执行onOrientationChanged函数进一步上传

WindowOrientataionLister是

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1