架构介绍

路径: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. EMS邮箱数据库常用命令(一)

    案例任务:创建名为"book"的邮箱数据库,数据库文件和日志文件存储位置为"c:\book". 键入以下命令. New-MailboxDatabase -Nam ...

  2. vue项目中返回之前页面数据不刷新的问题

    利用vue做项目的时候会有让用户选择当前页面的某些数据,然后再跳到下一页,而下一页是根据上一页的数据来的,有时候选择了上一页的不同选项,下一页的数据可能还是之前的 这个就属于vue的数据获取问题 解决 ...

  3. SpringMVC-获得Restful风格的参数

    使用@PathVariable注解:接收请求路径中占位符的值 @RequestMapping("/report18/{username}") @ResponseBody publi ...

  4. Oracle数据库包括两个部分数据库和数据库实例

    olsnodes,这个命令用来显示集群点列表(grid即oracle rac的第三个安装包内的软件,可找到) //集群名称[grid@shdb02 ~]$ olsnodes -cshfpdb-clus ...

  5. ASP.NET Core WebApi返回结果统一包装实践

    前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...

  6. 史上最全log4j2远程命令执行漏洞汇总报告

    已投稿信安之路公众号,文章链接

  7. synchronized有几种用法?

    在 Java 语言中,保证线程安全性的主要手段是加锁,而 Java 中的锁主要有两种:synchronized 和 Lock,我们今天重点来看一下 synchronized 的几种用法. 用法简介 使 ...

  8. 超详细讲解H5移动端适配

    前言 移动互联网发展至今,各种移动设备应运而生,但它们的物理分辨率可以说是五花八门,一般情况UI会为我们提供375尺寸的设计稿,所以为了让H5页面能够在这些不同的设备上尽量表现的一致,前端工程师就不得 ...

  9. 2021.07.19 BZOJ2654 tree(生成树)

    2021.07.19 BZOJ2654 tree(生成树) tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net) 重点: 1.生成树的本质 2.二分 题意: 有一 ...

  10. mongodb 数据块的迁移流程介绍

    1. 基本概念 1.1 Chunk(数据块) 表示特定服务器上面,连续范围的分片键值所包含的一组数据,是一个逻辑概念. 例如,某数据块记录如下: { "_id" : "c ...