preloader流程----基于MTK平台

2023-11-06 20:20
文章标签 流程 平台 mtk preloader

本文主要是介绍preloader流程----基于MTK平台,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、preloader流程简介

1、启动流程

(1)设备上电起来后,跳转到Boot ROM(不是flash)中的bootcode中执行把pre-loader加载起到ISRAM, 因为当前DRAM(RAM分SRAM跟DRAM,简单来说SRAM就是cache,DRAM就是普通内存)还没有准备好,所以要先把pre-loaderload到芯片内部的ISRAM(Internal SRAM)中。

2preloder的主要工作是初始化环境,包括c环境,timer,gpio,pmic,uart,i2c等以及装载LK镜像至DRAM中。

(3)如果实现了ATF,preloader加载完lk分区后,还会加载tee分区,在设置好环境后,会先跳转到EL3。

(4)EL3回到lk,执行lk流程,preloader流程结束。

2、下载流程

preloader除了具有启动功能之外,还具有下载功能。首先还是需要明确的是mtk芯片都的有个boot rom,如果没有这个rom那么,那么程序是无法被下载到nandflash中的,然后此时的flash上是为空的,没有任何数据的。系统在上电之后它会检测是启动模式还是下载模式,如果是下载模式,它会初始化一个usb的串口,将preloader加载到内部的SRAM中,跳转到preloader中去执行,初始化好flash和外部RAM之后,依次将preloader、lk、kernel、android下载到nand flash中去。

二、主要流程

void main(u32 *arg)

{…..

mtk_uart_init(UART_SRC_CLK_FRQ,CFG_LOG_BAUDRATE);

/*初始化平台环境,比如Timer、PLL、UART、PMIC、Memory、BootableStorage等。*/

bldr_pre_process();

/*和外部工具通过UART或者USB方式握手,确定启动模式。*/

bldr_handshake(&handler);

/*安全相关的初始化*/

#if CFG_ATF_SUPPORT

   trustzone_pre_init();

#endif

/*加载LK镜像到DRAM中(SecureBoot)*/

   if (0 != bldr_load_images(&jump_addr)){

       print("%s Second Bootloader Load Failed\n", MOD);

       goto error;

}

/*初始化所有的环境。*/

bldr_post_process();

/*初始化所有的安全相关环境。*/

#if CFG_ATF_SUPPORT

   trustzone_post_init();

#endif

/*设置向lk传递参数的地址*/

#if CFG_BOOT_ARGUMENT_BY_ATAG

   jump_arg = (u32)&(g_dram_buf->boottag);

#else

   jump_arg = (u32)&bootarg;

#endif

#if CFG_ATF_SUPPORT

  ……

/*支持ATF,跳转到EL3,然后再跳转到lk*/

       bldr_jump64(jump_addr,jump_arg, sizeof(boot_arg_t));

#else

/*跳转到lk*/

   bldr_jump(jump_addr,jump_arg, sizeof(boot_arg_t));

#endif

error:

   platform_error_handler();

}


三、详细流程

1、初始化

1link_descriptor.ld

文件路径:/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6735

在该文件中定义了入口,会跳转到_start中执行:


2init.s

文件路径:

vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6735/src/init

在该文件中会执行_start,然后跳转到resethandler执行,主要作用是配置c运行环境(寄存器、堆栈、BSS等)   BSS静态内存段(未初始化)、数据段(初始化)、堆段、栈段

以及设置cpu为管理模式,关中断。

结束后会跳转到main开始执行:


(3)main.c

文件路径:

/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6735/src/core

初始化外部DRAM的timer、时钟、UART、EMI(DRAM防静电干扰)。

 bldr_pre_process()完成各种的平台硬件(timer,pmic,gpio,wdt...)初始化工作。

static void bldr_pre_process(void)

{ …..

    /* 重要的硬件初始化timer,pll, uart... */

    platform_pre_init();

    /* 平台初始化*/

 platform_init();

 /* 分区初始化*/

 part_init();  

 part_dump();

    /* 初始化安全库*/

 sec_lib_init();

 /* 将log输出到dram*/

 log_buf_ctrl(1);

 …..

}

 

void platform_pre_init(void)

{

     /* 初始化计时器*/

     mtk_timer_init();

     /* init boot time */

     g_boot_time = get_timer(0);

     /* 初始化串口*/

     mtk_uart_init(UART_SRC_CLK_FRQ,CFG_LOG_BAUDRATE);

     /*初始化GPIO*/

     mt_gpio_init();

     clk_buf_all_on();

     //初始化PMICwrap

     pwrap_init_preloader();

     //初始化i2c

     i2c_hw_init();

       check_charger_boost_status();

     //打开长按重启功能

     PMIC_enable_long_press_reboot();

     platform_core_handler();

}

void platform_init(void)

{

     /* check DDR-reserve mode */

     check_ddr_reserve_status();

     /* init watch dog, will enable AP watch dog*/

     mtk_wdt_init();

     /*init kpd PMIC mode support*/

     set_kpd_pmic_mode();

     enable_PMIC_kpd_clock();

 /*初始化boot参数:  memset((void *)&(g_dram_buf->bootarg),0, sizeof(boot_arg_t));*/

      init_dram_buffer();

        ram_console_init();

        ram_console_reboot_reason_save(g_rgu_status);

    /*初始化devicestoreage */

 ret =boot_device_init();

 #ifCFG_REBOOT_TEST

     mtk_wdt_sw_reset();

     while(1);

 #endif

 /* 传递默认dram信息给LK*/  

}

 

(4)bldr_handshake(&handler): UARTUSB握手测试(保证可以通信)

2、加载Lk到DRAM

bldr_load_images(&jump_addr):将各个分区加载进入DRAM,主要是lk分区。

1static int bldr_load_images(u32 *jump_addr){

 /*获取启动设备,为得到分区在ROM中的地址做准备*/

 if (NULL == (bootdev = blkdev_get(CFG_BOOT_DEV))) {

         print("%scan't find boot device(%d)\n", MOD, CFG_BOOT_DEV);

         /* FIXME, shouldchange to global error code */

         return -1;

     }

………

 #elifCFG_LOAD_UBOOT

 /* 这个值是一个固定值,确定了lk加载的目的地址,定义在default.makCFG_UBOOT_MEMADDR  :=0x41E00000 */

      addr = CFG_UBOOT_MEMADDR;

  /*ROM中找到lk分区,并加载到DRAM中addr位置*/

      ret = bldr_load_part("lk", bootdev, &addr,&size);

     if (ret)

         return ret;

     *jump_addr = addr;

 #endif

 /*如果支持ATF,在加载lk后还会加载tee分区*/

 #if CFG_ATF_SUPPORT

      addr = CFG_ATF_ROM_MEMADDR;

      ret = bldr_load_tee_part("tee1", bootdev, &addr,0, &size);

   ……

     bldr_load_bootimg_header("boot",bootdev, &addr, 0, &size);

 #endif

     return ret;

}

2bldr_load_part最终会执行:part_load(bdev, part, addr, 0, size);指定读取的偏移量,检索分区头是否正确,如果正确则开始加载分区,加载分区的代码:

intpart_load(blkdev_t *bdev, part_t *part, u32 *addr, u32 offset, u32 *size)

    /*检索分区头. */

    if (blkdev_read(bdev, src,sizeof(img_hdr_t), (u8*)hdr, part->part_id) != 0) {

        //print("[%s] bdev(%d) read error(%s)\n", MOD, bdev->type, part->name);

        return -1;

    }

    if (part_hdr->info.magic == PART_MAGIC){

        /* 加载带分区头的image*/

        part_hdr->info.name[31] = '\0';

……

        maddr = part_hdr->info.maddr;

        dsize = part_hdr->info.dsize;

        mode = part_hdr->info.mode;

        src += sizeof(part_hdr_t);

       memcpy(part_info + part_num, part_hdr, sizeof(part_hdr_t));

       part_num++;

    } else {

        //print("[%s] %s image doesn'texist\n", MOD, part->name);

        return -1;

    }

/*设置

    if (maddr == PART_HEADER_DEFAULT_ADDR) {

        maddr = *addr;

#ifCFG_ATF_SUPPORT

    } else if (mode == LOAD_ADDR_MODE_BACKWARD){

        maddr = tee_get_load_addr(maddr);

#endif

}

3、跳转到LK

(1bldr_post_process():内部其实是执行platform_post_init(),其主要作用是检查电池是否存在,确定要传给lk的参数。

voidplatform_post_init(void)

{

#ifCFG_BATTERY_DETECT

/*检查电池是否存在,不存在就一直等待 */

…..

#endif

platform_parse_bootopt();

/*设置要传递给lk的参数,在platform.c中定义*/

    platform_set_boot_args();

}

(2) bldr_jump(jump_addr,jump_arg, sizeof(boot_arg_t))执行init.s中定义的jump,实现跳转到lk执行,跳转地址即为0x41E00000


如果支持ATF就执行bldr_jump64(jump_addr,jump_arg, sizeof(boot_arg_t))

bldr_jump64最主要是执行:trustzone_jump(addr, arg1, arg2)

void trustzone_jump(u32 addr, u32 arg1,u32 arg2)

{/*初始化tee模块*/

tee_sec_config();

……

/*执行init.s中定义的jumparch64*/

   jumparch64(addr, arg1, arg2, trustzone_get_atf_boot_param_addr());

}

jumparch64: 先jump到el3,然后再回到lk。

这篇关于preloader流程----基于MTK平台的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/358838

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud