Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43003
  • 博文数量: 4
  • 博客积分: 110
  • 博客等级: 入伍新兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 16:00
文章分类

全部博文(4)

文章存档

2011年(4)

分类: LINUX

2011-08-04 17:54:23



android上层应用apkG-sensor driver的大致流程:

Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念
1,源代码和目标位置
源代码: /hardware/libhardware目录,该目录的目录结构如下:
/hardware/libhardware/hardware.c编译成libhardware.so,目标位置为/system/lib目录
/hardware/libhardware/include/hardware目录下包含如下头文件:
hardware.h 通用硬件模块头文件
copybit.h copybit模块头文件
gralloc.h gralloc模块头文件
lights.h  背光模块头文件
overlay.h overlay模块头文件
qemud.h  qemud模块头文件
sensors.h 传感器模块头文件
/hardware/libhardware/modules目录下定义了很多硬件模块
这些硬件模块都编译成xxx.xxx.so,目标位置为/system/lib/hw目录



2,Android
对于SensorAPI定义在 hardware/libhardware/include/hardware/sensor.h, 要求在sensor.so提供以下8API函数
[
控制方面]
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);
[
数据方面]
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);
[
模块方面]
int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t const** list);

JavaSensor的状态控制由SensorService来负责,它的java代码和JNI代码分别位于:
frameworks/base/services/java/com/android/server/SensorService.java
frameworks/base/services/jni/com_android_server_SensorService.cpp

JavaSensor的数据控制由SensorManager来负责,它的java代码和JNI代码分别位于:
frameworks/base/core/java/android/hardware/SensorManager.java
frameworks/base/core/jni/android_hardware_SensorManager.cpp

android framework
中与sensor通信的是sensorService.javasensorManager.java
sensorService.java
的具体通信是通过JNI调用sensorService.cpp中的方法实现的。
sensorManager.java
的具体通信是通过JNI调用sensorManager.cpp中的方法实现的。

sensorService.cpp
sensorManger.cpp通过hardware.csensor.so通信。其中sensorService.cpp实现对sensor的状态控制,sensorManger.cpp实现对sensor的数据控制。
sensor.so
通过ioctl控制sensor driver的状态,通过打开sensor driver对应的设备文件读取G-sensor采集的数据。

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

sensorManager.java
提供registrater(),unregistrater()接口供sensorEventListener使用。
sensorManager.java
不断轮询从sensor.so中取数据。取到数据后送给负责监听此类型sensor sensorEventListener.javasensorEventListener.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.cppsensor通信所需要的全部信息。
device
结构变量有两种变体分别供sensorService.cppsensorManaer.cpp使用。其中主要是一些函数指针指向与sensor通信的函数。
sensorService.cpp
sensorManager.cpp在得到HAL_MODULE_INFO_SYM结构后都会调用 sensors.hinline函数open()通过HAL_MODULE_INFO_SYMopen函数指针将所需的device信息取回。

系统在启动activityManager.java时,它会启动sensorManager.java,它也会调用hardware.c中的方法hw_get_module()带回HAL_MODULE_INFO_SYM
阅读(2288) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~