06 初始化SDRAM

一、查阅核心板原理图SDRAM部分

06 初始化SDRAM_第1张图片
06 初始化SDRAM_第2张图片

从以上原理图中可以得出以下信息:

(1)开发板上使用的SDRAM编码是K4T1G164QQ

(2)开发板上包括4片内存芯片,每片内存的数据总线都是16位的

(3)横向的两颗内存芯片是并联的(并联时地址总线的接法一样,但数据总线要加起来),这样连接相当于在逻辑上可以把这两颗内存芯片看成是一个32位的内存芯片

(4)每个内存端口都由3类总线构成:地址总线(Xm1_ADDR0~Xm1_ADDR13、Xm2_ADDR0~Xm2_ADDR13)+ 控制总线 + 数据总线(Xm1_DATA0~Xm1_DATA31、Xm2_DATA0~Xm2_DATA31)


二、查阅SDRAM数据手册



由上图可得出K4T1G164QQ的含义如下:

   K:三星内存

   4:DRAM

   T:DDR2 SDRAM

1G:1Gb(128MB)

 16:单芯片16位宽

   4:8 Banks

三、内存寻址详解

06 初始化SDRAM_第3张图片

由上图可得出以下信息:

(1)S5PV210的内存端口信号中有BA0~BA2,接在内存芯片的BA0~BA2上,这些引脚用来选择Bank

(2)每个Bank内部有128Mb,通过Row Address(14位)+ Column Address(10位)的方式来综合寻址

(3)一共能寻址的范围是:2的24次方,也就是16MB(128Mb)的内存

四、内存映射

06 初始化SDRAM_第4张图片

从上图可得出以下信息:

(1)S5PV210共有两个内存端口,分别是DRAM0和DRAM1

(2)DRAM0的内存地址范围是0x20000000~0x3FFFFFFF(512MB)

(3)DRAM1的内存地址范围是0x40000000~0x7FFFFFFF(1024MB)

 

由此,得出结论:

(1)S5PV210最多支持1.5GB的内存,如果给它更多的内存,CPU就无法识别

(2)S5PV210最多支持1.5GB的内存,但实际开发板上不一定有这么多。例如X210开发板就只有512MB的内存(DRAM0端口分布256MB,DRAM1端口分布256MB)

(3)X210开发板上内存的合法地址是0x20000000~0x2FFFFFFF(256MB)+ 0x40000000~0x4FFFFFFF(256MB)

 

综合以上信息,进一步得出结论:

(1)X210开发板共使用了4片内存,每片1Gb(128MB),共512MB

(2)DRAM0对应的引脚是Xm1_xxxx

(3)DRAM1对应的引脚是Xm2_xxxx

(4)从数据总线的位数可知,X210开发板用的是32位的内存

五、SDRAM初始化详解

SDRAM初始化共涉及到两个文件:s5pv21.h 和 sdram_init.s 
三星在官方的数据手册里(section 05 memory->DRAM CONTROLLER->1.2.1.3章节中)讲到DDR2的初始化过程,共27步,如下图:

06 初始化SDRAM_第5张图片
06 初始化SDRAM_第6张图片

译文如下
1. 提供稳压电源给内存控制器和内存芯片,内存控制器必须保持CLE在低电平,此时就会提供稳压电源。注:当CKE引脚为低电平时,XDDR2SEL应该处于高电平
2. 依照时钟频率正确配置PhyControl0.ctrl_start_pointPhyControl0.ctrl_incbit-fields的值。配置的PhyControl0.ctrl_dll_on值为'1'以打开PHY DLL。
3. DQS Cleaning:依照时钟频率和内存的tAC参数正确设置PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetcbit-fields的值。
4. 配置PhyControl0.ctrl_start的值为'1'
5. 配置ConControl,与此同时,auto refresh自动刷新计数器应该关闭
6. 配置MemControl,与此同时,所有的power down(休眠模式)应该闭关
7. 配置MemConfig0寄存器。如果有两组内存芯片(比如有8片DDR,这8片DDR是分别挂在Memory Port1和Memory Port2上),再配置MemConfig1寄存器。
8. 配置PrechConfigPwrdnConfig寄存器
9. 依照内存的tAC参数配置TimingArefTimingRowTimingDataTimingPower寄存器
10. 如果需要QoS标准,配置QosControl0~15QosConfig0~15r寄存器
11. 等待PhyStatus0.ctrl_locked位变为'1'。检查是否PHY DLL是否已锁
12. PHY DLL补偿在内存操作时由PVT(Process, Voltage and Temperature,处理器、电压和温度)变化引起的延迟量。但是,PHY DLL不能因某些可靠的内存操作而切断,除非是工作在低频率下。如果关闭PHY DLL,依照PhyStatus0.ctrl_lock_value[9:2]位的值正确配置PhyControl0.ctrl_force位的值来弥补延迟量(fix delay amount)。清除PhyControl0.ctrl_dll_on位的值来关闭PHY DLL。
13. 上电后,确定最小值为200us的稳定时钟是否发出
14. 使用DirectCmd寄存器发出一个NOP命令,保证CKE引脚为高电平
15. 等最小400ns
16. 使用DirectCmd寄存器发出一个PALL命令
17. 使用DirectCmd寄存器发出一个EMRS2命令,program操作参数
18. 使用DirectCmd寄存器发出一个EMRS3命令,program操作参数
19. 使用DirectCmd寄存器发出一个EMRS命令来使能内存DLLs
20. 使用DirectCmd寄存器发出一个MRS命令,重启内存DLL
21. 使用DirectCmd寄存器发出一个PALL命令
22. 使用DirectCmd寄存器发出两个Auto Refresh(自动刷新)命令
23. 使用DirectCmd寄存器发出一个MRS命令,program操作参数,不要重启内存DLL
24. 等待最小200时钟周期
25. 使用DirectCmd寄存器发出一个EMRS命令给程序的运行参数。如果OCD校正(Off-Chip Driver,片外驱动调校)没有使用,改善一个EMRS命令去设置OCD校准的默认值。在此之后,发送一个EMRS指令去退出OCD校准模式,继续program操作参数
26. 如果有两组DDR芯片,重复14-25步配置chip1的内存,刚刚配置的是chip0,也就是第一组内存芯片
27. 配置ConControlto来打开自动刷新计数器
28. 如果需要power down(休眠)模式,配置MemControl寄存器.

初始化步骤翻译请参考:http://blog.csdn.net/mutemob/article/details/12968565

代码请参考:http://blog.csdn.net/czg13548930186/article/details/54893629

代码详细解释请参考:http://www.cnblogs.com/biaohc/p/6346949.html

补充复习图:

06 初始化SDRAM_第7张图片

你可能感兴趣的:(cortex-A8裸机编程)