分享

MTD

 点点阅 2017-03-11
MTD(memory technology device内存技术设备) 在硬件和文件系统层之间的提供了一个抽象的接口,MTD是用来访问内存设备(如:ROM、flash)的中间层,它将内存设备的共有特性抽取出来,从而使增加新的内存设备驱动程序变得更简单。
MTD - wen.shuijie - wen.shuijie的博客原始设备是MTD字符设备和MTD块设备的抽象。
MTD设备层、MTD原始设备层和Flash硬件驱动层之间的接口关系如下图:
MTD - wen.shuijie - wen.shuijie的博客
MTD芯片驱动程序必须向MTD子系统注册,通过mtd_info结构体给add_mtd_device()函数提供一组缺省的回调函数及
属性 ,回调函数一般用于删除,读出,写入与同步等操作,目前已经可以使用的MTD芯片驱动程序有:
DiskOnchip(DOC)、Common Flash Interface (CFI)、JEDEC、非DOC的NAND Flash、旧式非CFI的flash、RAM,ROM和不存在系统上的芯片、非缓存的RAM、用于测试和评估的虚拟设备。
有六种MTD /dev 条目,七种相应的MTD用户模块,看下表:
MTD - wen.shuijie - wen.shuijie的博客 MTD - wen.shuijie - wen.shuijie的博客MTD - wen.shuijie - wen.shuijie的博客 

 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表分区大小。

上面的实际物理存储位置如下表:

MTD - wen.shuijie - wen.shuijie的博客

 可以在/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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多