SDRAM 初始化程序如下:
memsetup:
adrl r0, mem_cfg_val //
1. 这条指令必须用adrl,不能用ldr,不然nand会死掉,只能通过norflash来复原
2.原因:nand的0地址将被破坏,强制檫除才能使用
3.adrl是一条位置无关指令(类同bl / b / mov),而ldr是一条位置相关指令,当我们的启动代码,限定在前4k运行时候(即在steppingstone),要用位置无关指令。当使用一条位置相关指令,他会调到编译时即确定的位置上去,比如,SDROM去,而这时SDROM并没有初始化,这样会引起错误 。
ldr r1, =MEM_CTRL_BASE
add r3, r1, #4*13
2:
ldr r4, [r0], #4
str r4, [r1], #4
cmp r3, r1
bne 2b
mov pc, lr
.align 4
mem_cfg_val:
@ 存储控制器13个寄存器的设置值
.long 0x22011110 @ BWSCON
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
.long 0x008C07A3 @ REFRESH
.long 0x000000B1 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7