您的位置 首页 解答

S5PV210(TQ210)学习笔记——内存装备(DDR2)

S5PV210有两个独立的DRAM控制器,分别是DMC0和DMC1,其中,DMC0最大支持512MByte,DMC1最大支持1GByte,而DMC0和DMC1又同时支持两个片选CS0

S5PV210有两个独立的DRAM操控器,别离是DMC0和DMC1,其间,DMC0最大支撑512MByte,DMC1最大支撑1GByte,而DMC0和DMC1又一起支撑两个片选CS0和CS1。S5PV210的内存模块比较2440和6410来讲要愈加杂乱一些,要想正确的装备S5PV210的内存,应该细心阅览芯片手册相关部分,在装备参数时也应该恰当的阅览下内存芯片的手册。这部分的寄存器和装备进程比较杂乱(可是不难),我只简略的讲一下我装备时遇到的问题。

一 接线原理

我的开发板是TQ210,开发板上有8片128M*8bits的内存芯片,从原理图上能够看到,其间4片并联接在DMC0上,别的四片并联在DMC1上,这儿我只贴出一个链接方法,由于8片都是相同的,仅仅前四片跟后四片挂载的方位不同。

咱们能够留意到,TQ210是将四片K4T1G084QQ的地址线并联,将数据线串联,这样正好是32位数据。别的,咱们还能够看到K4T1G084QQ只接了14根地址线,这是由于K4T1G084QQ有14根行地址,10根列地址,这14根线是复用的。可是K4T1G084QQ有8个bank,而DMC只要两根bank线,为此,S5PV210给出了以下几个处理方案:

依据注释3,咱们能够看到当S5PV210挂载8bank内存时CS1复用为BANK2,这中状况下S5PV210相当于只要一根片选引脚CS0,这样就能够理解了,咱们从这儿也能够知道装备num_chip参数时能够设置为1(经测验设置为2也能够,不过MEMCONFIG1的装备没有意思,由于8bank时只要CS0而没有CS1)。关于8banks且15根行地址的内存芯片也有一套处理方案,所以,必定要留意下面的注释,我其时装备时阅览手册就不行细心,没有看下面的注释,成果卡了我一上午,没有弄理解内存芯片的接线原理,乃至以为开发板接线接错了。

二 地址映射

S5PV210的DMC跟6410和2440的DMC有个重要差异,S5PV210能够操控内存地址映射,DMC0的地址空间为0x2000,0000~0x3fff,ffff,DMC1的地址空间为0x4000,0000~0x7fff,ffff,DMC能够经过装备寄存器来使内存芯片映射到其内存段内的恰当方位。这个装备在MEMCONFIG寄存器中,这个地址映射让我纠结了很长一段时间,最终仍是查资料看理解的。

假定设置chip_base为0x20:

(1)咱们挂载的内存为128M,那么这个chip_mask应该设置为0xF8

(2)咱们挂载256M内存时,chip_mask应该设置为0xF0

(3)咱们挂载512M时,chip_mask应该设置为0xE0

(4)咱们挂载1GB内存时,chip_mask就应该设置为0xC0。

以DMC0为例,当DMC0接纳到来自AXI的0x2000,0000~0x3fff,ffff内的地址时,会作如下处理:

(1)将AXI地址的高8位与chip_mask相与得到成果,记为X。

(2)将X别离与MEMCONFIG0和MEMCONFIG1的chip_base比较较,假定持平,则翻开相应的片选。

假定挂载的内存为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发来的地址为0x23xx,xxxx时,0x23&0xF8得到0x20,所以,会翻开片选CS0,当AXI发来的地址为0x28xx,xxxx时,0x28&0xF8得到0x28,所以,会翻开片选CS1,依此类推。

特别的,当载在的内存芯片为8bank(8bank内存芯片一般为14/15行地址,10列地址,即容量一般为512M或许1G)时,由于CS1为bank2引脚,为了坚持CS0时钟处于片选状况,关于512M内存来讲需求将chip_mask设置为0xE0,这是由于512M=512*1024*1024=0x2000,0000,也便是说,512M内存的偏移应该为0x0000,0000~0x1fff,ffff,所以高位剩下3位,即0xE0,当然了,假定内存为1G=1024*1024*1024=0x4000,0000,即偏移为0x0000,0000~0x3fff,ffff,高位剩下2为,故设置chip_mask为0xC0。这样,就会核算偏移这两个值了。

三 装备流程

内存芯片的装备比较杂乱,好在芯片手册上给出了常用内存类型的初始化序列,TQ210的内存是DDR2的,能够依照如下次序进行初始化:

  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型内存芯片的初始化序列,可是单纯的依据上面的进程装备或许有些困难,这时,咱们能够参阅u-boot的内存初始化代码来初始化内存,最终你会发现u-boot的操作次序跟上面是完全一致的。

四 内存初始化代码

我将我装备内存的代码上传到CSDN的下载空间,假定需求的话能够去我资源里下载,是C语言版的。

五 遗留问题

装备好内存的代码烧写到Nand运转是正常的,可是用USB方法发动时不正常,现在还没有找到原因,假定有朋友处理了或许有其他问题请留言相告,在这儿先说声谢谢。

现在找到原因了,本来S5PV210的USB发动进程跟Nand发动方法不相同,S5PV210以USB方法发动时会先将三星供给的一个固件程序下载到0xd0020010处运转,然后,再将用户代码下载0x23e00000处运转,也便是说,固件程序完成了内存的初始化,由于咱们的代码坐落0x23e00000处。而咱们的代码中再次装备内存时会重置内存,下载到内存中的代码也就丢掉了,所以程序履行到内存初始化函数就会挂掉。

为了证明上面的假定,我在代码中加上一段程序,该程序将内存的中代码复制到iram的16K今后的方位上(直接复制到0xd0020000处有问题,我是复制到了0xd0024000处,现在还不知道什么原因),然后将代码跳转到IRAM中,假定代码能够正常运转就能够证明内存初始化部分正常,试验成果是必定的,下面总结下:

S5PV210以USB方法发动时用户代码是下载到内存中的(0x23e00000处),要使代码以USB方法发动时正常运转,应该留意以下两点:

(1)假定是方位相关的代码,衔接地址应该链接到0x23e00000,假定是方位无关码,能够随意指定衔接地址。
(2)用户代码需求查验自己运转时的方位,假定运转在内存中则需越过内存初始化,依据需求决议是否需求代码重定位。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/256203.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部