架构介绍

路径: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. react在移动端的自适应布局

    react+flexible适配布局 (1)npm i lib-flexible --save (2)npm i postcss-px2rem --save (3)在 node_modules/rea ...

  2. Windows CMD常用命令集合

    CMD命令: 开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) chcp 修改默认字符集chcp 936默认中文chcp 65001 1. appwi ...

  3. Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (3)

    接上篇 Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (2) 7. 使用配置文件指定监听地址 打开 appsettings.json 文件,加入一行 "UseUrls&q ...

  4. 带UI的小初高数学学习软件—艰难地用C++(QT库)实现的过程

    从互相了解对方的代码思路然后确定用C++编写,到用win32写界面时变得摇摆不定的考虑着要不要改变语言,再到用QT写完界面后发现短信接口一般都不提供C++,最后到QT打包出来的可执行文件在别的设备上无 ...

  5. Struts2-向值栈中存放数据

    1.第一种 获取值栈对象,调用值栈对象里面的set方法(该方法添加的是一个Map集合) //第一种方式,使用值栈对象获取对象里面的set方法 //1.获取值栈对象 ActionContext cont ...

  6. Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法

    1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...

  7. 黑客入门——渗透必备神器Burpsuit的安装和简单使用教程

    ​ 很多人没有听说过burp全称(BurpSuite)BurpSuite是一款白帽子,黑帽子渗透测试必备工具,通过拦截HTTP/HTTPS的web数据包,当浏览器和相关应用程序的中间人,进行拦截.修改 ...

  8. 使用 shell 脚本自动获取发版指标数据

    问题背景 大一点的公司都会建立一套规章流程来避免低级错误,例如合入代码前必需经过同行评审:上线前必需提测且通过 QA 验证:全量前必需经过 1%.5%.10%.20%.50% 的灰度过程.尤其是最后一 ...

  9. 接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock

    因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分.先来看应用场景,App 经常会有一些信息展示的列表页,比如商家的菜品.股 ...

  10. Linux根目录下各文件目录的作用

    bin        用户二进制可执行文件    boot        系统启动引导文件    dev[device]        系统中使用的外部设备,但不是放的外部设备的驱动.一个访问这些外部 ...