转自:http://blog.csdn.net/qq_24696949/article/details/51156415
start.S:
1---异常向量表的构建;
2---nand启动(inand和SD)16字节校验头占位,详见Application note;
3---设置CPU进入SVC模式(可省略,ARM CPU复位时默认进入SVC模式),屏蔽中断(FIQ、IRQ)。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重定位;
12---清BSS段;
13---uboot一二阶段分界线start_armboot,从iRAM的BL1长跳到DDR的BL2。