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内存初始化的主要内容,如果未能解决你的问题,请参考以下文章

s5pv210——初始化SDRAM

S5PV210启动过程详解

SDRAM初始化

X210开发板刷机方法

Cortex A8系列S5PV210的启动概述

S5PV210芯片的DRAM控制器介绍初始化DDR的流程分析