[U-Boot] question: why write bbt and search bbt use different ops mode in nand_bbt.c in U-boot 2013.04?
Hici Lo
caoxueqin19871125 at gmail.com
Sun Sep 22 11:38:19 CEST 2013
Hi all,
First, My uboot version is 2013.04.
In the function scan_write_bbt(), U-boot uses MTD_OOB_PLACE to write BBT
data and BBT pattern. See ">>>" below
static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len,
uint8_t *buf, uint8_t *oob)
{
struct mtd_oob_ops ops;
>>> ops.mode = MTD_OOB_PLACE;
ops.ooboffs = 0;
ops.ooblen = mtd->oobsize;
ops.datbuf = buf;
ops.oobbuf = oob;
ops.len = len;
return mtd->write_oob(mtd, offs, &ops);
}
while in funtion search_bbt() (actually in function scan_read_raw_oob()),
U-boot uses MTD_OOB_RAW to read BBT data and BBT pattern. See ">>>" below.
static int scan_read_raw_oob(struct mtd_info *mtd, uint8_t *buf, loff_t
offs,
size_t len)
{
struct mtd_oob_ops ops;
int res;
>>> ops.mode = MTD_OOB_RAW;
ops.ooboffs = 0;
ops.ooblen = mtd->oobsize;
while (len > 0) {
if (len <= mtd->writesize) {
ops.oobbuf = buf + len;
ops.datbuf = buf;
ops.len = len;
return mtd->read_oob(mtd, offs, &ops);
} else {
ops.oobbuf = buf + mtd->writesize;
ops.datbuf = buf;
ops.len = mtd->writesize;
res = mtd->read_oob(mtd, offs, &ops);
if (res)
return res;
}
buf += mtd->oobsize + mtd->writesize;
len -= mtd->writesize;
}
return 0;
}
It's confused that search BBT and write BBT uses different mtd ops mode.
And also data will not be valid if U-boot uses mtd ops MTD_OOB_RAW during
reading and no software ECC is implemented.
I also noticed that in U-boot2013.07 both search BBT and write BBT uses mtd
ops MTD_OPS_PLACE_OOB.
Could anyone please explain the reason to me?
Nick Yao
More information about the U-Boot
mailing list