RK33XX/RK35XX系列设备启动流程、写入系统及编译流程 #1634
Replies: 7 comments 16 replies
-
Beta Was this translation helpful? Give feedback.
-
线刷流程
至此,入门线刷流程结束。 |
Beta Was this translation helpful? Give feedback.
-
卡刷流程 根据rk默认的启动流程,一般不会优先使用SD/MMC上的系统。不过有些设备可能调整过默认的启动流程来默认启动SD卡上的系统。 卡刷相当的简单。从本仓库的releases内下载对应设备的镜像文件,使用烧录软件(例如rufus,balena etcher,dd)将其烧录到对应的存储介质上。然后将其插入设备重启。 附:u-boot环境下破坏当前环境下的引导 PS:此操作高危,请反复阅读,并清楚你在做什么。 链接ttl到设备,启动过程中用任意按键打断u-boot的启动流,使其进入命令行模式。输入命令: |
Beta Was this translation helpful? Give feedback.
-
预留 |
Beta Was this translation helpful? Give feedback.
-
预留 |
Beta Was this translation helpful? Give feedback.
-
预留 |
Beta Was this translation helpful? Give feedback.
-
预留 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
更多细节可看瑞芯微的wiki:http://opensource.rock-chips.com/wiki_Boot_option
以RK3399为例,
RK3399启动的时候,首先执行BootRom中的代码,然后BootRom将加载第二阶段引导程序(SPL)。不管是执行BootRom还是执行SPL,都需要内存。到这一阶段,仅有芯片内部的SRAM被初始化且能够被程序使用。但是芯片的Cache都很小,几乎不足以完整的载入完整的引导加载程序。所以,RK3399在每次复位后,都会预先加载辅助程序加载器,然后由其初始化容量更大的DDR内存,以便后续的引导程序有足够的内存运行。
第一阶段:硬件起始 开天辟地
芯片软件引导的起始,是硬件。对于ARM处理器,上电后,PC指针寄存器直接复位至零地址,随后从中断向量表表头的reset向量处,获得后续的代码加载地址。后续的代码便会完成硬件自检,基本初始化,输入输出支持等操作。我们一般将这段出厂就写在ROM里,负责启动后续需用户软件的软件成为BootRom,或是Rom Code。现在,我们一般不会使用严格意义上的只读存储器来存放这部分程序,但至少它是一块掉电不易失的存储设备,比如EEPROM,NOR FLASH。虽然一般我们没有权限修改BootRom,但这并不意味BootRom就是一个完全的黑盒,很多芯片都有外部配置引脚,通常是一个拨码开关。
ROM代码是芯片专有,且不能被任何的开源设备取代。RK3399有192K的INTMEM0和32K的BOOTROM。这两部分存储空间组成了最初的引导代码运行环境。芯片自检完成后,如果没有外部引脚的配置,SPL便会默认以:SPI NOR,SPI NAND,Emmc,SD/MMC的顺序查找存储控制器。如果在这些存储控制器的对应地址都没有找到idbloader.img,则进行USB端口的初始化工作。如果找到了idbloader.img,并且校验通过,则使用其来初始化主存DDR,并将boot启动代码拷贝到DDR,加载完整的Bootloader代码至DDR内存中运行。
第二阶段:软件接管 创生万物
在经过BootRom和IDBLoader完成了一系列的初始化工作之后,U-Boot现在应该已经被拷贝到DDR内部并开始运行。
U-Boot启动大多都分为两个阶段:
第1阶段的主要任务是对依赖于CPU体系结构的相关硬件进行初始化,该阶段通常使用汇编语言实现。同时完成下面的五件任务:
1) 基本的硬件设备初始化
2) 为第2阶段准备RAM空间
3) 如果是从某个固态存储媒质中启动,则复制Bootloader的第2阶段代码到RAM
4) 设置堆栈
5) 跳转到第2阶段的C程序入口
第2阶段通常使用C语言实现,以实现更复杂的功能,也使程序有更好的可读性和可移植性。在这一阶段,完成剩下硬件设备的初始化工作,检查系统内存的映射,拷贝内核和rootfs到RAM,为内核设置启动参数。完成之后运行内核。
在这之后的事就交给内核进行处理。
Beta Was this translation helpful? Give feedback.
All reactions