以nand启动为例说明uboot启动过程:
1、 首先,设置从nand启动,硬件NFC会自动将nand前8k copy到ESRAM中,然后将ESRAM的地址映射为0,接着pc指针从0地址处的第一条指令开始执行,即uboot的start.s代码中 b reset第一次执行,此时pc在ESRAM中,故会执行自copy,将uboot copy到内存中。
2、 程序从ESRAM开始执行,首先copy ESRAM的前8k到内存的0x4040 0000处,因为从nand copy uboot时会用到全局变量nfc_init、read_uboot。然后开始执行nfc_init、read_uboot(此两个函数此时在内存的0x4040 0000中),从nand copy uboot到0x4050 0000中,并将pc指针赋值为0x4050 0000,下一步将从0x4050 0000处开始执行。
3、 pc跳到0x4050 0000处后,执行第一条程序,即第二次执行uboot的start.s的 b reset,此时代码位于0x4050 0000,reset后,将跳到start.s中的skip_uboot_copy处执行,在此处将0x4050 0000后面的代码copy到0x4040 0000,并将pc赋值为0x4040 0000
4、 程序从0x4040 0000处开始执行,第三次执行start.s中的 b reset。
睡眠唤醒移植的原因:
由于dddr3的初始化代码比较多,因此将uboot分成了三步,第一步主要是设置时钟等,第二部初始化ddr3和和自考贝。前8k已经放不下,所以将上述第二步以后放在第二阶段。
Ddr3 上uboot的功能描述:以nand启动为例
分3步走,前8K只有从NAND或者SD读取数据的代码。把更大的代码读到ESRAM中运行。后面的SDBOOT2是初始化DDR3用的,再后面才是uboot。
步骤:
1、前8K是读代码用的,即存放的是sdboot1,设置nand启动后,NFC把前8k拷贝到ESRAM中,并将从ESRAM中第一条代码处执行,sdboot1读取nand中第二个8k到ESRAM中(地址0xb2002000上),并将pc赋值为0xb2002000,即接着执行第二个8k中的代码。
2、在第2个8k中的代码即为sdboot2和uboot,先执行sdboot2,初始化DDR3,把此8k拷贝到0x4040 0000处,然后再把uboot从nand拷贝到0x4050 0000处,以后便跟上面一样。
0 件のコメント:
コメントを投稿