OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 这两天正在研究TFFS,希望感兴趣的朋友多多交流!

共8条 1/1 1 跳转至

这两天正在研究TFFS,希望感兴趣的朋友多多交流!

菜鸟
2002-09-25 03:42:00    评分
硬件平台是Samsung的4510B,操作系统是vxworks。需要自己写MTD层代码,并挂接到TrueFFS上。这两天看资料看得头都大了,请教了坛子里的高手,已经有了较大的进展,明天开始写代码。欢迎交流![em21][em21]



关键词: 两天     正在     研究     希望     感兴趣     朋友     多多     交流    

菜鸟
2002-09-27 05:22:00    评分
2楼
自己写MTD真是很烦,驱动倒是容易,但是要正确挂上去就很费事,很多小地方都要顾及。我现在还没有搞清楚它里面那个map window,是不是在内存是开辟了一块来映射flash?还有在FLFlash结构中的“FLStatus (*write)(FLFlash *, CardAddress, const void FAR1 *, int, int);”第二个参数CardAddress倒底传的是相对物理地址的偏移还是块地址?   另我的flash是16位一片的,一次写操作就是2个字节,如果先写奇数个bytes(如3bytes),再写2个bytes,就会在第一次和第二次写的单元之间出现一个无效的字节,我不知道tffs会不会处理这样的情况? 而vxworks自己提供的驱动则是针对一个byte或者是二个8位的芯片组成一个16宽度的芯片,因为可以分开操作所以不存在我所说的那种情况。   不知道各位高手对此有何看法? [align=right][color=#000066][此贴子已经被seasoblue于2002-9-26 21:22:50编辑过][/color][/align]

菜鸟
2002-09-28 19:51:00    评分
3楼
我曾在s3c4510b上试过一次:S3C4510B一共有4组针对flash的字节写使能nWBE[0-3],当把指向16位宽度的flash的指针强制转化成8位的指针写操作时,用示波器观察发现只有nWBE0(低8位)有效!并且我看了/tffs/amdtmd.c中amdMTDWrite()函数,发现它也是按这种方式处理的,即如果是vol.interleaving == 2(我理解interleaving为8位flash组成总线宽度的片数,不知道对否?),则按16位模式进行写,当发现只剩一个字节的时候则跳到vol.interleaving == 1(其实就是强制转化写指针为8位模式再写)执行。但下一次写怎么办呢?在MTD层好象要排除空一个字节的错误好象很难!   里面还有一些概念我还没有完全搞清楚,如它是怎么map window的?我用一片16位宽度的flash时,interleavin该设成1,还是2?FLFlash中noOfChips是指芯片数还是芯片编号?   我现在正在调试MTD程序,等我排除掉一些低级错误,有一定结果(不管是好的还是坏的)时再把程序发给你。  谢谢!

菜鸟
2002-09-29 17:52:00    评分
4楼
现在系统起来后,我在host端的shell下键入如下命令: Copyright 1995-1999 Wind River Systems, Inc. C++ Constructors/Destructors Strategy is AUTOMATIC -> i NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY ---------- ------------ -------- --- ---------- -------- -------- ------- ----- tExcTask _excTask ffab20 0 PEND 57934 ffaa54 0 0 tLogTask _logTask ff8204 0 PEND 57934 ff8138 0 0 tWdbTask 0x3d308 e1152c 3 READY 9d80 e1145c 0 0 tNetTask _netTask fb72ac 50 READY 793c fb713c 0 0 tTffsPTask _flPollTask ff4698 100 DELAY 1643c ff461c 0 4 value = 0 = 0x0 -> tffsShowAll TFFS Version 2.0 [color=#6495ED]Debug: entering SST MTD identification routine. unlockAddr1 = 0x610aaaa, unlockAddr1 = 0x6105554 flashPtr = 0x6100000 offSet = 0x6100002 vol.type = 0x2782 Debug: Identified sst39vf160 media.[/color] [color=#DC143C]0: socket=RFA: type=0x2782, unitSize=0x1000, mediaSize=0x0[/color]value = 44 = 0x2c = ',' -> tffsDevFormat 0,0 就没有反应了!蓝色的信息是tffsShowAll调用我在MTD层写的sstMTDIndentify函数得到的值,都是正确的,但红色信息中的mediaSize = 0,好象有问题。我可以提供相关代码,大家能否帮我分析一下?谢谢! [align=right][color=#000066][此贴子已经被seasoblue于2002-9-29 9:52:21编辑过][/color][/align]

菜鸟
2002-09-29 18:50:00    评分
5楼
我已查出出现mediaSize=0x0的原因乐:是因为在sstMTDIdentify()中我把vol.noOfchip设成0了,应该为1!看来noOfchip不是芯片编号,而是片数。但在format时还是有问题,格式化从地址0到0xe000都没有出问题,在0xf000扇区出现 “Data abort Program Counter: 0x27c0 Status Register: 0x20000013” 的情况,很奇怪。这种情况这般是在指针越界,或是指向16位宽度的奇地址时才出现。真是好事多磨呀!

菜鸟
2002-09-29 21:54:00    评分
6楼
现在已经有进展了。我修改了部分sst39VF160MTD代码,在执行tffsDevFormat(0,0)后打印出如下信息: -> sysTffsFormat Debug: entering SST MTD identification routine. unlockAddr1 = 0x610aaaa, unlockAddr1 = 0x6105554 flashPtr = 0x6100000 offSet = 0x6100002 vol.type = 0x2782 Debug: Identified sst39vf160 media. Debug: entering SST MTD identification routine. unlockAddr1 = 0x610aaaa, unlockAddr1 = 0x6105554 flashPtr = 0x6100000 offSet = 0x6100002 vol.type = 0x2782 Debug: Identified sst39vf160 media. firstBlock = 0x0, numOfBlock = 0x10 ERASE: flashPtr = 0x6100000 ERASE: flashPtr = 0x6101000 ERASE: flashPtr = 0x6102000 ERASE: flashPtr = 0x6103000 ERASE: flashPtr = 0x6104000 ERASE: flashPtr = 0x6105000 ERASE: flashPtr = 0x6106000 ERASE: flashPtr = 0x6107000 ERASE: flashPtr = 0x6108000 ERASE: flashPtr = 0x6109000 ERASE: flashPtr = 0x610a000 ERASE: flashPtr = 0x610b000 ERASE: flashPtr = 0x610c000 ERASE: flashPtr = 0x610d000 ERASE: flashPtr = 0x610e000 ERASE: flashPtr = 0x610f000 firstBlock = 0x10, numOfBlock = 0x10 ERASE: flashPtr = 0x6110000 ERASE: flashPtr = 0x6111000 ......... ......... ERASE: flashPtr = 0x62fe000 ERASE: flashPtr = 0x62ff000 Debug: entering SST MTD identification routine. unlockAddr1 = 0x610aaaa, unlockAddr1 = 0x6105554 flashPtr = 0x6100000 offSet = 0x6100002 vol.type = 0x2782 Debug: Identified sst39vf160 media. value = -1 = 0xffffffff 可以看出:擦除是成功了的(从0x6100000到0x6300000一共2M字节)。但后面有问题,因为返回值是-1。我不太清楚在擦除整修芯片后tffsDevFormat()又干了些什么,现在无从查起了。:(,不知各位有何高见? 我在shell里直接就是tffsDevFormat,之前什么命令也没有用,不知是不是少了?因为我想tffsDrv()之类已经在定义了INCLUDE_TFFS后已经运行了。[em21][em21]

菜鸟
2002-09-30 00:03:00    评分
7楼
耶 ̄ ̄ ̄!! 我成功啦!!! 现在“tffsDevFormat(0,0)”和“usrTffsConfig 0,0,"/tffs/"”已经成功返回0啦!用devs查看设备也有了 “3 /tffs/”的显示!接下来我可以试试文件操作乐!呵呵 ̄ ̄ ̄em21][em21][em21][em21][em27][em27][em27][em27]

菜鸟
2002-09-30 02:16:00    评分
8楼
谢谢!我在shell下进行fopen,fwrite,fread都可以了。但有时进行fread时shell会提示和目标机连接丢失,shell就关闭了,估计还有些毛病。

共8条 1/1 1 跳转至

回复

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