mtd子系统
MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。CFI接口的MTD设备分为四层(从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
mtd块设备 主设备号31
mtd字符设备 主设备号90
设备节点层:MTD框架可以在/dev下创建字符设备节点(主设备号90)以及块设备节点(主设备号31), 用户通过访问此设备节点即可访问MTD字符设备或块设备。
MTD设备层: 基于MTD原始设备, Linux在这一层次定义出了MTD字符设备和块设备, 字符设备在mtdchar.c中实现, 块设备则是通过结构mtdblk_dev来描述,"/drivers/mtd/mtdchar.c"文件实现了MTD字符设备口; "/drivers/mtd/mtdblock.c"文件实现了MTD块设备接口
MTD原始设备层: 由MTD原始设备的通用代码+特定的Flash数据组成。mtd_info、mtd_part、mtd_partition以及mtd_partitions等对象及其操作方法就属于这一层,对应的文件是"drivers/mtd/mtdcore.c"。类似于i2c驱动框架中的核心层。
硬件驱动层: 内核将常用的flash操作都已经在这个层次实现, 驱动开发只需要将相应的设备信息添加进去即可, 比如,NOR flash的芯片驱动位于"drivers/mtd/chips/", Nand flash位于"drivers/mtd/nand/"(eg s3c2410.c)
核心结构和方法简述
为了实现上述的框架, 内核中使用了如下类和API, 这些几乎是开发一个MTD驱动必须的
核心结构(include/linux/mtd/mtd.h)
原始设备层
mtd_info 描述原始设备层的一个分区的结构, 描述一个设备或一个多分区设备中的一个分区
mtd_table 管理原始设备层的mtd_info的数组
mtd_part 表示一个分区, 其中的struct mtd_info mtd描述该分区的信息, 一个物理Flash设备可以有多于1个mtd_part,每个mtd_part都对应一个mtd_info
mtd_partition 描述一个分区表, 通过管理mtd_part以及每一个mtd_part中的mtd_info来描述所有的分区,一个物理Flash设备只有一个mtd_partition
mtd_partitions 是一个list_head对象,用于管理mtd_partition
核心方法
add_mtd_device() // 注册一个MTD设备
del_mtd_device() // 注销一个MTD设备
add_mtd_partitions() // 注册一个或多个分区表
del_mtd_partitions() // 注销一个或多个分区表
Linux块设备驱动(二) _MTD驱动及其用户空间编程 (bbsmax.com)
第八章 Linux下MTD驱动 - 道客巴巴 (doc88.com)
(32条消息) MTD NANDFLASH驱动相关知识介绍_烽火的博客-CSDN博客