概述
分析Android sensor
Android sensor Framework 层以及APP如何读取sensor 数据。网上有很多文章不再累述。
由于我使用的是Android 5.1(kernel 3.10) ,不自带 opt3001的驱动,我发现kernel 4.10 已经自带opt3001的驱动。我不会为了一个驱动而换掉 kernel。而且 kernel 4.10 opt3001的驱动高度依赖与iio。两个kernel 版本的iio修改较大。移植也不是简单的复制。索性不看 kernel 4.10 上的代码。我们分析 Android 5.1(kernel 3.10)的代码。
其实写一个驱动读取 opt3001 中的数据并不难。看一看opt3001 的数据手册,就几个寄存器。配置也很简单。
然后我们看一下Android 是如何从kernel 中读取 光感数据的。自然是去看 HAL层的代码。我可以在hardware目录下找到LightSensor.cpp 。一般我们拿到的源码 HAL层到Framework,数据通路都是好的。不需要修改。
我们分析一下 LightSensor.cpp 我们可以看到class LightSensor 继承自 SamsungSensorBase 。SamsungSensorBase 又继承自 SensorBase。分析这几个类。并没有什么难的。
我们先看 SensorBase。
SensorBase::SensorBase(
const char* dev_name,
const char* data_name)
: dev_name(dev_name), data_name(data_name),
dev_fd(-1), data_fd(-1)
{
if (data_name) {
data_fd = openInput(data_name);
}
}
int SensorBase::open_device() {
if (dev_fd<0 && dev_name) {
dev_fd = open(dev_name, O_RDONLY);
LOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno));
}
return 0;
}
static int getInput(const char *inputName)
{
int fd = -1;
unsigned i;
static bool first = true;
static struct input_dev dev[255];
if (first) {
int fd = -1;
const char *dirname = "/dev/input";
char devname[PATH_MAX];
char *filename;
DIR *dir;
struct dirent *de;
first = false;
for (i = 0; i < sizeof(dev)/sizeof(dev[0]); i++) {
dev[i].fd = -1;
dev[i].name[0] = '