芯片上电解复位之后执行的第一段程序,在芯片中称之为Bootrom loader
。这部分程序在芯片制造过程中固化到其内部的ROM空间,具备只读属性,在实际使用过程中无法修改这部分内容,这部分程序的知识产权也仅归属于芯片公司所有。其实,你也可以将Bootrom loader
称之为固件。
对于ARM架构的处理器而言,芯片上电解复位后的PC通常是指向0x00000000
或0xffff0000
地址,也就是说,它会去该地址处取第一条指令、译码、执行。CPU能支持的启动模式通过硬件拨码的方式告知CPU,CPU上电解复位后内部逻辑会识别bootmode
。依据识别出的bootmode
决定去何处取第一条指令。假设解析bootmode
后发现并不是从bootrom
启动,而是从其他存储外设启动,例如norflash
、nandflash
、qspiflash
等,这些外设就会变为CPU的一级启动设备,而CPU内部逻辑也会将这些启动外设的地址空间进行remap处理。
RK3399内部包含4个ARM cortex-A53以及2个cortex-A72,典型的cluster结构,cortex-A53作为小核而cortex-A72作为大核。当系统上电解复位之后,cortex-A53的core0作为第一个启动的核心,执行0xffff0000
处的Bootrom loader
程序。
其完整的启动流程如下图所示:
+--------+----------------+----------+-------------+---------+
| Boot | Terminology #1 | Actual | Rockchip | Image |
| stage | | program | Image | Location|
| number | | name | Name | (sector)|
+--------+----------------+----------+-------------+---------+
| 1 | Primary | ROM code | BootRom | |
| | Program | | | |
| | Loader | | | |
| | | | | |
| 2 | Secondary | U-Boot |idbloader.img| 0x40 | pre-loader
| | Program | TPL/SPL | | |
| | Loader (SPL) | | | |
| | | | | |
| 3 | - | U-Boot | u-boot.itb | 0x4000 | including u-boot and atf
| | | | uboot.img | | only used with miniloader
| | | | | |
| | | ATF/TEE | trust.img | 0x6000 | only used with miniloader
| | | | | |
| 4 | - | kernel | boot.img | 0x8000 |
| | | | | |
| 5 | - | rootfs | rootfs.img | 0x40000 |
+--------+----------------+----------+-------------+---------+
RK3399的二级启动设备支持SPI NOR FLASH
、SPI NAND FLASH
、eMMC
、SD
以及USB load,可以将二级启动程序放置于上述静态存储设备中,RK3399通过读取ID BLOCK信息决定当前启动程序是否有效。
RK3399提供了镜像文件更新的软件工具AndroidTool.exe
,该工具可以更新二级启动程序及之后的所有镜像。
对于如何进入到固件更新模式,这取决于板卡的设计方式,例如我们手中的这块板子,它进入固件更新方式如下:
使用 Type-C 线连接开发板和主机,按住 recover 键然不要松开然后按 reset 键系统复位,大约两秒后,松开 recover 键。系统将提示发现 loader 设备。