linux中mtd字符設備與塊設備的區別。

轉:http://www.crifan.com/linux_system_in__dev__mtd_and__dev__mtdblock_distinction_character_devices_and_block_devices_mtd_difference/

1. /dev/mtdN 是Linux 中的MTD架構中,系統自己實現的mtd分區所對應的字符設備,其裏面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。

而mtd-util中的flash_eraseall等工具,就是以這些ioctl爲基礎而實現的工具,實現一些關於Flash的操作。比如,mtd 工具中的 flash_eraseall中的:

if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
   fprintf(stderr, "%s: %s: unable to get MTD device infon", exe_name, mtd_device);
   return 1;
}

其中,MEMGETINFO,就是Linux MTD中的drivers/mtd/nand/mtdchar.c中的:

static int mtd_ioctl(struct inode *inode, struct file *file,
       u_int cmd, u_long arg)
{

。。。。。

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,是Nand Flash驅動中,驅動在用add_mtd_partitions()添加MTD設備分區,而生成的對應的塊設備

根據以上內容,也就更加明白,爲什麼不能用nandwrite,flash_eraseall,flash_erase等工具去對/dev/mtdblockN去操作了。因爲/dev/mtdblock中不包含對應的ioctl,不支持你這麼操作。

2. mtd char 設備的主設備號是90,而mtd block設備的主設備號是31:

# ls /dev/mtd? -l 
crw-r—–    1 root     root      90,   0 May 30 2007 /dev/mtd0
crw-r—–    1 root     root      90,   2 May 30 2007 /dev/mtd1
crw-r—–    1 root     root      90,   4 Jul 17 2009 /dev/mtd2
crw-r—–    1 root     root      90,   6 May 30 2007 /dev/mtd3
crwxrwxrwx    1 root     root      90,   8 May 30 2007 /dev/mtd4
crwxrwxrwx    1 root     root      90, 10 May 30 2007 /dev/mtd5
crwxrwxrwx    1 root     root      90, 12 May 30 2007 /dev/mtd6
crwxrwxrwx    1 root     root      90, 14 May 30 2007 /dev/mtd7
crwxrwxrwx    1 root     root      90, 16 May 30 2007 /dev/mtd8
crwxrwxrwx    1 root     root      90, 18 May 30 2007 /dev/mtd9
# ls /dev/mtdblock? -l
brw-r—–    1 root     root      31,   0 May 30 2007 /dev/mtdblock0
brw-r—–    1 root     root      31,   1 May 30 2007 /dev/mtdblock1
brw-r—–    1 root     root      31,   2 May 30 2007 /dev/mtdblock2
brw-r—–    1 root     root      31,   3 May 30 2007 /dev/mtdblock3
brwxrwxrwx    1 root     root      31,   4 May 30 2007 /dev/mtdblock4
brwxrwxrwx    1 root     root      31,   5 May 30 2007 /dev/mtdblock5
brwxrwxrwx    1 root     root      31,   6 May 30 2007 /dev/mtdblock6
brwxrwxrwx    1 root     root      31,   7 May 30 2007 /dev/mtdblock7
brwxrwxrwx    1 root     root      31,   8 May 30 2007 /dev/mtdblock8
brwxrwxrwx    1 root     root      31,   9 May 30 2007 /dev/mtdblock9

此設備號,定義在/include/linux/mtd/mtd.h中 :

#define MTD_CHAR_MAJOR   90
#define MTD_BLOCK_MAJOR 31

3. 其中,mtd的塊設備的大小,可以通過查看分區信息獲得:

# cat /proc/partitions 
major minor #blocks name

31     0       1024 mtdblock0
31     1       8192 mtdblock1
31     2     204800 mtdblock2
31     3      65536 mtdblock3
31     4     225280 mtdblock4

上面中顯示的塊設備大小,是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的大小=1MB=0×100000。

5.mtd的字符設備和塊設備的命名規則,可以參考下表:

Table 7-1. MTD /dev entries, corresponding MTD user modules, and relevant device major numbers

/dev entry

Accessible MTD user module

Device type

Major number

mtdN

char device

char

90

mtdrN

char device

char

90

mtdblockN

block device, read-only block device, JFFS, and JFFS2

block

31

nftlLN

NFTL

block

93

ftlLN

FTL

block

44

Table 7-2. MTD /dev entries, minor numbers, and naming schemes

/dev entry

Minor number range

Naming scheme

mtdN

0 to 32 per increments of 2

N = minor / 2

mtdrN

1 to 33 per increments of 2

N = (minor – 1) / 2

mtdblockN

0 to 16 per increments of 1

N = minor

nftlLN

0 to 255 per sets of 16

L = set;[2] N = minor – (set – 1) x 16; N is not appended to entry name if its value is zero.

ftlLN

0 to 255 per sets of 16

Same as NFTL.

上表相關內容,請參考附錄2.

【附錄】

1.最新的mtd-utils-1.3.0.tar.bz2 下載地址:ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.3.0.tar.bz2

2.7.1 MTD-Supported Devices

http://book.opensourceproject.org.cn/embedded/oreillybuildembed/opensource/belinuxsys-chp-7-sect-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章