全部博文(92)
分类: 嵌入式
2010-04-23 16:12:23
NAND FLASH 启动过程及分区配置
这里有几篇博客很值得借鉴:
http://blog.sina.com.cn/s/blog_52009a100100hjmc.html(ARM的位置无关程序设计在Bootloader中的应用)
http://blog.sina.com.cn/s/blog_52009a100100hcv1.html(关于Uboot的NOR boot 或NAND boot问题---基于TQ2440)
http://blog.chinaunix.net/u1/34474/index.html(一个很强大的嵌入式博主)
NAND FLASH 启动过程:
l 2440内部有一个叫做“起步石(Steppingstone)” 的 SRAM缓冲器,在0x40000000~0x40001000
l 系统启动时Nand flash存储器的前面4K字节被自动拷贝到Steppingstone中
l Steppingstone被映射到nGCS0对应的BANK0存储空间
l CPU在Steppingstone的4-KB内部缓冲器中开始执行引导代码
l 引导代码执行完毕后,自动跳转到SDRAM(0x33F80000)执行
NAND FLASH的分区设置:
在arch/arm/plat-s3c24xx/common-smdk.c文件,我们需要设置自己的NAND FLASH分区
这里我们要使nandflash同时支持64M,256M。
static struct mtd_partition smdk_default_nand_part[] = {
#if defined(CONFIG_64M_NAND)
[0] = {
.name = "boot",
.offset = 0,
.size = SZ_1M,
},
[1] = {
.name = "kernel",
.offset = SZ_1M + SZ_128K,
.size = SZ_4M,
},
[2] = {
.name = "yaffs2",
.offset = SZ_1M + SZ_128K + SZ_4M,
.size = SZ_64M - SZ_4M - SZ_1M - SZ_128K,
}
#elif defined(CONFIG_256M_NAND)
[0] = {
.name = "boot",
.offset = 0,
.size = SZ_1M,
},
[1] = {
.name = "kernel",
.offset = SZ_1M + SZ_128K,
.size = SZ_4M,
},
[2] = {
.name = "yaffs2",
.offset = SZ_1M + SZ_128K + SZ_4M,
.size = SZ_256M - SZ_4M - SZ_1M – SZ_128K,
}
#endif
};
这里我们设置了3个系统分区,每个分区都对应一个设备(在/dev目录下):
1. boot=1M->/dev/mtdblock0
2. kernel=4M->/dev/mtdblock1
3. yaffs=256M-1M-4M-128K->/dev/mtdblock2(这128K是夹在boot和kernel中间的系统参数)
系统启动后,见打印信息:
Creating 3 MTD partitions on “NAND 256MiB 3 ,3V 8-bit”:
0x000000000000-0x000000100000 : “boot”
0x000000120000-0x000000520000 : “kernel”
0x000000520000-0x000010000000 : “yaffs2”
在UBOOT中通过参数设置实际的NAND FLASH 物理分区:
mtdparts=mtdparts=nandflash0:1m(bios);128k(params);4m(kernel);-(root)
/board/smdk2410/config.mk中
# SMDK2410 has 1 bank of 64 MB DRAM
#
# 3000'0000 to 3400'0000
#
# Linux-Kernel is expected to be at 3000'8000, entry 3000'8000
# optionally with a ramdisk at 3080'0000
#
# we load ourself to 33F8'0000
#
# download area is 3300'0000
#
TEXT_BASE = 0x33F80000