start.S:
1---异常向量表的构建;
2---nand启动(inand和SD)16字节校验头占位,详见Application note;
3---设置CPU进入SVC模式(可省略,ARM CPU复位时默认进入SVC模式),屏蔽中断(FIQ、IRQ)。
4---关闭MMU、刷新cache;
10---建立TTB(将基地址TTB设置到cp15的c2寄存器中)并使能MMU(详细见cortex A8 reference manual);
5---片内RAM中第一次设置栈(lowlevel_init.S中即将调用别的函数);
288行调用lowlevel_init
①lr压栈;
②检查复位状态(冷上电、热启动、睡眠状态下的唤醒等);
③恢复IO状态;
④关狗;
⑤供电锁存;
⑥第一次判断代码执行位置(决定是否执行⑦);
⑦初始化时钟和DDR;
⑧初始化串口并输出“OK”(串口中最早的输出信息,便于阶段性调试);
跳出lowlevel_init,返回start.S
6---第二次设置栈(0x33E00000,即uboot基地址下方);
7---第二次判断链接地址和运行地址是否相同,决定uboot是否重定位;
8---读0xD0037488地址处的值,判断从SD卡的通道0(inand)还是通道2(SD卡)启动;
9---movi_bl2_copy(第二个参数:开始扇区号为49)实现uboot重定位;
将0x
C0000000~0xD
0000000的256MB映射到了0x30000000~0x40000000,其他地址原地映射。
11---第三次设置栈(uboot起始地址上方2MB处,无浪费的安全地段);
12---清BSS段;
13---uboot一二阶段分界线start_armboot,从iRAM的BL1长跳到DDR的BL2。