欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

MTK】运行时间可切换配置机制

最编程 2024-05-05 17:32:32
...
  1. 编译阶段以某种方式将不同硬件的配置信息写入Image
    • 配置信息一般包含Property列表/APK/...
    • 具体流程请参考下一章节的介绍
       
  2. LK(little kernel)通过 eFuse/GPIO等硬件讯息获取当前应该是用哪套配置,并通过Command Line的方式传给init.
    • 这个步骤需要客户参考 DCC3209223 并根据自己的硬件设计自行实现
    • 单个Package的时候,无需此步骤,此步骤仅用于需要"切换"的场景。
       
  3. init process增加一段逻辑,加载当前配置对应的预先放在Image里的 Property 列表.
    • 具体流程参考:/system/core/init/property_service.cpp 里的 LoadRscRoProps LoadRscRwProps
       
  4. PMS 增加一段逻辑,安装当前配置对应的预先放在Image里的 APK.  
    • 具体流程参考:/vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/pm/PmsExtImpl.java 搜索 rsc 相关的code

 

 

3. 配置/编译流程:

RSC相关的配置文件,在Project中的位置如下图,主要是由Project的 RuntimeSwitchConfig.mk,以及各个RSC Package自己的RuntimeSwitch.mk组成。
大部分RSC的RuntimeSwitch.mk都使用了Include其他.mk的方式用来减少配置的工作量。

Project从MTK Release的时候,只有配置default一个RSC(其内容通常为空),此时您可以把它任意换成某个RSC,当不涉及到切换的时候,是可以直接使用的,它可以被视为一套优先级很高的配置,会覆盖掉device.mk的配置。而当您要配置2个及以上的RSC的时候,就需要如上节所述,自行客制化LK里面切换的Code了。

DeviceTree部分的配置会稍微复杂,大多数Feature并不需要配置它,如果有需求的时候,可以参考Single Image的文档. DCC3209223

 

当完成编译后,会在不同的Image的etc/rsc/目录下生成几套不同的配置包,如下图,
然后Init和PMS以及各个模块会根据您从LK传入的rsc name,来选择不同目录进行加载/安装。

 4. 客制化示例:

如果需要切换Property/APK,一般情况只需要在LK实现这个Function即可,该函数是个 Weak function,被LK的platform.c调用。

#include <rsc.h>
#include <mt_gpio.h>

void rsc_init(void)
{
    /*
        Please customize here base on your HW design, usually call driver function to get some HW info,
        like eFuse value or GPIO value, then decide to use which RSC names.
        Example:  here we check a MTK HW GPIO as an example
    */
    if (mt_get_gpio_in(GPIO155) == 0) {
        cmdline_append(RSC_CMDLINE"rsc01");
    } else {
        cmdline_append(RSC_CMDLINE"default");
    }
}

如果需要切换Device Tree Overlay 还需要额外实现这个Weak Function。

/*
   Implement this function only if you need to switch between different device tree overlay
*/
int rsc_get_dtbo_index(void)
{
    if (mt_get_gpio_in(GPIO155) == 0) {
        return 1; //Index 1 dtbo for Special HW, map to rsc01
    }
    return 0;  //Index 0 dtbo for default
}

推荐阅读