这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于TFFS的若干问题

共3条 1/1 1 跳转至

关于TFFS的若干问题

菜鸟
2007-06-15 18:27:38     打赏

我的flash是2048 bytes * 64 pages * 4096 blocks = 512MB积累了若干TFFS的问题,烦请高手帮忙看看。

1.我得知VxWorks5.5的TFFS不再支持NAND Flash了,这一点我也得到了风河的确认,可是我在代理商那里看5.4中也没有相应的TFFS文件。我觉得应该是缺少一个nftllite.c文件。不知道谁那里有该文件,不知道是否方便传给我一份。

2.同时我在VxWorks5.5中看到了一个ssfdc.c的文件,里面的处理类似于nand flash的操作,应该修改一下就可以用。这个我还没有试成功。不知道和nftllite.c是否有差别,能否直接用。

3.现在我的做法是,将nand flash当作nor flash来处理,即将不连续的地址映射为连续的地址空间,而不用nand flash后的空闲区。这样格式化、挂载的都成功了。只是在读写文件时候出现异常:
1)将4096块格式化后,写文件没有问题(读取flash相应的地址,有写入的数据,这就是说的确写入了文件),但是却找不到文件,但读函数也并没有报错,表现就是读出来的数据没有内容(忘了是ff还是00了)。或者只有第一个文件可以读出来,第二个文件无法读取。
2)如果只格式化16、256个块的话(即让系统认为flash只有这么多块),读写均成功,两个文件也一样。
3)怀疑是跟FAT系统有关系,是不是FAT12 16没有选好啊?需要在什么地方配置吗?簇的大小是否有限制呢?
4)另一个就是我的写函数中并没有对overwrite进行处理,上层传下来的overwrite是否表示我需要将整块的数据都读取出来然后在将数据修改后,擦块,然后再整块写入吗?还是这些机制都不用我来处理呢?
目前就是以上若干问题,谢谢版主赐教,不胜感激!




关键词: 关于     若干     问题     文件    

菜鸟
2007-06-21 08:28:00     打赏
2楼

谢谢版主回复:)

的确不是FAT的问题,我查看程序之后发现它会根据大小进行匹配。

下面是我的map函数的相关代码,请版主指教:

typedef struct {
unsigned short vendorID;
unsigned short chipID;
unsigned short pageSize ; /* all....................*/
unsigned short pageMask ; /* ...these...............*/
unsigned short pageAreaSize ; /* .......variables.......*/
unsigned short tailSize ; /* .............interleave*/
unsigned short noOfBlocks ; /* total erasable blocks in flash device*/
FLBuffer *buffer; /* buffer for map through buffer */
} Vars;

static Vars mtdVars[DRIVES];

#define thisVars ((Vars *) vol.mtdVars)
#define thisBuffer (thisVars->buffer->data)

static void FAR0 * NandMTDMap ( FLFlash vol,CardAddress Address,int length )
{
//unsigned int BlockNo=Address>>18;
NandMTDRead(&vol,Address,thisBuffer,length, 0);
vol.socket->remapped = TRUE;
return (void FAR0 *)thisBuffer;
}


菜鸟
2007-06-22 08:12:00     打赏
3楼

对了 在注册函数NandMTDIdentify中,有对window操作的语句,我也只是照搬过来,只对flSetWindowBusWidth改为了8,其他并没有动。不知道配置是否正确。

flSetWindowBusWidth(vol.socket,8);/* use 8-bits */
flSetWindowSpeed(vol.socket,120); /* 120 nsec. */
flSetWindowSize(vol.socket, 2); /* 4 KBytes unit*/

是不是flSetWindowSize()的参数给的不对啊,因为我同时在sysTffs.c中发现了

LOCAL void rfaSetWindow
(
FLSocket vol /* pointer identifying drive */
)
{
/* Physical base as a 4K page */

vol.window.baseAddress = FLASH_BASE_ADRS >> 12;

flSetWindowSize (&vol, FLASH_SIZE >> 12);
}

两者显然配置的不一样。不知道window是一个什么概念?是不是要将第一个的参数改为FLASH_SIZE >> 12


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]