日期:2014-05-16  浏览次数:20569 次

linux MTD FALSH管理设计
由于loader升级需要使用flash来保存数据,但在android系统上又没有合适的接口使用,因此
对MTD接口设计研究了一下并移植了flash管理代码,有些心得记录一下。


专有名词:
1. MTD:Memory Technology Device,内存技术设备,
2. JEDEC:Joint Electron Device Engineering Council,电子电器设备联合会
3. CFI:Common Flash Interface,通用Flash接口,Intel发起的一个Flash的接口标准
4. OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的块有16个字节的extra data,用于纠错或元数据。
5. ECC: error correction,某些硬件不仅允许对flash的访问,也有ecc功能,所有flash器件都受位交换现象的困扰。在某些情况下,一个比特位会发生反转或被报告反转了,如果此位真的反转了,就要采用ECC算法。
6. erasesize: 一个erase命令可以擦除的最小块的尺寸
7. buswidth:MTD设备的接口总线宽度
8. interleave:交错数,几块芯片平行连接成一块芯片,使buswidth变大
9. devicetype:芯片类型,x8、x16或者x32
10.NAND:一种Flash技术,参看NAND和NOR的比较
11.NOR:一种Flash技术,参看NAND和NOR的比较


1、概述
   MTD就在在硬件和文件系统层之间的提供了一个抽象的接口,MTD是用来访问内存设备(如:ROM、flash)的中间层,它将内存设备的共有特性抽取出来,从而使增加新的内存设备驱动程序变得更简单。本文件就是利用MTD来编写上层管理flash程序接口.
   

   MTD中间层细分为四层,按从上到下依次为:设备节点、MTD设备层、MTD原始设备层和硬件驱动层

   

   MTD设备层、MTD原始设备层和Flash硬件驱动层之间的接口关系如下图:
     

2、几个重要的数据结构:


/* Parse the contents of the file, which looks like: */
cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00400000 00100000 "logo"
mtd1: 01e00000 00100000 "cache"
mtd2: 00100000 00100000 "misc"
mtd3: 00700000 00100000 "kernel"
mtd4: 0b400000 00100000 "system"
mtd5: 10e00000 00100000 "userdata"
mtd6: 01300000 00100000 "factorydata"
mtd7: 00100000 00100000 "blackbox"


打开 "/proc/mtd" 文件即可解析出MTD分区信息,从这里可以知道MTD数目,SIZE,擦写块大小及DEV NAME


ls -l /dev/mtd/mtd* [partition_info]
crw------- root     root      90,  15 1970-01-01 08:00 mtd7ro
crw------- root     root      90,  14 1970-01-01 08:00 mtd7
crw------- root     root      90,  13 1970-01-01 08:00 mtd6ro
crw------- root     root      90,  12 1970-01-01 08:00 mtd6
crw------- root     root      90,  11 1970-01-01 08:00 mtd5ro
crw------- root     root      90,  10 1970-01-01 08:00 mtd5
crw------- root     root      90,   9 1970-01-01 08:00 mtd4ro
crw------- root     root      90,   8 1970-01-01 08:00 mtd4
crw------- root     root      90,   7 1970-01-01 08:00 mtd3ro
crw------- root     root      90,   6 1970-01-01 08:00 mtd3
crw------- root     root      90,   5 1970-01-01 08:00 mtd2ro
crw------- root     root      90,   4 1970-01-01 08:00 mtd2
crw------- root     root      90,   3 1970-01-01 08:00 mtd1ro
crw------- root     root      90,   2 1970-01-01 08:00 mtd1
crw------- root     root      90,   1 1970-01-01 08:00 mtd0ro
crw------- root     root      90,   0 1970-01-01 08:00 mtd0
可看出每个mtd设备有两个:一个是RW设备,另一个的RO,一般使用不带ro后缀的设备


mtd_info数据结构
struct mtd_info_user {
unsigned char type;  //内存技术类型,例如MTD_RAM,MTD_ROM,MTD_NORFLASH,MTD_NAND_FLASH,MTD_PER