精华内容
下载资源
问答
  • MTD雷达信号处理

    2018-11-25 16:44:46
    MTD雷达信号相参处理,有详尽的仿真程序和信号源。MTD雷达信号相参处理,有详尽的仿真程序和信号源MTD雷达信号相参处理,有详尽的仿真程序和信号源
  • 雷达动目标检测仿真,含脉冲压缩,mtd处理
  • MTD雷达信号相参处理,有详尽的仿真程序和信号源。
  • MTD

    2013-10-31 10:53:00
    内存技术设备(英语:Memory Technology Device,缩写为 MTD),是Linux系统中设备文件系统的一个类别,主要用于快闪存储器的应用,是一种快闪...因为具备以下特性,所以 MTD 装置和硬盘相较之下,处理起来要复...

    内存技术设备英语Memory Technology Device,缩写为 MTD),是Linux系统中设备文件系统的一个类别,主要用于快闪存储器的应用,是一种快闪存储器转换层(Flash Translation Layer,FTL)。创造MTD子系统的主要目的是提供一个介于快闪存储器硬件驱动程式与高阶应用程式之间的抽象层

    因为具备以下特性,所以 MTD 装置和硬盘相较之下,处理起来要复杂许多:

    • 具有 eraseblocks 的特微,而不是像硬盘一样使用丛集
    • eraseblocks (32KiB ~ 128KiB) 跟硬盘的 sector size(512 到 1024 bytes)比起来要大很多。
    • 操作上主要分作三个动作: 从 eraseblock 读取、写入 eraseblock 、还有就是清除 eraseblock 。
    • 坏掉的 eraseblocks 无法隐藏,需要软件加以处理。
    • eraseblocks 的寿命大约会在 104 到 105 的清除动作之后结束。

     

    MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的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_info、map_info和cfi_private结构用于描述MTD原始设备,因为组成MTD原始设备的NOR型Flash相同,cfi_ident结构用于描述Flash芯片信息;而flchip结构用于描述每个Flash芯片专有信息。
     
      根文件系统
     
      文件系统
     
      字符设备节点
     
      MTD字符设备
     
      MTD块设备
     
      MTD原始设备
     
      FLASH硬件驱动
     
      块设备节点
     
      一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程 序则位于/drivers/mtd/nand子目录下
     
      二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。
     
      用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量的关于MTD的数据和 操作函数。mtd_table(mtdcore.c)则是所有MTD原始设备的列表,mtd_part(mtd_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函数(lseek、open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_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_table,mtd_table中的每个MTD原始设备都可以被注册成一个MTD设备,其中字符设备的主设备号为90,次设备号为0、2、4、 6…(奇数次设备号为只读设备),块设备的主设备号为31,次设备号为0、1、2、3…
     
      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
     
      NOR型Flash芯片驱动与MTD原始设备
     
      所有的NOR型Flash的驱动(探测probe)程序都放在 drivers/mtd/chips下,一个MTD原始设备可以由一块或者数块相同的Flash芯片组成。假设由4块devicetype为x8的 Flash,每块大小为8M,interleave为2,起始地址为0x01000000,地址相连,则构成一个MTD原始设备 (0x01000000-0x03000000),其中两块interleave成一个chip,其地址从0x01000000到0x02000000, 另两块interleave成一个chip,其地址从0x02000000到0x03000000。
     
      请注意,所有组成一个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_info和cfi_private结构用于描述MTD原始设备;因为组成MTD原始设备的NOR型Flash相同,cfi_ident结构用于描 述Flash芯片的信息;而flchip结构用于描述每个Flash芯片的专有信息(比如说起始地址)
    展开全文
  • 雷达信号处理程序,包括线性调频,匹配滤波,产生目标回波加噪声,回波积累,时域脉压,频域脉压,加窗脉压,相干积累,mti对消,mtd检测,cfar检测,欢迎下载
  • ex9_13 用FFT和FIR方法实现MTD处理(程序有错误) ex9_14 雷达的恒虚警处理(CFAR) ex9_15 比较相参积累和非相参积累 ex9_14 计算加性高斯白噪声准则下雷达探测的经典CFAR 二进制检测阈值和指定的虚警概率。 ...
  • 在MATLAB上实现雷达信号处理仿真:该程序完成了对8个脉冲信号的脉压、动目标显示(MTI)、动目标检测(MTD),有注释。
  • mtd 介绍

    千次阅读 2018-07-19 09:58:20
    mtd 介绍 https://blog.csdn.net/bugouyonggan/article/details/9167213 MTD,Memory Technology Device即内存技术设备 字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问;同时,两者读写数据的...

    mtd 介绍

    https://blog.csdn.net/bugouyonggan/article/details/9167213

    MTD,Memory Technology Device即内存技术设备

    字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问;同时,两者读写数据的基本单元不同。

    字符设备,以字节为基本单位,在Linux中,字符设备实现的比较简单,不需要缓冲区即可直接读写,内核例程和用户态API一一对应,用户层的Read函数直接对应了内核中的Read例程,这种映射关系由字符设备的file_operations维护。

    块设备,则以块为单位接受输入和返回输出。对这种设备的读写是按块进行的,其接口相对于字符设备复杂,read、write API没有直接到块设备层,而是直接到文件系统层,然后再由文件系统层发起读写请求。 
    同时,由于块设备的IO性能与CPU相比很差,因此,块设备的数据流往往会引入文件系统的Cache机制。

    MTD设备既非块设备也不是字符设备,但可以同时提供字符设备和块设备接口来操作它。

    MTD总概述

    Linux中MTD的所有源码位于/drivers/mtd子目录下,

    MTD设备通常可分为四层 
    这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。

    一、Flash硬件驱动层 
    硬件驱动层负责在init时驱动Flash硬件并建立从具体设备到MTD原始设备映射关系 
    tip: 映射关系通常包括 分区信息、I/O映射及特定函数的映射 
    drivers/mtd/chips :   CFI/jedec接口通用驱动 
    drivers/mtd/nand :   nand通用驱动和部分底层驱动程序 
    drivers/mtd/maps :   nor flash映射关系相关函数 
    drivers/mtd/devices:   nor flash底层驱动

    二、MTD原始设备 
    用于描述MTD原始设备的数据结构是mtd_info,它定义了大量的关于MTD的数据和操作函数。 
    mtdcore.c :  MTD原始设备接口相关实现 
    mtdpart.c :  MTD分区接口相关实现

    三、MTD设备层 
    基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。 
    mtdchar.c :  MTD字符设备接口相关实现 
    mtdblock.c : MTD块设备接口相关实现

    四、设备节点 
    通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90) 
    通过访问此设备节点即可访问MTD字符设备和块设备 
    具体参考:  working-with-mtd-devices

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

    MTD数据结构 

    重要的数据结构: 
    1. mtd_info 表示mtd原始设备, 所有mtd_info结构体被存放在mtd_info数组mtd_table中

    2. mtd_part   表示MTD分区,其中包含了 mtd_info,每一个分区都是被看成一个MTD 原始设备 
    在mtd_table中,mtd_part.mtd_info中的大部分数据都从该分区的主分区mtd_part->master中获得 
    tip: master不作为一个mtd原始设备加入mtd_table

    各层之间的交互如下图

    image    
    mtd_info的主要数据结构

    作用
    typemtd类型, 包括MTD_NORFLASH,MTD_NANDFLASH等(See mtd-abi.h)
    flags标志位, MTD_WRITEABLE,MTD_NO_ERASE等(See mtd-abi.h)
    sizemtd设备的大小
    erasesize主要的擦除大小, 即Flash的块大小 (tip: mtd设备可能有多个erasesize)
    writesize写大小, 对于norFlash是字节,对nandFlash为一页
    oobsize每块oob数据量, eg 16
    oobavail 
    name命名
    index 
    ecclayoutnand_ecclayout结构体指针, 表示的是ecc布局,可参考硬件手册的OOB中ecc布局
    numeraseregions可变擦除区域的数目, 通常为1
    eraseregionsmtd_erase_region_info结构体指针, 可变擦除区域
    erase擦除Flash函数
    read/write读写Flash函数
    read_oob/write_oob带oob读写Flash函数
    suspend/resumePower Management functions
    priv私有数据, cfi接口flash指向map_info结构, 或指向自定义flash相关结构体
      

    mtd_part的主要数据结构

    作用
    mtd分区信息, 大部分由master决定
    master分区的主分区
    offset分区的偏移地址
    index分区号 (3.0后不存在该字段)
    list将mtd_part链成一个链表mtd_partitons
      

    mtd_partition的主要数据结构

    作用
    name 
    size 
    offset 
    mask_flags 
    ecclayout 
    mtdp 
      

    map_info的主要数据结构

    作用
    name名称
    size大小
    phys物理地址
    bankwidth总线宽度(in octets)
    virt虚拟地址,通常通过ioremap将物理地址进行映射得到
    read/copy_from/write/copy_to读写函数
    map_priv_1/map_priv_2驱动可用的私有数据
      

    nand_chip的主要数据结构

    作用
    IO_ADDR_R/IO_ADDR_W读/写8根io线的地址
    read_byte/read_word从芯片读一个字节/字
    read_buf/write_buf读芯片读取内容至缓冲区/将缓冲区内容写入芯片
    verify_buf 
    select_chip 
    block_bad检查是否坏块
    block_markbad标识坏块
    cmd_ctrl硬件相关控制函数
    init_size 
    dev_ready 
    cmdfunc命令处理函数
    waitfunc 
    erase_cmd擦除命令
    scan_bbt扫描坏块
    errstat 
    write_page 
    options与具体的NAND 芯片相关的选项, 如NAND_USE_FLASH_BBT等(nand.h)
    page_shift 
      
    ecclayoutnand_ecclayout类型结构体, ECC布局信息
    eccnand_ecc_ctrl类型结构体, ECC控制结构
      
      
      

    nand_ecclayout的主要数据结构

    作用
    eccbytesecc的字节数(For 512B-per-page, eccbytes is 3)
    eccposecc数据在oob中的位置
    oobavailoob中可用的字节数, MTD 会根据其它三个变量自动计算得到
    oobfreenand_oobfree类型结构体, 显示定义空闲的oob 字节
      

    MTD相关层实现

    MTD设备层

    mtd字符设备接口: 
    mtdchar.c 实现了字符设备接口,通过它,用户可以直接操作Flash 设备。 
    Ø 通过read()、write()系统调用可以读写Flash。 
    Ø 通过一系列IOCTL 命令可以获取Flash 设备信息、擦除Flash、读写NAND 的OOB、获取OOB layout 及检查NAND 坏块等(MEMGETINFO、MEMERASE、MEMREADOOB、MEMWRITEOOB、MEMGETBADBLOCK IOCRL) 
    tip: mtd_read和mtd_write直接直接调用mtd_info的read 函数,因此,字符设备接口跳过patition这一层

    mtd块设备接口: 
    主要原理是将Flash的erase block 中的数据在内存中建立映射,然后对其进行修改,最后擦除Flash 上的block,将内存中的映射块写入Flash 块。整个过程被称为read/modify/erase/rewrite 周期。 
    但是,这样做是不安全的,当下列操作序列发生时,read/modify/erase/poweroff,就会丢失这个block 块的数据。 
    块设备模拟驱动按照block 号和偏移量来定位文件,因此在Flash 上除了文件数据,基本没有额外的控制数据。

     

    MTD原始设备层

     

    MTD硬件驱动层

    1. NOR Flash驱动结构

    Linux系统实现了针对cfi,jedec等接口的通用NOR Flash驱动 
    在上述接口驱动基础上,芯片级驱动较简单 
         定义具体内存映射结构体map_info,然后通过接口类型后调用do_map_probe()  
    以h720x-flash.c为例(位于drivers/mtd/maps) 
    - 定义map_info结构体, 初始化成员name, size, phys, bankwidth 
    - 通过ioremap映射成员virt(虚拟内存地址) 
    - 通过函数simple_map_init初始化map_info成员函数read,write,copy_from,copy_to 
    - 调用do_map_probe进行cfi接口探测, 返回mtd_info结构体 
    - 通过parse_mtd_partitions, add_mtd_partitions注册mtd原始设备

    2. NAND Flash驱动结构 

    Linux实现了通用NAND驱动(drivers/mtd/nand/nand_base.c) 
    tip: For more, check 内核中的NAND代码布局  
    芯片级驱动需要实现nand_chip结构体 
    MTD使用nand_chip来表示一个NAND FLASH芯片, 该结构体包含了关于Nand Flash的地址信息,读写方法,ECC模式,硬件控制等一系列底层机制。 
    Ø NAND芯片级初始化 
    主要有以下几个步骤: 
    - 分配nand_chip内存,根据目标板及NAND控制器初始化nand_chip中成员函数(若未初始化则使用nand_base.c中的默认函数),将mtd_info中的priv指向nand_chip(或板相关私有结构),设置ecc模式及处理函数 
    - 以mtd_info为参数调用nand_scan()探测NAND FLash。 
       nand_scan()会读取nand芯片ID,并根据mtd->priv即nand_chip中成员初始化mtd_info 
    - 若有分区,则以mtd_info和mtd_partition为参数调用add_mtd_partitions()添加分区信息 
    -

    Ø MTD对NAND芯片的读写 
    主要分三部分: 
    A、struct mtd_info中的读写函数,如read,write_oob等,这是MTD原始设备层与FLASH硬件层之间的接口; 
    B、struct nand_ecc_ctrl中的读写函数,如read_page_raw,write_page等,主要用来做一些与ecc有关的操作; 
    C、struct nand_chip中的读写函数,如read_buf,cmdfunc等,与具体的NAND controller相关,就是这部分函数与硬件交互,通常需要我们自己来实现。 
    tip: nand_chip中的读写函数虽然与具体的NAND controller相关,但是MTD也为我们提供了默认的读写函数,如果NAND controller比较通用(使用PIO模式),那么对NAND芯片的读写与MTD提供的这些函数一致,就不必自己实现这些函数。

    上面三部分读写函数相互配合完成对NAND芯片的读写 
    首先,MTD上层需要读写NAND芯片时,会调用struct mtd_info中的读写函数,接着struct mtd_info中的读写函数就会调用struct nand_chip或struct nand_ecc_ctrl中的读写函数,最后,若调用的是struct nand_ecc_ctrl中的读写函数,那么它又会接着调用struct nand_chip中的读写函数。 
    eg:  以读为例 
    MTD上层会调用struct mtd_info中的读page函数,即nand_read函数。 
    接着nand_read函数会调用struct nand_chip中cmdfunc函数,这个cmdfunc函数与具体的NAND controller相关,它的作用是使NAND controller向NAND 芯片发出读命令,NAND芯片收到命令后,就会做好准备等待NAND controller下一步的读取。 
    接着nand_read函数又会调用struct nand_ecc_ctrl中的read_page函数,而read_page函数又会调用struct nand_chip中read_buf函数,从而真正把NAND芯片中的数据读取到buffer中(所以这个read_buf的意思其实应该是read into buffer,另外,这个buffer是struct mtd_info中的nand_read函数传下来的)。 
    read_buf函数返回后,read_page函数就会对buffer中的数据做一些处理,比如校验ecc,以及若数据有错,就根据ecc对数据修正之类的,最后read_page函数返回到nand_read函数中。 
    对NAND芯片的其它操作,如写,擦除等,都与读操作类似 

    http://www.cnblogs.com/hzl6255/archive/2012/12/18/2824043.html

     

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

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

      二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。 用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量的关于MTD的数据和操作函数。mtd_table(mtdcore.c)则是所 有MTD原始设备的列表,mtd_part(mtd_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函数(lseek、open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_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上。

    http://www.cnblogs.com/hoys/archive/2012/05/30/2526230.html

    展开全文
  • 1. 介绍MTD,即Memory Technology Device,值得是内存技术设备字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问;同时,两者读写数据的基本单元不同字符设备: 以字节为基本单位,在Linux中,字符...

    1. 介绍

    MTD,即Memory Technology Device,值得是内存技术设备

    字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问;同时,两者读写数据的基本单元不同

    字符设备: 以字节为基本单位,在Linux中,字符设备实现的比较简单,不需要缓冲区即可直接读写,内核例程和用户态API一一对应,用户层的Read函数直接对应了内核中的Read例程,这种映射关系由字符设备的file_operations维护

    块设备: 以块为单位接受输入和返回输出,对这种设备的读写是按块进行的,其接口相对于字符设备复杂,没有直接到块设备层,而是直接到文件系统层,然后再由文件系统层发起读写请求

    由于块设备的I/O性能与CPU相比很差,因此,块设备的数据流往往会引入文件系统的cache机制

    注意:MTD设备既非块设备也不是字符设备,但可以同时提供字符设备和块设备接口来操作

    2. 概述

    Linux中MTD的所有源码位于/drivers/mtd子目录下

    1381beea3caa7d61ce0552c0f29189b6.png

    MTD设备通常可分为四层,从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层

    硬件驱动层负责在init时驱动Flash硬件并建立从具体设备到MTD原始设备映射关系

    TIP: 映射关系通常包括 分区信息、I/O映射及特定函数的映射

    drivers/mtd/chips : CFI/JEDEC接口通用驱动

    drivers/mtd/nand : NAND通用驱动和部分底层驱动程序

    drivers/mtd/maps : NOR Flash映射关系相关函数

    drivers/mtd/devices : NOR Flash底层驱动

    MTD原始设备,用于描述MTD原始设备的数据结构是mtd_info,它定义了大量的关于MTD的数据和操作函数。

    mtdcore.c : MTD原始设备接口相关实现

    mtdpart.c : MTD分区接口相关实现

    MTD设备层,基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。

    mtdchar.c : MTD字符设备接口相关实现

    mtdblock.c : MTD块设备接口相关实现

    设备节点,通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)

    通过访问此设备节点即可访问MTD字符设备和块设备

    3. 数据结构

    MTD重要的数据结构包括mtd_info、mtd_part、mtd_partition、map_info、nand_chip、nand_ecclayout

    mtd_info表示mtd原始设备, 所有mtd_info结构体被存放在mtd_info数组mtd_table中

    成员

    作用

    type

    mtd类型, 包括MTD_NORFLASH,MTD_NANDFLASH等(See mtd-abi.h)

    flags

    标志位, MTD_WRITEABLE,MTD_NO_ERASE等(See mtd-abi.h)

    size

    mtd设备的大小

    erasesize

    主要的擦除大小, 即Flash的块大小 (tip: mtd设备可能有多个erasesize)

    writesize

    写大小, 对于norFlash是字节,对nandFlash为一页

    oobsize

    每块oob数据量, eg 16

    oobavail

    name

    命名

    index

    ecclayout

    nand_ecclayout结构体指针, 表示的是ecc布局,可参考硬件手册的OOB中ecc布局

    numeraseregions

    可变擦除区域的数目, 通常为1

    eraseregions

    mtd_erase_region_info结构体指针, 可变擦除区域

    erase

    擦除Flash函数

    read/write

    读写Flash函数

    read_oob/write_oob

    带oob读写Flash函数

    suspend/resume

    Power Management functions

    priv

    私有数据, cfi接口flash指向map_info结构, 或指向自定义flash相关结构体

    mtd_part表示MTD分区,其中包含了mtd_info,每一个分区都是被看成一个MTD原始设备

    成员

    作用

    mtd

    分区信息, 大部分由master决定

    master

    分区的主分区

    offset

    分区的偏移地址

    index

    分区号 (3.0后不存在该字段)

    list

    将mtd_part链成一个链表mtd_partitons

    mtd_partition的主要数据结构

    成员

    作用

    name

    size

    offset

    mask_flags

    ecclayout

    mtdp

    map_info的主要数据结构

    成员

    作用

    name

    名称

    size

    大小

    phys

    物理地址

    bankwidth

    总线宽度(in octets)

    virt

    虚拟地址,通常通过ioremap将物理地址进行映射得到

    read/copy_from/write/copy_to

    读写函数

    map_priv_1/map_priv_2

    驱动可用的私有数据

    nand_chip的主要数据结构

    成员

    作用

    IO_ADDR_R/IO_ADDR_W

    读/写8根io线的地址

    read_byte/read_word

    从芯片读一个字节/字

    read_buf/write_buf

    读芯片读取内容至缓冲区/将缓冲区内容写入芯片

    verify_buf

    select_chip

    block_bad

    检查是否坏块

    block_markbad

    标识坏块

    cmd_ctrl

    硬件相关控制函数

    init_size

    dev_ready

    cmdfunc

    命令处理函数

    waitfunc

    erase_cmd

    擦除命令

    scan_bbt

    扫描坏块

    errstat

    write_page

    options

    与具体的NAND 芯片相关的选项, 如NAND_USE_FLASH_BBT等(nand.h)

    page_shift

    ecclayout

    nand_ecclayout类型结构体, ECC布局信息

    ecc

    nand_ecc_ctrl类型结构体, ECC控制结构

    nand_ecclayout的主要数据结构

    成员

    作用

    eccbytes

    ecc的字节数(For 512B-per-page, eccbytes is 3)

    eccpos

    ecc数据在oob中的位置

    oobavail

    oob中可用的字节数, MTD 会根据其它三个变量自动计算得到

    oobfree

    nand_oobfree类型结构体, 显示定义空闲的oob 字节

    4. MTD相关层实现

    4.1 MTD设备层

    mtd字符设备接口:

    mtdchar.c 实现了字符设备接口,通过它,用户可以直接操作Flash 设备。

    ? 通过read()、write()系统调用可以读写Flash。

    ? 通过一系列IOCTL 命令可以获取Flash 设备信息、擦除Flash、读写NAND 的OOB、获取OOB layout 及检查NAND 坏块等(MEMGETINFO、MEMERASE、MEMREADOOB、MEMWRITEOOB、MEMGETBADBLOCK IOCRL)

    TIP: mtd_read和mtd_write直接直接调用mtd_info的read 函数,因此,字符设备接口跳过patition这一层

    mtd块设备接口:

    主要原理是将Flash的erase block中的数据在内存中建立映射,然后对其进行修改,最后擦除Flash 上的block,将内存中的映射块写入Flash 块。整个过程被称为read/modify/erase/rewrite 周期。

    但是,这样做是不安全的,当下列操作序列发生时,read/modify/erase/poweroff,就会丢失这个block 块的数据。

    块设备模拟驱动按照block 号和偏移量来定位文件,因此在Flash 上除了文件数据,基本没有额外的控制数据。

    4.2 MTD原始设备层

    MTD原始设备层

    4.3 硬件驱动层

    4.3.1 NOR Flash驱动结构

    Linux系统实现了针对cfi,jedec等接口的通用NOR Flash驱动

    在上述接口驱动基础上,芯片级驱动较简单

    定义具体内存映射结构体map_info,然后通过接口类型后调用do_map_probe()

    以h720x-flash.c为例(位于drivers/mtd/maps)

    - 定义map_info结构体, 初始化成员name, size, phys, bankwidth

    - 通过ioremap映射成员virt(虚拟内存地址)

    - 通过函数simple_map_init初始化map_info成员函数read,write,copy_from,copy_to

    - 调用do_map_probe进行cfi接口探测, 返回mtd_info结构体

    - 通过parse_mtd_partitions, add_mtd_partitions注册mtd原始设备

    4.3.2 NAND Flash驱动结构

    Linux实现了通用NAND驱动(drivers/mtd/nand/nand_base.c)

    tip: For more, check 内核中的NAND代码布局

    芯片级驱动需要实现nand_chip结构体

    MTD使用nand_chip来表示一个NAND FLASH芯片, 该结构体包含了关于Nand Flash的地址信息,读写方法,ECC模式,硬件控制等一系列底层机制。

    ? NAND芯片级初始化主要有以下几个步骤:

    - 分配nand_chip内存,根据目标板及NAND控制器初始化nand_chip中成员函数(若未初始化则使用nand_base.c中的默认函数),将mtd_info中的priv指向nand_chip(或板相关私有结构),设置ecc模式及处理函数

    - 以mtd_info为参数调用nand_scan()探测NAND FLash。

    nand_scan()会读取nand芯片ID,并根据mtd->priv即nand_chip中成员初始化mtd_info

    - 若有分区,则以mtd_info和mtd_partition为参数调用add_mtd_partitions()添加分区信息

    -

    ? MTD对NAND芯片的读写主要分三部分:

    A、struct mtd_info中的读写函数,如read,write_oob等,这是MTD原始设备层与FLASH硬件层之间的接口;

    B、struct nand_ecc_ctrl中的读写函数,如read_page_raw,write_page等,主要用来做一些与ecc有关的操作;

    C、struct nand_chip中的读写函数,如read_buf,cmdfunc等,与具体的NAND controller相关,就是这部分函数与硬件交互,通常需要我们自己来实现。

    tip: nand_chip中的读写函数虽然与具体的NAND controller相关,但是MTD也为我们提供了默认的读写函数,如果NAND controller比较通用(使用PIO模式),那么对NAND芯片的读写与MTD提供的这些函数一致,就不必自己实现这些函数。

    上面三部分读写函数相互配合完成对NAND芯片的读写

    首先,MTD上层需要读写NAND芯片时,会调用struct mtd_info中的读写函数,接着struct mtd_info中的读写函数就会调用struct nand_chip或struct nand_ecc_ctrl中的读写函数,最后,若调用的是struct nand_ecc_ctrl中的读写函数,那么它又会接着调用struct nand_chip中的读写函数。

    eg:  以读为例

    MTD上层会调用struct mtd_info中的读page函数,即nand_read函数。

    接着nand_read函数会调用struct nand_chip中cmdfunc函数,这个cmdfunc函数与具体的NAND controller相关,它的作用是使NAND controller向NAND 芯片发出读命令,NAND芯片收到命令后,就会做好准备等待NAND controller下一步的读取。

    接着nand_read函数又会调用struct nand_ecc_ctrl中的read_page函数,而read_page函数又会调用struct nand_chip中read_buf函数,从而真正把NAND芯片中的数据读取到buffer中(所以这个read_buf的意思其实应该是read into buffer,另外,这个buffer是struct mtd_info中的nand_read函数传下来的)。

    read_buf函数返回后,read_page函数就会对buffer中的数据做一些处理,比如校验ecc,以及若数据有错,就根据ecc对数据修正之类的,最后read_page函数返回到nand_read函数中。

    对NAND芯片的其它操作,如写,擦除等,都与读操作类似

    4.3.3 Flash转换层

    Tranlation Layer

    逻辑块地址(Logical Block Address)对应到Flash存储器的物理位置,使系统能把Flash当作普通的硬盘一样处理

    FTL主要用于NOR Flash;NFTL用于NAND Flash

    闪存转换层要做下面的操作来完成写请求:

    - 将这个扇区所在擦除块的数据读到内存中,放在缓存中

    - 将缓存中与这个扇区对应的内容用新的内容替换。

    - 对该擦除块执行擦除操作。

    - 将缓冲中的数据写回该擦除块。

    参考:

    <>

    展开全文
  • mtd mdd

    2016-09-07 10:34:43
    VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别 VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) C 运行时库 库文件 Single thread(static link) ML ...

    VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别

    VC编译选项 多线程(/MT)
    多线程调试(/MTd)
    多线程 DLL (/MD)
    多线程调试 DLL (/MDd)
    运行时库 库文件
    Single thread(static link) ML libc.lib
    Debug single thread(static link) MLd libcd.lib
    MultiThread(static link) MT libcmt.lib
    Debug multiThread(static link) MTd libcmtd.lib
    MultiThread(dynamic link) MD msvert.lib
    Debug multiThread(dynamic link) MDd msvertd.lib 
    3. 各种 运行时库的区别
    ( )静态链接的单线程库
    静态链接的单线程库只能用于单线程的应用程序, 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线
    程库。
    ( )静态链接的多线程库
    静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
    ( )动态链接的运行时库
    动态链接的运行时库将所有的 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中, MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态链接的运行时库。


    /MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。 


    下面是msdn关于Visual C++ 编译器选项的说明:
    这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。
    选项说明
    /MD 定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
    用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,/MD库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。
    当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接
    ,同时仍通过 msvcrt.lib 动态链接到主 CRT
    /MDd 定义 _DEBUG_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
    /ML 使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。
    /MLd 定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。
    /MT 定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析
    外部符号。创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
    /MTd 定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使
    用 LIBCMTD.lib 解析外部符号。创 建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
    /LD 创建 DLL
    将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
    链接 DLL 启动代码。
    如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
    将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe
    如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT
    /LDd 创建调试 DLL。定义 _DEBUG
    VC编译选项 多线程(/MT)
    多线程调试(/MTd)
    多线程 DLL (/MD)
    多线程调试 DLL (/MDd)
    运行时库 库文件
    Single thread(static link) ML libc.lib
    Debug single thread(static link) MLd libcd.lib
    MultiThread(static link) MT libcmt.lib
    Debug multiThread(static link) MTd libcmtd.lib
    MultiThread(dynamic link) MD msvert.lib
    Debug multiThread(dynamic link) MDd msvertd.lib 
    3. 各种 运行时库的区别
    ( )静态链接的单线程库
    静态链接的单线程库只能用于单线程的应用程序, 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线
    程库。
    ( )静态链接的多线程库
    静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
    ( )动态链接的运行时库
    动态链接的运行时库将所有的 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中, MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态
    链接的运行时库。
    /MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息
    ,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。 
    下面是msdn关于Visual C++ 编译器选项的说明:
    这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。
    选项 说明
    /MD 定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
    用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 
    接的应用程序可用。
    当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接
    ,同时仍通过 msvcrt.lib 动态链接到主 CRT
    /MDd 定义 _DEBUG_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
    /ML 使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。
    /MLd 定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。
    /MT 定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析
    外部符号。创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
    /MTd 定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使
    用 LIBCMTD.lib 解析外部符号。创 建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
    /LD 创建 DLL
    将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
    链接 DLL 启动代码。
    如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
    将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe
    如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT
    /LDd 创建调试 DLL。定义 _DEBUG
    警告 不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非 DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。

     

    展开全文
  • MTD应用学习:mtd和mtdblock的区别

    千次阅读 2016-05-07 17:31:17
    http://my.oschina.net/shelllife/blog/123482 ... 今天做升级方案用到了mtd-utils中的flash_eraseall和flash_cp两个工具,在进行方案验证的时候,遭遇到各种不解和疑惑,因对MTD的原理不熟悉,所
  • mtd介绍

    2016-07-20 16:28:00
    MTD,Memory Technology Device即内存技术设备 字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问;同时,两者读写数据的基本单元不同。 字符设备,以字节为基本单位,在Linux中,字符设备实现的...
  • MTD设备驱动

    千次阅读 2013-07-07 12:15:58
    MTD(memory technology device):内存技术设备 是linux用于描述ROM,NAND,NOR等内存设备的子系统的抽象 MTD设备可以按块读写也可以按字节读写,也就是说MTD设备既可以是块设备也可以是字符设备 一.MTD设备基础 1.关键...
  • Linux MTD系统剖析

    2016-03-03 21:58:32
    MTD,Memory Technology Device即内存技术设备,在Linux内核中,引入MTD层为NOR FLASH和NAND FLASH设备提供统一接口。MTD将文件系统与底层FLASH存储器进行了隔离。 如上图所示,MTD设备通常可分为四层,从上到...
  • 浅析 mtd 子系统

    千次阅读 2016-10-10 23:20:16
    如果按照这个思路的话,nandflash 驱动程序我们就需要在请求处理函数中实现对 nandflash 的读写操作,事实上确实如此,只不过内核在块设备驱动的基础上又封装了一层,也就是所谓的MTD,现在只需要创建并填充一个 mtd_...
  • mtd驱动框架分析

    千次阅读 2015-06-17 10:14:45
    mtd驱动框架分为mtd block层,mtd raw层,具体的设备驱动。
  • MTD块设备---mtd_blkdevs.c

    千次阅读 2014-02-21 16:04:03
    (1)mtd块设备结构定义 static struct block_device_operations mtd_blktrans_ops = { .owner = THIS_MODULE, .open = blktrans_open, .release = blktrans_release, .locked_ioctl = blktrans_ioctl, ...
  • 什么是MTD

    2019-10-07 02:02:22
    在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。使用NOR器件时所需要的MTD要相对少一些,...
  • MTD应用学习札记

    千次阅读 2017-04-28 09:44:44
    今天做升级方案用到了mtd-utils中的flash_eraseall和flash_cp两个工具,在进行方案验证的时候,遭遇到各种不解和疑惑,因对MTD的原理不熟悉,所以只能多次尝试,虽然最后把方案搞定了,不过觉得MTD中的mtd和mtdblock...
  • Linux mtd 驱动

    2017-05-23 15:13:56
    转载于:... MTD,Memory Technology Device即内存技术设备,在Linux内核中,引入MTD层为NOR FLASH和NAND FLASH设备提供统一接口。MTD将文件系统与底层FLASH存储器进行了隔离。 如上图所示,MT
  • mtd层次分析

    2014-12-11 18:10:54
    关于mtd的层次分析,网上一大堆,先看看网上怎么说的. MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱 动更加简单,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,387
精华内容 4,554
关键字:

mtd处理