MTK虚拟sensor梳理

一 虚拟sensor注册
以倾斜检查虚拟sensor为例,梳理虚拟sensor的控制流和数据流
倾斜虚拟sensor驱动在SCP virt_driver里tilt_detector.c,MTK SCP侧的虚拟sensor都是存放在这个目录下。

wakeup------抬起唤醒
liftDetector----拾起察觉
liftPdDetector—拾起察觉(带防误触检查)
stepRecognition —虚拟计步器

tiltDetectorStart()
{
mTask.taskID = taskId:
mtask.handle = sensorRegister(&mSi, &mSops,NULL,true);//注册操作接口
osEventSubscribe(taskId,EVT_APP_START);//加入实际并执行,在tiltDetectorHandleEvent中该事件仅打印了log “TILT EVT_APP_START”后就删除了该事件的监听
}

二 虚拟sensor控制流程
HAL层:tilt是归属于Situation.cpp管理,该类还管理pickup_gesture motion_detect wake_gesture等虚拟sensor,但计步器有自己独立的HAL驱动stepCounter.cpp
使能:
Int SituatiionSensor::enale(int32_t handlle, int en) //抬腕sensor handle = 21
{
Open() //打开kernel的驱动节点situactive
Write() //写1
}

对节点situactive执行write操作就是执行对应的store函数
static ssize_t situation_store_active()
{
Index = handle_to_index(handle);//通过handle找到要操作的sensor

Situation_enable_and_batch(index); //使能该函数主要调用   cxt->ctl_context[index].situation_ctl.open_report_data(1)

}

cxt->ctl_context[index].situation_ctl具体的实例化是在situation_register_control_patch()中,这对应这具体驱动的注册,不难发展在tiltdetecthub.c驱动的tiltdetecthub_local_init()初始化时会提供接口:
ctl.open_report_data = tilt_detect_open_report_data:

static int tilt_detect_open_report_data(int open)
{
Sensor_enable_to_hub(ID_TILT_DETECTOR,open);//去SCP侧开启sensor

}
AP到SCP大致流程:sensor_enable_to_hub()函数会打包一个cmd(sensor type、rate、enable信息)通过中断的形式发给SCP,SCP接收处理将在hostIntfHandleEvent()进行
hostIntfHandleEvent()
{
①将mtkType转换未SCP侧的chreType
Cmd->sensType = mtkTypeToChreType(cmd->sensType)
②通过 chreType寻找sensorHandle
sensorFind()
③开启sensor
SensorRequest() //会掉用该驱动sensorPower函数

}
IC驱动Power on:
TiltDetectorPower( bool on ,void * cookie)
{
If(on){
configAccel(true,NORMAL_ACC_WINDOW)
{
sensorFind(SENS_TYPE_ACCEL,I,&mTask.acclHandle) //寻找ACC sensor
sensorRequest(mTask.taskId,mTask.accelHandle,ACCEL_MIN_RATE,ACCEL_LATENCY) //开启ACC
osEventSubscribe(mTask.taskId,EVT_SENSOR_ACCEL) //该驱动监听ACCEL事件
}
configAnyMotion(true)
configNomotion(true)
}

}

三sensor的监听流程
在tiltDetectionHandleEvent(){

//监听了4个事件
Case EVT_APP_START: //仅驱动加载时打印log
//下面2个事件通过虚拟sensor motin_adaptor.c判断手机状态,修改ACC的采样频率
Case EVT_SENSOR_ANY_MOTTION:
Case EVT SENSOR_NO_MOTION:
//这个才是真真办事情的,当检查ACC有数据变化,分析数据,上报状态
Case EVT_SENSOR_ACC:
{
TiltDetectorAlgo->
run_tilt_algorithm->
osEnqueueEvt(sensorGetMyEventType(SENS_TYPE_TLT),sample.vpte,NULL)
}

}
四 数据上报
驱动掉用osEnqueueEvt(sensorGetMyEventType(SENS_TYPE_TLT),sample.vpte,NULL)
依旧是hostIntfHandleEvent()进行处理
hostIntfHandleEvent()
{
copyTripleSample(sensor,evtData)//数据保存
simpleQueueEnqueue()-SensorQueueEnqueue()->hostIntfTransferData()->contextHubFormateData()->contextHubTransferOnChangeSensor()->contextHubSramFIfoWrite()//将数据写入FIFO
}
在驱动tiltdetecthub.c中会读取这个FIFO
Tilt_detect_recv_data()
{
Situation_data_report()//数据上报到HAL层
}

结论:
虚拟sensor同样适用android的架构控制 HAL—KERNEL—SCP。如倾斜检查sensor:
HAL层的situation.cpp文件。
kernel的situation.c和tiltdetecthub.c。
SCP的/VIR_driver/tilt_detector.c。

控制流和数据流依旧和常规sensor一致。值得注意的是在contexthub中会对sensor type 进行相应的转换,从而AP和SCP的sensor type值不一定相等。如倾斜在AP sensor type = 22
而在SCP却是25,转换函数chreTypeToMtkType() 、MtkTypeToChreType() 。

部分手机开启抬起唤醒功能,其实会打开 SENSOR_TYPE_WAKE_GESTURE .对应SCP的就是wakeup.c驱动,而wakeup的功能是依赖与liftDetect.c驱动的.所以可以开启的wakeup、liftDetect 2个虚拟sensor。

部分手机开启抬起唤醒功能,其实会打开 SENSOR_TYPE_TILT_DETECTOR .对应SCP的就是liftpbDetect.c驱动或tilt_detect.c驱动.
liftpbDetect.c和tilt_detect.c驱动注册的类型都是 SENS_TYPE_TILT 他们的区别在于liftpbDetect.c不光监听ACC还会监听PROX.使用liftpbDetect的时候,靠近状态倾斜手机是不会上报数据的.
对于一项功能,可能会有几种sensor都可以实现.具体使用的那种需要注意上层调用的handle.再对具体的sensor具体分析.

MTK虚拟sensor梳理相关推荐

  1. MTK 虚拟 sensor bring up (pick up) sensor1.0

    pick up bring up sensor1.0 1.pick up对比 2.SCP 1.添加驱动文件 2.添加编译环境(打开开关) 注:编译过程中如果显示内存不够 3.修改底层数据上报方式 3. ...

  2. MTK平台添加虚拟sensor

    一.添加一个新的sensor类型 HUB部分 1./vendor/mediatek/proprietary/tinysys/freertos/source/middleware/contexthub/ ...

  3. MT6752/32平台 KK和L版本支持的虚拟sensor类型有哪些

    [DESCRIPTION] MT6752/32平台 KK和L版本支持的虚拟sensor类型有哪些 [SOLUTION] KK Hal Support 9 virtual sensors,这些虚拟sen ...

  4. MTK 平台sensor arch 介绍-hal

    MTK 平台sensor arch 介绍-hal 一:整体框架 二:具体流程简介 AP-HAL: (1)init & control flow 我们以前文的originchannel 的 ac ...

  5. 1.高通SEE 虚拟sensor分析

    在SEE中,处理硬件sensor,高通实现的platform sensor,还有一类是通过硬件sensor等各种数据计算,抽象出来的虚拟sensor. 我们以高通提供的参考为例,看如何添加一个虚拟se ...

  6. MTK 平台sensor arch 介绍-kernel

    MTK 平台sensor arch 介绍-kernel AP-kernel 1.文件相关介绍 1.进入到(core) 2.进入到(mtk_nanohub) 3.(lsm6dsm_secondary)是 ...

  7. MTK 平台sensor arch 介绍-scp

    架构介绍 路径:vendor/mediatek/proprietary/tinysys/scp 1.[build]编译相关 2.[driver]scp 的driver,I2C,power,eint 3 ...

  8. mtk android 笔记,Android驱动笔记(9)——MTK平台Sensor Bring Up

    sensor的img位于scp.img 9.1.在成熟的平台Bring Up 在已知的平台上驱动并验证一个器件是很常见的工作.因为管脚等基本不需要重新配置.所以只需要按照一般步骤驱动即可.驱动代码位置 ...

  9. MTK 虚拟键盘与输入法

    一.    虚拟键盘 Typedef struct { BOOLenable_dead_key; S16n_matrix_layout; S16n_custom_keys;               ...

最新文章

  1. 零基础学习大数据人工智能,学习路线篇!
  2. Ubuntu下 Oracle sqldeveloper中文目录、文件,select查询结果中:中文乱码
  3. 报文解析_104规约报文结构解析
  4. hashset默认长度是多少?_看看,这些细节上的坑,你犯了多少?
  5. 下载、安装Keil 5
  6. 除了 Coding,程序员获得收入的四大途径!
  7. Oauth协议是否会泄露用户的密码
  8. 微信小程序文本溢出省略号(···)
  9. python要学多久可以找到工作-学习Python多久能找到工作?老男孩Python开发培训
  10. App---mui页面无法滚动问题
  11. Android 调整控件位置和大小(以textView为例,并设置字体与背景颜色)
  12. 解决Eclipse中文乱码的问题
  13. 使用boost中的线程池
  14. 基于STM32F103自制CMSIS-DAP下载器
  15. plc单片机组态软件php_学习plc单片机组态软件,嵌入式的一些心得
  16. php和vue实现智商在线测试题
  17. Springboot配置文件
  18. linux 根目录变为只读了,Linux系统重启或无故变为只读造成网站无法正常访问的简单临时的做 根目录只读不能写处理:...
  19. 100项目插件激活程序验证码,自行复制
  20. STM32 ADC最大采样频率

热门文章

  1. VMware下载安装WIN7虚拟机
  2. urt-8转成GBK 之多种方法
  3. ROS2:Humble 教程
  4. 语音信号处理之语音特征提取(1)机器学习的语音处理
  5. ROS2编程基础课程--库
  6. Excel操作:制作to do list
  7. Matplotlib:设置坐标轴范围,刻度,位置,自定义刻度名称,添加数据标签
  8. java程序启动打印_JAVA打印问题:程序正常运行,打印机无反应
  9. OSPFB笔记-五个报文【超详细】[Hello报文,DD报文,LSR报文,LSU报文,LSAck报文]
  10. DirectX11 简介+环境配置