學生在進行開發時,經常對內存這塊有疑問,下面將使用exynos4412芯片的華清開發板(fs4412)為例作為講解。
使用到的手冊如下:
FS4412_CoreBoard_V2.pdf
FS4412-DevBoard-V5.pdf
SEC_Exynos4412_Users Manual_Ver.1.00.00.pdf
簡述
exynos4412存儲分下面幾塊:
iROM:啟動鏡像區,存放三星預置的程序,也叫bl0
iRAM :內部內存區,加載通過OM選擇后的啟動程序,通常加載bl1、bl2
SMC:靜態內存區,Static Read Only Memory Controller ,通常用于映射外部總線上設備,如網卡等,該區域被分為4個bank,每個16M(對應硬件手冊xm0開頭的)
SFR:特殊功能寄存器區,通常用于映射SOC內部設備,如GPIO等
DMC:動態內存區,就是我們通常意義上的內存。
ps:動態內存(由于動態內存本身不供電,需要不斷供電刷新,保存數據,所以叫動態內存)(對應硬件手冊xm1和xm2開頭的)
硬件原理(SMC)
Exynos4412中有1個獨立的SMC,分為4個bank
沒有行地址和列地址,整個芯片可用內存大小:2^8bit=256/16=16Byte
外部設備片選時,只能選0或者1.
硬件原理(DMC)
Exynos4412中有兩個獨立的DRAM控制器,分別叫DMC0和DMC1,可以接2組不同的DDR內存。DMC0和DMC1分別支持大1.5GB的DRAM,它們都支持DDR2/DDR3和LPDDR2等,512 Mb, 1 Gb, 2 Gb, 4 Gb and 8 Gbit的內存設備,支持16/32bit的位寬。DRAM0 對應的地址是0x4000_0000~0xAFFF_FFF共1.5GB,DRAM1 對應的地址是0xA000_000~0x0000_0000共1.5GB。
4412的1GB的DRAM是由4片大小為256M*16的DDR3芯片組合而成(查看芯片型號可以得到)
芯片型號:K4B4G1646B-HYXX
第一位: K表示內存
第二位:4表示falsh類型 DRAM
第三位:B表示DDR3
第4~5位. Density(注:實際單位應該是bit,而不是Byte),我們的是4Gbit=4G/16(數據位)=256MByte
第6~7位. organization:數據線引腳個數,我們的是16
分析完成,開發板上共有4片這樣的內存芯片,總容量就是256M*4=1G
這四片DDR 芯片被分成了兩兩一組,組成32位數據,四片都是掛接到DMC0處
總圖如下:
分解圖如下(只列了一半):
從上兩圖可以看出,這四片DDR 芯片被分成了兩兩一組,組成32位數據,四片都是掛接到DMC0處,如下:
· 左邊一片16位,右邊16位,組成32位數據
· 全部芯片片選掛到CS0:
· bank線數:
3路線(BA0-BA2),有2^3組合,也就是一個芯片上,bank有8個
· 地址線
地址線數:15(A0-A14)
ps:一個芯片內存大支持:2^(bank線數+地址線)=2^33=8Gbit/16=512MByte
· 行列地址線
nRAS,nCAS:復用地址線行和列選擇,同一時刻只能有一種地址線使用(不是行就是列),我們的板子上芯片有256M(2^28),28-3(bank)-15(行地址)=10(列地址)
· 尋址流程
這個操作順序是,先片選,CS拉低,然后,當RAS拉低時,表示傳過的是行地址,是A0-A14,15位;當CAS拉低時,表示傳過來的是列地址,是A0-A9,列地址多的幾位是預留的用來擴展內存,一個芯片內存多可以擴展到512M。
內存劃分多個bank原因
由于DDR是不自備充電電路的,所以,每隔一段時間,內存控制器就會刷新一次電路,也就是要充一次電,如果只有一個Bank,那么結果就是在某一時刻,要么都充電,要么都不充電。
像上面這樣分成了8個Bank,當我對000充電的時候,我還可以在010或是剩下的別的Bank中讀取數據,這樣就減小了等待的時間,不用說當電路刷新時,不能讀取數據了。
exynos板子上,每個bank大小= 256M/8=32M(1個芯片上有2^3個bank)
內存計算方法
SDRAM容量計算
計算可尋址單元的數量(32位)
地址線數(管腳數):11(A0-A10)
bank線數:2(BA0-BA1) 可以組合出2^2個 bank
大行線數=211(例如地址線的編號,11個管腳線,組合有211種)
大列線數=211(例如地址線的編號,11個管腳線,組合有211種)
一個bank中總單元數=211x 211
芯片中總單元數=(bank個數)×(一個bank中總單元數)
= 22 x 211 x 211
= 224
備注:
因為行線與列線上傳輸的數據是經過編碼(組合方式)的,而不是直接的行號和列號,
也就是說每個bank里有213 個行和 29 個列,并非只有13行和9列。
所以要尋址的單元在第(2行線數據 )行,第( 2列線數據)列。
例如bank0,行線數據是0 0000 0010 0000,列線數據是0 0000 1000,
意思是要獲取行32,列8的單元的數據,而不是行5,列3的數據。
如果行線數據是 0 0010 1101 0110,列線數據是0 0011 1010,意思是獲取行726,列58的單元的數據。
例如一個32MB的SDRAM芯片中有4個Logic-bank(邏輯bank),位寬16bit(即每個單元是16bits),地址線13條,大行線數13,大列線數9。計算得:
一個bank的單元數= 213 x 29= 4194304(即4M)。
芯片總單元數=4Banks × 4M units = 16M units 。
芯片總位數=16M units × 16bits/per_unit = 256M bits 。
芯片總字節數=256M bits/8 = 32M Bytes 。
內存初始化流程
在三星提供的數據手冊《SEC_Exynos4412_Users Manual_Ver.1.00.00》的第1046頁提供給了一段關于LPDDR2-S4的初始化步驟,LPDDR2表示低功耗DDR2,DDR3的初始化過程應和這個一樣,我們就按這個過程來初始化DDR3
初始化流程,如手冊中 18.3.1 LPDDR2-S4 描述:
18.3.1 LPDDR2-S4
Use the sequence given here to initialize LPDDR2 devices. Unlessspecified otherwise, these steps are
mandatory. Note that the memory CK/CKn must be less than or equal to50 MHz before you initialize the
LPDDR2-S4 device.
1. DMC must assert and holdCKE to a logic low level to provide stable power for memory device and thenapply
stable clock.
2. Set thePhyControl0.ctrl_start_point and PhyControl0.ctrl_inc bit-fields to a correctvalue according to clock
frequency. Set the PhyControl0.ctrl_dll_on bit-field to"1" to activate the PHY DLL.
3. DQS cleaning: Set thePhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc bit-fields to theappropriate value
according to clock frequency, board delay, and memory tDQSCKparameter.
4. Set thePhyControl0.ctrl_start bit-field to "1".
5. Set the ConControl. Atthis moment, an auto-refresh counter should be disabled.
6. Set the MemControl. Atthis moment, all power down modes should be disabled.
7. Set the MemConfig0register. When there are two external memory chips, set the MemConfig1register.
8. Set the PrechConfig andPwrdnConfig registers.
9. Set the TimingAref,TimingRow, TimingData, and TimingPower registers according to memory AC
parameters.
10. Set the QosControl0 to 15and QosConfig0 to 15 registers when a certain bus master requires QoS scheme.
11. Wait for thePhyStatus0.ctrl_locked bit-fields to change to "1". Verify whetherPHY DLL is locked.
PHY DLL compensates the changes of delay amount that pressure,volume, and temperature variation
causes during memory operation. Therefore, you should not power offPHY DLL for reliable operation.
It can be in power-off mode except when it runs at low frequency.When you use the power-off mode,
set the PhyControl0.ctrl_force bit-field to the correct valueaccording to the PhyStatus0.ctrl_lock_value[9:2]
bit-field for fix delay amount. Clear the PhyControl0.ctrl_dll_onbit-field to turn off PHY DLL.
12. Set thePhyControl1.fp_resync bit-field to "1" to update DLL information.
13. Confirm that Clock Enable(CKE) is in a logic low level at least 100ns after power on.
14. Issue a NOP command byusing the DirectCmd register to assert and hold CKE to a logic high level.
15. Wait for a minimum of 200ms.
16. Issue a MRS command byusing the DirectCmd register to reset memory devices and program the operating
parameters.
17. Wait for minimum of 1 μs.
18. Issue a MRR command byusing the DirectCmd register to poll the DAI bit of the MRStatus register.
This is to know whether or not Device Auto-Initialization iscomplete.
19. If there are two externalmemory chips, execute step 14 to 19 for chip1 memory device.
20. Set the ConControl toturn on an auto-refresh counter.
21. Set MemControl registerwhen you require power-down modes.
翻譯上面的步驟:
1、DMC功能必須設置,并且要保持CKE為低電平,以便可以提供穩定的電源和時鐘給DDR
2、根據時鐘頻率設置PhyControl0.ctrl_start_point 和PhyControl0.ctrl_inc bit-fields,并且設置PhyControl0.ctrl_dll_on bit-field 為 "1" 已啟動PHY DLL。
3、DQS 清除,根據時鐘頻率、板子延時和芯片的tDQSCK參數設置PhyControl1.ctrl_shiftc 和PhyControl1.ctrl_offsetcbit-fields。
4、設置 PhyControl0.ctrl_start bit-field 為"1"。
5、設置ConControl,此時,不能使能自動刷新計數器(auto-refresh counter )。
6. 設置MemControl,此時,所有的power down模式應關閉。
7、設置MemConfig0 寄存器,當外面有兩片存儲芯片時,設置MemConfig1寄存器。
8、設置 PrechConfig和 PwrdnConfig寄存器。
9、根據DDR3的 AC參數設置TimingAref, TimingRow, TimingData, 和 TimingPower寄存器。
10、當總線主控者需要QoS時序參數時,設置QosControl0 到15寄存器和QosConfig0 到 15寄存器。
11、等待 PhyStatus0.ctrl_locked bit-fields 變成 "1",以確定 PHY DLL 是否鎖定。PHY DLL 可以補償壓力、體積?和溫度等環境的變化,因為在芯片工作期間,我們不能關閉了PHY DLL的電源,只有當他在低的時鐘頻率時才可以切換到Power-off 模式,當我們用power-off 模式,參考PhyStatus0.ctrl_lock_value[9:2]的延時參數來設置PhyControl0.ctrl_forcebit-field,清楚PhyControl0.ctrl_dll_on bit-field來關閉 PHY DLL。
12、設置PhyControl1.fp_resync bit-field 為 "1" 來更新 DLL的設置。
13、確保在電源上電后至少保持Clock Enable (CKE)在低電平100ns。
14、用DirectCmd 寄存器來執行一條NOP指令且保持CKE 為高電平。
15、至少等待200us。
16、發出MRS指令來重新設置存儲芯片的操作參數。
17、至少等待1us。
18、用MRR指令來查詢MRStatus的寄存器的DAI位,用這們來確定自動初始化過程是否完成。
19、如果外部有別的存儲芯片,重復執行14到19步來設置芯片1。
20、設置ConControl來啟動auto-refresh counter.
21、當我們要進行power-down模式,設置MemControl寄存器。
按照上邊的步驟來設置就可以完成DDR的初始化。
更多exynos4412內存分析問題