S5PV210(TQ210)學(xué)習(xí)筆記——內(nèi)存配置(DDR2)
一 接線原理
本文引用地址:http://m.butianyuan.cn/article/201611/322804.htm我的開發(fā)板是TQ210,開發(fā)板上有8片128M*8bits的內(nèi)存芯片,從原理圖上可以看到,其中4片并聯(lián)接在DMC0上,另外四片并聯(lián)在DMC1上,這里我只貼出一個(gè)鏈接方式,因?yàn)?片都是一樣的,只是前四片跟后四片掛載的位置不同。
我們可以注意到,TQ210是將四片K4T1G084QQ的地址線并聯(lián),將數(shù)據(jù)線串聯(lián),這樣正好是32位數(shù)據(jù)。另外,我們還可以看到K4T1G084QQ只接了14根地址線,這是因?yàn)镵4T1G084QQ有14根行地址,10根列地址,這14根線是復(fù)用的。但是K4T1G084QQ有8個(gè)bank,而DMC只有兩根bank線,為此,S5PV210給出了以下幾個(gè)解決方案:
根據(jù)注釋3,我們可以看到當(dāng)S5PV210掛載8bank內(nèi)存時(shí)CS1復(fù)用為BANK2,這中狀態(tài)下S5PV210相當(dāng)于只有一根片選引腳CS0,這樣就可以理解了,我們從這里也可以知道配置num_chip參數(shù)時(shí)可以設(shè)置為1(經(jīng)測(cè)試設(shè)置為2也可以,不過MEMCONFIG1的配置沒有意思,因?yàn)?bank時(shí)只有CS0而沒有CS1)。對(duì)于8banks且15根行地址的內(nèi)存芯片也有一套解決方案,所以,一定要注意下面的注釋,我當(dāng)時(shí)配置時(shí)閱讀手冊(cè)就不夠仔細(xì),沒有看下面的注釋,結(jié)果卡了我一上午,沒有弄明白內(nèi)存芯片的接線原理,甚至認(rèn)為開發(fā)板接線接錯(cuò)了。
二 地址映射
S5PV210的DMC跟6410和2440的DMC有個(gè)重要區(qū)別,S5PV210可以控制內(nèi)存地址映射,DMC0的地址空間為0x2000,0000~0x3fff,ffff,DMC1的地址空間為0x4000,0000~0x7fff,ffff,DMC可以通過配置寄存器來使內(nèi)存芯片映射到其內(nèi)存段內(nèi)的適當(dāng)位置。這個(gè)配置在MEMCONFIG寄存器中,這個(gè)地址映射讓我糾結(jié)了很長(zhǎng)一段時(shí)間,最后還是查資料看明白的。
如果設(shè)置chip_base為0x20:
(1)我們掛載的內(nèi)存為128M,那么這個(gè)chip_mask應(yīng)該設(shè)置為0xF8
(2)我們掛載256M內(nèi)存時(shí),chip_mask應(yīng)該設(shè)置為0xF0
(3)我們掛載512M時(shí),chip_mask應(yīng)該設(shè)置為0xE0
(4)我們掛載1GB內(nèi)存時(shí),chip_mask就應(yīng)該設(shè)置為0xC0。
以DMC0為例,當(dāng)DMC0接收到來自AXI的0x2000,0000~0x3fff,ffff內(nèi)的地址時(shí),會(huì)作如下處理:
(1)將AXI地址的高8位與chip_mask相與得到結(jié)果,記為X。
(2)將X分別與MEMCONFIG0和MEMCONFIG1的chip_base相比較,如果相等,則打開相應(yīng)的片選。
假如掛載的內(nèi)存為128M,且CS0和CS1上分別掛了一片,那么128M=128*1024*1024=0x8000000,則128M內(nèi)存的偏移范圍應(yīng)該是0x0000,0000~0x07ff,ffff,高位剩余5位,那么,我們把MEMCONFIG0的chip_base設(shè)置為0x20,chip_mask設(shè)置為0xF8,為了保持內(nèi)存連續(xù),則需要將MEMCONFIG1的chip_base設(shè)置為0x28,chip_mask設(shè)置為0xF8,當(dāng)AXI發(fā)來的地址為0x23xx,xxxx時(shí),0x23&0xF8得到0x20,所以,會(huì)打開片選CS0,當(dāng)AXI發(fā)來的地址為0x28xx,xxxx時(shí),0x28&0xF8得到0x28,所以,會(huì)打開片選CS1,依此類推。
特別的,當(dāng)載在的內(nèi)存芯片為8bank(8bank內(nèi)存芯片一般為14/15行地址,10列地址,即容量一般為512M或者1G)時(shí),由于CS1為bank2引腳,為了保持CS0時(shí)鐘處于片選狀態(tài),對(duì)于512M內(nèi)存來講需要將chip_mask設(shè)置為0xE0,這是因?yàn)?12M=512*1024*1024=0x2000,0000,也就是說,512M內(nèi)存的偏移應(yīng)該為0x0000,0000~0x1fff,ffff,所以高位剩余3位,即0xE0,當(dāng)然了,如果內(nèi)存為1G=1024*1024*1024=0x4000,0000,即偏移為0x0000,0000~0x3fff,ffff,高位剩余2為,故設(shè)置chip_mask為0xC0。這樣,就會(huì)計(jì)算偏移這兩個(gè)值了。
三 配置流程
內(nèi)存芯片的配置比較復(fù)雜,好在芯片手冊(cè)上給出了常用內(nèi)存類型的初始化序列,TQ210的內(nèi)存是DDR2的,可以按照如下順序進(jìn)行初始化:
- 1.Toprovidestablepowerforcontrollerandmemorydevice,thecontrollermustassertandholdCKEtoalogiclowlevel.Thenapplystableclock.Note:XDDR2SELshouldbeHighleveltoholdCKEtolow.
- 2.SetthePhyControl0.ctrl_start_pointandPhyControl0.ctrl_incbit-fieldstocorrectvalueaccordingtoclockfrequency.SetthePhyControl0.ctrl_dll_onbit-fieldto‘1’toturnonthePHYDLL.
- 3.DQSCleaning:SetthePhyControl1.ctrl_shiftcandPhyControl1.ctrl_offsetcbit-fieldstocorrectvalueaccordingtoclockfrequencyandmemorytACparameters.
- 4.SetthePhyControl0.ctrl_startbit-fieldto‘1’.
- 5.SettheConControl.Atthismoment,anautorefreshcountershouldbeoff.
- 6.SettheMemControl.Atthismoment,allpowerdownmodesshouldbeoff.
- 7.SettheMemConfig0register.Iftherearetwoexternalmemorychips,settheMemConfig1register.
- 8.SetthePrechConfigandPwrdnConfigregisters.
- 9.SettheTimingAref,TimingRow,TimingDataandTimingPowerregistersaccordingtomemoryACparameters.
- 10.IfQoSschemeisrequired,settheQosControl0~15andQosConfig0~15registers.
- 11.WaitforthePhyStatus0.ctrl_lockedbit-fieldstochangeto‘1’.CheckwhetherPHYDLLislocked.
- 12.PHYDLLcompensatesthechangesofdelayamountcausedbyProcess,VoltageandTemperature(PVT)variationduringmemoryoperation.Therefore,PHYDLLshouldnotbeoffforreliableoperation.Itcanbeoffexceptrunsatlowfrequency.Ifoffmodeisused,setthePhyControl0.ctrl_forcebit-fieldtocorrectvalueaccordingtothePhyStatus0.ctrl_lock_value[9:2]bit-fieldtofixdelayamount.ClearthePhyControl0.ctrl_dll_onbit-fieldtoturnoffPHYDLL.
- 13.Confirmwhetherstableclockisissuedminimum200usafterpoweron
- 14.IssueaNOPcommandusingtheDirectCmdregistertoassertandtoholdCKEtoalogichighlevel
- 15.Waitforminimum400ns.
- 16.IssueaPALLcommandusingtheDirectCmdregister.
- 17.IssueanEMRS2commandusingtheDirectCmdregistertoprogramtheoperatingparameters.
- 18.IssueanEMRS3commandusingtheDirectCmdregistertoprogramtheoperatingparameters.
- 19.IssueanEMRScommandusingtheDirectCmdregistertoenablethememoryDLLs.
- 20.IssueaMRScommandusingtheDirectCmdregistertoresetthememoryDLL.
- 21.IssueaPALLcommandusingtheDirectCmdregister.
- 22.IssuetwoAutoRefreshcommandsusingtheDirectCmdregister.
- 23.IssueaMRScommandusingtheDirectCmdregistertoprogramtheoperatingparameterswithoutresettingthememoryDLL.
- 24.Waitforminimum200clockcycles.
- 25.IssueanEMRScommandusingtheDirectCmdregistertoprogramtheoperatingparameters.IfOCDcalibrationisnotused,issueanEMRScommandtosetOCDCalibrationDefault.Afterthat,issueanEMRScommandtoexitOCDCalibrationModeandtoprogramtheoperatingparameters.
- 26.Iftherearetwoexternalmemorychips,performsteps14~25forchip1memorydevice.
- 27.SettheConControltoturnonanautorefreshcounter.28.Ifpowerdownmodesisrequired,settheMemControlregisters.
四 內(nèi)存初始化代碼
我將我配置內(nèi)存的代碼上傳到CSDN的下載空間,如果需要的話可以去我資源里下載,是C語言版的。
五 遺留問題
配置好內(nèi)存的代碼燒寫到Nand運(yùn)行是正常的,但是用USB方式啟動(dòng)時(shí)不正常,目前還沒有找到原因,如果有朋友解決了或者有其他問題請(qǐng)留言相告,在這里先說聲謝謝。
現(xiàn)在找到原因了,原來S5PV210的USB啟動(dòng)過程跟Nand啟動(dòng)方式不一樣,S5PV210以USB方式啟動(dòng)時(shí)會(huì)先將三星提供的一個(gè)固件程序下載到0xd0020010處運(yùn)行,然后,再將用戶代碼下載0x23e00000處運(yùn)行,也就是說,固件程序完成了內(nèi)存的初始化,因?yàn)槲覀兊拇a位于0x23e00000處。而我們的代碼中再次配置內(nèi)存時(shí)會(huì)重置內(nèi)存,下載到內(nèi)存中的代碼也就丟失了,所以程序執(zhí)行到內(nèi)存初始化函數(shù)就會(huì)掛掉。
為了證明上面的假設(shè),我在代碼中加上一段程序,該程序?qū)?nèi)存的中代碼拷貝到iram的16K以后的位置上(直接拷貝到0xd0020000處有問題,我是拷貝到了0xd0024000處,現(xiàn)在還不知道什么原因),然后將代碼跳轉(zhuǎn)到IRAM中,如果代碼可以正常運(yùn)行就可以證明內(nèi)存初始化部分正常,實(shí)驗(yàn)結(jié)果是肯定的,下面總結(jié)下:
S5PV210以USB方式啟動(dòng)時(shí)用戶代碼是下載到內(nèi)存中的(0x23e00000處),要使代碼以USB方式啟動(dòng)時(shí)正常運(yùn)行,應(yīng)該注意以下兩點(diǎn):
(1)如果是位置相關(guān)的代碼,連接地址應(yīng)該鏈接到0x23e00000,如果是位置無關(guān)碼,可以隨便指定連接地址。
(2)用戶代碼需要檢驗(yàn)自己運(yùn)行時(shí)的位置,如果運(yùn)行在內(nèi)存中則需跳過內(nèi)存初始化,根據(jù)需要決定是否需要代碼重定位。
評(píng)論