mtd子系统

发布时间 2023-03-22 21:11:12作者: 迷人的危险~

 

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)

  第六讲-MTD驱动 - 道客巴巴 (doc88.com)

  第八章 Linux下MTD驱动 - 道客巴巴 (doc88.com)

  (32条消息) MTD NANDFLASH驱动相关知识介绍_烽火的博客-CSDN博客