【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值