从以上图可以看出,整个sensor传感器框架主要分为4层,其中包括
1、传感器java部分,frameworks/base/core/java/android/hardware/SensorManager.java
2、传感器jni部分,frameworks/base/services/sensorservice/SensorService.cpp
3、传感器硬件抽象层,device/sprd/common/libs/libsensors/sensors.cpp
4、内核驱动层,kernel/drivers/input/misc/ltr_558als.c
展讯6825平台hardware层框架分析:
和其他硬件抽象层一样,sensor的硬件抽象层也是向framework提供接口(stub),供上层调用。
下面我以LTR558光距离传感器为例子门,为大家分析下安卓sensor系统中间层的架构,所涉及到的文件包括以下几个:
device/sprd/common/libs/libsensors/SensorLTR558.cpp
device/sprd/common/libs/libsensors/sensors.cpp
device/sprd/common/libs/libsensors/Android.mk
device/sprd/common/libs/libsensors/SensorBase.cpp
device/sprd/common/libs/libsensors/InputEventReader.cpp
hardware/libhardware/hardware.c
1)怎么添加一个设备的中间层文件
在device/sprd/common/libs/libsensors/Android.mk文件中,找到以下这个标记,添加你所要打开的宏
LOCAL_CFLAGS := -DLOG_TAG=\"Sensors\" \
-DSENSORHAL_ACC_MC3XX0 \
-Wall
-DSENSORHAL_LIGHT_LTR558
其次再添加LOCAL_SRC_FILES += EWTSASensor.cpp \
\ SensorLTR558.cpp
在这句语句中添加你所对应的设备中间层文件.这样,就可以编译,生成你所对应的动态库。
编译命令 mmm device/sprd/common/libs/libsensors
生成的目标库out/target/product/sp6825ea/system/lib/hw/sensors.sp6825ea.so 可以通过adb push到system/lib/hw/ 这个路径,也就不需要整个编译了。
2)google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:
hardware/libhardware/include/hardware/sensors.h
#define SENSOR_TYPE_ACCELEROMETER 1 //加速度传感器
#define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力传感器
#define SENSOR_TYPE_ORIENTATION 3 //方向
#define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪
#define SENSOR_TYPE_LIGHT 5 //环境光照传感器
#define SENSOR_TYPE_PRESSURE 6 //压力传感器
#define SENSOR_TYPE_TEMPERATURE 7 //温度传感器
#define SENSOR_TYPE_PROXIMITY 8 //距离传感器
#define SENSOR_TYPE_GRAVITY 9
#define SENSOR_TYPE_LINEAR_ACCELERATION 10 //线性加速度
#define SENSOR_TYPE_ROTATION_VECTOR 11
#define SENSOR_TYPE_RELATIVE_HUMIDITY 12 //湿度传感器
#define SENSOR_TYPE_AMBIENT_TEMPERATURE 13
3)下面分析下安卓的hardware层到底是怎么工作的,又是以什么原理来工作的,跟下代码先。首先看下开机启动是在什么时候加载这个动态sensors.sp6825ea.so库的。
安卓开机启动,开机SystemService用于创建init.rc定义的服务之外的所有服务,开始分析其加载流程:
1)系统开始调用以下函数
extern "C" status_t system_init()--------------------------------
property_get("system_init.startsensorservice", propBuf, "1");//先获取系统sensor服务的属性
if (strcmp(propBuf, "1") == 0) {//若获取到了
// Start the sensor service
SensorService::instantiate();//则实例化一个sensorservice服务,然后在此服务中开始调用SensorService::onFirstRef()函数,
继而调用SensorDevice& dev(SensorDevice::getInstance())这个类;从而调到以上类的构造函数,
hw_get_module(SENSORS_HARDWARE_MODULE_ID,(hw_module_t,const**)&mSensorModule);获取sensor传感器stub的句柄。
下面分析下hw_get_module这个函数,此函数是native框架层获取hardware层句柄的函数,
hw_get_module_by_class(id, NULL, module);//id 则是要获取的ID枚举号,这里对应的是
#define SENSORS_HARDWARE_MODULE_ID "sensors" module则为保存的一些信息
//这个函数主要就是去加载sensor的动态库了,得到路径,属性和名字去匹配system/lib/hw
中的动态库........,加载完动态库,我们就能通过句柄来用他、动态库为我们办事了。
sensors_open(&mSensorModule->common, &mSensorDevice);//打开动态库,获取其中的信息
static int open_sensors(const struct hw_module_t* module, const char* id,
struct hw_device_t** device)
{
int status = -EINVAL;
sensors_poll_context_t *dev = new sensors_poll_co