• 【DSP】【第五篇】RBL源代码分析


    2022年11月7日

    • 最近手头事情做完,闲下来,整理一下之前的笔记。
    • 本文关注的重点是,RBL是如何在EMIF接口下,自动搬运代码段的。
    • 随着理解的深入,以后会进行自纠和补充。

    1. C6678、C6670的RBL代码调用关系

    (1)当设备上电复位后,执行RBL,会进入"_restVec" 汇编函数地址处。完成一些基本操作后,会跳转到函数"_bootMain"。如下图所示。
    在这里插入图片描述
    (2)_bootMain对应C文件(rmain.c)中定义的bootMain函数。如下图所示,中间会调用汇编文件中的函数“romtBootReentry”。最终会调用C文件(rmain.c)中的“boot_main_chaining”函数。
    该过程会读取设备状态寄存器,得到启动模式等参数。并根据启动模式,对其他参数进行初始化。
    在这里插入图片描述
    关于EMIF25初始化函数 “bootInitBootParamsEmif25”,如下图所示。初始化得到分支跳转地址0x70000000,以及其他参数。
    在这里插入图片描述

    (3)“boot_main_chaining”函数主要功能是:重置堆栈,然后继续引导链接过程。如下图所示。最终会根据不同的模式,选择不同的启动方式。
    在这里插入图片描述
    (4)接上文,除了EMIF启动之外的,启动,会涉及到 启动参数表,启动配置表,启动表的读取。如下图所示。
    首先是初始化启动表相关的函数。使用了函数指针数组和状态机。
    在这里插入图片描述
    然后是具体的使用启动表的状态机。如下图所示。
    在这里插入图片描述
    (5)EMIF启动,定位到函数“bootMainEmif25”。最终进行分支跳转到0x70000000地址。
    在这里插入图片描述

    2. C6657的RBL代码调用关系

    (1)当设备上电复位后,执行RBL,会进入"_restVec" 汇编函数地址处。完成一些基本操作后,会跳转到函数"_bootMain"。如下图所示。
    在这里插入图片描述

    (2)_bootMain对应C文件(rmain.c)中定义的bootMain函数。如下图所示,中间会调用汇编文件中的函数“romtBootReentry”。最终会调用C文件(rmain.c)中的“boot_main_chaining”函数。
    该过程会读取设备状态寄存器,得到启动模式等参数。并根据启动模式,对其他参数进行初始化。

    在这里插入图片描述
    关于EMIF25初始化函数 “bootInitBootParamsEmif25”,如下图所示。初始化得到分支跳转地址0x70000000,以及其他参数。

    在这里插入图片描述
    (3)“boot_main_chaining”函数主要功能是:重置堆栈,然后继续引导链接过程。如下图所示。最终会根据不同的模式,选择不同的启动方式。
    在这里插入图片描述
    关于Emif25的启动处理过程,如下图所示。主要是初始化EMIF外设,以及将Nor入口地址传到下一级函数bootDataProcess,进行处理。

    在这里插入图片描述
    (4)接上文,启动会涉及到 启动参数表,启动配置表,启动表的读取。如下图所示。
    首先是初始化启动表相关的函数。使用了函数指针数组和状态机。
    在这里插入图片描述
    然后是具体的使用启动表的状态机。如下图所示。Emif25启动,RBL调用bootDataProcess函数,调用状态机对0x70000000处的数据进行处理。
    即,支持boot启动参数表的识别与搬运,启动配置表的识别与搬运,启动表的识别与搬运。

    在这里插入图片描述

    3. 在RBL中的magicAddr

    魔法地址,非零的地址 表示引导完成。
    (1)启动异常时 chipBootException ,跳转地址。
    (2)获取该地址变量,使用 chipGetMagicAddr函数。
    (3)辅助核心只需清除其引导地址寄存器 和 进入空闲。一旦被唤醒,它们就会转移到启动地址寄存器中的地址
    辅核最终执行到 gauss_sec_core_boot 函数。将IPC中断 路由到核心,并执行空闲。
    被唤醒后,如果得到非零 magicAddr地址,则 解锁kick,置位一个核的完成位。再跳转到该地址处。
    在这里插入图片描述
    (4)在完成休眠恢复的过程中,chipCleanupHibernation函数 使用了magicAddr地址。
    只有核心0才能真正调用此函数,因为其他核心在检测到休眠恢复后将旋转。

    (5)通过 p_boot_entry_addr 指针操作 magicAddr变量。
    bootDataProcess函数的参数 modes = = emifBootDataTypes = = BOOTCONFIG_EMIF25_IMAGE_TYPES = = { BOOT_IMAGE_TYPE_BLOB_TBL, 0 } 。
    这里的BOOT_IMAGE_TYPE_BLOB_TBL 决定了 EMIF启动模式下的处理方式。由下图可知,直接获取入口地址并跳转。并没有状态机搬运的过!!!
    可以知道,某一种启动方式的处理方式,可以有多种并存,只需要在上述的花括号结构中添加索引宏定义。
    在这里插入图片描述

    4. RBL源代码下载地址

    RBL的源代码:http://software-dl.ti.com/sdoemb/sdoemb_public_sw/rbl/1_0_C6657/index_FDS.html
    RBL的源代码:http://software-dl.ti.com/sdoemb/sdoemb_public_sw/rbl/1_0_C6670/index_FDS.html
    RBL的源代码:http://software-dl.ti.com/sdoemb/sdoemb_public_sw/rbl/1_0_C6678/index_FDS.html

  • 相关阅读:
    2023高教社杯全国大学生数学建模竞赛E题代码解析
    广州华锐互动VRAR | VR课件内容编辑器解决院校实践教学难题
    LeetCode算法题解|LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间
    ffmpeg+qsv
    uni-app yrkDataPicker 日期和时间选择控件
    污水处理厂如何实现设备远程监控与调试?
    电脑投屏到TCL电视鼠标延迟
    Jmeter性能测试:高并发分布式性能测试
    C++11
    RN:Error: /xxx/android/gradlew exited with non-zero code: 1
  • 原文地址:https://blog.csdn.net/Kshine2017/article/details/127732232