架构介绍

路径: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. python爬虫---污言污语网站数据采集

    代码: import requests from lxml import etree headers = { "user-agent": "Mozilla/5.0 (Wi ...

  2. java继承当中都有一些什么样的构造函数规则?

    6.继承当中的构造函数规则   马克-to-win:继承当中的构造函数规则貌似复杂: 记住我给你的以下几条口诀, 你高枕无忧.1)如果你在某类中写了带参构造函数,系统就不会再为你在那类中自动添加无参构 ...

  3. mysql绿色版安装以及遇到的问题

    下载mysql绿色版 放在如下文件夹  D:\javaSkill\mysql 修改my.ini文件内容: [mysql] default-character-set=utf8 [mysqld] bas ...

  4. executeFind()方法和execute()方法区别

    返回类型不同:executeFind()方法返回集合,execute()方法返回对象 executeFind @Override public List<TCpContact> getCp ...

  5. 设计模式学习笔记(十四)责任链模式实现以及在Filter中的应用

    责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求.当有请求发生时,可将请求沿着这条 ...

  6. redis笔记补充

    redis补充 这篇文章是redis入门笔记的补充. 1.info命令 用来显示服务的信息. info命令可以跟下面的选项: server: 关于 Redis 服务器的一些信息 clients: 客户 ...

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

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

  8. springboot中bean的重定义

    需求描述: 项目中应用其他项目的jar包,然后有些controller中的方法有缺陷需要修改. 1.配置添加 spring.main.allow-bean-definition-overriding= ...

  9. Mysql入门学习day2随笔2

    事务 什么是事务 要么都成功,要么都失败 事务原则 原子性:针对一个事务,两个步骤一起成功或一起失败 一致性:最终一致性,例如A.B之间的转账,无论两个账户如何操作,两账户的总价值不会变 隔离性:针对 ...

  10. 比较爽的导航查询 功能 - SqlSugar ORM

    1.导航查询特点 作用:主要处理主对象里面有子对象这种层级关系查询 1.1 无外键开箱就用 其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则开箱就用,无外键,只需配置特性和主键就能使用 ...