android 上层应用 apk 到 G-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 对于 Sensor 的 API 定义在 hardware/libhardware/include/hardware/sensor.h 中 , 要求在 sensor.so 提供以下 8 个 API 函数
[ 控制方面 ]
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);
在 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
android framework 中与 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 控制 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.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