210内存初始化
Posted 三石居士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了210内存初始化相关的知识,希望对你有一定的参考价值。
210的地址空间,我们所能访问的内存从0x2000_0000开始
打开S5PV210的手册,像6410一样,6410有内存初始化的顺序,2410是不是也有?210用的是DDR2的内存,所以我们能在第五章节找到这个
这张图就是210内存的初始化顺序
1、是保证供电充足稳定,我们不用管这一条
2、设置PhyControl0寄存器的一些位ctrl_start_point、ctrl_inc、ctrl_dll_on ,这三个位。来找到这个寄存器
代码如下:
在前面要宏定义这个寄存器地址
#define DMC_PHCONTROL0 0xf0000018
ldr r0, =DMC_PHCONTROL0 ldr r1, 0x00101000 str r1, [r0] ldr r0, =DMC_PHCONTROL0 ldr r1, 0x00101002 str r1, [r0]
3、清除DQS部分,这部分我们没有使用到,所以不用管
4、设置PhyControl0.ctrl_start为1
ldr r0, =DMC_PHCONTROL0 ldr r1, 0x00101003 str r1, [r0]
5、设置concontrol寄存器,在此刻,自动刷新计数器应该被关掉。来找到这个寄存器,关掉自动刷新,所以我们保存它的默认值
代码如下:
同样要宏定义这个寄存器的地址
#define DMC_CONCONTROL 0xf0000000
1 ldr r0, =DMC_CONCONTROL 2 ldr r1, 0x0fff1350 3 str r1, [r0]
6、设置Memcontrol寄存器,在此刻,所有掉电模式应该被关闭,还有一个内存类型应该选择
代码如下:
#define DMC_MEMCONTROL 0xf0000004
1 ldr r0, =DMC_MEMCONTROL 2 ldr r1, 0x00202400 3 str r1, [r0]
7、设置MemConfig0寄存器。如果有两片外部的内存芯片就设置MemConfig1寄存器
在本篇的第一幅图中,哦我们只配置DRAM0,所以是DMC0,其中的0~11位需要看板子上的内存芯片类型才能确定配置参数
配置代码如下:
#define DMC_MEMCONFIG0 0xf0000008
ldr r0, =DMC_MEMCONFIG0 ldr r1, =0x20F00313 str r1, [r0]
8、设置PrechConfig 和 PwrdnConfig寄存器
代码配置如下,这两个寄存器就默认他们本身初始化的配置就行
#define DMC_PRECHCONFIG 0xf0000014
ldr r0, =DMC_PRECHCONFIG ldr r1, =0xff000000 str r1, [r0]
#define DMC_PWRDNCONFIG 0xf0000028
ldr r0, =DMC_PWRDNCONFIG ldr r1, =0xFFFF00FF str r1, [r0]
9、根据内存AC参数,设置TimingAref, TimingRow, TimingData 和TimingPower寄存器
#define DMC_TIMINGAREF 0xf0000030
#define DMC_TIMINGROW 0xf0000034
#define DMC_TIMINGDATA 0xf0000038
#define DMC_TIMINGPOWER 0xf000003c
ldr r0, =DMC_TIMINGAREF ldr r1, =0x00000618 str r1, [r0] ldr r0, =DMC_TIMINGROW ldr r1, =0x2B34438A str r1, [r0] ldr r0, =DMC_TIMINGDATA ldr r1, =0x24240000 str r1, [r0] ldr r0, =DMC_TIMINGPOWER ldr r1, =0x0BDC0343 str r1, [r0]
10、如果需要QoS体系,就配置QosControl0~15 和QosConfig0~15寄存器,显然我们不需要这个
11、等待PhyStatus0.ctrl_locked这个位变成1,检查PHY DLL 是否被锁定
#define DMC_PHYSTATUS 0xf0000040
wait_lock: ldr r0, =DMC_PHYSTATUS ldr r1, [r0] and r2, r1, #0x4 cmp r2, #0x4 bne wait_lock
12、PHY DLL弥补了在内存操作中由处理、电压和温度引起的延迟量的改变。因此,为了更可靠的内存操作,PHY DLL不应该关闭。除了运行在低频率下它才能关闭。如果这种关闭模式被使用,就需要根据PhyStatus0.ctrl_lock_value[9:2]设置PhyControl0.ctrl_force位来纠正参数来修正延迟量。清除PhyControl0.ctrl_dll_on位可以把PHY DLL关闭。
13、在上电后确认 是否 稳定的时钟 的最小值是200us
这两步在查手册之后发现就是默认值,所以不需要我们设置
14、使用DirectCmd寄存器发出一个NOP命令来声称和维持CKE一个逻辑高电平
代码如下:
#define DMC_DIRECTCMD 0xf0000010
ldr r0, =DMC_DIRECTCMD ldr r1, =0x07000000 str r1, [r0]
15、等待最小限度400ns
16、使用DirectCmd寄存器发出一个PALL命令
ldr r1, =0x01000000 str r1, [r0]
17、使用DirectCmd寄存器发出一个EMRS2命令来对操作参数编程
ldr r1, =0x00020000 str r1, [r0]
细心的人有没有发现这个寄存器少了第19、15位,哈哈哈哈哈哈哈哈,我也不知道为什么!特地又去下载了几份S5PV210的手册,发现如出一辙,都没有19、16位!
18、使用DirectCmd寄存器发出一个EMRS3命令来对操作参数编程
ldr r1, =0x00030000 str r1, [r0]
19、使用DirectCmd寄存器发出一个EMRS命令来使能内存DLLs
ldr r1, =0x00010400 str r1, [r0]
20、使用DirectCmd寄存器发出一个MRS命令来复位内存DLLs
ldr r1, =0x00000542 str r1, [r0]
21、使用DirectCmd寄存器发出一个PALL命令
ldr r1, =0x01000000 str r1, [r0]
22、使用DirectCmd寄存器发出一个两次Auto Refresh命令
ldr r1, =0x05000000 str r1, [r0] ldr r1, =0x05000000 str r1, [r0]
23、在没有复位内存DLL时,使用DirectCmd寄存器发出一个MRS的命令对操作参数编程
ldr r1, =0x00000442 str r1, [r0]
24、等待最小限度200个时钟循环
25、使用DirectCmd寄存器发出一个EMRS的命令来对操作参数编程。如果没有使用OCD校准,发出一个EMRS命令来设置默认OCD校准。在那之后,发出一个EMRS命令来退出OCD校准模式并且对操作参数编程。
ldr r1, =0x00010780 str r1, [r0] ldr r1, =0x00010400 str r1, [r0]
26、如果有两个内存芯片,重复前面芯片1的14~25操作顺序
ldr r1, =0x07100000 str r1, [r0] ldr r1, =0x01100000 str r1, [r0] ldr r1, =0x00120000 str r1, [r0] ldr r1, =0x00130000 str r1, [r0] ldr r1, =0x00110400 str r1, [r0] ldr r1, =0x00100542 str r1, [r0] ldr r1, =0x01100000 str r1, [r0] ldr r1, =0x05100000 str r1, [r0] ldr r1, =0x05100000 str r1, [r0] ldr r1, =0x00100442 str r1, [r0] ldr r1, =0x00110780 str r1, [r0] ldr r1, =0x00110400 str r1, [r0]
27、设置ConControl寄存器开启自动刷新寄存器
ldr r0, =DMC_CONCONTROL ldr r1, =0x0FF02030 str r1, [r0] ldr r0, =DMC_PWRDNCONFIG ldr r1, =0xFFFF00FF str r1, [r0] ldr r0, =DMC_CONCONTROL ldr r1, =0x00202400 str r1, [r0]
28、如果需要使用掉电模式,可以设置MemControl寄存器。但是我们这里不需要。
到这为止,210的内存初始化就完成了。具体其中好多参数为什么要这么设置没可以参考U-boot这位老大哥,它是U-boot界的鼻祖
链接在这:链接:https://pan.baidu.com/s/1ghldktX 密码:ea3d,有需要的可以下载查看,建个SourceInsight工程,找找就行,这个压缩包不能再Windows操作系统下解压,要在Linux系统下解压。
以上是关于210内存初始化的主要内容,如果未能解决你的问题,请参考以下文章