Chinaunix首页 | 论坛 | 博客
  • 博客访问: 475235
  • 博文数量: 56
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1957
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-07 23:02
文章分类

全部博文(56)

文章存档

2016年(1)

2014年(7)

2013年(48)

分类: 嵌入式

2013-07-31 22:24:51

本博文为原创,转帖请注明出处。谢谢。

7.2 TrueFFS系统静态分析

7.2.1 TrueFFS系统概述

TrueFFS是和VxWorks兼容的一种M-SystemsFlite实现方式,它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。有了TornadoTrueFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的操作一样。

如图7.2所示,TrueFFS由三个功能层,翻译层(translationlayer),MTD层(MTDlayer),socket层(socketlayer)组成。每一层都实现了一些列的通用接口。

图7.2 TrueFFS的功能层

翻译层(TL层)主要实现TrueFFSdosFs之间的高级交互功能。它也包含了控制flash映射、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。VxWorks有两种不同的翻译层模块可供选择:FTLSSFDC它为上层提供了一系列的通用接口,通过这些通用接口,计算机系统就可以像访问普通内存一样对flash卡进行访问,而不必关注socket层和MTD层的内容。

不同的计算机可以采用不同的socket层控制芯片,这些芯片主要用于控制flash卡的卡槽的管理,因为计算机系统对flash的访问实际是对于socket卡槽的访问控制。由于芯片的不同,其访问控制的方法也是不同的,而Socket软件的作用,就是提供实现了一组通用的socket控制器访问控制接口,通过这些接口,TL层则可以直接使用通用接口对socket控制器进行访问控制,而无需关注其细节。

MTD层(MemoryTechnologyDrivers)主要是实现对具体的flash卡进行读、写、擦、ID识别等驱动,并设置与flash密切相关的一些参数。比如不同的sd卡(如intelamd卡),它的读、写、擦除时序可能不同,因此要首先识别不同的卡,然后才能对这些卡进行不同的读、写、擦除等操作。该层实现了一组与flash卡生产厂商无关的一组通用的访问控制接口。

7.3描述了TrueFFS系统中各主要函数库的层次关系。

7.3 TrueFFS系统中各函数库的层次关系

首先我们用一幅图来详细描述flash驱动文件的层次关系。通过函数flMount,将MTDsockettl层连接起来,而调用flMount的函数则是由Dos文件系统函数mountVolume来完成。

      下面将依次分析各个函数库。

7.2.2 接口结构Flflash

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所在socketMTD专有区域如果MTD使用该变量的话,则需要有MTD识别函数对该变量进行初始化,文件amd92lvMtd.c没有使用

FLSocket * socket

指向该flash卡所在的socketFLSocket结构

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)(...)

注册加电回调函数。通常不同。

阅读(5261) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~