各位好!
小弟最近在学习vxworks的nandflash文件系统tffs移植。
使用的是at91rm9200挂接三星的k9f1208 64M*byte的nand(4096 block *[32 page/block]*[512byte/page] = 64M*byte),目前开发板已经做好了norflash的tffs,我想不使用norflash而在nandflash上移植好tffs! 经过近一段时间的调试,遇到的问题如下:
编译完成好vxworks镜像之后下载到开发板之后,运行 tffsShowAll 提示:
TFFS Version 2.0
0: socket=RFA: type=0xec76, unitSize=0x4000, mediaSize=0x4000000
目前来看是能够读取到ID的;
但是在运行格式化tffsDevFormat(0,0) 时提示输出:
value = -1 = 0xffffffff
上网查了很多资料,只是找到了许多类似的问题并没有找到比较系统的全面点的解决办法,或许是我比较笨,还望大家多指点!!
下面我将我所修改的文件信息列出来供各位大虾查看:
1.对文件sysTffs.c文件的修改:
添加了定义nandflash基地址及大小的宏
#define ND_FLASH_BASE_ADRS 0x40000000 /* K9F1208U0C的基地址 512Mbit */
#define ND_FLASH_SIZE 0x04000000 /* 64M */
由于是采用的norflash的对应文件,我将 INCLUDE_TL_FTL #undef 掉了并同时打开了
INCLUDE_TL_NFTL /* NFTL translation layer */ 的宏即:
#define INCLUDE_TL_NFTL /* NFTL translation layer */
#undef INCLUDE_TL_FTL /* FTL translation layer modify by wanbo 2013.04.10 */
对于格式化时所调用的 ¶ms我给出了如下参数
tffsDevFormatParams params=
{
/*#undef HALF_FORMAT lower 0.5MB for bootimage,upper 1.5MB for TFFS */
/*
#ifdef HALF_FORMAT
{0x800001,99,1,0x100001,NULL,{0,0,0,0},NULL,2,0,NULL},
#else
{0x000000000l,99,1,0x100001,NULL,{0,0,0,0},NULL,2,0,NULL},
*/
{0x00080000l, 99, 1, 0x10000l, NULL, {0,0,0,0}, NULL, 2, 0, NULL},
/*
0x000000000l 表示该nandflash文件系统中前面我不打算留出bootimage的空间
即整体全部做成文件系统 不知是否有问题!?
*/
/* #endif HALF_FORMAT */
};
对于rfaRegister 做了如下修改:
if (noOfDrives == 0)
vol.window.baseAddress = ND_FLASH_BASE_ADRS >> 12;
/*
else if(noOfDrives == 1)
vol.window.baseAddress = FLASH_BOOT_ADRS >> 12;
*/
noOfDrives++;
对于rfaSetWindow 做了如下修改:
/* Physical base as a 4K page */
if (vol.serialNo == 0){
vol.window.baseAddress = ND_FLASH_BASE_ADRS >> 12;
flSetWindowSize (&vol, ND_FLASH_SIZE >> 12);
上面两处的修改 主要是改成了nandflash的基地址跟大小!!
其实这中间还有个概念基本不太懂 就是关于window 如若能指明方向我会去深入查看下的!
以上就是sysTffs.c中的修改,不知是否有未考虑到的或是修改错误的地方,望指教!
2.tffsConfig.c文件的修改:
增加了
FLStatus nandMTDIdentify(FLFlash vol); /* add by mhf 2013.3.26 */
及在 MTD Tables 表中增加了
#ifdef INCLUDE_MTD_NAND /* add by mhf 2013.3.29 */
nandMTDIdentify,
#endif
而对宏 INCLUDE_MTD_NAND 的控制我则直接放到了 config.h 中!
不知上述文件修改是否有问题!
3.sysLib.c文件修改:
sysPhysMemDesc 表中增加了
{
(void *) 0x40000000,
(void *) 0x40000000,
ROUND_UP (0x08000000, PAGE_SIZE),
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
#ifdef INCLUDE_FLASH
/* needs to be writable */
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
#else
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
#endif
},
而原来的norflash的内容保留如下:
{
(void *) ROM_BASE_ADRS,
(void *) ROM_BASE_ADRS,
ROUND_UP (ROM_SIZE_TOTAL*2, PAGE_SIZE),
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
#ifdef INCLUDE_FLASH
/* needs to be writable */
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
#else
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
#endif
},
此处修改是地址映射需要用到的(不知是否正确!),未修改此处
之前输入 tffsShowAll 始终无法输出正确!!! 修改之后能够打印
出正确信息了。
4.再然后就是添加了 nandMTD.c及k9f1208.c .h文件 后面我会附带传上去!
在nandMTD.c文件中,主要有nandMTDIdentify的定义 定义如下:
FLStatus nandMTDIdentify(FLFlash vol)
{
#ifdef DEBUG_PRINT
DEBUG_PRINT("Debug: Entering K9F1208 identification routine\n");
#endif
flSetWindowBusWidth(vol.socket,8);/* use 16-bits */
flSetWindowSpeed(vol.socket,120); /* 120 nsec. */
flSetWindowSize(vol.socket,2); /* 4 KBytes */
vol.mtdVars = &mtdVars[flSocketNoOf(vol.socket)];
/* get pointer to buffer (we assume SINGLE_BUFFER is not defined) */
thisVars->buffer = flBufferOf(flSocketNoOf(vol.socket));
vol.interleaving = 1;
vol.noOfChips = 1; /* 以1为起始 */
if(readFlashID(&vol, vol.noOfChips) != TRUE )
{
#ifdef DEBUG_PRINT
DEBUG_PRINT("Debug: did not identify K9F1208 flash media.\n");
#endif
return flUnknownMedia;
}
/* Register our flash handlers
vol.write = nand_write_page;*/ /*modify by wanbo 2013.04.19
vol.erase = nand_erase_block;
vol.read = nandMTDRead;*/
//vol.map = nandMTDMap;
vol.write = nandMTDWrite;
vol.erase = nandMTDErase;
/*vol.read = nandMTDRead;*/
vol.map = nandMTDMap;
vol.flags |= SUSPEND_FOR_WRITE|NFTL_ENABLED;/*支持nand flash传输层*/
#ifdef DEBUG_PRINT
DEBUG_PRINT("Debug: Identified K9F1208.\n");
#endif
return flOK;
}
其中的
/* Register our flash handlers
vol.write = nand_write_page;*/ /*modify by wanbo 2013.04.19
vol.erase = nand_erase_block;
vol.read = nandMTDRead;*/
//vol.map = nandMTDMap;
vol.write = nandMTDWrite;
vol.erase = nandMTDErase;
/*vol.read = nandMTDRead;*/
vol.map = nandMTDMap;
不知是否有问题
而nand_write_page nand_erase_block等函数的定义是在k9f1208.c中实现的,
之前已经裸机测试过了读、写、擦出都是没问题的!
最后,还是烦请各位大虾多多指点为谢!!!