1.内存的分类:
下面主讲6410内存初始化
打开6410的手册192页
先看第一句,翻译过来就是给memc_cmd寄存器写入0b100,使DRAM寄存器处于配置的状态。
我们找到这个memc_cmd寄存器,地址是0x7e001004,所以代码如下ldr r0, =0x7e001004ldr r0, =0x7e001004
ldr r0, =0x7e001004 mov r1, #0x4 str r1, [r0]
这就使DRAM寄存器处于配置的状态。
接着看第二句,写内存时序参数、芯片配置、和身份配置寄存器
这一部分和2440的芯片的内存配置差不多,不一样的是2440的内存配置只有这么多,没有上面的使DRAM寄存器处于配置的状态。
接下来就一个一个配置寄存器
这个寄存器有32位,每个位都有说明,具体看对这个寄存器的说明
31位到23位是被保留的,所以不需要看。
接下来的这个位具体要看你板子上的内存芯片的参数来配置,所以我只能按照我的板子来设置。
ldr r0, =0x7e00100c ldr r1, =0x00010012 str r1, [r0]
再接着是这个寄存器
这个是设置DRAM的刷新周期,只有0~14位
ldr r0, =0x7e001010 ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) ) str r1, [r0]
这个具体为什么刷新时间这个数,我目前也没弄清楚
再接着是这个寄存器
具体什么意思看英文,是这样设置
ldr r0, =0x7e001014 mov r1, #(3 << 1) str r1, [r0]
由于寄存器众多,这里就不再一一讲解
给出第二步的初始化代码
ldr r0, =0x7e001010 ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e001014 mov r1, #(3 << 1) str r1, [r0] ldr r0, =0x7e001018 mov r1, #0x1 str r1, [r0] ldr r0, =0x7e00101c mov r1, #0x2 str r1, [r0] ldr r0, =0x7e001020 ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e001024 ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e001028 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e00102c ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e001030 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e001034 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e001038 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e00103c mov r1, #0x07 str r1, [r0] ldr r0, =0x7e001040 mov r1, #0x02 str r1, [r0] ldr r0, =0x7e001044 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e001048 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, [r0] ldr r0, =0x7e00100c ldr r1, =0x00010012 str r1, [r0] ldr r0, =0x7e00104c ldr r1, =0x0b45 str r1, [r0] ldr r0, =0x7e001200 ldr r1, =0x150f8 str r1, [r0] ldr r0, =0x7e001304 mov r1, #0x0 str r1, [r0]
这里第二步就结束
接下来看第三步
等待200us的系统上电和时钟稳定
接下来第四步
执行内存初始化程序
代码如下
@issue NOP ldr r0, =0x7e001008 ldr r1, =0xc0000 str r0, [r0] @issue prechargeall ldr r0, =0x7e001008 ldr r1, =0x0 str r0, [r0] @issue refresh ldr r0, =0x7e001008 ldr r1, =0x4 str r0, [r0] @issue refresh ldr r0, =0x7e001008 ldr r1, =0x4 str r0, [r0] @issue mrs ldr r0, =0x7e001008 ldr r1, =0xa0000 str r1, [r0] @issue mrs ldr r0, =0x7e001008 ldr r1, =0x80032 str r1,[r0]
接下来第五步
给这个memc_cmd寄存器写入000,是他处于等待状态
ldr r0, =0x7e001004 mov r1, #0x0 str r1, [r0]
接下来第六步
检查内存的状态是否为b01,01就代表着准备
check_ready: ldr r0, =0x7e001000 ldr r1, [r0] mov r2, #0x3 and r1, r1, r2 cmp r1, #0x1 bne check_ready mov pc, lr
到这里6410初始化就完成了
下面附上2440内存初始化程序
#define mem_contrl 0x48000000 init_sdram: ldr r0, =mem_contrl add r3, r0, #4*13 adrl r1, mem_data 0: ldr r2, [r1], #4 str r2, [r0], #4 cmp r0, r3 bne 0b mov pc, lr mem_data: .long 0x22000000 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00018001 .long 0x00018001 .long 0x008c04f5 .long 0x000000b1 .long 0x00000030 .long 0x00000030