热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

介绍下当下状况,ucosii操作系统已移植到lpc3250上了,现在需要把yaffs文件系统和nandflash驱动移植到lpc3250上去。Yaffs文件系统对操作系统提供的接口很简单就是几个互斥的

介绍下当下状况,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 error\r\n");

}

if (err != OS_NO_ERR)

{

}

}

#endif

return 0;

}

 

//上锁

void yaffsfs_Lock(void) 

{

unsigned char err;

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

OSMutexPend(g_hFSEvent,(0),&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, 0, 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文件系统。


推荐阅读
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • 全面解析Java虚拟机:内存模型深度剖析 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • Qt 34:深入探讨缓冲区管理、目录操作及文件系统监控技术——QBuffer、QDir与QFileSystemWatcher的应用分析
    本文深入探讨了Qt框架中QBuffer、QDir和QFileSystemWatcher三个核心类的应用。QBuffer作为缓冲区管理工具,提供了高效的数据读写功能;QDir则专注于目录操作,支持路径遍历和文件检索等任务;而QFileSystemWatcher则用于实时监控文件系统的变化,便于应用程序及时响应文件或目录的增删改操作。通过实例分析,详细解析了这三个类在实际开发中的应用场景和实现细节。 ... [详细]
  • APKAnalyzer(1):命令行操作体验与功能解析
    在对apkChecker进行深入研究后,自然而然地关注到了Android Studio中的APK分析功能。将APK文件导入IDE中,系统会自动解析并展示其中各类文件的详细信息。官方文档提供了详细的命令行工具使用指南,帮助开发者快速上手。本文以一个RecyclerView的Adapter代理开源库为例,探讨了如何利用这些工具进行高效的APK分析。 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
author-avatar
sds家的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有