本帖最后由 laotang365 于 2014-10-30 22:12 编辑
在syscfg.inc文件中DDR寄存器参数设置如下:- .if (CLK_400_200_166_133 == 1) || (CLK_800_200_166_133 == 1) || (CLK_1000_200_166_133 == 1)
- .equ DMC0_MEMCONFIG_0, 0x30F01313
- .equ DMC0_MEMCONFIG_1, 0x40F01323
- .equ DMC0_TIMINGA_REF, 0x00000618
- .equ DMC0_TIMING_ROW, 0x28233287
- .equ DMC0_TIMING_DATA, 0x23240304
- .equ DMC0_TIMING_PWR, 0x09C80232
-
- .equ DMC1_MEMCONFIG_0, 0x40F01313
- .equ DMC1_MEMCONFIG_1, 0x00E01323
- .equ DMC1_TIMINGA_REF, 0x00000618
- .equ DMC1_TIMING_ROW, 0x28233289
- .equ DMC1_TIMING_DATA, 0x23240304
- .equ DMC1_TIMING_PWR, 0x08280232
复制代码这里DMC0_MEMCONFIG_0中的chip_row设置为0x1 = 13bits,而DMC1_MEMCONFIG_0中的chip_row设置为0x2 = 14bits,但是看核心板原理图,不都是K4T1G164QQ么,行地址应该都是14bits才对啊。 DMC0_MEMCONFIG_1的chip1_base是0x40,chip1_mask是0xF0。而DMC1_MEMCONFIG_0也是chip1_base是0x40,chip1_mask是0xF0,这样地址映射不就重复了吗??? 另外DMC1_MEMCONFIG_1的chip1_base居然是0x00,和chip1_mask的0xE0相与,那不就是IROM的地址范围么?怎么能这样设置呢?
而Uboot源码的DDR设置(uboot-x210\onenand_bl1\smdkc110\s5pc110_reg.inc)也有奇怪的地方:- CONFIG_CLK_1000_200_166_133
- .ifdef CONFIG_X210B
- .equ DMC0_MEMCONFIG_0, 0x30F82222
- .equ DMC0_MEMCONFIG_1, 0x40F82222
- .equ DMC0_TIMINGA_REF, 0x0000050E
- .equ DMC0_TIMING_ROW, 0x14233287
- .equ DMC0_TIMING_DATA, 0x12130005
- .equ DMC0_TIMING_PWR, 0x0E140222
- .equ DMC1_MEMCONTROL, 0x00212100
- .equ DMC1_MEMCONFIG_0, 0x40F01322
- .equ DMC1_MEMCONFIG_1, 0x50F01322
- .equ DMC1_TIMINGA_REF, 0x00000618
- .equ DMC1_TIMING_ROW, 0x11344309
- .equ DMC1_TIMING_DATA, 0x12130005
- .equ DMC1_TIMING_PWR, 0x0E190222
- .endif @;CONFIG_X210B
复制代码 DMC0_MEMCONFIG_0配置成0x30F82222,注意末尾的2222,chip_col设置成9bits(K4T1G164QQ的行地址不是10bits么)。
再看DMC1_MEMCONFIG_0 = 0x40F01322,这里chip_col设置成0x3 = 10bit了,难道这核心板上DDR芯片不一样么?
哦,看错了,makefile有S5PV210的定义
ifdef CONFIG_MCP_SINGLE
AFLAGS = --defsym $(FLAG4REV)=0x1 --defsym S5PV210=0x1
CFLAGS = -I../../include -Os -D$(FLAG4REV) -DS5PV210
CFLAGS_HOST = -D$(FLAG4REV) -DS5PV210
else
AFLAGS = --defsym $(FLAG4REV)=0x1
CFLAGS = -I../../include -Os -D$(FLAG4REV)
CFLAGS_HOST = -D$(FLAG4REV)
endif
S5PV210的定义隐藏得好深啊。。。
.ifdef S5PV210
.equ CONFIG_SMDKV210, 0x1
.else
.equ CONFIG_X210B, 0x1
.endif
所以uboot的DDR参数应该是- .ifdef CONFIG_SMDKV210
- .equ DMC0_MEMCONFIG_0, 0x20E01323
- .equ DMC0_MEMCONFIG_1, 0x40F01323
- .equ DMC0_TIMINGA_REF, 0x00000618
- .equ DMC0_TIMING_ROW, 0x28233287
- .equ DMC0_TIMING_DATA, 0x23240304
- .equ DMC0_TIMING_PWR, 0x09C80232
- .equ DMC1_MEMCONTROL, 0x00202400
- .equ DMC1_MEMCONFIG_0, 0x40C01323
- .equ DMC1_MEMCONFIG_1, 0x00E01323
- .equ DMC1_TIMINGA_REF, 0x00000618
- .equ DMC1_TIMING_ROW, 0x28233289
- .equ DMC1_TIMING_DATA, 0x23240304
- .equ DMC1_TIMING_PWR, 0x08280232
- .endif @;CONFIG_SMDKV210
- .endif @;CONFIG_CLK_800_200_166_133
复制代码 那么uboot的DDR设置可以理解了,但是九鼎裸机例程的DDR设置无法理解。有人看过这段代码么,交流一下,谢谢。
2014.10.30更新:
经测试,以上配置都有问题,因为根据datasheet第二章的内容,Memory Map规定DMC0的范围只能在0x2000_0000~0x3FFF_FFFF(512MByte),只有DMC1才能分配(0x4000_0000~0x7FFF_FFFF)(1GByte)
所以 0x40F01323不可能分配给DMC0_MEMCONFIG_1。分配了也不可用。
我的板子是X210II,只有512MByte,而且是DMC0挂了256M,DMC1上挂256M,真是蛋疼。
为了保持地址连续,最终我的配置是这样的:
.equ DMC0_MEMCONFIG_0, 0x30F01323 /*九鼎给的原值为0x0x30F01313*/
.equ DMC0_MEMCONFIG_1, 0x38F81323 /*九鼎给的原值为0x0x40F01323*/
.equ DMC0_TIMINGA_REF, 0x00000618
.equ DMC0_TIMING_ROW, 0x28233287
.equ DMC0_TIMING_DATA, 0x23240304
.equ DMC0_TIMING_PWR, 0x09C80232
.equ DMC1_MEMCONFIG_0, 0x40F01323 /*九鼎给的原值为0x50F01313*/
.equ DMC1_MEMCONFIG_1, 0x48F81323 /*九鼎给的原值为0x00E01323,这里chip_base不该是0x00吧,如果是0x00,DMC1只有128M可用*/
.equ DMC1_TIMINGA_REF, 0x00000618
.equ DMC1_TIMING_ROW, 0x28233289
.equ DMC1_TIMING_DATA, 0x23240304
.equ DMC1_TIMING_PWR, 0x08280232
完 |