android传感器系统整体框架分析

从以上图可以看出,整个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 pushsystem/lib/hw/ 这个路径,也就不需要整个编译了。

2googleSensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,AndroidSensorHAL接口定义在:

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

你可能感兴趣的:(技术文档)