1. 程式人生 > >210內存初始化

210內存初始化

哈哈哈 stat 宏定義 類型 def 分享圖片 改變 bubuko nop

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
 1     ldr r0, =DMC_PHCONTROL0
 2     ldr r1, 0x00101000
3 str r1, [r0] 4 5 ldr r0, =DMC_PHCONTROL0 6 ldr r1, 0x00101002 7 str r1, [r0]

3、清除DQS部分,這部分我們沒有使用到,所以不用管

4、設置PhyControl0.ctrl_start為1

1     ldr r0, =DMC_PHCONTROL0
2     ldr r1, 0x00101003
3     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
1     ldr    r0, =DMC_MEMCONFIG0
2     ldr    r1, =0x20F00313                
3     str    r1, [r0]

8、設置PrechConfig 和 PwrdnConfig寄存器

技術分享圖片技術分享圖片

代碼配置如下,這兩個寄存器就默認他們本身初始化的配置就行

#define DMC_PRECHCONFIG 0xf0000014
1     ldr r0, =DMC_PRECHCONFIG
2     ldr r1, =0xff000000
3     str r1, [r0]
#define DMC_PWRDNCONFIG 0xf0000028
1     ldr     r0, =DMC_PWRDNCONFIG
2     ldr    r1, =0xFFFF00FF                    
3     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
 1     ldr    r0, =DMC_TIMINGAREF
 2     ldr    r1, =0x00000618                
 3     str    r1, [r0]
 4     
 5     ldr    r0, =DMC_TIMINGROW
 6     ldr    r1, =0x2B34438A                
 7     str    r1, [r0]
 8     
 9     ldr    r0, =DMC_TIMINGDATA
10     ldr    r1, =0x24240000
11     str    r1, [r0]
12     
13     ldr    r0, =DMC_TIMINGPOWER
14     ldr    r1, =0x0BDC0343                
15     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、16位,哈哈哈哈哈哈哈哈,我也不知道為什麽!特地又去下載了幾份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內存初始化