- ameters.
- 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.
上面就是手册上给出的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)用户代码需要检验自己运行时的位置,如果运行在内存中则需跳过内存初始化,根据需要决定是否需要代码重定位。