Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2968752
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: 嵌入式

2014-08-05 22:55:35

原文地址:http://besk.blog.163.com/blog/static/75789798201392941943512/

一、关于内存的基本常识

TQ6410开发板使用了K4X51163PC,从资料看,是16bit宽,512Mb的DDR,共2片,拼成32bit的1Gb的内存.4个BANK,行列地址线分别为:Row=13, Col=10, 每个BANK的存储单元个数 = (2^Row)*(2^Col) = 2^(Row+Col),每个存储单元为16 位数据,所以总容量=芯片个数*每个芯片的BANK数量*位宽*行地址线*列地址线   (bit)
计算结果= 2*4*16*(2^13)*(2^10) = 2^(1+2+4+13+10)= 2^30 bit,转换为字节为128MB.

二、修改内存大小

1.  修改用来显示的内存大小

代码在: ./include/configs/smdk6410.h

#define PHYS_FLASH_SIZE  0x100000         /*    256MB  */          

2.  修改CPU对应的寄存器配置

阅读S3C6410的数据手册1.2版英文版,第196页的配置表:

2013年10月29日 - besk - 日月未老我先老

        按照TQ6410开发板的配置,0x01_0020寄存器的内容应该如下:

                 因为使用了2片DDR,所以需要选择[22:21]=01.

2013年10月29日 - besk - 日月未老我先老
2013年10月29日 - besk - 日月未老我先老
 根据芯片的参数,ROW=13 选择为[5:3]=010;
                              COL=10  选择为[2:0]=010;
代码./include/configs/s3c6410.h:

#define ELFIN_DMC1_BASE      0x7e001000 
#define INDEX_DMC_MEMORY_CFG (0x0C) 
#define DMC1_MEM_CFG 0x00010012

行列地址线配置
#define DMC1_MEM_CFG 0x0001001A 
1A转换为二进制为00011010,就是Row,Column的寄存器配置的值

        3.修改UBOOT的自启动

一般考虑修改UBOOT自举地址都会去修改 board/samsum/smdk6410/config.mk 中的 TEXT_BASE 的值,但这里不能做

网上下来资料看了下,目前大多数的s3c6410开发板都没有去修改UBOOT的自举地址,这里记录了下查找及修改的过程



[cpp] view plaincopyprint?
cpu/s3c64xx/start.S 中看到 
#ifdef CONFIG_BOOT_MOVINAND 
ldr sp, _TEXT_PHY_BASE 
bl movi_bl2_copy 
b after_copy 
#endif 
cpu/s3c64xx/start.S 中看到

#ifdef CONFIG_BOOT_MOVINAND
        ldr     sp, _TEXT_PHY_BASE
        bl      movi_bl2_copy
        b       after_copy
#endif

[cpp] view plaincopyprint?
_TEXT_PHY_BASE: 
.word CFG_PHY_UBOOT_BASE 
_TEXT_PHY_BASE:
        .word   CFG_PHY_UBOOT_BASE

[cpp] view plaincopyprint?
修改 include/configs/smdk6410.h 
#define CFG_MEMTEST_END MEMORY_BASE_ADDRESS + 0x7e00000 /* 128 MB in DRAM */ 
#define CFG_MEMTEST_END MEMORY_BASE_ADDRESS + 0xfe00000 /* 256 MB in DRAM */ 
#ifdef CONFIG_ENABLE_MMU 
// #define CFG_UBOOT_BASE 0xc7e00000 
#define CFG_UBOOT_BASE 0xcfe00000 
#else 
//#define CFG_UBOOT_BASE 0x57e00000 
#define CFG_UBOOT_BASE 0x5fe00000 
#endif 
//#define CFG_PHY_UBOOT_BASE MEMORY_BASE_ADDRESS + 0x7e00000 
#define CFG_PHY_UBOOT_BASE MEMORY_BASE_ADDRESS + 0XFE00000 
修改 include/configs/smdk6410.h
#define CFG_MEMTEST_END         MEMORY_BASE_ADDRESS + 0x7e00000         /* 128 MB in DRAM       */
#define CFG_MEMTEST_END         MEMORY_BASE_ADDRESS + 0xfe00000         /* 256 MB in DRAM       */


#ifdef CONFIG_ENABLE_MMU
        // #define CFG_UBOOT_BASE               0xc7e00000
        #define CFG_UBOOT_BASE 0xcfe00000
#else
        //#define CFG_UBOOT_BASE                0x57e00000
        #define CFG_UBOOT_BASE 0x5fe00000
#endif

//#define CFG_PHY_UBOOT_BASE    MEMORY_BASE_ADDRESS + 0x7e00000
#define CFG_PHY_UBOOT_BASE MEMORY_BASE_ADDRESS + 0XFE00000



[cpp] view plaincopyprint?
修改 board/samsung/smdk6410/config.mk 
//TEXT_BASE = 0xc7e00000 
TEXT_BASE = 0xcfe00000 
修改 board/samsung/smdk6410/config.mk

//TEXT_BASE = 0xc7e00000
TEXT_BASE = 0xcfe00000



[cpp] view plaincopyprint?
修改 include/movi.h 
//#define BL2_BASE 0x57E00000 
#define BL2_BASE 0x5FE00000 
这宏只作用于movi_bl2_copy函数,因为我们需要将UBOOT自举到256的最顶端 
修改 include/movi.h

//#define BL2_BASE                0x57E00000
#define BL2_BASE                0x5FE00000

这宏只作用于movi_bl2_copy函数,因为我们需要将UBOOT自举到256的最顶端

修改MMU地址映射规则



[cpp] view plaincopyprint?
修改 board/samsung/smdk6410/lowlevel_init.S 
找到 mmu_table:将 
// 128MB for SDRAM 0xC0000000 -> 0x50000000 
.set __base, 0x500 
.rept 0xC80 - 0xC00 
FL_SECTION_ENTRY __base,3,0,1,1 
.set __base,__base+1 
.endr 
// access is not allowed. 
.rept 0x1000 - 0xc80 
.word 0x00000000 
.endr 
修改为: 
// 256MB for SDRAM 0xC0000000 -> 0x50000000 
.set __base, 0x500 
.rept 0xd00 - 0xC00 
FL_SECTION_ENTRY __base,3,0,1,1 
.set __base,__base+1 
.endr 
// access is not allowed. 
.rept 0x1000 - 0xd00 
.word 0x00000000 
.endr 
修改 board/samsung/smdk6410/lowlevel_init.S
找到 mmu_table:将
        // 128MB for SDRAM 0xC0000000 -> 0x50000000
        .set __base, 0x500
        .rept 0xC80 - 0xC00        
        FL_SECTION_ENTRY __base,3,0,1,1
        .set __base,__base+1
        .endr

        // access is not allowed.
        .rept 0x1000 - 0xc80        
        .word 0x00000000
        .endr

修改为:
        // 256MB for SDRAM 0xC0000000 -> 0x50000000
        .set __base, 0x500
        .rept 0xd00 - 0xC00
        FL_SECTION_ENTRY __base,3,0,1,1
        .set __base,__base+1
        .endr

        // access is not allowed.
        .rept 0x1000 - 0xd00
        .word 0x00000000
        .endr

UBOOT启动起来,敲入 md cfe00000,打印出内存的数据,可以查看到跟我们编译出来的u-boot.bin是一致的

三、参考资料

专家详解:内存工作原理及发展历程(值得一看)

http://blog.chinaunix.net/link.php?url=http://memory.zol.com.cn%2F47%2F474952.html

6410平台上配置Linux的DDR参数(直接给出了结果,可以有个参考)

http://flydream1129.blog.163.com/blog/static/482344592010112033628978/

S3C6410的DRAM控制器(罗列的非常清楚)

http://blog.csdn.net/nanjianhui/article/details/4264302

《s3c6410_rev12.pdf》

《OK6410开发板硬件手册2.1.pdf》

《K4X51163PC.pdf》

《K4X1G163PC.pdf》

阅读(4151) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~