2013年1月31日木曜日

世界早已cortex-a8了,我也得跟一下所以QT210的开板。
        长话开始搞SDUBOOT,从SDUBOOT
        s5pv210_irom_applicationnote_preliminary_20091126.pdf知道,s5pv210BL0BL1BL2段。BL0s5pv210内部IROM固化的代段代根据OM引脚配置状选择从哪个外部存储设备BL1段代实际BL1就是我们编写的UBOOT的前8K段代要包含完整的将后半部UBOOT复制和清bss段的功能,当然我要从SD卡启动烧写在上面的UBOOTOM引脚就必配置SD卡启配置)。
            1
从上可知,从sdBL0的代是从第512个字节处开始加什么要这样做呢?由于以后功能展的需要三星的件工程写的固化到IROM中的BL0是从SD卡的512节处BL1的,他就是这样写的,我们对应UBOOT放置在SD卡中的位置就要往后移512,后面有介怎么指定把uboot写到sd卡指定的位置的命令。
       有一定要注意如下所示的地方:
                                                                                          2
BL1之前要加16个字部信息。也就是在真正的UBOOT第一条指令之前要加16个字部信息,于是就有我所看到的uboot如下的用宏定的一段:
  1. #if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)  
  2.     .word 0x2000  
  3.     .word 0x0  
  4.     .word 0x0  
  5.     .word 0x0  
以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处,以后便跟上面一样。