关于传感器,我们在日常生活中使用了很多。例如,建筑物的楼梯灯、道路上的路灯等。那么,我们手机上的传感器能起到什么作用呢?现在让我们看看Android它提供了什么?有加速度传感器、磁场、方向、陀螺仪、光线、压力、温度,接近传感器。
-----------------------------------文件分布------------------------------------------------------------
代码分布如下:
1、传感器系统的JAVA部分
代码路径:frameworks/base/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:=$(callmy-dir)
LOCAL_PRELINK_MODULE:=false
LOCAL_MODULE_PATH:=$(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_SHARED_LIBRARIES:=libcutilslibcliblog
LOCAL_SRC_FILES:=适配文件
LOCAL_MODULE:=sensors.$(PROJECT)
include$(BUILD_SHARED_LIBRARY)
这里有一个细节要看LOCAL_MODULE这里的模块名称定义得很好,可以参考hardware/libhardware/hardware.c
/**
*Thereareasetofvariantfilenameformodules.Theformofthefilename
*is".variant.so"sofortheledmoduletheDreamvariants
*ofbase"ro.product.board","ro.board.platform"and"ro.arch"wouldbe:
*
*led.trout.so
*led.msm7k.so
*led.ARMV6.so
*led.default.so
*/
加载顺序也可以在这里看到sensor加载时,依次查找这些so是否存在,然后加载相应的适配。
-----------------------------------填充结构体------------------------------------------------------------
在HAL注意几层填充结构:
sensor模块定义:
structsensor_module_t{
structhw_module_tcommon;
int(*get_sensors_list)(structsensors_module_t*module,structsensor_tconst**list);
};
其中的get_sensors_list()用于获取传感器列表;
structsensor_t{
constchar*name;//传感器名称
constchar*vendor;//传感器Vendor
intversion;///传感器版本
inthandle;//传感器的句柄
inttype;//传感器类型
floatmaxRange;////传感器的最大范围
floatresolution;//分析传感器
floatpower;///传感器的能耗,单位为mA
void*reserved[9];
}
sensor_t表示传感器的描述;
typedefstruct{
intsensor;//sensor标识符
unio{
sensors_vec_tvector;//x,y,z矢量
sensors_vec_torientation;//方向值单位为角度
sensors_vec_tacceleration;//加速度值,单位为m/s2
sensors_vec_tmagnetic;//磁矢量,单位uT
floattemperature;//温度,单位℃
floatdistance;//距离,单位cm
floatlight;//光亮,单位lux
}
int64_ttime;//ns
uint32_treserved;
}sensors_data_t;
这里还有两个sensors_control_device_t和sensors_data_device_t这两个结构都是定义一些函数指针;
-----------------------------------适应层函数接口------------------------------------------------------
在HAL在层中,我们需要注意这个函数staticints_device_open(conststructhw_module_t*module,
constchar*name,
structhw_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;
...
}elseif(!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-&t;device.poll = poll;
.......
}
看到这里,就可以发现具体的函数的定义是什么了。也可以根据名字知道了jni应该是采用poll的方式来获取数据的。也就是说我们在驱动中提供的代码要实现file_operation。
注意:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/skywalkzf/archive/2010/11/10/6000811.aspx