资讯详情

Android的传感器HAL层的书写---基础篇

关于传感器,我们在日常生活中使用了很多。例如,建筑物的楼梯灯、道路上的路灯等。那么,我们手机上的传感器能起到什么作用呢?现在让我们看看Android它提供了什么?有加速度传感器、磁场、方向、陀螺仪、光线、压力、温度,接近传感器。

------------------------------文件分布------------------------------

代码分布如下:

1.传感器系统JAVA部分

代码路径:frameworks/base/include/core/java/android/hardware

文件为Sensor*.java

2.传感器系统JNI部分

代码路径:frameworks/base/core/jni/android_hardware_SensorManager.cpp

这部分是android.hardware.Sensor.Manager类的本质支持

3.传感器系统HAL层

头文件路径:hardware/libhardware/include/hardware/sensors.h

传感器系统的硬件抽象层需要具体的实现。

4、驱动层

代码路径:kernel/driver/hwmon/$(PROJECT)/sensor

这里主要分析一下HAL层和JNI驱动层可参考每个层sensor制造商提供的代码

------------------------------Android.mk------------------------------

下面转入到HAL层,也就是我们的c/cpp这里的路径通常在代码中hardware/$(PROJECT)/sensor/

让我们先看看其中之一Android.mk,全文如下:

LOCAL_PATH:= $(call my-dir)

LOCAL_PRELINK_MODULE := false

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

LOCAL_SHARED_LIBRARIES := libcutils libc liblog

LOCAL_SRC_FILES := 适配文件

LOCAL_MODULE := sensors.$(PROJECT)

include $(BUILD_SHARED_LIBRARY)

这里有一个细节要看LOCAL_MODULE这里的模块名称定义得很好,可以参考hardware/libhardware/hardware.c

/**

* There are a set of variant filename for modules. The form of the filename

* is ".variant.so" so for the led module the Dream variants

* of base "ro.product.board", "ro.board.platform" and "ro.arch" would be:

*

* led.trout.so

* led.msm7k.so

* led.ARMV6.so

* led.default.so

*/

加载顺序也可以在这里看到sensor加载时,依次查找这些so是否存在,然后加载相应的适配。

------------------------------填充结构体------------------------------

在HAL注意几层填充结构:

sensor模块定义:

struct sensor_module_t {

struct hw_module_t common;

int (*get_sensors_list) (struct sensors_module_t *module, struct sensor_t const**list);

};

其中的get_sensors_list()用于获取传感器列表;

struct sensor_t{

const char*name;//传感器名称

const char*vendor;//传感器Vendor

int version;///传感器版本

inthandle;///传感器句柄

int type;//传感器类型

floatmaxRange;////传感器的最大范围

floatresolution;//分析传感器

floatpower;///传感器的能耗,单位为mA

void*reserved[9];

}

sensor_t表示传感器的描述;

typedef struct{

int sensor;//sensor 标识符

unio{

sensors_vec_t vector;//x,y,z矢量

sensors_vec_torientation;//方向值 单位为角度

sensors_vec_tacceleration;//加速度值, 单位为m/s2

sensors_vec_tmagnetic;//磁矢量,单位uT

floattemperature;//温度,单位℃

floatdistance;//距离,单位cm

floatlight;//光亮,单位lux

}

int64_t time;//ns

uint32_treserved;

}sensors_data_t;

这里还有两个sensors_control_device_t和sensors_data_device_t这两个结构都是定义一些函数指针;

------------------------------适应层函数接口------------------------------

在HAL在层中,我们需要注意这个函数static int s_device_open(const struct hw_module_t* module,

const char* name,

struct hw_device_t** device)

注意以下赋值

if (!strcmp(name, SENSORS_HARDWARE_CONTROL)) {//命令通路

...

dev->device.common.close = dev_control_close;

dev->device.open_data_source = open_data_source;

dev->device.activate = activate;

dev->device.set_delay = set_delay;

...

} else if (!strcmp(name, SENSORS_HARDWARE_DATA)) {///数据通路

...

dev->device.common.close = dev_data_close;

dev->device.data_open = data_open;

dev->device.data_close = data_close;

dev->device.poll = poll;

...

}

具体函数的定义是什么?你也可以根据名字知道jni应该是采用poll获取数据的方法。也就是说,我们在驱动中提供的代码应该实现file_operation。

注意:

在想提醒你,我们在驱动代码中获得的sensor寄存器中的值不一定是我们实际上应该向应用程序报告的值,例如g-sensor,每个方向不应大于10。其他人也应该考虑。我在这个问题上跌跌撞撞。0b1331709591d260c1c78e86d0c51c18.png

标签: hal880传感器传感器mk72vetor温度传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台