ARM_DDR初始化

测试的硬件平台为天嵌公司的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;


K4T1G084QQ芯片手册得知该芯片具有8个BANK,需要3根BANK选择线,具有14根地址线(其中14跟行地址和10根列地址复用)。每个芯片的存储容量为128M,每个芯片内部的BANK的存储容量为16MB(地址位宽为24, 2^24 = 16M)。地址线配置如下图1所示。

ARM_DDR初始化_第1张图片

图1 K4T1G084QQ地址线配置

关键寄存器配置说明(DMC0和DMC1的配置完全一样,除了AXI BASE Address)。

分析第一条语句 DMC0_PHYCONTROL0 = 0x00101000;

查询手册S5PV210_UM_REV1.1.pdf,见图2。0x00101000的每一位都是根据手册来确定的。

ARM_DDR初始化_第2张图片

图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

ARM_DDR初始化_第3张图片

图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。

ARM_DDR初始化_第4张图片

图4 TIMINGROW配置


ARM_DDR初始化_第5张图片

图5 K4T1G044QQ-HC(L)E6分类


ARM_DDR初始化_第6张图片

图6 DDR2-667 5-5-5的时间参数1


ARM_DDR初始化_第7张图片

图7 DDR2-667 5-5-5的时间参数2

接着分析ddr的直接命令。

如 DMC0_DIRECTCMD = 0x07000000;/* NOP */

将0x07000000赋值给DMC0_DIRECTCMD,DDR自动执行空指令,没有经过CPU执行,所以叫DDR的直接命令。

DDR的直接命令表见图8。

ARM_DDR初始化_第8张图片

图8 DDR的DIRECTCMD

至此,DDR的配置全部完成。

参考文献

qq:809205580.嵌入式Linux学习笔记(基于S5PV210、TQ210)



你可能感兴趣的:(Linux)