九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4109|回复: 1
打印 上一主题 下一主题

裸机DDR内存映射的配置问题(已解决)

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-27 10:13:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 laotang365 于 2014-10-30 22:12 编辑

在syscfg.inc文件中DDR寄存器参数设置如下:
  1. .if (CLK_400_200_166_133 == 1) || (CLK_800_200_166_133 == 1) || (CLK_1000_200_166_133 == 1)
  2. .equ DMC0_MEMCONFIG_0,         0x30F01313
  3. .equ DMC0_MEMCONFIG_1,         0x40F01323
  4. .equ DMC0_TIMINGA_REF,         0x00000618
  5. .equ DMC0_TIMING_ROW,         0x28233287
  6. .equ DMC0_TIMING_DATA,         0x23240304
  7. .equ DMC0_TIMING_PWR,         0x09C80232

  8. .equ DMC1_MEMCONFIG_0,         0x40F01313
  9. .equ DMC1_MEMCONFIG_1,         0x00E01323
  10. .equ DMC1_TIMINGA_REF,         0x00000618
  11. .equ DMC1_TIMING_ROW,         0x28233289
  12. .equ DMC1_TIMING_DATA,         0x23240304
  13. .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_base0x40chip1_mask0xF0。而DMC1_MEMCONFIG_0也是chip1_base0x40chip1_mask0xF0,这样地址映射不就重复了吗???
另外DMC1_MEMCONFIG_1chip1_base居然是0x00,和chip1_mask0xE0相与,那不就是IROM的地址范围么?怎么能这样设置呢?


而Uboot源码的DDR设置(uboot-x210\onenand_bl1\smdkc110\s5pc110_reg.inc)也有奇怪的地方:
  1. CONFIG_CLK_1000_200_166_133
  2. .ifdef        CONFIG_X210B
  3.         .equ DMC0_MEMCONFIG_0,                0x30F82222
  4.         .equ DMC0_MEMCONFIG_1,                0x40F82222
  5.         .equ DMC0_TIMINGA_REF,                0x0000050E
  6.         .equ DMC0_TIMING_ROW,                0x14233287
  7.         .equ DMC0_TIMING_DATA,                0x12130005
  8.         .equ DMC0_TIMING_PWR,                0x0E140222

  9.         .equ DMC1_MEMCONTROL,                0x00212100
  10.         .equ DMC1_MEMCONFIG_0,                0x40F01322
  11.         .equ DMC1_MEMCONFIG_1,                0x50F01322
  12.         .equ DMC1_TIMINGA_REF,                0x00000618
  13.         .equ DMC1_TIMING_ROW,                0x11344309
  14.         .equ DMC1_TIMING_DATA,                0x12130005
  15.         .equ DMC1_TIMING_PWR,                0x0E190222
  16. .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参数应该是
  1. .ifdef        CONFIG_SMDKV210
  2.         .equ DMC0_MEMCONFIG_0,                0x20E01323
  3.         .equ DMC0_MEMCONFIG_1,                0x40F01323
  4.         .equ DMC0_TIMINGA_REF,                0x00000618
  5.         .equ DMC0_TIMING_ROW,                0x28233287
  6.         .equ DMC0_TIMING_DATA,                0x23240304
  7.         .equ DMC0_TIMING_PWR,                0x09C80232

  8.         .equ DMC1_MEMCONTROL,                0x00202400
  9.         .equ DMC1_MEMCONFIG_0,                0x40C01323
  10.         .equ DMC1_MEMCONFIG_1,                0x00E01323
  11.         .equ DMC1_TIMINGA_REF,                0x00000618
  12.         .equ DMC1_TIMING_ROW,                0x28233289
  13.         .equ DMC1_TIMING_DATA,                0x23240304
  14.         .equ DMC1_TIMING_PWR,                0x08280232
  15. .endif        @;CONFIG_SMDKV210
  16. .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


回复

使用道具 举报

沙发
 楼主| 发表于 2014-11-2 18:44:59 | 只看该作者
本帖最后由 laotang365 于 2015-5-6 14:20 编辑

2014.11.12更新:
之前理解错了,因为只是用了CS0作为片选,CS1当做BA3,X210的DMC0应该当做一个芯片来用,所以不需要设置DMC0_MEMCONFIG_1,但是DMC0_memcontrol[19:16]必须设置为0x0,即只有一个chip。同理DMC1_MEMCONFIG_1也不需要设置。
另外,纠正一个错误,X210ii的DDR2芯片行地址宽度是是13bit而非14bit,虽然原理图上给的是画的是14bit,可能只是为了扩展内存容量画的。

x210(512M版本)的DDR芯片属于上图的第三种配置 ,因此2^13 * 2^10 * 2^3 * 4 =512MB。行地址 13 bit,列地址10bit。因此是MENCONFIG_0[3:0] = 1313
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-11-22 18:27 , Processed in 0.020060 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表