zoukankan      html  css  js  c++  java
  • what is MTD?

    2010-7-20

    what is MTD?

    Description:

    MTD(memory technology device内存技术设备)是用于访问memory设备(ROMflash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱 动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。CFI接口的MTD设备分为四层(从 设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。

      MTD原始设备描述

      所有组成MTD原始设备的Flash芯片必须是同类型(无论是interleave还是地址相 连),在描述MTD原始设备数据结构中采用同一结构描述组成Flash芯片。每个MTD原始设备有一个mtd_info结构,其中的priv指针指向一个 map_info结构,map_info结构中的fldrv_priv指向一个cfi_private结构,cfi_private结构的cfiq指针指 向一个cfi_ident结构,chips指针指向一个flchip结构的数组。其中mtd_infomap_infocfi_private结构用 于描述MTD原始设备,因为组成MTD原始设备的NORFlash相同,cfi_ident结构用于描述Flash芯片信息;而flchip结构用于描 述每个Flash芯片专有信息。

      根文件系统

      文件系统

      字符设备节点

      MTD字符设备

      MTD块设备

      MTD原始设备

      FLASH硬件驱动

      块设备节点

      一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。NANDFlash的驱动程 序则位于/drivers/mtd/nand子目录下

      二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是 各个特定的Flash的数据,例如分区。

      用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量的关于MTD的数据和 操作函数。mtd_tablemtdcore.c)则是所有MTD原始设备的列表,mtd_partmtd_part.c)是用于表示MTD原始设备 分区的结构,其中包含了mtd_info,因为每一个分区都是被看成一个MTD原始设备加在mtd_table中的,mtd_part.mtd_info 中的大部分数据都从该分区的主分区mtd_part->master中获得。

      在drivers/mtd/maps/子目录下存放的是特定的flash的数据,每一个文件都 描述了一块板子上的flash。其中调用add_mtd_device()del_mtd_device()建立/删除 mtd_info结构并将其加入/删除mtd_table(或者调用add_mtd_partition()del_mtd_partition() mtdpart.c)建立/删除mtd_part结构并将mtd_part.mtd_info加入/删除mtd_table 中)。

      三、MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号 31)和字符设备(设备号90)。MTD字符设备的定义在mtdchar.c中实现,通过注册一系列file operation函数(lseekopenclosereadwrite)。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_devmtd_table中的每一个 mtd_info一一对应。

      四、设备节点:通过mknod/dev子目录下建立MTD字符设备节点(主设备号为90)和 MTD块设备节点(主设备号为31),通过访问此设备节点即可访问MTD字符设备和块设备。

      五、根文件系统:在Bootloader中将JFFS(或JFFS2)的文件系统映像 jffs.image(或jffs2.img)烧到flash的某一个分区中,在/arch/arm/mach-your/arch.c文件的 your_fixup函数中将该分区作为根文件系统挂载。

      六、文件系统:内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint上。

      设备层和原始设备层的函数调用关系(红色部分需要我们实现):

      一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进 mtd_tablemtd_table中的每个MTD原始设备都可以被注册成一个MTD设备,其中字符设备的主设备号为90,次设备号为024 6…(奇数次设备号为只读设备),块设备的主设备号为31,次设备号为0123…

      mtd_notifier mtd_notifier

      字符设备 mtd_fops 块设备 mtd_fops

      (mtdchar.c mtdblock.c mtdblks

      设备层

      register_mtd_user()

      get_mtd_device()

      unregister_mtd_user()

      put_mtd_device()

      erase_info

      mtd_notifiers

      mtd_table

      mtd_info

      mtd_part

      (mtdcore.c

      (mtdpart.c

      Your Flash

      (your-flash.c

      add_mtd_partitions()

      del_mtd_partitions()

      原始设备层 add_mtd_device()

      del_mtd_device()

      mtd_partition

      NORFlash芯片驱动与MTD原始设备

      所有的NORFlash的驱动(探测probe)程序都放在 drivers/mtd/chips下,一个MTD原始设备可以由一块或者数块相同的Flash芯片组成。假设由4devicetypex8 Flash,每块大小为8Minterleave2,起始地址为0x01000000,地址相连,则构成一个MTD原始设备 0x01000000-0x03000000),其中两块interleave成一个chip,其地址从0x010000000x02000000 另两块interleave成一个chip,其地址从0x020000000x03000000

      请注意,所有组成一个MTD原始设备的Flash芯片必须是同类型的(无论是 interleave还是地址相连),在描述MTD原始设备的数据结构中也只是采用了同一个结构来描述组成它的Flash芯片。

      0x03000000

      0x02000000

      0x01000000

      每个MTD原始设备都有一个mtd_info 结构,其中的priv指针指向一个map_info结构,map_info结构中的fldrv_priv指向一个cfi_private 构,cfi_private结构的cfiq指针指向一个cfi_ident结构,chips指针指向一个flchip结构的数组。其中mtd_info map_infocfi_private结构用于描述MTD原始设备;因为组成MTD原始设备的NORFlash相同,cfi_ident结构用于描 flash芯片的信息;而flchip结构用于描述每个Flash芯片的专有信息(比如说起始地址)

     

  • 相关阅读:
    【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图
    【Selenium03篇】python+selenium实现Web自动化:元素三类等待,多窗口切换,警告框处理,下拉框选择
    【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!
    【Selenium01篇】python+selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!
    面试官看到一定会打我---软件测试工程师面试套路和暗语灵魂解密
    十年测试老鸟告诉你--自动化测试选JAVA还是选Python--写给还在迷茫中的朋友
    华为十年测试老鸟教您如何便写高质量的自动化测试工程师简历--看完必有所获
    工作中常用的Android系统ADB命令收集
    自动化测试中的三类等待深入剥析
    JAVA自动化之Junit单元测试框架详解
  • 原文地址:https://www.cnblogs.com/nickchan/p/3104398.html
Copyright © 2011-2022 走看看