android AP侧通过sensor_class挂载sensor的一种方案

来源:互联网 发布:仿美文网整站源码 编辑:程序博客网 时间:2024/06/06 04:15

1.引言

1.1背景

目前android上对sensor的处理是将其挂载到类似于sensor-hub的独立处理单元上与AP分离,这样便于解决功耗问题。高通平台也类似的将sensor挂在了adsp上,但特定需求下还是希望sensor能够挂载到AP下,并且对上层隐藏这种差异,可以使用相同的处理流程。本文介绍一种使用以input设备为基础的sensor_class抽象类在AP侧挂载sensor的方法。(使用高通MSM8937平台)

2.添加sar sensor

2.1 在kernel中使用sensor_class注册sensor

2.1.1添加对sensors_class的支持

sensor_class是google对ap侧sensor设备的抽象,并不是内核自带的。某些android版本可能没有kernel\drivers\sensors\sensors_class.c文件,需要下载最新代码merge此文件。 

2.1.2注册input设备

首先需要注册标准的input设备,使用标准方法注册即可,注册后可以在/dev/input中获得相应节点,读取key event

input_top = input_allocate_device();__set_bit(EV_ABS, input_top->evbit);input_set_abs_params(input_top,ABS_DISTANCE, -1, 100, 0, 0);input_top->name = "SX9310 Cap Touchtop";input_register_device(input_top);

2.1.3注册sensors_class设备 

a,定义新sensor

static struct sensors_classdev sensors_capsensor_top_cdev= {       .name= "capsense_top",       .vendor= "semtech",       .version= 1,       .type= 65552, //sensor type自已定义,不能与已有冲突即可       .max_range= "5",       .resolution= "5.0",       .sensor_power= "3",       .min_delay= 0, /* in microseconds */       .fifo_reserved_event_count= 0,       .fifo_max_event_count= 0,       .enabled= 0,       .delay_msec= 100,       .sensors_enable= NULL,       .sensors_poll_delay= NULL,};static struct sensors_classdevsensors_capsensor_bottom_cdev = {       .name= "capsense_bottom",       .vendor= "semtech",       .version= 1,       .type= 65552,       .max_range= "5",       .resolution= "5.0",       .sensor_power= "3",       .min_delay= 0, /* in microseconds */       .fifo_reserved_event_count= 0,       .fifo_max_event_count= 0,       .enabled= 0,       .delay_msec= 100,       .sensors_enable= NULL,       .sensors_poll_delay= NULL,};

 b,使用sensor_class中的注册函数注册sensor设备

int sensors_classdev_register(struct device*parent,                            structsensors_classdev *sensors_cdev)

sensor device是基于input devie的,因此父设备为2.1.2中注册的input.dev注册sensor device。注册后的表现为/sys/class/sensor中出现了我们添加的设备,hal层将通过对/sys/class/sensor中节点的读取来获取设备


2.2 hal层添加库对sensor event进行转换

a,hal的主要功能

读取/sys/class/sensor中各个sensor的节点,向android framwork提供sensor信息

将key event转换成android framwork层的sensor event 

b,向系统中加入新库

高通sensor架构中对sensor相关的库写在/etc/sensors/hals.conf文件中,需要修改此文件添加新库。其中库的加载过程位于hardware/libhardware/modules/sensors/multihal.cpp文件中。

2.3 app层对新类型sensor的使用

private List<Sensor> sarSensor; //获取sensor@Overridepublic void onCreate(BundlesavedInstanceState){       sm= (SensorManager)getSystemService(SENSOR_SERVICE);       sarSensor= sm.getSensorList(65552);//65552是在kernel中新增sensor时指定的} //注册sensor@Overrideprotected void onResume() {       Iterator<Sensor>it = sarSensor.iterator();       while(it.hasNext())       {              Sensorsr = it.next();              Log.d(TAG,"found sensor:" + sr.getName() + sarSensor.size());              sm.registerListener(this,it.next(), SensorManager.SENSOR_DELAY_FASTEST);              Log.d(TAG,"register sensor:" + sr.getName());       }} public void onSensorChanged(SensorEventevent) {              synchronized(this) {                     inttype = event.sensor.getType();                     Log.d(TAG,"onSensorChanged: " + type+ event.sensor.getName() +event.values[0]);}