#ARCH ?= arm
#CROSS_COMPILE ?=arm-linux-
2、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息。这里的分区一定要和你的bootloader的一致,你可以参考smdk_default_nand_part[]这个数据结构的做法。
3、还是2中用到的文件,修改static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0,
.twrph0 = 30, //这 三个数字要改的 以前是20 60 20
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
}
4、修改drivers/mtd/nand/s3c2410.c中s3c2410_nand_init_chip函数的NAND_ECC_SOFT为NAND_ECC_NONE。
5、晶振频率:修改arch/arm/mach-s3c2440/mach-smdk2440.c
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc))
s3c24xx_init_clocks(12000000)//改成和你的一样
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs))
}
6、添加对yaffs2文件系统的支持:
下载yaffs2的源码包,解压后进入其中,其加入Linux内核(打补丁的方式)
#cd yaffs2
#./patch-ker.sh c $you_kernel_path(你的内核代码的目录)
7、配置内核
先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
1.General setup --->
[*] Configure standard kernel features (for small systems) --->
2. System Type ---->
[*] S3C2410 DMA support [*] Support ARM920T processor
S3C2410 Machines --->
[*] SMDK2410/A9M2410
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module
3.Boot options --->
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改成 (noinitrd root=/dev/mtdblock2 console=ttySAC0,115200 init=/linuxrc )
这里要特别注意root=/dev/mtdblock2 这个参数,mtdblock2是你的根文件系统所在的位置,和你在bootloader的分配有关,当然也和上述2。步骤的密切相关。不行的话多试几次。
4.[*] Enable loadable module support --->
[*] Module unloading
[*] Automatic kernel module loading
选择这两个,剩下的可以去掉
5.Device Drivers --->
<*>Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*>NAND Device Support --->
<*>NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个要去掉
6.File systems----->
Miscellaneous filesystems --->
<*>YAFFS2 file system support
7.make zImage
和普通文件系统不同,YAFFS文件系统专门为Nand Flash设计,可以使用mkyaffsimage生成文件系统的镜像,但如果要将此镜像烧入Flash,那么有些地方需要注意。
硬件上,Nand Flash的设计已考虑到包含坏块的情况,对于每扇区512字节的Nand Flash,每扇区都有一个16字节额外的扩展区,通常用以存储此扇区的校验数据以及坏块标记等信息(WinCE则使用了其中4字节存储逻辑扇区编号),所以我们看Nand Flash的Data Sheet时,经常会发现其容量以“64M + 2048K”这样的格式进行描述,后面的数字就用来表示扩展区的容量。
YAFFS文件系统既然专为Nand Flash设计,它在生成文件系统镜像时,已经考虑到对扩展区的利用,并将扩展区的数据包含在扇区数据后,其结构定义如下:
bytes 0-511: Data
bytes 512-515: YAFFS TAG
bytes 516: Data status
bytes 517: Block status
bytes 518-519: YAFFS TAG
bytes 520-522: ECC for bytes 256-511
bytes 523-524: YAFFS TAG
bytes 525-527: ECC for bytes 0-255
可以看出,YAFFS使用了8字节(YAFFS TAG)存储文件系统相关信息,并使用4字节(ECC)存储校验数据,而此校验数据算法与Nand Flash控制器的硬件算法并不一致,对于很多Boot Loader,可能会校验失败。
另外,由于YAFFS文件系统需要使用分区上的第一个块来存储一个名为Yaffs_ObjectHeader的结构体。该结构体记录了该分区中的文件、路径以及相关的链接,该块无法在生成镜像的时候产生,所以在烧写时还需要跳过第一个可用的块。比如,我们在MTD分区中划分一个YAFFS分区,占用Nand Flash空间为块1000-4095,那么,第1000块我们必须留空,镜像文件要从1001块开始烧写。
了解了YAFFS镜像文件的特点,我们现在清楚如何将YAFFS镜像烧入Nand Flash:
1、将镜像文件载入内存
2、根据MTD分区信息,定位到首块Nand Flash并跳过,从下一块开始烧录
3、擦除块,如果擦除失败,标志为坏块,继续 *** 作下一块
4、从镜像文件读出512字节,写入Nand Flash扇区
5、继续从镜像文件读出16字节,写入Nand Flash扩展数据区(注意不要写入硬件ECC,否则YAFFS分区无法mount)
6、重复步骤4,直到整块数据写入完成
7、重复步骤3,直到整个影像文件写入完成
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)