测试的硬件平台为天嵌公司的TQ210。
TQ210采用的处理器解决方案是集成了ARM Cortex-A8 core的S5PV210芯片,S5PV210有2个独立的DRAM控制器和端口(引脚):DMC0和DMC1。DMC0最大支持512MB,DMC1最大支持1GB,两个控制器必须使用相同类型的内存。
TQ210开发板使用了8片K4T1G084QQ ,每片128MB,共计1GB。其中4片挂接在DMC0,使用相同的地址线xm1ADDR[13:0],串联使用数据线xmlDATA[31:0],数据位宽32位;另外4片挂接在挂接在DMC1,使用相同的地址线xm2ADDR[13:0],串联使用数据线xm2DATA[31:0],数据位宽32位;
/* DMC0 */
DMC0_PHYCONTROL0 = 0x00101000;
DMC0_PHYCONTROL0 = 0x00101002; /* DLL on */
DMC0_PHYCONTROL1 = 0x00000086;
DMC0_PHYCONTROL0 = 0x00101003; /* DLL start */
while ((DMC0_PHYSTATUS & 0x7) != 0x7); /* wait DLL locked */
DMC0_CONCONTROL = 0x0FFF2350; /* Auto Refresh Counter should be off */
DMC0_MEMCONTROL = 0x00202430; /* Dynamic power down should be off */
DMC0_MEMCONFIG0 = 0x20E01323;
DMC0_PRECHCONFIG = 0xFF000000;
DMC0_PWRDNCONFIG = 0xFFFF00FF;
DMC0_TIMINGAREF = 0x00000618; /* 7.8us * 200MHz = 1560 = 0x618 */
DMC0_TIMINGROW = 0x19233309;
DMC0_TIMINGDATA = 0x23240204;
DMC0_TIMINGPOWER = 0x09C80232;
DMC0_DIRECTCMD = 0x07000000; /* NOP */
DMC0_DIRECTCMD = 0x01000000; /* PALL */
DMC0_DIRECTCMD = 0x00020000; /* EMRS2 */
DMC0_DIRECTCMD = 0x00030000; /* EMRS3 */
DMC0_DIRECTCMD = 0x00010400; /* EMRS enable DLL */
DMC0_DIRECTCMD = 0x00000542; /* DLL reset */
DMC0_DIRECTCMD = 0x01000000; /* PALL */
DMC0_DIRECTCMD = 0x05000000; /* auto refresh */
DMC0_DIRECTCMD = 0x05000000; /* auto refresh */
DMC0_DIRECTCMD = 0x00000442; /* DLL unreset */
DMC0_DIRECTCMD = 0x00010780; /* OCD default */
DMC0_DIRECTCMD = 0x00010400; /* OCD exit */
DMC0_CONCONTROL = 0x0FF02030; /* auto refresh on */
DMC0_PWRDNCONFIG = 0xFFFF00FF;
DMC0_MEMCONTROL = 0x00202400;</span>
从K4T1G084QQ芯片手册得知该芯片具有8个BANK,需要3根BANK选择线,具有14根地址线(其中14跟行地址和10根列地址复用)。每个芯片的存储容量为128M,每个芯片内部的BANK的存储容量为16MB(地址位宽为24, 2^24 = 16M)。地址线配置如下图1所示。
图1 K4T1G084QQ地址线配置
关键寄存器配置说明(DMC0和DMC1的配置完全一样,除了AXI BASE Address)。
分析第一条语句 DMC0_PHYCONTROL0 = 0x00101000;
查询手册S5PV210_UM_REV1.1.pdf,见图2。0x00101000的每一位都是根据手册来确定的。
图2 PHY Control0 Register
从第1行到第15行的语句都是简单地通过查询手册得到的,下面这一段代码是根据自己的时钟配置情况计算得到的。
DMC0_TIMINGAREF = 0x00000618;/* 7.8us * 200MHz = 1560 = 0x618 */
DMC0_TIMINGROW = 0x19233309;
DMC0_TIMINGDATA = 0x23240204;
DMC0_TIMINGPOWER = 0x09C80232;
拿这行分析 DMC0_TIMINGAREF = 0x00000618;
查询手册S5PV210_UM_REV1.1.pdf,见图2。 因为配置的T(mclk)=1/MSYS=1/200MHZ=5ns,7.8us * 200MHz = 1560 = 0x618
图3 TIMINGRAEF配置
分析此行DMC0_TIMINGROW = 0x19233309;
查询手册S5PV210_UM_REV1.1.pdf,见图4。查询K4T1G084QQ-HCE6.pdf,见图5至图7。计算过程:t_rfc = tRFC/T(mclk) = 127.5/5 = 25.5=0x19,其他参数的计算同t_rfc。
图4 TIMINGROW配置
图5 K4T1G044QQ-HC(L)E6分类
图6 DDR2-667 5-5-5的时间参数1
图7 DDR2-667 5-5-5的时间参数2
接着分析ddr的直接命令。
如 DMC0_DIRECTCMD = 0x07000000;/* NOP */
将0x07000000赋值给DMC0_DIRECTCMD,DDR自动执行空指令,没有经过CPU执行,所以叫DDR的直接命令。
DDR的直接命令表见图8。
图8 DDR的DIRECTCMD
至此,DDR的配置全部完成。
参考文献
qq:809205580.嵌入式Linux学习笔记(基于S5PV210、TQ210)