前言
在进行s5pv210的使用时,由于外设的初始化要求和空间大小,需要在IRAM中执行SPL代码进行一些外设的初始化,随后将u-boot加载到指定的DRAM中。因此,对于SPL的了解和学习十分有必要,而且SPL中的许多操作涉及到ARM相关功能和寄存器的操作,由此也展开对裸机程序的学习。可以通过下图来查看整个设备的启动流程。
从上图中可以看出,在IROM中的romcode执行完成后,会将Booting Device中的BL1(SPL)先load到IRAM中,因为IRAM不需要初始化,可以直接上电使用,则加载SPL后就可以执行,完成时钟和DRAM等外设的初始化后,就可以加载BL2(U-Boot)完成其他外设的初始化。为什么需要BL1?
- IRAM空间不足,无法加载全部u-boot。且为了节省成本
- DRAM需要进行初始化才可以使用,因此需要有一段开机可以执行的代码来进行DRAM的初始化
由于在执行romcode时会从Booting Devices中读取BL1到IRAM中,所以romcode中肯定存在Booting Devices的驱动。
在编译u-boot时,可以编译出spl,那spl和u-boot的区别到底在哪里,这就需要我们分析一下u-boot中spl的编译过程
1. 根目录makefile分析
在编译u-boot时,在执行完make s5pv210_defconfig
而生成对应的配置文件后,则可以通过执行make
生成设备运行需要的bin文件。而执行make
命令时,肯定会去根目录的Makefile中执行。
all: .binman_stamp inputs
起始目标为all
,通过上述代码可以看出该目标依赖于inputs
,其生成规则如下:
inputs: $(INPUTS-y)
通过代码可以看出inputs
依赖于$(INPUTS-y)
,其中INPUTS-y
作为一个变量,里面包含多个内容,代码如下:
INPUTS-y += u-boot.srec u-boot.bin u-bo