1、/dev/mtdn是linux中的MTD架構中,系統自己實現的mtd分區所對應的字符設備,其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。
???? 而mtd-util中的flash_eraseall等工具,就是以這些ioctl為基礎而實現的工具,實現一些關于flash的操作,比如,mtd工具中的flash_eraseall中的:
?
?if(ioctl(fd,MEMGETINFO,&meminfo) != 0)
?{
??perror("MEMGETINFO");
??close(fd);
??exit(1);
?}
?
其中,MEMGETINFO,就是linux mtd中的/drivers/mtd/nand/mtdchar.c中的:
?
?case MEMGETINFO:
??info.type?= mtd->type;
??info.flags?= mtd->flags;
??info.size?= mtd->size;
??info.erasesize?= mtd->erasesize;
??info.writesize?= mtd->writesize;
??info.oobsize?= mtd->oobsize;
??/* The below fields are obsolete */
??info.ecctype?= -1;
??info.eccsize?= 0;
??if (copy_to_user(argp, &info, sizeof(struct mtd_info_user)))
???return -EFAULT;
??break;
?
而/dev/mtdblockn,是NandFlash驅動中,驅動在用add_mtd_partitions()添加MTD設備分區而生成的對應的塊設備。根據以上內容也更加明白,為什么不能用nandwrite,flash_eraseall,flash_erase等工具去對/dev/mtdblockn去操作了,因為/dev/mtdblock中不包含對應的ioctl,不支持你這么操作。
?
2、mtd char設備的主設備號是90;而mtdblock設備的主設備號是31;
???? 此設備號定義在/include/linux/mtd/mtd.h中
?
3、mtd塊設備的大小可以通過查看分區信息來得到:
# cat /proc/partitions
major minor? #blocks? name
? 31??????? 0??????? 128 mtdblock0
? 31??????? 1??????? 128 mtdblock1
? 31??????? 2??????? 512 mtdblock2
? 31??????? 3?????? 2048 mtdblock3
? 31??????? 4????? 32768 mtdblock4
? 31??????? 5???? 486400 mtdblock5
?
上面顯示的塊設備的大小,是block的數目,每個block是1KB;
而每個字符設備,其實就是對應著上面的餓每個設備,即/dev/mtd0對應/dev/mtdblock0,以此類推,換句話說,mtdblockn的一些屬性,也就是mtdn的屬性,比如大小。
?
4、對每個mtd字符設備的操作,比如利用nandwrite去對/dev/mtd0寫數據,實際就是操作/dev/mtdblock0。而這些操作里面涉及到得offset都指的是mtd分區內的偏移。比如向/dev/mtd1的offset為0的位置寫入數據,實際操作的物理偏移是offset=/dev/mtd0的大小=128KB。