http://bbs.2beanet.com/boot-f31/s3c6410-uboot-t3135.html
前章我们已经可以制作出用来启动的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 的,行列地址线在实际的使用过程中是分时复用的。
二、内存大小的修改
修改用来显示的内存大小
修改CPU中对应的寄存器配置
《s3c6410_rev12.pdf》196页,5.5.4 MEMORY CONFIGURATION REGISTER
00 = 1 chip
01 = 2 chips
10 = Reserved
11 = Reserved
这里我们是2片所以要选成 01
000 = 11 bits
001 = 12 bits
010 = 13 bits
011 = 14 bits
100 = 15 bits
101 = 16 bits
000 = 8 bits
001 = 9 bits
010 = 10 bits
011 = 11 bits
100 = 12 bits
以256M内存芯片的参数为例
《K4X1G163PC.pdf》芯片手册中描述如下:
这里我们需要将Row设置为011将Column设置为010
uboot代码中我们可以看到
实际上,如果通过读CPU的手册而将内存配置正确,是件挺困的事情,还好我们有很多可参考的代码,但我们需要弄清楚这些代码为什么要这样修改
修改行列地址线的配置
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的自举地址,这里记录了下查找及修改的过程
cpu/s3c64xx/start.S 中看到
ldr sp, _TEXT_PHY_BASE
bl movi_bl2_copy
b after_copy
#endif
.word CFG_PHY_UBOOT_BASE
修改 include/configs/smdk6410.h
#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 = 0xcfe00000
修改 include/movi.h
#define BL2_BASE 0x5FE00000
这宏只作用于movi_bl2_copy函数,因为我们需要将UBOOT自举到256的最顶端
修改MMU地址映射规则
修改 board/samsung/smdk6410/lowlevel_init.S
找到 mmu_table:将
.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
修改为:
.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是一致的