分类: 嵌入式
2013-07-31 22:24:51
TrueFFS是和VxWorks兼容的一种M-SystemsFlite实现方式,它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。有了Tornado的TrueFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的操作一样。
如图7.2所示,TrueFFS由三个功能层,翻译层(translationlayer),MTD层(MTDlayer),socket层(socketlayer)组成。每一层都实现了一些列的通用接口。
图7.2 TrueFFS的功能层
翻译层(TL层)主要实现TrueFFS和dosFs之间的高级交互功能。它也包含了控制flash映射、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。VxWorks有两种不同的翻译层模块可供选择:FTL和SSFDC。它为上层提供了一系列的通用接口,通过这些通用接口,计算机系统就可以像访问普通内存一样对flash卡进行访问,而不必关注socket层和MTD层的内容。
不同的计算机可以采用不同的socket层控制芯片,这些芯片主要用于控制flash卡的卡槽的管理,因为计算机系统对flash的访问实际是对于socket卡槽的访问控制。由于芯片的不同,其访问控制的方法也是不同的,而Socket层软件的作用,就是提供实现了一组通用的socket控制器访问控制接口,通过这些接口,TL层则可以直接使用通用接口对socket控制器进行访问控制,而无需关注其细节。
MTD层(MemoryTechnologyDrivers)主要是实现对具体的flash卡进行读、写、擦、ID识别等驱动,并设置与flash密切相关的一些参数。比如不同的sd卡(如intel和amd卡),它的读、写、擦除时序可能不同,因此要首先识别不同的卡,然后才能对这些卡进行不同的读、写、擦除等操作。该层实现了一组与flash卡生产厂商无关的一组通用的访问控制接口。
图7.3描述了TrueFFS系统中各主要函数库的层次关系。
图7.3 TrueFFS系统中各函数库的层次关系
首先我们用一幅图来详细描述flash驱动文件的层次关系。通过函数flMount,将MTD,socket、tl层连接起来,而调用flMount的函数则是由Dos文件系统函数mountVolume来完成。
下面将依次分析各个函数库。
mtd层主要有两个函数库组成:Flflash和amd92lvMtd文件。其中头文件Flflash.h文件提供了一个通用的接口:FLFlash结构,该结构为上层提供了一个通用的函数接口,这个函数接口包括flash卡芯片的结构,类型以及驱动等等;而Flflash函数库则是该通用接口的一个简单的缺省的实现,对于特定类型的flash卡则需要专门的驱动来实现,因此这里不再描述函数库Flflash,只对函数库amd92lvMtdhsk和结构FLFlash进行分析。
表7.1对结构Flflash中的各个元素进行了详细说明。
表格 7.1 结构Flflash中的各个元素说明
元 素 |
描 述 |
FlashType type |
设备类型编码(JEDEC id) |
long int erasableBlockSize |
最小可擦除单元的大小 |
long int chipSize |
单个flash的芯片的大小 |
int noOfChips |
flash卡中芯片的数量。 flash卡容量=单个芯片的容量×芯片数量 |
int interleaving |
关于flash卡内部芯片地址的描述,它描述了一个芯片上相邻两个字节的地址差异,在硬件上表现为地址线的连接情况 |
unsigned flags |
用于特殊的标记,Bits 0-7 可被FLite使用。本文件amd92lvMtd.c里没有使用 |
void * mtdVars |
指向该flash所在socket的MTD专有区域如果MTD使用该变量的话,则需要有MTD识别函数对该变量进行初始化,文件amd92lvMtd.c没有使用 |
FLSocket * socket |
指向该flash卡所在的socket的FLSocket结构 |
void FAR0 * (*map)(...) |
将flash卡上的一段数据映射到指定的内存中,对NOR类型的flash卡来说,可以像访问普通内存一样访问flash卡,因此可以不进行map,直接从卡上的相应地址读取即可(但是仍然需要从flash卡地址到内存地址的转换,即返回参数中flash卡内地址CardAddress对应的在计算机系统的地址),而对于NAND类型的flash卡来说,则是需要利用复杂的操作将flash卡中对应地址的数据复制到系统内存的位置,最后返回系统内存的地址。 |
void FAR0 * (*read)(...) |
从flash卡上指定位置读取一定数量的数据,保存在参数指定的系统内存中。它需要首先进行map操作。 |
void FAR0 * (*write)(...) |
将指定的内存中的数据写入到flash卡向指定的地址中,写之前已经擦除过了。 |
void FAR0 * (*erase)(...) |
擦除一个或多个物理连续的区块。 |
void FAR0 * (*setPowerOnCallback)(...) |
注册加电回调函数。通常不同。 |