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
1 ldr r0, =DMC_PHCONTROL0 2 ldr r1, 0x001010003 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內存初始化