zoukankan      html  css  js  c++  java
  • 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系统下解压。

     

     

  • 相关阅读:
    jeos没有消亡,但看 debian 的 netinst .iso格式,那就是jeos的系统!
    ubuntu-14.04.x-desktop-amd64.iso:安装Oracle11gR2
    ubuntu-16.04.1-desktop-amd64.iso:ubuntu-16.04.1-desktop-amd64:安装Oracle11gR2
    JDBC 基础
    How to check for null/empty/whitespace values with a single test?
    STRING DELIMITED BY SIZE
    分行符
    甲醛超标
    notepad++ 去空行
    shell脚本中的set -e和set -o pipefail
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/8366919.html
Copyright © 2011-2022 走看看