三. 修改制作yaffs映象文件的工具
在 yaffs 源码中有个 utils 目录,里面是工具 mkyaffsimage 和 mkyaffs2image的源代码,前者用来制作 yaffs1 映象文件,后者用来制作 yaffs2 映象文件。目前 mkyaffsimage 工具只能生成老格式的yaffs1 映象文件,需要修改才能支持新格式。
(1)下载的yaffs2解压出来是这样的一个目录/Development下面有两个文件夹:yaffs yaffs2,我们需要进入yaffs2,然后再进入utils,这个下面有3个文件,我们需要加两个文件,nand-ecc.c yaffs_packedtags1.c ,yaffs_packedtags1.c这个文件是从上一节目录拷贝过来的,nand-ecc.c的原码如下:
在mkyaffsimage.c里边修改原码为:
加这个头文件:#include "yaffs_packedtags1.h"
static int write_chunk(__u8 *data, __u32 objId, __u32 chunkId, __u32 nBytes)
{
#ifdef CONFIG_YAFFS_9BYTE_TAGS
yaffs_Tags t;
yaffs_Spare s;
error = write(outFile,data,512);
if(error < 0) return error;
memset(&t,0xff,sizeof (yaffs_Tags));
memset(&s,0xff,sizeof (yaffs_Spare));
t.chunkId = chunkId;
t.serialNumber = 0;
t.byteCount = nBytes;
t.objectId = objId;
if (convert_endian)
{
little_to_big_endian(&t);
}
yaffs_CalcTagsECC(&t);
yaffs_LoadTagsIntoSpare(&s,&t);
yaffs_CalcECC(data,&s);
nPages++;
return write(outFile,&s,sizeof(yaffs_Spare));
#else
yaffs_PackedTags1;
yaffs_ExtendedTags etags;
__u8 ecc_code[6];
__u8 oobbuf[16];
error = write(outFile,data,512);
if(error < 0) return error;
etags.chunkId = chunkId;
etags.serialNumber = 0;
etags.byteCount = nBytes;
etags.objectId = objId;
etags.chunkDeleted = 0;
yaffs_PackTags1(&pt1, &etags);
yaffs_CalcTagsECC((yaffs_Tags *)&pt1);
memset(oobbuf, 0xff, 16);
memcpy(oobbuf+8, &pt1, 8);
nand_calculate_ecc(data, &ecc_code[0]);
nand_calculate_ecc(data+256, &ecc_code[3]);
oobbuf[0] = ecc_code[0];
oobbuf[1] = ecc_code[1];
oobbuf[2] = ecc_code[2];
oobbuf[3] = ecc_code[3];
oobbuf[6] = ecc_code[4];
oobbuf[7] = ecc_code[5];
nPages++;
return write(outFile, oobbuf, 16);
#endif
}
修改Makefile文件:
MKYAFFSSOURCES = mkyaffsimage.c yaffs_packedtags1.c nand-ecc.c
yaffs_packedtags1.c和nand-ecc.c是我们加上去的
这样我们就可以用make命令来生成工具文件了:mkyaffsimage 和mkyaffs2image
现在我们来制作镜象文件,把目录转到我们文件系统的文件夹上一个目录,我是转到根目录,因为我是在根目录创建了filesystem_install目录,为了方便用mkyaffsimage命令,我们直接把mkyaffsimage拷贝到根目录的bin里边,这样这个命令就可以用了,这样我们就可以用下面的命令来生成镜象文件了:mkyaffsimage filesystem_install (自己命个名字给镜象文件,但是后缀一定是yaffs,比如:myyaffs.yaffs),
这样我们就全部搞定了一个根文件系统yaffs,这样我们就可以下载的板上面去测试,我这样的做的,是完全成功的,在环境变量里边还有设置个变量:bootargs=noinitrd console=ttySAC0 root=/dev/mtdblock2 rootfstype=yaffs到此为止,全部搞定。如果有什么问题,可以一起交流,