电子罗盘HAL层分析

文件位置:hardware/msm7k/libsensors/akmSensors.cpp

         这里分析过程主要关注ioctl中数据流向,其他的可以根据一般的hal层分析方法进行学习。

         HAL层的框架文件是xxsensor.cpp和sensors.c,主要是针对sensors.h(谷歌定义的抽象类)的具体实现,并通过继承的机制实现了各种sensor的多态。

4.1关于sensors.c

首先,分析的是sensor_module_t类型的HAL_MODULE_INFO_SYM,该结构体类型有两个域common和get_sensor_list,其中common域中id是用来寻找模块匹配的,methods是通过定义的senosr_module_method来实现的。

Get_seonsor_list域是通过定义的sensors__get_sensors_list来实现的

然后,senosr_module_method具体实现在本文件中完成,主要是枚举了自定义的sensor_t数组ssensorlists[],返回了数组的大小

最后,sensors__get_sensors_list结构体也是在本文件中完成,该结构体包含一个open域,通过定义的open_sensors函数来实现的。

open_sensors函数通过调用xxsensor.cpp文件中的init_sensors来完成初始化

 

4.2 关于xxsensor.cpp

这里主要是构建了sensor_poll_context_t类和实现init_sensors函数

首先,关于sensor_poll_context_t

第一个域固定为sensor_poll_device_t,作为c++继承在c语言上的实现,继承了该类型

然后定义了构造函数和析构函数,公有成员函数activate,poll,set_delay,

注意:该类是独立的,是通过init_sensors中的调用开始执行的

然后,关于init_sensors

在初始化函数中首先就是将新建一个上面的类,(new实现)。然后针对dev的device域进行填充。

dev->device.common.tag =HARDWARE_DEVICE_TAG;

dev->device.common.version = 0;

dev->device.common.module =const_cast<hw_module_t*>(module);

dev->device.common.close = poll__close;

 

dev->device.activate = poll__activate;

dev->device.setDelay = poll__setDelay;

dev->device.pll = poll__poll;

 

static int poll__activate函数实现通过继承自定义的sensor_poll_device_t来实现的。具体到每个akmsensor具体实现可以看其派生的akmSensors.cpp文件中的类。

 

4.3 关于akmSensors.cpp

         该文件主要是akmsensor类的实现。

首先,通过调用ECS_IOCTL_APP_MVFLAG, ECS_IOCTL_APP_MFLAG在构造函数中关掉设备

然后,需要注意的是结合初始化过程中注意函数的调用关系。

如: xxsensor.cpp中的actvate成员调用akmSensors.cpp中的enable

xxsensor.cpp中的setDelay成员调用akmSensors.cpp中的setDelay

其中setDelay中返回调用update_delay的数据,在update_delay中调用

ECS_IOCTL_APP_SET_DELAY设置延时。

xxsensor.cpp中的pollEvents成员调用akmSensors.cpp中的readEvents

其中readEvents中对符合类型的上报数据调用ProcessEvents进行处理

 

4.4小结

该层通过ioctl命令读写的数据流都是向kernel层发出的,控制命令应当和kernel层中的ioctl相互对应,从而实现层间的数据流向。

你可能感兴趣的:(电子罗盘HAL层分析)