- S5PV210上电后首先从IROM处执行已经固化的启动代码BL0,IROM(0xD001_0000~0xD001_FFFF,64K空间);
- 在BL0初始化过程中对设备进行判断,并从启动设备拷贝BL1(最大16k)到IRAM地方,IRAM(0xD002_0000,0xd0003_7FFF),其中0xD0020000~0xD0020010这16字节为BL1的检验信息和尺寸,并对BL1进行校验,校验通过转入BL1进行执行,BL1继续初始化,并拷贝BL2(最大80个字节)到IRAM进行校验,校验通过后进入BL2。
- BL2完成比较复杂的初始化工作,包括DRAM的初始化,完成后将OS代码拷贝到DRAM里面,并跳转到OS中执行完成启动引导。
BL0完成的工作:
关闭看门狗,初始化icache,初始化堆栈,初始化设备拷贝功能,设置系统时钟,拷贝BL1到iRAM,检验BL1的校验和,失败选择安全启动模式,成功跳转到IRAM执行
IRAM前16个字节的内容是:
地址 内容
0xD002_0000 BL1 的大小
0xD002_0004 必须写为 0
0xD002_0008 CheckSum
0xD002_000C 必须写为 0
检验方法如下:
for(count = 0;count < dataLength; count++)
{
buffer = (*(volatile u8*))(uBLAddr + count);
CheckSum = CheckSum + buffer;
}
//count--循环索引变量
//dataLength BL1的大小以字节为单位
//buffer从BL1里读一个字节的数据
//BL1的校验和
生成BL1的方法:
在从启动设备(如:NAND FLASH / SD 卡)拷贝 BL1 的前 16K 数据到 IRAM时,这 16K 数据中的前 16byte 中保存了校验和的值以及 BL1 的大小,在拷贝过程中 CPU 会计算
出当前 bin 文件中含’1’的个数,然后与校验和进行比较,如果二者相等则继续运行程序,否则,不执行。很巧,两个16.