文章目錄
- 記憶體的分類
- SRAM
- SDRAM
- DDR(Double Data Rate SDRAM)
- DRAM
- 記憶體的內部結構
- 尋址資訊
- 2440記憶體初始化
- 使用芯片為HY57V561621
- 存盤控制器
- 6410記憶體初始哈
- 地址空間
- 主存盤區劃分
- 記憶體芯片連接
- 初始化流程
- 代碼
- 210記憶體初始化
- 地址空間
- 記憶體芯片連接
- 初始化
- mem.S
參考國嵌
記憶體的分類
SRAM
SRAM:它是一種具有靜止存取功能的記憶體,不需要定期重繪電路就能保存它內部存盤的資料,其優點:存取速度快;但是缺點是:功耗大,成本高,常用作存盤容量不高,但存取速度快的場合,比如steppingstone.
SDRAM
SDRAM(Synchronous Dynamic Random Access Memory)
同步: 記憶體作業需要有同步時鐘,內部的命令的發送
與資料的傳輸都以該時鐘為基準,
動態: 存盤陣列需要不斷的重繪來保證資料不丟失,
隨機: 是指資料不是線性依次存盤,而是自由指定地
址進行資料讀寫,
備注:2440開發板上使用的記憶體通常是SDRAM.
DDR(Double Data Rate SDRAM)
“雙倍速率同步動態隨機存盤器”,
與早期的SDRAM相比,DDR除了可以在時鐘脈沖的上升沿傳輸資料,還可以在下降沿傳輸信號,這意味著在相同的作業頻率下,DDR的理論傳輸速率為SDRAM的兩倍,
DDR2則在DDR的基礎上再次進行了改進,使得資料傳輸速率在DDR的基礎上再次翻倍,
備注:6410開發板通常采用DDR記憶體
210開發板通常采用DDR2記憶體
在嵌入式硬體體系中,除了CPU內部的"steppingstone"采用SRAM外,板載記憶體一般會采用DRAM,而DRAM又可以分為SDRAM,DDR,DDR2等,
DRAM
DRAM:它的基本原件是小電容,電容可以在兩個極板上保留電荷,但是需要定期的充電(重繪),否則資料會丟失,缺點:由于要定期重繪存盤介質,存取速度較慢,
記憶體的內部結構
記憶體的內部如同表格,資料就存放在每個單元格中,資料讀寫時,先指定行號(行地址),再指定列號(列地址),我們就可以準確地找到所需要的單元格,而這張表格的稱為:
Logical Bank(L-Bank).

由于技術、成本等原因,一塊記憶體不可能把所有的單元格都做到一個L-Bank,現在記憶體內部基本都會分割成4個L-Bank,

尋址資訊
- L-Bank選擇信號
- 行地址
- 列地址
2440記憶體初始化
27根地址線

8個片選信號

為了擴大外設的訪問范圍,S3c2440芯片提供了8個片選信號
nGCS0~nGCS7
當某個片選信號nGCSx有效時,則可以通過27根地址線去訪問對應這個片選的128MB空間,
由于有8個片選,所以2440芯片能訪問的外設空間總共為8*128MB=1GB而1G(Ox40000000)以上的空間,則安排給了2440內部的暫存器,訪問這些內部的暫存器,則是通過32位的處理器內部總線來完成的,

使用芯片為HY57V561621

存盤控制器

因為沒有使用bank7的UB/LB因此31位為0,等待狀態設定為0,因此30位為0,因為是將兩個16位的記憶體芯片,然后拼成的32位的,因此29:28設定為10
同樣bank6和bank7一樣,都是連接sdram,因此值一樣,后面的5-0都還沒有使用,全部保持為0,因此總的值為0x22000000

沒有用到bank0-5,因此值不變都為0x0700

首先16:15位決定是什么型別,因為我們這里是sdram因此設定為11
因為用的SDRAM因此只用設定0-3位
首先是設定延時是幾個始終

這里應該設定為2個時鐘,為00
后面的SCAN是設定為列地址數,通過HY576這個芯片手冊

這里應該設定為9位,01
0x11000000000000001=0x18001

然后是負責重繪的控制暫存器
23位設定為1要重繪
22位設定為0自動重繪
21:20設定為00兩個時鐘

19:18設定為11一行重繪時間通常為17個時鐘
17:16設定為00不使用的
15:11設定為00000也是不使用的
10:0重繪周期設定

要根據HCLOCK設定,是核頻率的1/4也就是100MHZ,因此設定為1269就是了
也就是10011110101
因此總的下來這個暫存器應該設定為0x8c04F5

7位控制ARM core突發模式操作是否使用,一般設定為1
6位未用為0
5位掉電模式打開設定位1
4位設定位1
3位為0
2:0bank大小設定因此設定為00164M
總的下來設定為0xb1

設定bank6和bank7的模式設定(設定一個其余一個相同即可)
只需要設定CL域就行了
是用來設定CAS延遲,根據圖來

指的是從RAS變低到CAS變低的時鐘數,這里是三個時鐘
因此為011其余全部為0
因此總的為0x30同樣bank7對應的也一樣
6410記憶體初始哈
地址空間
S3C6410處理器擁32位地址總線,其尋址空間為4GB,其中高2GB為保留區,低2GB區域又可劃分為兩部分:主存盤區和外設區,

主存盤區劃分

外設區存放著暫存器這些,主存盤區是記憶體和boot這些
記憶體芯片連接
6410的芯片是用的兩片128M記憶體組成的256M的,

初始化流程

-
memc cmd設定到’b100,使DRAM控制器進入“Config”狀態,
-
芯片配置和id配置暫存器以及時隙引數等,
-
等待200us允許SDRAM電源和時鐘穩定,然而,當CPU開始作業時,電源和時鐘已經穩定了(這個作業可以不做)
-
執行記憶體初始化序列,(因為使用的是ddr的記憶體,因此選擇第二個)

-
將memc cmd編程為b000,使DRAM控制器進入’Ready’狀態
-
檢查memc stat中的記憶體狀態欄位,直到記憶體狀態變為b01,即’Ready’,
在最前面其實有一步,設定引腳為data pin

代碼

檢查最后兩位是否為ready 01

210記憶體初始化
地址空間

0地址也是映射區
記憶體芯片連接
210開發板的記憶體通常采用8片或者4片128M*8bit芯片級聯的辦法,
初始化
為了支持高速存盤設備,DRAM控制器使用SEC DDR PHY介面,該控制器包括一個先進的嵌入式調度器,以有效地利用記憶體設備和優化的管道階段,以減少延遲,S5PV210有兩個獨立的DRAM控制器和埠,DMCO和一代,DMCO最大支持512MByte和DMC1 1GByte記憶體大小,但兩個控制器必須使用相同型別的記憶體
這里采用初始化DRAM 0
采用的是DDR2

DDR2記憶體型別的初始化順序:
-
為了為控制器和存盤設備提供穩定的電源,控制器必須斷言并保持CKE到邏輯低電平,然后應用穩定時鐘,注意:XDDR2SEL應該是高電平,以保持CKE為低,
-
設定PhyControl0.ctrl_start_point和PhyControl0.ctrl_inc位域根據時鐘頻率來校正值,設定PhyControl0.ctrl_dll_on bit-field to '1’打開PHY DLL

-
DQS清洗:設定PhyControl1.ctrl_shiftc和 PhyControl1.ctrl_offsetc 位域,根據時鐘頻率和記憶體tAC引數來校正值,(因為現在只用DRAM 0,因此1暫時不管)
-
設定PhyControl0.ctrl_start位域為’1

-
設定ConControl,此時,自動重繪計數器應該關閉(默認值即可),

-
設定MemControl,此時,所有的關機模式都應該關閉,

-
設定MemConfig0暫存器,如果有兩個外部記憶體芯片,設定MemConfig 1暫存器,

-
設定 PrechConfig和PwrdnConfig暫存器,


-
根據記憶體交流引數設定TimingAref、TimingRow、TimingData和TimingPower暫存器




-
如果需要QoS方案,則設定QosControl0-15和QosConfig0-15暫存器,
-
等待PhyStatus0.ctrl_locked位域為’1’,檢查PHY DLL是否為locked

-
PHY DLL補償記憶體運行程序中由于行程、電壓和溫度(PVT)變化而引起的延遲量的變化,因此,為了可靠的運行,PHY DLL不應該關閉,除了低頻運行外,它可以關閉,如果使用off模式,請設定PhyControl0.ctrl_force bit-field根據PhyStatus0.ctrl_lock_value[9:2]欄位修正延遲量,清除PhyControl0.ctrl_dll_on bit-field關閉PHY DLL,

-
確認開機后是否發出穩定時鐘最小200us

-
使用DirectCmd暫存器發出NOP命令來斷言并將CKE保持在一個邏輯高級,
-
等待最小400ns
-
使用DirectCmd注冊器發出PALL命令
-
使用DirectCmd寄存器發出EMRS2命令來撰寫運行引數,
-
使用DirectCmd暫存器發出EMRS3命令來撰寫運行引數,
-
使用DirectCmd注冊器發出EMRS命令來啟用記憶體dll
-
使用DirectCmd暫存器發出MRS命令來重置記憶體DLLs,
-
使用DirectCmd注冊器發出PALL命令
-
使用DirectCmd暫存器發出兩個自動重繪命令,
-
使用DirectCmd暫存器發出MRS命令來編程運行引數,而不重置記憶體DLL,
-
等待至少200個時鐘周期,
-
使用DirectCmd暫存器發出EMRS命令來撰寫運行引數,如果不使用OCD校準,可通過EMRS命令設定“OCD校準默認值”,之后,發出EMRS命令退出OCD校準模式,并對運行引數進行編程
-
如果有2個外置記憶體芯片,則對“chip1”記憶體設備執行14-25
-
將control設定為打開自動重繪計數器,
-
如果需要掉電模式,請設定MemControl暫存器,
mem.S
#define DMC_PHYCONTROL0 0xf0000018
#define DMC_PHYCONTROL1 0xf000001c
#define DMC_CONCONTROL 0xf0000000
#define DMC_MEMCONTROL 0xf0000004
#define DMC_MEMCONFIG0 0xf0000008
#define DMC_MEMCONFIG1 0xf000000c
#define DMC_PRECHCONFIG 0xf0000014
#define DMC_TIMINGAREF 0xf0000030
#define DMC_TIMINGROW 0xf0000034
#define DMC_TIMINGDATA 0xf0000038
#define DMC_TIMINGPOWER 0xf000003c
#define DMC_PHYSTATUS 0xf0000040
#define DMC_DIRECTCMD 0xf0000010
#define DMC_PWRDNCONFIG 0xf0000028
#define DMC0_MEMCONTROL 0x00202400
#define DMC0_MEMCONFIG_0 0x20F00313
#define DMC0_MEMCONFIG_1 0x00F00313
#define DMC0_TIMINGA_REF 0x00000618
#define DMC0_TIMING_ROW 0x2B34438A
#define DMC0_TIMING_DATA 0x24240000
#define DMC0_TIMING_PWR 0x0BDC0343
.globl mem_init
mem_init:
@ step 2.1
ldr r0, =DMC_PHYCONTROL0
ldr r1, =0x00101000
str r1, [r0]
@ step 2.2
ldr r0, =DMC_PHYCONTROL0
ldr r1, =0x00101002
str r1, [r0]
@ step 4
ldr r0, =DMC_PHYCONTROL0
ldr r1, =0x00101003
str r1, [r0]
@ step 5
ldr r0, =DMC_CONCONTROL
ldr r1, =0x0FFF1350
str r1, [r0]
@ step 6
ldr r0, =DMC_MEMCONTROL
ldr r1, =DMC0_MEMCONTROL
str r1, [r0]
@ step 7
ldr r0, =DMC_MEMCONFIG0
ldr r1, =DMC0_MEMCONFIG_0
str r1, [r0]
@ step 8
ldr r0, =DMC_PRECHCONFIG
ldr r1, =0xFF000000
str r1, [r0]
@ step 9.1
ldr r0, =DMC_TIMINGAREF
ldr r1, =DMC0_TIMINGA_REF
str r1, [r0]
@ step 9.2
ldr r0, =DMC_TIMINGROW
ldr r1, =DMC0_TIMING_ROW
str r1, [r0]
@ step 9.3
ldr r0, =DMC_TIMINGDATA
ldr r1, =DMC0_TIMING_DATA
str r1, [r0]
@ step 9.4
ldr r0, =DMC_TIMINGPOWER
ldr r1, =DMC0_TIMING_PWR
str r1, [r0]
@ step 11
wait_lock:
ldr r0, =DMC_PHYSTATUS
ldr r1, [r0]
and r2, r1, #0x4
cmp r2, #0x4
bne wait_lock
@ step 14
ldr r0, =DMC_DIRECTCMD
ldr r1, =0x07000000
str r1, [r0]
@ step 16
ldr r1, =0x01000000
str r1, [r0]
@ step 17
ldr r1, =0x00020000
str r1, [r0]
@ step 18
ldr r1, =0x00030000
str r1, [r0]
@ step 19
ldr r1, =0x00010400
str r1, [r0]
@ step 20
ldr r1, =0x00000542
str r1, [r0]
@ step 21
ldr r1, =0x01000000
str r1, [r0]
@ step 22.1
ldr r1, =0x05000000
str r1, [r0]
@ step 22.2
ldr r1, =0x05000000
str r1, [r0]
@ step 23
ldr r1, =0x00000442
str r1, [r0]
@ step 25.1
ldr r1, =0x00010780
str r1, [r0]
@ step 25.2
ldr r1, =0x00010400
str r1, [r0]
@ step 26, repeat step14~step25
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]
@ step 27
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]
mov pc, lr
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299758.html
標籤:其他
下一篇:Unity筆記-04
