Android Sensor 使能流程

最近在看Sensor相关的东西,发现看了很多,没有很细致的流程介绍

下面把自己的跟的流程写下来,方便需要的兄弟。

基于:MT6737-N 

1.app入口

        

   从registerListener 跟到alps/frameworks/base/core/java/android/hardware/SensorManager.java

public abstract class SensorManager 发现是个抽象类 那么搜下类继承的地方




2.framework

实现registerListenerImpl的地方
alps/frameworks/base/core/java/android/hardware/SystemSensorManager.java


这个主要做了两个事情

    a.queue = new SensorEventQueue
    b.queue.addSensor

很关键的是a 这个会让你理解 类ISensorEventConnection下的enableDisable方法 这个后面回答是怎么回事。

我们来看queue = new SensorEventQueue


SensorEventQueue继承的是BaseEventQueue这个类 进去看看


构成函数一开始调用了nativeInitBaseEventQueue

我们先找下这个nativer方法实现的地方 


alps/frameworks/base/core/jni/android_hardware_SensorManager.cpp


sp<SensorEventQueue> queue(mgr->createEventQueue(clientName, mode));

这句按我的理解 sensorManager->createEventQueue()

我们跳转看下

alps\frameworks\native\libs\gui\SensorManager.cpp


这个关键点在于queue = new SensorEventQueue(connection); 在这里初始化了SensorEventQueue,点进去看下


这句我的理解是传入参数 mSensorEventConnection = connection 剩下的几个参数不关注,

那这个connection 是哪里传来的
alps\frameworks\native\libs\gui\SensorManager.cpp


点进去看下 alps\frameworks\native\include\gui\ISensorServer.h


什么也没有实现,看来这个应该是binder的client端

DECLARE_META_INTERFACE(SensorServer); 声明了client 

接下来直接搜声明binder对应的实现声明 这么搜META_INTERFACE(SensorServer

也可以定位到alps/frameworks/native/libs/gui/ISensorServer.cpp 这个


进去看下


真正的client端出现了

BpSensorServer 

那么服务端怎么搜,我是这样搜BnSensorServer,不知道还有没其他更好的方法,希望知道的指点下小弟。


alps\frameworks\native\services\sensorservice\SensorService.h


原来实现方法都在SensorService这个类中

alps\frameworks\native\services\sensorservice\SensorService.cpp



到这里刚刚完

 a.queue = new SensorEventQueue

接下我们来看b

alps/frameworks/base/core/java/android/hardware/SystemSensorManager.java

queue.addSensor 点进去看下



还是native方法

alps\frameworks\base\core\jni\android_hardware_SensorManager.cpp


我们看下

getSensorEventQueue()取的是什么


还是 SensorEventQueue

alps\frameworks\native\libs\gui\SensorEventQueue.cpp


这个在a时候分析过了mSensorEventConnection = connection


看下上面分析参数实在

alps\frameworks\native\services\sensorservice\SensorService.cpp实现

createSensorEventConnection

 sp<SensorEventConnection> result(new SensorEventConnection(this, uid, packageName,

mSensorEventConnection 就是new SensorEventConnection 的返回值。

alps\frameworks\native\services\sensorservice\SensorEventConnection.cpp


enable 点进去看下还是到了

alps\frameworks\native\services\sensorservice\SensorService.cpp


我们可以这么认为,sensor操作基本是在这个文件进行。

而sensor真正的使能的是

status_t SensorService::enable  函数下的这句

err = sensor->activate(connection.get(), true);

3.HAL

    alps\frameworks\native\services\sensorservice\SensorInterface.h


alps\frameworks\native\services\sensorservice\SensorInterface.cpp


mSensorDevice在哪里赋值的 



mSensorDevice(SensorDevice::getInstance()) 这里赋值

我们搜下SensorDevice

alps\frameworks\native\services\sensorservice\SensorDevice.cpp

SensorDevice::getInstance() 应该走的是构造函数


status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,

            (hw_module_t const**)&mSensorModule);

这个是JNI和HAL 的桥梁,根据SENSORS_HARDWARE_MODULE_ID这个id进行关联

err = sensors_open_1(&mSensorModule->common, &mSensorDevice);

这个应该是打开并赋值mSensorDevice

好了我们搜下SENSORS_HARDWARE_MODULE_ID


alps\vendor\mediatek\proprietary\hardware\sensor\sensors.c


open


init_nusensors

alps\vendor\mediatek\proprietary\hardware\sensor\nusensors.cpp


 dev = new sensors_poll_context_t(); 看下这个到底做了什么


初始化设备对应的操作方法。

我们关注mSensors[temperature] = new TempratureSensor();

alps\vendor\mediatek\proprietary\hardware\sensor\Temprature.cpp

并没有看到activate 相关方法


回到alps\vendor\mediatek\proprietary\hardware\sensor\nusensors.cpp


poll__activate



这里才是使能地方


回到alps\vendor\mediatek\proprietary\hardware\sensor\Temprature.cpp

enable


这个才是它的节点,写1为使能路径 /sys/class/misc/m_temp_misc/tempactive



4.Kernel

 不往下跟了,kernel部分这个机子没有温度传感器,其他kernel跟其他也很简单,在kernel搜下节点名字就可以出来了


节点的store和show函数都有了,这个是MTK框架,往框架上添加相应的驱动即可。




  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值