问题描述:
C6678开发板配置外部64bit宽度DDR3大小为1GB,当使用gel文件通过仿真器初始化DSP后,发现写DDR3地址为0x8000 0000 ~ 0x9FFF FFFF(512MB) 同时地址0xA000 0000 ~ 0xBFFF FFFF(512MB) 也在变换,比如:0x8000 0000地址写0xaaaa5555,同时0xA000 0000地址值也变成了0xaaaa5555。
问题分些:
从写地址现象来看,首先想到的应该是0x8000 0000 ~ 0x9FFF FFFF段和0xA000 0000 ~ 0xBFFF FFFF段映射到了同一段物理地址,然后查看外部地址映射如下图。
从上图可以看出32bit虚拟起始地址为0x8000 0000,映射大小1E,查表(如下图)可知1E表示映射大小为2GB,对应映射64bit物理起始地址是0x8 0000 0000,BF表示权限。
通过上面两个图可知默认映射大小为2GB,而我们实际物理地址只有1GB,所以排除是地址映射引起的访问问题。
接下来,继续排查外部DDR3初始化代码,即GEL文件里的ddr3_setup_auto_lvl_1333()函数,结合手册《DDR3 Memory Controller for KeyStone I Devices User’s Guide》发现SDCFG寄存器配置与实际DDR3芯片参数有出入,然后根据实际使用DDR3芯片手册查询修改配置参数,测试,发现问题解决,能够正常读写地址:0x8000 0000 ~ 0xBFFF FFFF(1GB)。
SDCFG寄存器各段设置详解见下表:
为此,DDR3访问问题解决;这里特别注意SDCFG寄存器几个参数配置(如:位宽,页大小,BANK大小等),具体配置如下:
/* New value with DYN_ODT disabled and SDRAM_DRIVE = RZQ/7
*last config write DRAM init occurs
*/
TEMP = 0;
TEMP |= 0x3 << 29; // SDRAM_TYPE bit field 31:29
TEMP |= 0x0 << 27; // IBANK_POS bit field 28:27
TEMP |= 0x3 << 24; // DDR_TERM bit field 26:24
TEMP |= 0x0 << 21; // DYN_ODT bit field 22:21
TEMP |= 0x1 << 18; // SDRAM_DRIVE bit field 19:18
TEMP |= 0x2 << 16; // CWL bit field 17:16
TEMP |= 0x0 << 14; // NM bit field 15:14
TEMP |= 0xA << 10; // CL bit field 13:10
TEMP |= 0x4 << 7; // ROWSIZE bit field 9:7
TEMP |= 0x3 << 4; // IBANK bit field 6:4
TEMP |= 0x0 << 3; // EBANK bit field 3:3
TEMP |= 0x2; // PAGESIZE bit field 2:0
DDR_SDCFG = TEMP;