文件位置: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相互对应,从而实现层间的数据流向。