走到现在,停下来想一下,uboot的bl1阶段最大的使命就是初始化ddr,好让后面的大部队有充足的内存可以挥霍,所以下一步就需要好好看看和ddr相关的东西。
接着定位到lowlevel_init,看完之后发现里面有一个
internal_ram_init,这个是DDR初始化?往下看发现,代码就那么几行,心里就大概清楚肯定不是DDR初始化了。
(ps:嵌入式开发中,内存的硬件设计和软件设计应该是最难的了,软件这里要和硬件一起搞,才能配置好很多寄存器,我们公司DDR寄存器配置的参数都是硬件设的)。DDR初始化不是我现在这种水平能搞定的,所以决定移植开发板配套的DDR。
拷贝
samsung-uboot/cpu/s5pc11x/s5pc110目录下的
cpu_init.S到我们现在修改的uboot的板级目录下
u-boot-2014.10/board/Samsung/X210/。由于内存初始化也要放在BL1前面,所以我们要对
cpu_init.S进行裁剪,把没用的部分删除掉,减少下空间(当然不裁剪也可以,理论上应该是够用的)
Review一下
cpu_init.S,发现需要用到好多宏,然后就需要包含开发板配套的uboot的头文件,这里拷贝
samsung-uboot/include目录下的
s5pc110.h到
u-boot-2014.10/include目录下即可,由于
s5pc110.h又调用到了一些头文件,这里我嫌麻烦,就直接将需要的头文件的内容直接包含进了
s5pc110.h。编译后发现还缺了一些DDR配置参数,从三星版本的
smdkv210single.h中复制到
include/configs/目录下的
X210.h中。
接着修改DDR的板级信息,将
CONFIG_NR_DRAM_BANKS更改为2,然后删除
PHYS_SDRAM_3和
PHYS_SDRAM_3_SIZE,并将1和2的大小设置为256M。
之后在板级目录下出x210.c文件中修改,将
dram_init中的
PHYS_SDRAM_S_SIZE删除,将dram_init_banksize里面的bi_dram[2]删除。
然后在
lowlevel_init.s中追加DDR初始化,初始化完成后打印一个-。
修改完后,在主
makefile和
uboot.lds文件中修改需要链接的
cpu_init.o,具体修改方法上面说过了,和lowlevel_init如出一辙。编译后拷贝到sd卡再启动,打印出-,说明成功了。