加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于把yaffs2文件系统移植到lpc3250的nandflash上:

发布时间:2020-12-15 17:49:50 所属栏目:百科 来源:网络整理
导读:介绍下当下状况, ucosii 操作系统已移植到 lpc3250 上了,现在需要把 yaffs 文件系统和 nandflash 驱动移植到 lpc3250 上去。 Yaffs 文件系统对操作系统提供的接口很简单就是几个互斥的函数,实现了这几个函数,与操作系统相关的就不用管了。 其实现在 Yaff

介绍下当下状况,ucosii操作系统已移植到lpc3250上了,现在需要把yaffs文件系统和nandflash驱动移植到lpc3250上去。

Yaffs文件系统对操作系统提供的接口很简单就是几个互斥的函数,实现了这几个函数,与操作系统相关的就不用管了。

其实现在Yaffscfg2k.c中:

定义两个全局变量

static?OS_EVENT?*?g_hFSEvent?=?NULL;

static?int?gs_nyaffsLockcnt?=?0;?//这里可以不用这个东西

//初始化互斥量事件

int?yaffs_InitEvent(void)

{

unsigned?char?err;

#ifndef?WIN32

if?(g_hFSEvent?==?NULL)?

{

g_hFSEvent?=?OSMutexCreate(15,?&err);

if?(g_hFSEvent?==?0)

{

UART_Printf(2,?"OSMboxCreate?errorrn");

}

if?(err?!=?OS_NO_ERR)

{

}

}

#endif

return?0;

}

?

//上锁

void?yaffsfs_Lock(void)?

{

unsigned?char?err;

//OSMboxPend(g_hFSEvent,(0),NULL);

OSMutexPend(g_hFSEvent,&err);

if?(err?!=?OS_NO_ERR)

{

}

gs_nyaffsLockcnt++;

}

//解锁

void?yaffsfs_Unlock(void)

{

#ifndef?WIN32

//OSMboxPost(g_hFSEvent,?(void*)1);

OSMutexPost(g_hFSEvent);

?

#endif

gs_nyaffsLockcnt--;

}

这样操作系统这边的事就摆平了。

Yaffs文件系统提供给nandflash的接口主要是填写nandflash相关信息,yaffs文件管理的区域结构体ST_FLASH_TYPE,之后只需要实现yaffs_startup函数就完了。Yaffs文件系统的操作函数不直接操作与flash驱动函数接头,而是通过函数指针实现的,yaffs_Device结构体中定义了操作函数相关的函数指针,这些函数指针时在yaffs_startup函数中填充的。

Yaffscfg2k.c中如下实现:

//NandFlash的参数信息

#define?NF_PAGE_DATA_BYTES (2048) //每个页的数据区大小

#define?NF_PAGE_SPARE_BYTES (64) //每个页的备用区大小

#define?NF_PAGES_PER_BLOCK (64) //每个块包含的页个数

#define?NF_BLOCKS (512) //包含的Block个数

?

#define?NF_BOOT_BLOCKS (256) //bootBLOCK个数,约32M

#define?NF_DATA_BLOCKS (NF_BLOCKS?-?NF_BOOT_BLOCKS) //data区的BLOCK个数,约223M

?

static?yaffs_Device?gst_dev_boot; //boot

static?yaffs_Device?gst_dev_data; //data

static?yaffs_Device?gst_dev_app; //app

?

static?yaffsfs_DeviceConfiguration?yaffsfs_config[]?=?

{

{?"/boot",?&gst_dev_boot},

{?"/data",?&gst_dev_data},

{(void?*)0,(void?*)0}?/*?Null?entry?to?terminate?list?*/

};

?

下面是关于yaffs_startup函数的实现:

int?yaffs_startup(ST_FLASH_TYPE?*pstFlashType)

{

HAL_NandInit(NULL);

?

//?Stuff?to?configure?YAFFS

//?Stuff?to?initialise?anything?special?(eg?lock?semaphore).

yaffsfs_LocalInitialisation();?//加入互斥量

?

memset(&gst_dev_boot,?0,?sizeof(gst_dev_boot));

memset(&gst_dev_data,?sizeof(gst_dev_data));

?

//Boot

gst_dev_boot.totalBytesPerChunk?=?pstFlashType->nNF_PAGE_DATA_BYTES;

gst_dev_boot.nDataBytesPerChunk?=?pstFlashType->nNF_PAGE_DATA_BYTES;

gst_dev_boot.spareBytesPerChunk?=?pstFlashType->nNF_PAGE_SPARE_BYTES;

gst_dev_boot.nChunksPerBlock?=?pstFlashType->nNF_PAGES_PER_BLOCK;

gst_dev_boot.nReservedBlocks?=?5;

//gst_dev_boot.inbandTags?=?1;

//gst_dev_boot.checkpointStartBlock?=?1;

//gst_dev_boot.checkpointEndBlock?=?20;

gst_dev_boot.startBlock?=?pstFlashType->nStartBlock;

gst_dev_boot.endBlock?=?pstFlashType->nNF_BOOT_BLOCKS?-?1;? //?Make?it?smaller

gst_dev_boot.isYaffs2?=?1;

gst_dev_boot.wideTnodesDisabled?=?0;

gst_dev_boot.nShortOpCaches?=?0;? //?Use?caches

gst_dev_boot.genericDevice?=?(void?*)0; //?Used?to?identify?the?device?in?fstat.

gst_dev_boot.writeChunkWithTagsToNAND=?yflash2_WriteChunkWithTagsToNAND;

gst_dev_boot.readChunkWithTagsFromNAND=

yflash2_ReadChunkWithTagsFromNAND;

gst_dev_boot.eraseBlockInNAND?=?yflash2_EraseBlockInNAND;

gst_dev_boot.initialiseNAND?=?yflash2_InitialiseNAND;

gst_dev_boot.markNANDBlockBad?=?yflash2_MarkNANDBlockBad;

gst_dev_boot.queryNANDBlock?=?yflash2_QueryNANDBlock;

?

//Data

gst_dev_data.totalBytesPerChunk?=?pstFlashType->nNF_PAGE_DATA_BYTES;

gst_dev_data.nDataBytesPerChunk?=?pstFlashType->nNF_PAGE_DATA_BYTES;

gst_dev_data.spareBytesPerChunk?=?pstFlashType->nNF_PAGE_SPARE_BYTES;

gst_dev_data.nChunksPerBlock?=?pstFlashType->nNF_PAGES_PER_BLOCK;

gst_dev_data.nReservedBlocks?=?5;

//gst_dev_data.inbandTags?=?1;

//gst_dev_data.checkpointStartBlock?=?1;

//gst_dev_data.checkpointEndBlock?=?20;

gst_dev_data.startBlock?=?pstFlashType->nNF_BOOT_BLOCKS;

gst_dev_data.endBlock?=?pstFlashType->nNF_BLOCKS?-?2;? //?Make?it?smaller

gst_dev_data.isYaffs2?=?1;

gst_dev_data.wideTnodesDisabled?=?0;

gst_dev_data.nShortOpCaches?=?YAFFS_MAX_SHORT_OP_CACHES;? //?Use?caches

gst_dev_data.genericDevice?=?(void?*)1; //?Used?to?identify?the?device?in?fstat.

gst_dev_data.writeChunkWithTagsToNAND?=?yflash2_WriteChunkWithTagsToNAND;//从这以下是yaffs?与硬件相关的函数

gst_dev_data.readChunkWithTagsFromNAND?=?yflash2_ReadChunkWithTagsFromNAND;

gst_dev_data.eraseBlockInNAND?=?yflash2_EraseBlockInNAND;

gst_dev_data.initialiseNAND?=?yflash2_InitialiseNAND;

gst_dev_data.markNANDBlockBad?=?yflash2_MarkNANDBlockBad;

gst_dev_data.queryNANDBlock?=?yflash2_QueryNANDBlock;

yaffs_initialise(yaffsfs_config);//将填充的结构提注册到YAFFS?

return?0;

}

Yaffs文件系统为flash提供的接口都在上面的函数指针函数中实现了,下面来看一个:

yaffs_fileem2k.c中有个yflash2_WriteChunkWithTagsToNAND函数,是关于flash块的擦写的其中就调用了HAL_NandPageWrite?这个函数,这个函数的nandflash提供的一个接口函数。

关于nandflash的分区管理,我们公司的分区时,把bootload放在第0块,1--9块存放eboot,之后又分了两个区,分别存放osapp。我谈论这个问题主要是在ucosii开启任务的时候,要填充ST_FLASH_TYPE?stFlashType?结构体,填充结构后要调用yaffs_startup(&stFlashType);函数启动yaffs文件系统。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读