MTD: Memory Technology Device 内存技术设备
CFI: Common Flash Interface 通用Flash接口,Inter发起的一个Flash接口标准。
ECC: error correction
erasesize: 一个erase命令可以擦除的最小size。
buswidth: MTD设备的接口总线宽度。
devicetype: 芯片类型。
interleave“ 交错数,几块芯片平行连接成1块,使buswidth变大。
MTD是用于访问memory设备的linux的子系统。
MTD所有源代码在/drivers/mtd子目录下。
MTD设备分为4层:
设备节点
MTD设备层
MTD原始设备层
硬件驱动层
硬件驱动层: 负责在init时候驱动Flash硬件,NOR Flash 位于drivers/mtd/chips子目录下。NAND Flash位于/drivers/mtd/nand子目录下
MTD原始设备层: 分为2部分。 1.MTD原始设备通用代码。 2.各个特定的Flash数据,例如分区。
mtd_info: 用于描述MTD原始设备的数据结构,包含了大量的关于MTD的数据和操作函数。
mtd_table: 所有MTD原始设备的列表。
mtd_part: 用于表示MTD原始设备分区的结构,其中包括mtd_info。每一个分区都被看成一个MTD原始设备加在mtd_table中的,mtd_part.mtd_info中的大部分数据都从该分区的住分区mtd_part->master获得。
在/drivers/mtd/maps/子目录下存放的是特定的flash数据,每一个文件都描述了一块板子上的flash。
MTD设备层: 基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。
MTD字符设备的定义在mtdchar.c中,通过注册一系列file operation函数(lseek, open, close, read, write)。
设备层和原始设备层的调用关系
一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进mtd_table, mtd_table中的每个MTD原始设备都可以被注册成一个MTD设备,其中字符设备的主设备号为90,次设备号为0,2,4,6(奇数次设备号为只读设备),块设备的主设备号为31,次设备号为0,1,2,3...
设备层
register_mtd_user()
get_mtd_device()
unregister_mtd_user()
put_mtd_device()
erase_info
mtd_notifiers
mtd_table
mtd_info
mtd_part
原始设备层:
add_mtd_partitions
del_mtd_partitions
add_mtd_device()
del_mtd_device()
mtd_partition
NAND 和 NOR的1些区别
NOR的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存中运行。不必把代码读到RAM中去。 NOR的传输效率高,而擦写效率低。
NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易的存取其内部的每一个字节。
NAND使用复杂的I/O口来串行的存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制,地址和数据信息。
总线接口上,NOR的接口类型一般的总线接口,与SRAM器件相似。NAND则是IO接口,需要另外逻辑才能作为MEMORY(当然是厂家做好了的)
NOR的器件支持随机访问,而NAND的只支持顺序访问。因此NAND一般用在大规模存贮,而NOR的用于存程序代码,直接运行程序。而NAND放程序时,要先LOAD到RAM中再跑的)
源码分析
mtd_info 表示MTD原始设备的结构,每个分区也被实现为一个mtd_info,如果有两个MTD原始设备,每个上有三个分区,在系统中就一共有6个mtd_info结构,这些mtd_info的指针被存放在名为mtd_table的数组里。
mtd_notifier 加入/删除MTD设备和原始设备时调用的函数,在设备层,当MTD字符设备或块设备注册时,如果定义了CONFIG_DEVFS_FS, 则会将一个mtd_notifier加入MTD原始设备层的mtd_notifiers链表,其中的函数会在两种情况下被调用,一是加入/删除新的MTD字符/块设备时,此时调用该MTD字符/块设备的notifier对下层所有的MTD原始设备操作一遍,二是加入/删除新的MTD原始设备时,此时调用所有的notifier对该原始设备执行一遍。
get_mtd_device: 获得一个MTD设备,在设备层函的open函数中被调用,用来获得一个MTD原始设备。
put_mtd_device: 归还一个MTD设备。设备层函数,通常在设备层的release函数中调用。
add_mtd_device: 加入一个MTD原始设备。加入此原始设备的mtd_info到mtd_table中,notify所有的MTD设备一个mtd被加入(调用所有的notifier->add(mtd))。Flash相关文件(your-flash.c)初始化时(maps子目录下的文件中的init_xxxx函数)调用。
del_mtd_device: 删除一个MTD设备。从mtd_table中删除此设备的mtd_info,通知所有的MTD设备(调用所有的notifier.remove(mtd))。Flash相关文件(your-flash.c)初始化时(maps子目录下的文件中的cleanupt_xxx函数)调用。
register_mtd_user: 加入一个MTD原始设备的使用者(即MTD设备,MTD块设备或字符设备)。将新的mtd通知器new加入notifier队列中,增加模块的use count,对所有已有的MTD原始设备调用new->add()。如果定义了CONFIG_DEVFS,MTD设备级的初始化(mtdblock.c mtdchar.c ftl.c init_xxx)。
unregister_mtd_user: 删除一个MTD设备,将被删除MTD设备的通知器old从notifer队列中删除,减模块的use count,对所有已有的MTD原始设备调用old->remove()。如果定义了CONFIG_DEVFS,MTD设备级的清除(mtdblock.c mtdchar.c ftl.c init_xxx)。
__get_mtd_device: 返回指定的MTD原始设备的handler,被get_mtd_device()调用。
add_mtd_partitions: 将MTD原始设备分区。对每一个新建分区建立一个新的mtd_part结构,并将其加入mtd_partitions中,根据master设置mtd_part.mtd_info的成员。
del_mtd_partitions: 删除master上的所有分区。对mtd_partitions上的每一个分区,如果它的主分区是master,将它从mtd_partitions和mtd_table中删除并free掉。参数:被删除分区的主分区。
阅读(675) | 评论(0) | 转发(0) |