概述
可能这篇总结写得会有一点凌乱,一会讲sensor,一会又讲event的。但是把两者摆在一起也是有原因的,sensor的处理是event事件的基础上实现的,正是因为sensor对event的依赖性,所以把两者摆在一起了。仔细想想,还是会有其中的原因。
开始前首先要说明两点
1、 这里说的android层面上是linux内核之上的
2、sensor指的是gsensor,lightsensor等
下面正式开始,首先简略讲一下驱动中的处理。通常对于驱动来说,一般是通过i2c来获取sensor器件的数据,当然这里面是有中断机制的处理。然后通过input_event,input_sync等函数上报事件。上报的数据,毋容置疑是写在设备节点里面(/dev/input/event*)。接下来就是看android层面上的处理了。
在android层面上,首先看到BoardConfig.mk
62 #BOARD_HAS_SENSOR := true
很明显,这是一个可配置的选项,意思也很明确,配置上了,就意味着sensor的相关的代码会被编译。接下来我们看看解析这个配置的地方:hardware里面的其中一个Android.mk
ifeq ($(BOARD_HAS_SENSOR),true)
28 LOCAL_SRC_FILES :=
29 sensors.cpp
30 SensorBase.cpp
31 LightSensor.cpp
32 AccelSensor.cpp
33 MagSensor.cpp
34 PressSensor.cpp
35 InputEventReader.cpp
我们看到31—34分别是:光感,加速度,磁性,压力。而这里也是可选,可以根据自己实际使用的sensor的进行增加或者删减。在这里,我们主要关注SensorBase.cpp,看以下的一段代码
145 int SensorBase::openInput(const char* inputName) {
146 int fd = -1;
147 int input_id = -1;
148 const char *dirname = "/dev/input";
149 const char *inputsysfs = "/sys/class/input";
150 char devname[PATH_MAX];
151 char *filename;
152 DIR *dir;
153 struct dirent *de;
154
155 dir = opendir(dirname);
156 if(dir == NULL)
157 return -1;
158 strcpy(devname, dirname);
159 filename = devname + strlen(devname);
160 *filename++ = '/';
161 while((de = readdir(dir))) {
162 if(de->d_name[0] == '.' &&
163 (de->d_name[1] == '