基于3.10.90内核代码
对于nand flash, 坏块标记一般位于每个block的第一个page页spare区的第一个字节。如一个page为2k+64Byte, 则 64为spare区,用来存放oob和ecc,以及block的坏块标记(只有某些页如第一页)。对于一些文件系统如 yaffs2和jffs2会使用到 oob区来存放一些数据 。由于坏块标记位于 spare区的第一个字节,则 oob数据需要跳过该位置。
在 atmel_nand.c (drivers\mtd\nand) 里:
static struct nand_ecclayout atmel_oobinfo_large = {
.eccbytes = 4,
.eccpos = {60, 61, 62, 63},
.oobfree = {
{2, 58} // 2表示oob偏移两个字节,从而与坏块标记位错开。
},
};
通过 atmel_hw_nand_init_params 里:
nand_chip->ecc.layout = &atmel_oobinfo_large;
在 mtd 设备操作时:
mtd->_write_oob = nand_write_oob
nand_write_oob // nand_base.c (drivers\mtd\nand)
nand_do_write_oob
nand_fill_oob
case MTD_OPS_AUTO_OOB 时会使用下面的 中的 offset, 对oob区中的数据进行偏移
struct nand_oobfree *free = chip->ecc.layout->oobfree;
boffs = free->offset + woffs; // 对应的上面的 offset 进行偏移 2个字节,不是从spare区顶头写
memcpy(chip->oob_poi + boffs, oob, bytes);