电子罗盘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相互对应,从而实现层间的数据流向。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newtonnl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值