On Tuesday 25 September 2007 14:09, wrote:
> Thank you! What I change is same to you, but now still has
> some questions, look below:
>
> ---
> /work/embedded_book_source/Development/yaffs2/yaffs_mtdif1.c
> 2007-07-24 03:14:04.000000000 +0800 +++ yaffs_mtdif1.c
> 2007-09-25 05:59:29.000000000 +0800 @@ -208,6 +208,9 @@
> switch (retval) {
> case 0:
> /* no error */
> + etags->blockBad = (mtd->block_isbad)(mtd,
> addr); + if (etags->blockBad)
> + return YAFFS_FAIL;
> break;
No, don't add it to the read function, it will slow down every
read of every page. The test is only needed for each block
during the initial scan. I added the call to the Query function
which is used during the scan.
> Another question:
>
> linux 2.6.22.6,
> yaffs_mtdif1.c's version is : "$Id: yaffs_mtdif1.c,v 1.2
> 2007/07/23 19:14:04 imcd Exp $" Flash Type: 512Byte/Page
>
> Even for yaffs1, the default nand_ecclayout of yaffs_mtdif1.c
> is: static struct nand_ecclayout nand_oob_16 = {
> .eccbytes = 6,
> .eccpos = {0, 1, 2, 3, 6, 7},
> .oobfree = {
> { .offset = 8,
> . length = 8}}
> };
>
> But the nand_ecclayout of utils/mkyaffsimage.c is:
> static struct nand_ecclayout nand_oob_16 = {
> .eccbytes = 6,
> .eccpos = { 8, 9, 10, 13, 14, 15 },
> .oobavail = 9,
> .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } }
> };
>
> They are diffrent, this is the reason my yaffs partition
> can be mount, but can't work: in
> nandmtd1_ReadChunkWithTagsFromNAND, 'retval =
> yaffs_CheckECCOnTags((yaffs_Tags *)&pt1)' is -1, so all blocks
> are treated as 'Empty'.
Yes, MTD changed the built-in/default layout policy between
2.6.17 and 2.6.18. If you want backward compatibility you'll
have to change the layout -- and if you do, try adding it
to the platform NAND mapping code. You will probably find you
also need to replace the call to nand_scan() with two calls:
nand_scan_ident(), then, after you override the default layout
(eg: chip->ecclayout = chip->ecc.layout = &my_nand_layout) call
nand_scan_tail() to finish off.
> I use the second nand_oob_16 above, configure
> CONFIG_YAFFS_9BYTE_TAGS. And then the system can boot, the
> content in the yaffs root filesystem can be seen.
>
> The question is: it can't boot next time. After the first
> booting, I do nothing but run 'reset'.
You need to untangle the layout issues. MTD can only really
do one policy for the whole chip - to boot images, bootloaders,
yaffs etc., all have to agree as to the format/layout of
oob/spare.
> The kernel log at the second booting is:
> VFS: Mounted root (yaffs filesystem).
> Freeing init memory: 124K
> Kernel panic - not syncing: No init found. Try passing init=
> option to kernel.
>
> By the way, change the nand_ecclayout seem to be ugly, there
> is another partions on the nand flash, the ECC layout should
> be consistent to another tools, such as U-Boot. Do you have
> some idea? Thank you.
It's a big mess. The user-space tools have a very poor idea of
MTD policies. We need new tools and a better design.
-imcd