全部博文(685)
分类: 嵌入式
2014-08-05 22:55:35
一、关于内存的基本常识
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页的配置表:
按照TQ6410开发板的配置,0x01_0020寄存器的内容应该如下:
因为使用了2片DDR,所以需要选择[22:21]=01.
#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的自举地址,这里记录了下查找及修改的过程
cpu/s3c64xx/start.S 中看到 #ifdef CONFIG_BOOT_MOVINAND ldr sp, _TEXT_PHY_BASE bl movi_bl2_copy b after_copy #endif
_TEXT_PHY_BASE: .word CFG_PHY_UBOOT_BASE
修改 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
修改 board/samsung/smdk6410/config.mk //TEXT_BASE = 0xc7e00000 TEXT_BASE = 0xcfe00000
修改 include/movi.h //#define BL2_BASE 0x57E00000 #define BL2_BASE 0x5FE00000 这宏只作用于movi_bl2_copy函数,因为我们需要将UBOOT自举到256的最顶端
修改MMU地址映射规则
修改 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》