MTK sensor 框架

    xiaoxiao2021-03-25  159

    文章目录

    前言安卓框架图HAL 框架Sensor 服务启动驱动框架图MTK 通用模块实现初始化获得数据应用层接口通过 sys 节点启动传感器定时器->工作队列->get_data()->inputMTK 通用模块提供接口 第三方驱动实现初始化I2C 匹配 备注:问题 1问题 2 Ps 距离上报 10cm 流程

    前言

    因为喜欢用文件记录代码调用流程及总结什么的,画 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; }
    转载请注明原文地址: https://ju.6miu.com/read-40562.html

    最新回复(0)