<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > S5PV210(TQ210)學(xué)習筆記——內存配置(DDR2)

S5PV210(TQ210)學(xué)習筆記——內存配置(DDR2)

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
S5PV210有兩個(gè)獨立的DRAM控制器,分別是DMC0和DMC1,其中,DMC0最大支持512MByte,DMC1最大支持1GByte,而DMC0和DMC1又同時(shí)支持兩個(gè)片選CS0和CS1。S5PV210的內存模塊相比2440和6410來(lái)講要更加復雜一些,要想正確的配置S5PV210的內存,應該仔細閱讀芯片手冊相關(guān)部分,在配置參數時(shí)也應該適當的閱讀下內存芯片的手冊。這部分的寄存器和配置過(guò)程比較復雜(但是不難),我只簡(jiǎn)單的講一下我配置時(shí)遇到的問(wèn)題。

一 接線(xiàn)原理

本文引用地址:http://dyxdggzs.com/article/201611/322804.htm

我的開(kāi)發(fā)板是TQ210,開(kāi)發(fā)板上有8片128M*8bits的內存芯片,從原理圖上可以看到,其中4片并聯(lián)接在DMC0上,另外四片并聯(lián)在DMC1上,這里我只貼出一個(gè)鏈接方式,因為8片都是一樣的,只是前四片跟后四片掛載的位置不同。

我們可以注意到,TQ210是將四片K4T1G084QQ的地址線(xiàn)并聯(lián),將數據線(xiàn)串聯(lián),這樣正好是32位數據。另外,我們還可以看到K4T1G084QQ只接了14根地址線(xiàn),這是因為K4T1G084QQ有14根行地址,10根列地址,這14根線(xiàn)是復用的。但是K4T1G084QQ有8個(gè)bank,而DMC只有兩根bank線(xiàn),為此,S5PV210給出了以下幾個(gè)解決方案:

根據注釋3,我們可以看到當S5PV210掛載8bank內存時(shí)CS1復用為BANK2,這中狀態(tài)下S5PV210相當于只有一根片選引腳CS0,這樣就可以理解了,我們從這里也可以知道配置num_chip參數時(shí)可以設置為1(經(jīng)測試設置為2也可以,不過(guò)MEMCONFIG1的配置沒(méi)有意思,因為8bank時(shí)只有CS0而沒(méi)有CS1)。對于8banks且15根行地址的內存芯片也有一套解決方案,所以,一定要注意下面的注釋?zhuān)耶敃r(shí)配置時(shí)閱讀手冊就不夠仔細,沒(méi)有看下面的注釋?zhuān)Y果卡了我一上午,沒(méi)有弄明白內存芯片的接線(xiàn)原理,甚至認為開(kāi)發(fā)板接線(xiàn)接錯了。

二 地址映射

S5PV210的DMC跟6410和2440的DMC有個(gè)重要區別,S5PV210可以控制內存地址映射,DMC0的地址空間為0x2000,0000~0x3fff,ffff,DMC1的地址空間為0x4000,0000~0x7fff,ffff,DMC可以通過(guò)配置寄存器來(lái)使內存芯片映射到其內存段內的適當位置。這個(gè)配置在MEMCONFIG寄存器中,這個(gè)地址映射讓我糾結了很長(cháng)一段時(shí)間,最后還是查資料看明白的。

如果設置chip_base為0x20:

(1)我們掛載的內存為128M,那么這個(gè)chip_mask應該設置為0xF8

(2)我們掛載256M內存時(shí),chip_mask應該設置為0xF0

(3)我們掛載512M時(shí),chip_mask應該設置為0xE0

(4)我們掛載1GB內存時(shí),chip_mask就應該設置為0xC0。

以DMC0為例,當DMC0接收到來(lái)自AXI的0x2000,0000~0x3fff,ffff內的地址時(shí),會(huì )作如下處理:

(1)將AXI地址的高8位與chip_mask相與得到結果,記為X。

(2)將X分別與MEMCONFIG0和MEMCONFIG1的chip_base相比較,如果相等,則打開(kāi)相應的片選。

假如掛載的內存為128M,且CS0和CS1上分別掛了一片,那么128M=128*1024*1024=0x8000000,則128M內存的偏移范圍應該是0x0000,0000~0x07ff,ffff,高位剩余5位,那么,我們把MEMCONFIG0的chip_base設置為0x20,chip_mask設置為0xF8,為了保持內存連續,則需要將MEMCONFIG1的chip_base設置為0x28,chip_mask設置為0xF8,當AXI發(fā)來(lái)的地址為0x23xx,xxxx時(shí),0x23&0xF8得到0x20,所以,會(huì )打開(kāi)片選CS0,當AXI發(fā)來(lái)的地址為0x28xx,xxxx時(shí),0x28&0xF8得到0x28,所以,會(huì )打開(kāi)片選CS1,依此類(lèi)推。

特別的,當載在的內存芯片為8bank(8bank內存芯片一般為14/15行地址,10列地址,即容量一般為512M或者1G)時(shí),由于CS1為bank2引腳,為了保持CS0時(shí)鐘處于片選狀態(tài),對于512M內存來(lái)講需要將chip_mask設置為0xE0,這是因為512M=512*1024*1024=0x2000,0000,也就是說(shuō),512M內存的偏移應該為0x0000,0000~0x1fff,ffff,所以高位剩余3位,即0xE0,當然了,如果內存為1G=1024*1024*1024=0x4000,0000,即偏移為0x0000,0000~0x3fff,ffff,高位剩余2為,故設置chip_mask為0xC0。這樣,就會(huì )計算偏移這兩個(gè)值了。

三 配置流程

內存芯片的配置比較復雜,好在芯片手冊上給出了常用內存類(lèi)型的初始化序列,TQ210的內存是DDR2的,可以按照如下順序進(jìn)行初始化:

  1. 1.Toprovidestablepowerforcontrollerandmemorydevice,thecontrollermustassertandholdCKEtoalogiclowlevel.Thenapplystableclock.Note:XDDR2SELshouldbeHighleveltoholdCKEtolow.
  2. 2.SetthePhyControl0.ctrl_start_pointandPhyControl0.ctrl_incbit-fieldstocorrectvalueaccordingtoclockfrequency.SetthePhyControl0.ctrl_dll_onbit-fieldto‘1’toturnonthePHYDLL.
  3. 3.DQSCleaning:SetthePhyControl1.ctrl_shiftcandPhyControl1.ctrl_offsetcbit-fieldstocorrectvalueaccordingtoclockfrequencyandmemorytACparameters.
  4. 4.SetthePhyControl0.ctrl_startbit-fieldto‘1’.
  5. 5.SettheConControl.Atthismoment,anautorefreshcountershouldbeoff.
  6. 6.SettheMemControl.Atthismoment,allpowerdownmodesshouldbeoff.
  7. 7.SettheMemConfig0register.Iftherearetwoexternalmemorychips,settheMemConfig1register.
  8. 8.SetthePrechConfigandPwrdnConfigregisters.
  9. 9.SettheTimingAref,TimingRow,TimingDataandTimingPowerregistersaccordingtomemoryACparameters.
  10. 10.IfQoSschemeisrequired,settheQosControl0~15andQosConfig0~15registers.
  11. 11.WaitforthePhyStatus0.ctrl_lockedbit-fieldstochangeto‘1’.CheckwhetherPHYDLLislocked.
  12. 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. 13.Confirmwhetherstableclockisissuedminimum200usafterpoweron
  14. 14.IssueaNOPcommandusingtheDirectCmdregistertoassertandtoholdCKEtoalogichighlevel
  15. 15.Waitforminimum400ns.
  16. 16.IssueaPALLcommandusingtheDirectCmdregister.
  17. 17.IssueanEMRS2commandusingtheDirectCmdregistertoprogramtheoperatingparameters.
  18. 18.IssueanEMRS3commandusingtheDirectCmdregistertoprogramtheoperatingparameters.
  19. 19.IssueanEMRScommandusingtheDirectCmdregistertoenablethememoryDLLs.
  20. 20.IssueaMRScommandusingtheDirectCmdregistertoresetthememoryDLL.
  21. 21.IssueaPALLcommandusingtheDirectCmdregister.
  22. 22.IssuetwoAutoRefreshcommandsusingtheDirectCmdregister.
  23. 23.IssueaMRScommandusingtheDirectCmdregistertoprogramtheoperatingparameterswithoutresettingthememoryDLL.
  24. 24.Waitforminimum200clockcycles.
  25. 25.IssueanEMRScommandusingtheDirectCmdregistertoprogramtheoperatingparameters.IfOCDcalibrationisnotused,issueanEMRScommandtosetOCDCalibrationDefault.Afterthat,issueanEMRScommandtoexitOCDCalibrationModeandtoprogramtheoperatingparameters.
  26. 26.Iftherearetwoexternalmemorychips,performsteps14~25forchip1memorydevice.
  27. 27.SettheConControltoturnonanautorefreshcounter.28.Ifpowerdownmodesisrequired,settheMemControlregisters.
上面就是手冊上給出的DDR2型內存芯片的初始化序列,但是單純的根據上面的步驟配置可能有些困難,這時(shí),我們可以參考u-boot的內存初始化代碼來(lái)初始化內存,最后你會(huì )發(fā)現u-boot的操作順序跟上面是完全一致的。

四 內存初始化代碼

我將我配置內存的代碼上傳到CSDN的下載空間,如果需要的話(huà)可以去我資源里下載,是C語(yǔ)言版的。

五 遺留問(wèn)題

配置好內存的代碼燒寫(xiě)到Nand運行是正常的,但是用USB方式啟動(dòng)時(shí)不正常,目前還沒(méi)有找到原因,如果有朋友解決了或者有其他問(wèn)題請留言相告,在這里先說(shuō)聲謝謝。

現在找到原因了,原來(lái)S5PV210的USB啟動(dòng)過(guò)程跟Nand啟動(dòng)方式不一樣,S5PV210以USB方式啟動(dòng)時(shí)會(huì )先將三星提供的一個(gè)固件程序下載到0xd0020010處運行,然后,再將用戶(hù)代碼下載0x23e00000處運行,也就是說(shuō),固件程序完成了內存的初始化,因為我們的代碼位于0x23e00000處。而我們的代碼中再次配置內存時(shí)會(huì )重置內存,下載到內存中的代碼也就丟失了,所以程序執行到內存初始化函數就會(huì )掛掉。

為了證明上面的假設,我在代碼中加上一段程序,該程序將內存的中代碼拷貝到iram的16K以后的位置上(直接拷貝到0xd0020000處有問(wèn)題,我是拷貝到了0xd0024000處,現在還不知道什么原因),然后將代碼跳轉到IRAM中,如果代碼可以正常運行就可以證明內存初始化部分正常,實(shí)驗結果是肯定的,下面總結下:

S5PV210以USB方式啟動(dòng)時(shí)用戶(hù)代碼是下載到內存中的(0x23e00000處),要使代碼以USB方式啟動(dòng)時(shí)正常運行,應該注意以下兩點(diǎn):

(1)如果是位置相關(guān)的代碼,連接地址應該鏈接到0x23e00000,如果是位置無(wú)關(guān)碼,可以隨便指定連接地址。
(2)用戶(hù)代碼需要檢驗自己運行時(shí)的位置,如果運行在內存中則需跳過(guò)內存初始化,根據需要決定是否需要代碼重定位。



關(guān)鍵詞: S5PV210內存配置DD

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>