android sensor 定义,Android sensor 系统框架 (一)

这几天深入学习了Android sensor框架,以此博客记录和分享分析过程,其中难免会有错误的地方,欢迎指出!

这里主要分析KERNEL->HAL->JNI这3层的流程。主要从以下几方面开始着手:

(A) 驱动层向上提供了那些文件节点给系统层读写?

(B) 系统层通过什么方式访问驱动层?

(C) 如何统一各种sensors的接口,生成.so库?

(D) 如何加载访问.so库

(E) 实现sensor service (未写,待续)

(F) JNI接口 (未写,待续)

(A) 驱动层向上提供了那些文件节点给系统层读写?

关于linux基本驱动框架,不在本文范围,这里不再分析。学习过Linux驱动的都知道应用层要访问内核驱动,都是通过open、

read、write等系统函数操作驱动注册的文件节点进行的。这里以n2dm g-sensor的驱动为例,找出这些文件节点。文件路径:

./kernel/drivers/input/misc/n2dm.c

static int n2dm_acc_probe(struct i2c_client *client,const struct i2c_device_id *id)

{

......

acc->input_dev->name = "accelerometer";

err = input_register_device(acc->input_dev); /* 生成 /dev/input/event2 */

......

err = misc_register(&n2dm_acc_misc_device); /* 生成 /sys/class/n2dm_acc */

......

gsensor_class = class_create(THIS_MODULE,"xr-gsensor");

gsensor_cmd_dev = device_create(gsensor_class, NULL, , NULL, "device");

device_create_file(gsensor_cmd_dev, &dev_attr_gsensor); /* 生成 /sys/class/xr-gsensor/device/gsensor */

device_create_file(gsensor_cmd_dev, &dev_attr_delay_acc); /* 生成 /sys/class/xr-gsensor/device/delay_acc */

......

}

由以上代码可知,这个驱动生成了/dev/input/event2、/sys/class/n2dm_acc、/sys/class/xr-gsensor/device/gsensor、

/sys/class/xr-gsensor/device/delay_acc这4个文件节点,其中/sys/class/n2dm_acc文件节点用不到,可以不用理会。其余3

个文件节点的作用分别是:

1. /dev/input/event2:驱动通过这个文件节点上报输入事件,如这个是g-sensor传感器,会上报x,y,z三轴事件,数据格式:

input_report_abs(acc->input_dev, ABS_X, xyz[]);

input_report_abs(acc->input_dev, ABS_Y, xyz[]);

input_report_abs(acc->input_dev, ABS_Z, xyz[]);

input_sync(acc->input_dev);

2. /sys/class/xr-gsensor/device/gsensor数据格式:

"" /* 使能g-sensor */

"" /* 禁止g-sensor */

3. /sys/class/xr-gsensor/device/delay_acc数据格式:

十进制数值 /* g-sensor 数据刷新频率,时间ms */

(B) 系统层通过什么方式访问驱动层?

系统层肯定是通过open、read、write、ioctl等函数读写文件节点的方式访问驱动层,读写这些文件节点的代码路径在:

vendor/sprd/open-source/libs/libsensors_sprd/

这个目录下是各种传感器,如:g-sensor、光感、陀螺仪等的系统访问驱动的接口文件,这里以g-sensor为例来分析,

文件路径:

vendor/sprd/open-source/libs/libsensors_sprd/Acc_Xr.cpp

vendor/sprd/open-source/libs/libsensors_sprd/AccSensor.h

vendor/sprd/open-source/libs/libsensors_sprd/InputEventReader.cpp

vendor/sprd/open-source/libs/libsensors_sprd/InputEventReader.h

vendor/sprd/open-source/libs/libsensors_sprd/sensors.cpp

vendor/sprd/open-source/libs/libsensors_sprd/sensors.h

其中,vendor/sprd/open-source/libs/libsensors_sprd/InputEventReader.cpp文件的作用是为事件读取提供一个环形

缓冲区,vendor/sprd/open-source/libs/libsensors_sprd/sensors.cpp的作用是抽象所有的sensor为一个sensor hal。

AccSensor.h

class AccSensor : public SensorBase {

public:

AccSensor();

virtual ~AccSensor();

#ifndef ACC_NULL

enum {

Accelerometer = ,

numSensors

};

#else

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值