MTK sensor 框架

前言

因为喜欢用文件记录代码调用流程及总结什么的,画 uml 图什么的实现是懒的画了,直接上传源码总结吧,先传几张图欣赏下吧,感觉有需要就下载源码自己跟下流程吧,如果喜欢这种风格的的话,请点赞[笑脸]
##源码环境
mtk 6582 + android 4.4

安卓框架图

安卓框架图:
这里写图片描述

android app 操作sensor 流程:
在这里插入图片描述
这里写图片描述

	1. 获取 sensor manager 对象;
        /
        // 此函数会创建一个 SystemSensorManager 对象,上面有介绍,他会调用 SensorManger 
        // 通过 Binder 请求 SensorService 服务返回【传感器列表】, 保存在 SystemSensorManager 中
        // 代码调用路径:
        //      xxx.apk
        //          ContextImpl.java                    // app 都有的 Context 参数实现,这是创建 activity 时创建的
        //              SystemServiceRegistry.java      // 此类的静态代码块中注册各种服务
        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

	2. 获取 sensor object;
	    /
	    // 查找第一步获得的传感器列表,返回对应的传感器的 Sensor 类对象 
	    mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

	3. 定义 eventListener:
        
        // 定义了 SensorEventListener 类接口,主要主要是重写了 onSensorChanged() 
        // 和 onAccuracyChanged() 方法,当所监听的sensor有数据上报会自动调用 
        // onSensorChanged() 进行处理。这里的 handleLightSensorEvent() 就是用来
        // 处理 light sensor 上报的数据。
        private final SensorEventListener mLightSensorListener = new SensorEventListener() {  
            @Override  
            public void onSensorChanged(SensorEvent event) {  
                if (mLightSensorEnabled) {  
                    final long time = SystemClock.uptimeMillis();  
                    final float lux = event.values[0];  
                    handleLightSensorEvent(time, lux);  
                }  
            }  
        
            @Override  
            public void onAccuracyChanged(Sensor sensor, int accuracy) {  
                // Not used.  
            }  
        };
    4. 注册 eventListener;
        
        // 函数会一直调用到 C++ 层,创建一个套接字,接收 SensorService 发 
        // 过来的传感器数据,然后一层层调用,最后调用注册的监听函数处理传感器数据
        // 代码调用路径:
        //      xxx.apk 中 
        //          SensorManager.java                          // 他是 SystemSensorManager 的父类,按接口编程
        //              SystemSensorManager.java
        //                  SensorEventQueue.java
        //                      SystemSensorManager.java        // 初始化父类 BaseEventQueue
        // -------------------- jni -----------------------------------------------------------------
        //                          android_hardware_SensorManager.cpp 
        //                              SensorManager.cpp       // 在这里注册一个套接字接收 Sensor 发来的数据
        // 收到数据处理流程:
        //      android_hardware_SensorManager.cpp              // Recevicer::handleEvent()
        //          SystemSensorManager.java                    // app 覆写的:onAccuracyChanged()/onSensorChanged()
        mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MILLIS * 1000, mHandler);

	5. 卸载 eventListener;
        
        // 调用类路径为:
        //      SensorManager.java
        //          SystemSensorManager.java
        //  ------------------- jni ------------------------------------------------------------
        //              android_hardware_SensorManager.cpp
        //                  SensorEventQueue.cpp                            // 用来管理 sensor 上报的事件的
        //                      SensorEventConnection.cpp                   // SensorEventConnection 类,管理 Sensor 连接的
        //                          SensorService.cpp
        //                              SensorInterface.cpp
        //                                  SensorDevice.cpp
        //                                      Sensors.c
        //                                          Nusensors.cpp
        //                                              Acceleration.cpp
        //  -------------------- kernel -------------------------------------------------------------------
        //                                                  accel.c         // MTK 封装的加速度传感器框架文件
        //                                                      mc3413.c    // 第三方实现的具体的传感器驱动文件
        mSensorManager.unregisterListener(mLightSensorListener);

HAL 框架

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Sensor 服务启动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	// 【Sensor 初始化流程】:
	// 初始化文件路径:
	//  Init.cpp                                    // init 进程:system\core\init
	//      App_main.cpp                            // zygote 进程:frameworks\base\cmds\app_process
	//          AndroidRuntime.cpp
	//              ZygoteInit.java                 // :frameworks/base/core/java/com/android/internal/os
	//                  RuntimeInit.java            // 抛出异常: frameworks\base\core\java\com\android\internal\os
	//   ----------------------------------------------------------------
	//                      SystemServer.java       // systemserver 进程: 是 zygote 子进程:frameworks\base\services\java\com\android\server
	//                          Onload.cpp                              // 注册一些 jni, 如硬件访问服务的: frameworks\base\services\jni
	//                          --- jni -----------------------------
	//                          com_android_server_SystemServer.cpp     // 初始化 C++ 层的 sensor 服务端:frameworks\base\services\jni
	//                              SensorService.h                     // SensorService(C++) 类初始化:提交 Binder 服务:frameworks\native\services\sensorservice
	//                              SensorService.cpp
	//                                  SensorDevice.cpp                // SensorDevice(C++) 类初始化:与 HAL 层打交道: frameworks\native\services\sensorservice
	//                                  --------- 下调 HAL 实现 ----------------
	//                                      Sensors.c                   // 【HAL实现】MTK 创建的 Sensors.c,HAL 层文件,与具体传感器实现打交道:vendor\mediatek\proprietary\hardware\sensor
	//                                           Acceleration.cpp       // 【具体的 sensor 实现函数】:vendor\mediatek\proprietary\hardware\sensor
	//                                           Gyroscope.cpp
	//                                           Magnetic.cpp
	//                                           StepCounter.cpp
	//                                           。。。
	//                                           ------- kernel ----------------------
	//                                              Accel.c             // kernel-3.18\drivers\misc\mediatek\accelerometer
	//                                              alsps.c             // kernel-3.18\drivers\misc\mediatek\alsps

驱动框架图

MTK sensor 上报数据经过了一个中间层,框图为
这里写图片描述

MTK 通用模块实现

在这里插入图片描述

初始化

在这里插入图片描述

获得数据

在这里插入图片描述

应用层接口

在这里插入图片描述
在这里插入图片描述

通过 sys 节点启动传感器

在这里插入图片描述

定时器->工作队列->get_data()->input

在这里插入图片描述

MTK 通用模块提供接口

	xxx_driver_add():  xxx_init_info 包含了 sensor 的相关信息,通过将这个结构体注册到 common driver 实现 sendor auto detect 的功能 
	xxx_register_data_path():  用于注册获取数据相关操作函数
	xxx_register_control_path():用于注册控制相关操作函数

第三方驱动实现

	xxx_data_path: 包含 get_data() 获取数据函数
	xxx_control_path: 包含相关开头 sensor 操作函数
	xxx_init_info: sensor 相关信息

初始化

在这里插入图片描述

I2C 匹配

在这里插入图片描述

备注:

问题 1

acc_driver_add() 煞费苦心的注册了一个 platform_device 匹配 gsensor,却在 probe() 中假装做了些事情。
在这里插入图片描述
应该是预留的接口,用于做一些 sensor 全局的设置,比如获得 pinctrl 设备,设置特殊工作引脚什么的。。。
在这里插入图片描述

问题 2

G-sensor 的 probe() 为什么会进两次?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Ps 距离上报 10cm 流程

	########################################
	# Ps 距离传感器上报值处理:sensor box 显示为 10cm
	######################################## 
	// 内核上报:
	#getevent  /dev/input/event4
	    // 接近上报:0x01
	    0002 0002 00000001
	    0002 0001 00000003
	    0000 0000 00000000
	
	    // 远离上报:0x02
	    0002 0002 00000002
	    0002 0001 00000003
	    0000 0000 00000000
	 
	# HAL 处理,然后就会通过套接字上报给上层应用 APK 
	// Proximity.cpp (vendor\mediatek\proprietary\hardware\sensor)
	ProximitySensor::processEvent(int code, int value)
	    switch (code) {
	    case EVENT_TYPE_PS_VALUE:
	        mPendingEvent.distance = (value - 1) * PROXIMITY_RANGE; // Hwmsen_chip_info.h (vendor\mediatek\proprietary\hardware\sensor)
	                                                                //      #define PROXIMITY_RANGE         10.00f
	        break;
	    }
  • 14
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值