架构介绍

路径:vendor/mediatek/proprietary/tinysys/scp


1.[build]编译相关
2.[driver]scp 的driver,I2C,power,eint
3.[middleware]Audio VOW,contexhub 相关 lib 和driver
4.[project]不同项目的配置文件,例如编译,eint num 等

运行环境

概括

在scp,MTK 的sensorhub 是在Google 的CHRE 下开发的,所有的sensor driver 的实现可以称为一个 CHRE app CHRE APP 的框架如下图:

每一份在CHRE 下的sensor driver 的实现,必须要有如上几个模块:sensorinfo,sensorops,以及处理event的handler

common层

scp 支持的sensor,被分为了一下几类
1.accgyro
2.alps
3.barometer
4.Magneteometer
5.sar
不同的vendor driver 根据如上划分,将driver 的实现放置到对应的path下,每一个sensor 的control 和 Data flow 必须经过此common层,统一处理,示
意图如下:

通过这样的方式,规定好不同vendor driver 的具体实现接口,driver 在对应方法上,只在意处理逻辑和寄存器操作即可

实现流程

Control Flow

从AP 侧kernel 下发enable_cmd 的地方看起:

路径:
kernel-4.14/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/
int mtk_nanohub_enable_to_hub(uint8_t sensor_id, int enabledisable)
{
uint8_t sensor_type = id_to_type(sensor_id);
struct ConfigCmd cmd;
int ret = 0;
...
sensor_state[sensor_type].enable = enabledisable;
init_sensor_config_cmd(&cmd, sensor_type); //cmd
if (atomic_read(&power_status) == SENSOR_POWER_UP) {
ret = nanohub_external_write((const uint8_t *)&cmd,
sizeof(struct ConfigCmd)); //cmd hostintf
if (ret < 0)
pr_err("fail enable: [%d,%d]\n", sensor_id, cmd.cmd);
}
...
return ret < 0 ? ret : 0;
}

填充cmd:

static void init_sensor_config_cmd(struct ConfigCmd *cmd,
int sensor_type)
{
uint8_t alt = sensor_state[sensor_type].alt;
bool enable = 0;
memset(cmd, 0x00, sizeof(*cmd));
cmd->evtType = EVT_NO_SENSOR_CONFIG_EVENT; //evtype
cmd->sensorType = sensor_state[sensor_type].sensorType;//sensor type
if (alt && sensor_state[alt].enable &&
sensor_state[sensor_type].enable) {
cmd->cmd = CONFIG_CMD_ENABLE; //cmd
if (sensor_state[alt].rate > sensor_state[sensor_type].rate)
cmd->rate = sensor_state[alt].rate; //
else
cmd->rate = sensor_state[sensor_type].rate;
if (sensor_state[alt].latency <
sensor_state[sensor_type].latency)
cmd->latency = sensor_state[alt].latency;
else
cmd->latency = sensor_state[sensor_type].latency;
}
}

以上是AP侧的最后一步,接下来cmd 会在hostintf 接收到,再解析:

路径:
vendor/mediatek/proprietary/hardware/contexthub/firmware/src/hostIntf.c

hostintf 也是是CHRE APP:

INTERNAL_APP_INIT(APP_ID_MAKE(APP_ID_VENDOR_GOOGLE, 0), 0, hostIntfRequest, hostIntfRelease, hostIntfHandleEvent);

再其处理event 的函数:hostintfhandleevent 内

static void hostIntfHandleEvent(uint32_t evtType, const void* evtData)
{
struct ConfigCmd *cmd;
uint32_t i, cnt;
uint64_t rtcTime;
struct ActiveSensor *sensor;
uint32_t tempSensorHandle;
const struct HostHubRawPacket *hostMsg;
struct HostIntfDataBuffer *data;
const struct NanohubHalCommand *halCmd;
const uint8_t *halMsg;
uint32_t reason;
//uint32_t interrupt = HOSTINTF_MAX_INTERRUPTS;
if (evtType == EVT_APP_START) {
...
} else if (evtType == EVT_APP_TO_HOST) {
...
} else if (evtType == EVT_APP_FROM_HOST) {
...
}else if (evtType == EVT_LATENCY_TIMER) {
...
}else if (evtType == EVT_NO_SENSOR_CONFIG_EVENT) { // config
cmd = (struct ConfigCmd *)evtData;
#ifdef CFG_CONTEXTHUB_FW_SUPPORT
if (cmd->cmd == CONFIG_CMD_ENABLE)
registerDownSampleInfo(cmd->sensType, cmd->rate);
// mtk add for remapping sensorType to chreType
cmd->sensType = mtkTypeToChreType(cmd->sensType); //MTK sensor type CHRE type
#endif
osLog(LOG_INFO, "hostintf: %lld, chreType:%u, rate:%" PRIu32 ", latency:%lld, cmd:%d!\n",
rtcGetTime(), cmd->sensType, cmd->rate, cmd->latency, cmd->cmd)
if (cmd->cmd == CONFIG_CMD_FLUSH) {
sensorFlush(sensor->sensorHandle);
}
}

hostinf 会调用对应APP 的sensorops:
比如Accgyro.c

static const struct SensorOps mSensorOps[MAX_HANDLE] = {
{ DEC_OPS_ALL(sensorPowerAcc, sensorFirmwareAcc, sensorRateAcc, sensorFlushAcc, sensorCaliAcc, sensorCfgAcc,
sensorSelfTestAcc) },
{ DEC_OPS_ALL(sensorPowerGyro, sensorFirmwareGyro, sensorRateGyro, sensorFlushGyro, sensorCaliGyro,
sensorCfgGyro, sensorSelfTestGyro) },
{ DEC_OPS(anyMotionPower, anyMotionFirmwareUpload, anyMotionSetRate, anyMotionFlush) },
{ DEC_OPS(noMotionPower, noMotionFirmwareUpload, noMotionSetRate, noMotionFlush) },
};

如上的宏都是再填充SensorOps的具体方法:
以Acc的power_on 为例子

至此 kernel 到common 层的control flow 就结束了,接下来就是vendor 根据平台实现自己的逻辑。
目前common 和driver 的实现,分为两种,第一种就是FSM 状态机,另一种是MTK arch 2 新的架构,广播机制

FSM:

MSE:


以alps 为例子梳理下enable 流程:
与acc 一样,hostintf 通过调用APP 提供的sensorops:

对alps common 层下发sensorpower

通过函数sensor_broadcast_event 发出event,挂载的als app会在处理event 的函数内处理 对应的event type
以bu27030 为例:
init 时候会注册自己接收event 的函数

Data Flow

FSM:

以Acc 为例子:
Data flow 无论是中断还是polling 都是从common 层下第一个FSM


最后上报data 的函数是:

MSE:

以Als为例子:
Data flow 依靠driver init后注册的timer ,当power 后根据下发的rate 启动timer:

这个是和power_on 后下发的,用来设置rate,在driver 通过timer 实现
回到driver:



至此,acc 和 als 都调用函数: osEnqueueEvt 发送data 给上层:
以下上报流程不区分FSM/MSE ,完全一致,接着分析:
common层发从的data 从code 流程上全部到了contexthub_fw.c

路径:
vendor/mediatek/proprietary/tinysys/scp/middleware/contexthub/contexthub_fw.
c



需要注意的是这里面填充的struct data_unit_t 就是AP 侧kernel mtk_nonahub 处理的数据类型。所以contexhub_fw.c 这里填充的dummy 的log 也就是
平时debug AP 与SCP 界限的 分割点。

MTK 平台sensor arch 介绍-scp的更多相关文章

  1. MTK 平台sensor arch 介绍-hal

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

  2. MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率

    1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...

  3. MTK平台Android项目APK预置方案

    项目开发中,通常需要向系统中预置一些APK,这里简单介绍一下MTK平台预置APK的方法. 需要预置的apk可以放置在目录:vendor/mediate/${Project}/artifacts/out ...

  4. andorid之摄像头驱动流程--MTK平台

    原文地址:andorid之摄像头驱动流程--MTK平台 作者:守候心田 camera成像原理: 景物通过镜头生产光学图像投射到sensor表面上,然后转为模拟电信号,经过数模变成数字图像信号,在经过D ...

  5. Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新

    SystemUI系列文章 Android8.1 MTK平台 SystemUI源码分析之 Notification流程 Android8.1 MTK平台 SystemUI源码分析之 电池时钟刷新 And ...

  6. 批量搞机(二):分布式ELK平台、Elasticsearch介绍、Elasticsearch集群安装、ES 插件的安装与使用

    一.分布式ELK平台 ELK的介绍: ELK 是什么? Sina.饿了么.携程.华为.美团.freewheel.畅捷通 .新浪微博.大讲台.魅族.IBM...... 这些公司都在使用 ELK!ELK! ...

  7. 关于MTK平台SIM-ME Lock的配置方案

    针对一些运营商的锁网需求,MTK平台已经对其有很好的支持.绝大多数的海外需求可以通过直接配置相关文件来完成.这里简单描述一下配置方法,不做原理分析. 相关数据结构分析: Modem中与SML锁网配置相 ...

  8. 关于MTK平台CC相关的Log查询

    关于MTK平台CC相关的Log查询 在外场问题中,经常会出现通话相关的故障.这里简单总结一下通话相关log的分析点: 主叫方:主叫方,是指主动发起通话的一方. 初步定位问题, 用户发起通话时,AP端的 ...

  9. SNF快速开发平台--规则引擎介绍和使用文档

    设计目标: a) 规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b) 能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c) 运算速度 ...

随机推荐

  1. Java中使用最频繁及最通用的Java工具类

    在Java中,工具类定义了一组公共方法,Java中使用最频繁及最通用的Java工具类. 一. org.apache.commons.io.IOUtils closeQuietly:关闭一个IO流.so ...

  2. IDEA 2022.2.1 Beta 2发布:新增支持Java 18、增强JUnit 5的支持

    近日,IDEA 2022.1的Beta 2版本发布了!下面我们一起来看看对于我们Java开发者来说,有哪些重要的更新内容. Java增强 随着Java 18的正式发布,IDEA也在该版本中迅速跟进.目 ...

  3. LC-209

    给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, nums ...

  4. 帝国CMS网站地图生成插件

    可以生成电脑端也可以生成手机端的地图XML. 安装方法: 这个帝国sitemap插件的安装跟其他插件的安装方式一样,介于可能有人不会安装帝国的插件,就写一下吧,以后你们如果碰到帝国插件也可以参考这个. ...

  5. springboot项目找不到符号问题以及模块聚合项目maven插件使用的相关问题

    问题如图 更换maven,清空缓存重新导入依赖依然无效后 解决方法: 方式一:删除项目中.idea文件夹,重新打开项目,选中jdk版本 ,重新导入依赖即可. 最近又遇到找不到符号问题,本地运行没问题, ...

  6. allure用法(一)-配置信息及基本用法

    allure是一个轻量级的,灵活的,支持多语言的测试报告工具 优点: 可以为dev/qa 提供 详尽的测试报告.测试步骤.日志 可以为管理层提供更好的统计报告 Java语言开发的 可以集成到jenki ...

  7. 解决pycharm的爬虫乱码问题(初步了解各种编码格式)

    Ascii码(American Standard Code for Information Interchange,美国信息互换标准代码):最初计算机只在美国使用时,只用8位的字节来组合出256(2的 ...

  8. Java学习day42

    继续刷力扣题

  9. MATLAB R2019b超详细安装教程(附完整安装文件)

    摘要:本文详细介绍Matlab的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用.本文目录如首页 ...

  10. k8s入门之基础环境准备(一)

    一.在虚拟机中安装Ubuntu20.04.4系统 1.下载Ubuntu20.04.4服务器版本系统 下载链接地址如下: https://mirrors.tuna.tsinghua.edu.cn/ubu ...