- 論壇徽章:
- 0
|
現(xiàn)在正在看uboot燒寫(xiě)yaffs2的代碼,有點(diǎn)疑問(wèn)
輸入命令后執(zhí)行do_nand,然后執(zhí)行到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,先執(zhí)行了meminfo->write_oob,寫(xiě)了flash的OOB區(qū),然后執(zhí)行到了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 中又重新寫(xiě)了一遍OOB區(qū),用的是上面函數(shù)的oobbuf,可是nand_prepare_oobbuf返回的指針是nand chip結(jié)構(gòu)體中的oob_buf。所以最終flash的OOB區(qū)寫(xiě)入的是 nand chip結(jié)構(gòu)體中的oob_buf?煽v觀該程序沒(méi)發(fā)現(xiàn)把文件中的OOB區(qū)讀到oob_buf的步驟,所以很不理解 |
|