今天看了一下IXP425上MTD的实现(linux/drivers/mtd/maps/ixp425.c),有如下几点收获
1、FLASH的分区并不是写死的,而是在MTD初始化的时候,通过读redboot的配置文件来得到FLASH的分区信息,然后加载为MTD的分区。
2、reboot下看分区信息:
redboot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0x50000000 0x50000000 0x00040000 0x00000000
RedBoot config 0x507C0000 0x507C0000 0x00020000 0x00000000
FIS directory 0x507E0000 0x507E0000 0x00020000 0x00000000
o1 0x50040000 0x00800000 0x00080000 0x00800000
o2 0x500C0000 0x00800000 0x00100000 0x00800000
p1 0x501C0000 0x03000000 0x00100000 0x03000000
p2 0x502C0000 0x00800000 0x00160000 0x00800000
p3 0x50420000 0x00800000 0x00160000 0x00800000
p4 0x50580000 0x00800000 0x00120000 0x00800000
p5 0x507A0000 0x03000000 0x00020000 0x03000000
linux下看MTD的信息:
root$ cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "RedBoot"
mtd1: 00080000 00020000 "o1"
mtd2: 00100000 00020000 "o2"
mtd3: 00100000 00020000 "p1"
mtd4: 00160000 00020000 "p2"
mtd5: 00160000 00020000 "p3"
mtd6: 00120000 00020000 "p4"
mtd7: 00100000 00020000 "unallocated space"
mtd8: 00020000 00020000 "p5"
mtd9: 00020000 00020000 "RedBoot config"
mtd10: 00020000 00020000 "FIS directory"
可以看出,确实是一一对应。 (mtd7在启动过程中被加载为disk目录,用来保存文件)
3、mtd是字符设备而mtdblock是块设备,mtd2X对应mtdblockX,也就是说mtd2对应mtdblock1,mtd4对应mtdblok2,奇数次设备号的mtd设备是只读设备,所以跳过,对于你写入的区别在于在写入mtd之前不会erase,而mtdblock会erase