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

阅读: 评论:0

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

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 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用于创建定义的服务之外的所有服务,开始分析其加载流程:

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

本文发布于:2024-01-28 00:16:07,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063721673504.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:传感器   框架   系统   android
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23