mtdN:每个条目就是一个独立的MTD设备分区,每个MTD分区如同一个独立的MTD设备
mtdrN:每个条目就是相应的mtdN条目的只读版本
mtdblockN:每个条目就是相应的mtdN项目的块设备版本
nftlLN:每组设备就是一个独立的NFTL设备,在同组中每个条目就是NFTL设备上的一个分区,在同组设备中第一个条目就是整个设备,如:/dev/nftlb代表第二个NFTL设备的全部,/dev/nftlb3代表第二个设备的第3个分区。
inftlLN,ftlLN,rfd_ftlLN,ssdfclL same as NFTL
设定配置内核
以下是关于一些配置的子菜单:
MTD support,CONFIG_MTD:启用支持core MTD子系统:若要产生模块的话,名为mtdcort.ko
MTD concatenating support,CONFIG_MTD_CONCAT:用于合并多个MTD设备或分区成为一个单一的逻辑分区;mtdconcat.ko
MTD partitioning support,CONFIG_MTD_PARTITIONS:要让MTD设备能够划分成各个独立的分区;mtdpart.ko
Direct char device access to MTD devices,CONFIG_MTD_CHAR:字符设备MTD用户模块(mtdN/mtdrN的配置选项);mtdchar.ko
Caching block device access to MTD devices,CONFIG_MTD_BLOCK:读写块设备MTD用户模块(/dev/mtdblockN);mtdblock.ko
Read-only block device access to MTD devices,CONFIG_MTD_BLOCK_RO:只读(与读写块设备同名的/dev);mtdblock_ro.ko
FTL(Flash Translation Layer)support,CONFIG_FTL:支持FTL用户模块必须设定此选项;ftl.ko,NFTL用户模块可通过/dev/ftlLN设备条目来存取
NFTL(NAND Flash Translation Layer)support,CONFIG_MTD_NFTL:NFTL用户模块,nftl,ko,/dev/nftlLN来存取
Write support for NFTL, CONFIG_NFTL_RW:想要写入具有NFTL格式的设备必须启用此项,它只会影响NFTL用户模块的建立方式,本身不是独立的用户模块。
注意:两种块设备用户模块只能选用一种。
MTD次级菜单还包括四个次级菜单:用来设定支持实际MTD硬件的设备驱动程序。
RAM/ROM/Flash chip drivers: CFI-compliant flash, JEDEC-compliant flash,old non-CFI flash, RAM, ROM, and absent chips.
Mapping drivers for chip access:mapping drivers. Includes one generic mapping driver that can be configured by providing the physical start address of the device and its size in hexadecimal notation, and its bus width in octets. This submenu also contains one entry for each board for which there is an existing mapping driver included in the kernel
Self-contained MTD device drivers:standalone drivers that are not part of the NOR,NAND, or OneNAND frameworks. This includes test drivers such as the memory-backed test device, “loopback” block device driver, and legacy drivers for the
DiskOnChip devices.
NAND Flash Device Drivers: NAND flash devices, including the supported DiskOnChip modules.
OneNAND Flash Device Drivers: Samsung OneNAND flash devices.
对于目标板,一定要把MTD相应模块编译成内核的一部分,否则根文件系统用不了。无法安装根文件系统的指示信息:
kernel panic:VFS: unable to mount root fs on ...
文件系统建立工具,
mkfs.jffs2 [options] -r directory -o output_file :从directory目录开始建立JFFS2文件系统的映象文件
sumtool [options] -i input_file -o output_file :添加信息到每一个擦除块,结合 CONFIG_JFFS2_SUMMARY,加快JFFS2的安装
jffs2dump [options] image :
NFTL工具,
nftl_format device [start_address [size]] : 将device设备格式化,供NFTL or INFTL 用户模块使用
nftldump device [output_file] :将NFTL分区的内容转储到output_file中
FTL工具:
ftl_format [options] device :FTL设备格式化
ftl_check [options] device :检查并提供与FTL设备有关的信息
NAND flash工具:
nandwrite device input_file start_address :将input_file内容写入nand中
nandtest device :测试nand芯片,包括那些在DOC设备里的nand 芯片
nanddump device output_file [offset] [number_of_bytes] :将nand 芯片的内容转储到output_file文件中,相当于读?
以上工具现在不会用,以后再用,先做个笔记。
现在配置内核:
若要使用CFI flash,必须启用以下选项:
? MTD support
? MTD partitioning support if you would like to partition your flash device
? Direct char device access to MTD devices
? Caching block device access to MTD devices
? In the “RAM/ROM/Flash chip drivers” submenu, detect flash chips by CFI probe
? In the “Mapping drivers for chip access” submenu, the CFI flash device-mapping driver for your particular board
那么如何分区呢?
进行分区一般是将相应的mapping驱动程序进行如下类似数据结构初始化:
static struct mtd_partition tqm8xxl_partitions[ ] = {
{
name: "uboot", /* uboot Firmware */
offset: 0x00000000,
size: 0x00040000, /* 256 KiB */
},
{
name: "kernel", /* default kernel image */
offset: 0x00040000,
size: 0x000C0000,
},
{
name: "user",
offset: 0x00100000,
size: 0x00100000,
},
{
name: "initrd",
offset: 0x00200000,
size: 0x00200000,
}
};
static struct mtd_partition tqm8xxl_fs_partitions[ ] = {
{
name: "cramfs",
offset: 0x00000000,
size: 0x00200000,
},
{
name: "jffs2",
offset: 0x00200000,
size: 0x00200000,
}
};
tqm8xxl_partitions:为第一组4M的存储分了4个分区,tqm8xxl_fs_partitions:为第二组4M分了2个分区,每个分区包含3个属性。name单为一个助记符属性,offset:为分区的起始地址,size表分区大小。
上面的实际物理存储位置如下表:
可以在/proc/mtd来查看分区,cat /proc/mtd,注意分区要以擦除单位为最小单位进行分区
分区好后,在/dev下要有必要的分区条目
根据设备上的分区数,要为两种MTD用户模块建立相同数量的/dev条目
# for i in $(seq 0 5)
> do
> mknod mtd$i c 90 $(expr $i + $i)
> mknod mtdblock$i b 31 $i
> done
对于CFI flash写入前,必须进行擦除操作erase and eraseall
需要擦除"initrd“分区如:eraseall /dev/mtd3
写与读:cat 或dd进行写,但是flashcp for NOR flash and nandwrite for NAND就更好了,这两个命令的好处可以看相关文档
flashcp /tmp/initrd.bin /dev/mtd3 :*.bin->mtd3
以下是读取操作的例子:
dd if=/dev/mtd0 of=/tmp/ppcboot.img :mtd0->ppcboot.img