root@dm368-evm:~# ubiattach/dev/ubi_ctrl -m 3
UBI: attaching mtd3 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 129024 bytes
UBI: smallest flash I/O unit: 2048
UBI: sub-page size:512
UBI: VID header offset: 512 (aligned 512)
UBI: data offset: 2048
分析下UBI写数据的过程,
UBI DBG (pid 1484): ubi_io_write:write 512 bytes to PEB 57:0
int ubi_io_write(struct ubi_device*ubi, const void *buf, int pnum, int offset,
int len)
addr= (loff_t)pnum * ubi->peb_size + offset;
err= ubi->mtd->write(ubi->mtd, addr, len, &written, buf);
在io_init函数中可以看到几个变量的赋值;
ubi->peb_size = ubi->mtd->erasesize;
ubi->peb_count = mtd_div_by_eb(ubi->mtd->size,ubi->mtd);
ubi->flash_size= ubi->mtd->size;
从debug log来看,这里一次写了512字节,从某个block的起始page开始,offset是0;
那么到了nand mtd底层驱动,行为就是;
nand_write->nand_do_write_ops:
subpage= column || (writelen & (mtd->writesize - 1));
这里,subpage就是writelen,512;
也可以得知一点,ubifs没有使用oob,这跟jffs2和yaffs2是不同的;
/*Partial page write ? */
if(unlikely(column || writelen
writesize - 1))) {
cached= 0;
bytes= min_t(int, bytes - column, (int) writelen);
chip->pagebuf= -1;
memset(chip->buffers->databuf,0xff, mtd->writesize);
memcpy(&chip->buffers->databuf[column],buf, bytes);
wbuf= chip->buffers->databuf;
}
ret= chip->write_page(mtd, chip, wbuf, page, cached,
(ops->mode == MTD_OOB_RAW));
下面是write_page函数的代码;
static int nand_write_page(structmtd_info *mtd, struct nand_chip *chip,
const uint8_t *buf, int page, int cached,int raw)
{
intstatus;
chip->cmdfunc(mtd,NAND_CMD_SEQIN, 0x00, page);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/dianqi/article-51076-2.html
在中国同志有更传统的意思哦
此人完了