S3C6410开发全纪录(二)《如何计算内存大小,并在UBOOT中调整内存大小》

转载 2012年03月29日 00:15:04

前章我们已经可以制作出用来启动的SD卡了,并将自己编译的UBOOT烧录到了SD卡中

这份UBOOT代码中的内存配置肯定和手头的开发板不一致,这里我们将搞清楚如何修改内存大小,并说清楚内存大小到底是如何计算的

一、关于内存大小的计算

1)硬件的型号,在飞凌的开发板中

128M内存 采用的是 K4X51163PC 可以看出来 这颗芯片是 总大小为512 bit 位宽 为16
256M内存 采用的是 K4X1G163PC 可以看出来 这颗芯片是 总大小为1G  bit 位宽 为16

2)贴片数量2,都是用2DDR,来构成32位

3)查看DDR的芯片手册
128M内存 总共有 4 个 BANK 行列地址线数量分别为 Row = 13 Col = 10
256M内存 总共有 4 个 BANK 行列地址线数量分别为 Row = 14 Col = 10

4)以256M内存为例,内存大小的计算为

每个BANK的存储单元个数 = (2^Row)*(2^Col) = 2^(Row+Col)
每个存储单元 可以存放 16 位 的数据
总容量 = 芯片个数 * 每个芯片的BANK数量 * 位宽 * 行地址线数量 * 列地址线数量 (这里的单位都是bit)
            = 2*4*16*(2^14)*(2^10) = 2^(1+2+4+14+10)= 2^31 bit 

转换为 字节 2^28  转换为兆 2^8 M = 256 M

这里需要说明的是 行列地址线的总数是 > 16 的,行列地址线在实际的使用过程中是分时复用的。

二、内存大小的修改

修改用来显示的内存大小

  1. ./include/configs/smdk6410.h:#define PHYS_SDRAM_1_SIZE  0x10000000 /* 256 MB */   

修改CPU中对应的寄存器配置

《s3c6410_rev12.pdf》196页,5.5.4 MEMORY CONFIGURATION REGISTER

  1. P1MEMCFG  0x7E00100C  R/W  32-bit DRAM controller memory config register  0x01_0020  
  1. Active chips  [22:21]   
  2. 00 = 1 chip    
  3. 01 = 2 chips    
  4. 10 = Reserved   
  5. 11 = Reserved   

这里我们是2片所以要选成 01

  1. Row bits [5:3]  
  2. 000 = 11 bits    
  3. 001 = 12 bits    
  4. 010 = 13 bits    
  5. 011 = 14 bits    
  6. 100 = 15 bits    
  7. 101 = 16 bits    
  1. Column bits  [2:0]   
  2. 000 = 8 bits    
  3. 001 = 9 bits    
  4. 010 = 10 bits    
  5. 011 = 11 bits    
  6. 100 = 12 bits    

以256M内存芯片的参数为例

《K4X1G163PC.pdf》芯片手册中描述如下:

  1. 32M x16 BA0,BA1 A0 - A13 A0 - A9  

这里我们需要将Row设置为011将Column设置为010

uboot代码中我们可以看到

  1. ./include/s3c6410.h:#define ELFIN_DMC1_BASE         0x7e001000  
  1. ./include/s3c6410.h:#define INDEX_DMC_MEMORY_CFG    (0x0C)  
  1. ./include/s3c6410.h:#define DMC1_MEM_CFG            0x00010012  

实际上,如果通过读CPU的手册而将内存配置正确,是件挺困的事情,还好我们有很多可参考的代码,但我们需要弄清楚这些代码为什么要这样修改

修改行列地址线的配置

  1. #define DMC1_MEM_CFG 0x0001001A  

1A转换为二进制为00011010,可以看到,是我们查到的Row,Column的寄存器配置的值

在有些代码中也修改了 #define DMC1_CHIP0_CFG  0x150F8 这个寄存器的值,为 #define DMC1_CHIP0_CFG  0x150F0
翻遍了资料也不知道这个值是做什么用的,为什么要修改,所以我这里并没有修改这个值,也希望有经验的朋友能告诉我为什么。

修改UBOOT的自举地址

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

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

  1. cpu/s3c64xx/start.S 中看到  
  2.   
  3. #ifdef CONFIG_BOOT_MOVINAND  
  4.         ldr     sp, _TEXT_PHY_BASE  
  5.         bl      movi_bl2_copy  
  6.         b       after_copy  
  7. #endif  
  1. _TEXT_PHY_BASE:  
  2.         .word   CFG_PHY_UBOOT_BASE  
  1. 修改 include/configs/smdk6410.h  
  2. #define CFG_MEMTEST_END         MEMORY_BASE_ADDRESS + 0x7e00000         /* 128 MB in DRAM       */  
  3. #define CFG_MEMTEST_END         MEMORY_BASE_ADDRESS + 0xfe00000         /* 256 MB in DRAM       */  
  4.   
  5.   
  6. #ifdef CONFIG_ENABLE_MMU  
  7.         // #define CFG_UBOOT_BASE               0xc7e00000  
  8.         #define CFG_UBOOT_BASE 0xcfe00000  
  9. #else  
  10.         //#define CFG_UBOOT_BASE                0x57e00000  
  11.         #define CFG_UBOOT_BASE 0x5fe00000  
  12. #endif  
  13.   
  14. //#define CFG_PHY_UBOOT_BASE    MEMORY_BASE_ADDRESS + 0x7e00000  
  15. #define CFG_PHY_UBOOT_BASE MEMORY_BASE_ADDRESS + 0XFE00000  
  1. 修改 board/samsung/smdk6410/config.mk  
  2.   
  3. //TEXT_BASE = 0xc7e00000  
  4. TEXT_BASE = 0xcfe00000  
  1. 修改 include/movi.h  
  2.   
  3. //#define BL2_BASE                0x57E00000  
  4. #define BL2_BASE                0x5FE00000  
  5.   
  6. 这宏只作用于movi_bl2_copy函数,因为我们需要将UBOOT自举到256的最顶端  

修改MMU地址映射规则

  1. 修改 board/samsung/smdk6410/lowlevel_init.S  
  2. 找到 mmu_table:将  
  3.         // 128MB for SDRAM 0xC0000000 -> 0x50000000  
  4.         .set __base, 0x500  
  5.         .rept 0xC80 - 0xC00          
  6.         FL_SECTION_ENTRY __base,3,0,1,1  
  7.         .set __base,__base+1  
  8.         .endr  
  9.   
  10.         // access is not allowed.  
  11.         .rept 0x1000 - 0xc80          
  12.         .word 0x00000000  
  13.         .endr  
  14.   
  15. 修改为:  
  16.         // 256MB for SDRAM 0xC0000000 -> 0x50000000  
  17.         .set __base, 0x500  
  18.         .rept 0xd00 - 0xC00  
  19.         FL_SECTION_ENTRY __base,3,0,1,1  
  20.         .set __base,__base+1  
  21.         .endr  
  22.   
  23.         // access is not allowed.  
  24.         .rept 0x1000 - 0xd00  
  25.         .word 0x00000000  
  26.         .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》


S3C6410开发全纪录(二)《如何计算内存大小,并在UBOOT中调整内存大小》 .

转载:http://blog.csdn.net/turui/article/details/6634778 前章我们已经可以制作出用来启动的SD卡了,并将自己编译的UBOOT烧录到了SD卡中 这份...
  • Sun_Rise2011
  • Sun_Rise2011
  • 2012年08月06日 20:16
  • 2135

S3C6410开发全纪录(二)《如何计算内存大小,并在UBOOT中调整内存大小》

zz : http://blog.csdn.net/turui/article/details/6634778 前章我们已经可以制作出用来启动的SD卡了,并将自己编译的UBOOT烧录...
  • sxlwzl
  • sxlwzl
  • 2013年09月03日 11:07
  • 686

Eclipse设置内存大小

Eclipse设置内存大小 1、修改Eclipse的配置文件 (1)打开Eclipse目录 (2)以EditPlus打开eclipse.ini,修改“-Xms40m  -...
  • you23hai45
  • you23hai45
  • 2015年01月27日 20:43
  • 10002

linux系统内存大小和起始地址的解析与修改

原帖:http://blog.chinaunix.net/uid-9543173-id-3571668.html 在实际的工作中,由于产品型号的不同,经常需要调整linux所管理的内...
  • u014694393
  • u014694393
  • 2015年05月12日 13:41
  • 1875

java对象占用内存大小计算方式

案例一: User public class User { } UserSizeTest public class UserSizeTest { static fin...
  • wobendiankun
  • wobendiankun
  • 2014年07月24日 23:02
  • 1833

Ios图片内存计算

转自:http://www.cnblogs.com/yaokang/archive/2012/06/02/2532257.html” 一,IOS与图片内存 在IOS上,图片会被自动缩放到2的N...
  • a21064346
  • a21064346
  • 2013年09月29日 09:52
  • 1410

图片占用内存计算方法

Android中有四种,分别是: ALPHA_8:每个像素占用1byte内存 ARGB_4444:每个像素占用2byte内存 ARGB_8888:每个像素占用4byte内存 R...
  • OnafioO
  • OnafioO
  • 2015年03月26日 21:54
  • 5636

调整jvm内存大小

默认状态下jvm会分配物理内存的1/4,因此当你的程序占用的内存超过物理内存的1/4时时,就会出现Exception in thread "main" java.lang.OutOfMemoryErr...
  • seventeen_years
  • seventeen_years
  • 2015年08月16日 23:12
  • 72

调整JVM虚拟机内存大小

随着应用程序处理需求的提升,我们对JAVA虚拟机的内存可能会有更高的要求,那么为了提升程序的处理能力,可以考虑在硬件支持的情况下适当扩大JAVA虚拟机的默认内存大小,下面介绍windows环境和liu...
  • lixinyao5281
  • lixinyao5281
  • 2017年07月27日 09:56
  • 157

uboot ddr配置

2014.4版本uboot启动至命令行几个重要函数为:_start,_main,board_init_f,relocate_code,board_init_r。 一 _start 对于任何程序,入口...
  • q123456789098
  • q123456789098
  • 2015年11月02日 09:23
  • 3353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:S3C6410开发全纪录(二)《如何计算内存大小,并在UBOOT中调整内存大小》
举报原因:
原因补充:

(最多只允许输入30个字)