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

本文详细分析了Android传感器系统框架,包括4个层次:传感器Java部分、JNI部分、硬件抽象层和内核驱动层。重点讨论了硬件抽象层的实现,以LTR558光距离传感器为例,介绍了如何添加设备中间层文件、编译生成动态库,并阐述了硬件抽象层的工作原理。此外,还概述了SensorService如何通过JNI与HAL交互,以及上层应用如何通过SensorManager获取传感器数据。最后简要提及了内核驱动架构,展示了LTR558的硬件结构和电气特性,以及添加和编译驱动文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从以上图可以看出,整个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_context_t();//先创建一个sensor对象

        memset(&dev->device, 0, sizeof(sensors_poll_device_t));//清空

        dev->device.common.tag = HARDWARE_DEVICE_TAG;//设置属性

        dev->device.common.version  = 0;//设置版本

        dev->device.common.module   = const_cast<hw_module_t*>(module);

        dev->device.common.close    = poll__close;//填充方法

        dev->device.activate        = poll__activate;//设置状态

        dev->device.setDelay        = poll__setDelay;//设置延时的方法

        dev->device.poll            = poll__poll;//轮训数据

        *device = &dev->device.common;

        status = 0;

        return status;

}

以上函数主要就是调用new sensors_poll_context_t这个结构体的构造函数,这个构造函数干了什么事情了,原来在Android.mk中定义的宏在这里打开,然后调用我们新家TR558光距离传感器添加的类,以及设置一些属性。

sensors_poll_context_t::sensors_poll_context_t()

{

............................

#if defined SENSORHAL_LIGHT_LTR558

    mSensors[pls] = new SensorLT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值