vxworks的TFFS分析(2)

2020-06-28 11:40

第一步一般这么写:

FLSocket *flSocketOf(unsigned volNo); FLSocket vol = flSocketOf (noOfDrives);

if (noOfDrives >= DRIVES) return (flTooManyComponents); tffsSocket[noOfDrives] = \noOfDrives++;

第二部初始化下面一些变量: window.baseAddress

See window.baseAddress; cardDetected ; VccOn ; VccOff; VppOn; VppOff; initSocket; setWindow;

setMappingContext;

getAndClearCardChangeIndicator writeProtected freeSocket

4.3添加全局函数?FitInSocketWindow()和?DelayLoop()函数

Tffs使用?FitInSocketWindow()函数确定chipsize不会比windowsize大;什么是chipsize什么是windowsize?chipsize是你的flash大小;而windowsize是ppc为了方便管理每个外围设备,而分配的一段空间;所以?FitInSocketWindow()就是要确保分配给你的空间足够用;如果ppc分配的flash空间比flash本身要小,那么就返回ppc分配的flash空间。一般这个函数直接返回FLSocket.chipSize。如下: long int flFitInSocketWindow (

long int chipSize, /* size of single physical chip in bytes */ int interleaving, /* flash chip interleaving (1,2,4 etc) */ long int windowSize /* socket window size in bytes */ ) {

/* x86 architectures use sliding windows for flash arrays */ /* so this check is irrelevant for them */

return (chipSize);

}

Tffs使用?DelayLoop()函数来处理flash硬件之间交互所需的等待时间;这个函数格式比较固定:

void flDelayLoop (

int cycles /* loop count to be consumed */ ) {

while (--cycles); }

5. 添加MTD

根据第4节分析的添加tffs流程分析可以得出:添加MTD需要以下几个部分:xxxIdentify()函数、flmap()函数、flash读写擦除函数、添加xxxIndentify到MTD中。

xxxIdentify()

xxxIdentify函数探测设备,并鉴别设别ID;看设备ID是否是其支持的设备ID;如果是则初始化flflash数据结构;如果不是则返回失败。Flflash中需要初始化的数据包括以下部分:

type

erasableBlockSize chipSize noOfChips interleaving write erase map read

对于大部分的norflash你可以使用标准的?IntelIdentify()和?IntelSize()函数自动读取flash设备ID、flash大小等;首先调用?IntelIdentify()

FLStatus flIntelIdentify( FLFlash vol,

void (*amdCmdRoutine) (FLFlash *, long int, unsigned char), long int chipOffset) ?IntelIdentify()使用flash设备READ_ID命令检测设备并读取ID,如果是intel的flash设备amdCmdRoutine设置为NULL,如果是AMD& Fujitsu的flash设备amdCmdRoutine设置为写flash命令函数的地址;chipOffSet设置为读取设备ID的偏移地址。一般设置为0。

如果?IntelIdentify失败,那么MTD的xxxIndentify函数也将返回失败;如果成功,它将设置vol.type和vol.interleaving的值;xxxIndentify函数将检查vol.type中包含的ID;如果MTD可以处理这种类型的flash,它将设置vol.chipSize为正确的值。然后调用?IntelSize()函数,它将设置vol.noOfChips的值。

Flmap()函数

Flmap是MTD映射函数,第四章有介绍在鉴定flash设备时需要调用flmap函数获取硬件设备地址,然后读取flash设备ID。Flash阵列是通过系统一个智能控制器连接到总线的,我们系统通过主机地址窗口访问flash地址空间。具体如下图:

地址窗口可以在地址空间上左右移动,当我们需要访问flash地址空间时,将窗口移动到flash地址,然后访问flash就可以像访问本地存储空间一样。因为窗口的最小值为4K,所以在访问偏移地址时不能超过4K大小。

Read()函数

如果 flash设备可以直接映射到 flash存储空间,则读取操作将是小菜一碟。TFFS提供一个默认函数用于重映射和简单的内存拷贝以便从特定区域重新获取数据。如果映射是通过缓存进行的,你就必须提供你自己的读取函数。

一般情况下,你应当尽可能通用地编写读函数。就是说,读函数每次只应当读一个字符或一个字也或者一个长字,而且它还应当能忽略芯片类型进行通用的读操作。

Write()函数和Erase()函数

通常来说,擦除和写函数应该尽量做到通用化,写函数每次只应当写一个字符,或者 一个字也或者一个长字,而且能象忽略芯片类型一样进行通用的写操作。这种要求同样使用擦除操作。作为输入,使用FLFlash结构体中的erasableBlockSize成员的值将块号传送到 flash阵列的偏移地址,即可以针对某个块进行擦除。

注册你的MTD设备

前面第四章有将到,当tffs要匹配MTD时,需要遍历mtdtable数组,这个数组是全局遍历。我们将我们mtd的xxxIndentify函数加载这个数组中。如下: MTDidentifyRoutine mtdTable[] = /* MTD tables */ {

#ifdef INCLUDE_MTD_SST39VF160 sst160Identify, /*fixed by george*/ #ifdef INCLUDE_MTD_I28F016 i28f016Identify,

#endif /* INCLUDE_MTD_I28F016 */ #ifdef INCLUDE_MTD_I28F008 i28f008Identify,

#endif /* INCLUDE_MTD_I28F008 */ #ifdef INCLUDE_MTD_AMD amdMTDIdentify,

#endif /* INCLUDE_MTD_AMD */ #ifdef INCLUDE_MTD_CDSN cdsnIdentify,

#endif /* INCLUDE_MTD_CDSN */ #ifdef INCLUDE_MTD_DOC2 doc2Identify,

#endif /* INCLUDE_MTD_DOC2 */ #ifdef INCLUDE_MTD_CFISCS cfiscsIdentify,

#endif /* INCLUDE_MTD_CFISCS */ };

如果你新写了一个 MTD并希望 TFFS可以识别它,就必须在此表中添加它的注册信息(如上表中 sst160Identify为译者加的 SST39VF160的注册信息)。当然,这之前需要一个条件包含声明。控制这个条件包含的字符常量在BSP的config.h中(你也可以在其他文件中加,比如 sysTffs.c中)。使用这些常量,用户就可以有选择地包含特定的MTD。在你给此表添加 MTD识别程序的同时,也应当给config.h添加一个新的常量。


vxworks的TFFS分析(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高考物理实验创新题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: