移植yaffs根文件系统,开发板是mini2440。NAND flash是64M的,由于yaffs2/utils中的mkyaffsimage程序只能生成老式的yaffs1映象文件,需要修改才能支持新格式。yaffs1新、老格式的不同在于oob区的使用发生了变化:一是ECC检验码的位置发生了变化,二是可用空间即标记(tag)的数据结构定义发生了变化。
移植uboot版本为uboot-2009.11,内核版本2.6.32.2;根文件系统制作采用busybox1.19.3。
1. 内核配置yaffs选项选择yaffs do it's own ECC
由于yaffs采用自己的ECC校验,那么linux应该关闭ECC校验,否则无法挂载根文件系统,选择kernel为NAND_ECC_NONE。(在/drivers/mtd/nand/s3c2410.c中修改)
2. 没有选择yaffs do it's own ECC
这时使用的mtd的ecc校验,linux应该选择NAND_ECC_SOFT(不能使用硬件ECC,因为mkyaffsimage程序中使用的是mtd的软件ecc校验)。
拷贝yaffs_packedtags1.c, yaffs_packedtags1.h,linux/drivers/mtd/nand/nand_ecc.c到utils目录
修改Makefile文件:
MKYAFFSSOURCES = mkyaffsimage.c yaffs_packedtags1.c nand-ecc.c
在mkyaffsimage.c添加:
#include "yaffs_packedtags1.h"
extern int nand_calculate_ecc(const unsigned char *buf, unsigned char *code);
主要修改write_chunk函数:
static int write_chunk(u8 *data, u32 obj_id, u32 chunk_id, u32 n_bytes)
{
#ifdef CONFIG_YAFFS_9BYTE_TAGS // old program
struct yaffs_tags t;
struct yaffs_spare s;
error = write(outFile,data,512);
if(error < 0) return error;
memset(&t,0xff,sizeof (struct yaffs_tags));
memset(&s,0xff,sizeof (struct yaffs_spare));
t.chunk_id = chunk_id;
t.serial_number = 0;
t.n_bytes_lsb = n_bytes;
t.obj_id = obj_id;
if (convert_endian)
{
little_to_big_endian(&t);
}
yaffs_calc_tags_ecc(&t);
yaffs_load_tags_to_spare(&s,&t);
yaffs_calc_ecc(data,&s);
nPages++;
return write(outFile,&s,sizeof(struct yaffs_spare));
#endif
struct ya