- 论坛徽章:
- 0
|
现在正在看uboot烧写yaffs2的代码,有点疑问
输入命令后执行do_nand,然后执行到nand_write_opts
int nand_write_opts(nand_info_t *meminfo, const nand_write_options_t *opts)
{
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
memcpy(data_buf, buffer, readlen);
buffer += readlen;
if (opts->writeoob) {
/* read OOB data from input memory block, exit
* on failure */
memcpy(oob_buf, buffer, meminfo->oobsize);
buffer += meminfo->oobsize;
/* write OOB data first, as ecc will be placed
* in there*/
result = meminfo->write_oob(meminfo,
mtdoffset,
meminfo->oobsize,
&written,
(unsigned char *)
&oob_buf);
。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。
}
result = meminfo->write(meminfo,
mtdoffset,
meminfo->oobblock,
&written,
(unsigned char *) &data_buf);
| 在这段代码中,opts->writeoob=1,先执行了meminfo->write_oob,写了flash的OOB区,然后执行到了meminfo->write,meminfo->write=nand_write
static int nand_write (struct mtd_info *mtd, loff_t to, size_t len, size_t * retlen, const u_char * buf)
{
return (nand_write_ecc (mtd, to, len, retlen, buf, NULL, NULL));
}
static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
size_t * retlen, const u_char * buf, u_char * eccbuf, struct nand_oobinfo *oobsel)
{。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
oobbuf = nand_prepare_oobbuf (mtd, eccbuf, oobsel, autoplace, numpages);
while (written < len) {
this->data_poi = (u_char*) &buf[written];
ret = nand_write_page (mtd, this, page, &oobbuf[oob], oobsel, (--numpages > 0));
。。。。。。。。。。。。。。。。。。
}
。。。。。。。。。。。。。。。。。。。。。。
}
|
在nand_write_page 中又重新写了一遍OOB区,用的是上面函数的oobbuf,可是nand_prepare_oobbuf返回的指针是nand chip结构体中的oob_buf。所以最终flash的OOB区写入的是 nand chip结构体中的oob_buf。可纵观该程序没发现把文件中的OOB区读到oob_buf的步骤,所以很不理解 |
|