没有合适的资源?快使用搜索试试~ 我知道了~
YAFFS(Yet Another Flash File System)是由Aleph One公司所发展出来的NAND flash 嵌入式文件系统。 此文来源于对CSDN博客整理,对NAND FLASH的移植指导
资源推荐
资源详情
资源评论
YAFFS2移植指南 - CSDN博客
(暂略部分)
对NAND Flash编程时,只能将1编程为0,因此要将0x00变为0xFF,需要先将NAND擦除,这同时会将该Block其余部分也擦除。然而,
后续的程序在没有0变为1的情况下,就不需要擦除,这在一些后续数据有规律的情况下可能很有用。
刚出厂的NAND Flash就包含坏块,坏块是不可靠的,其中存储的数据可能会轻易崩溃。因此需要记录这些坏块,OOB数据区用于标记坏
块。
NAND通常产生比特位错误,因此,OOB数据区也用于存储错误校验码(Error Correction Code, ECC),这样就可以甄别一些错误。
这里,最好先搞明白YAFFS期望的NAND FLASH的行为,这样你就知道要将YAFFS运行起来,需要在NAND的驱动程序中提供哪些东西。
Yaffs使用了一个相当抽象的NAND FLASH模型。它以高度灵活的方式使用YAFFS。YAFFS是为NAND FLASH设计的,它作了以下的假设
或定义。
NAND Flash是基于块(block)的,每一个Block大小相同,由整数个chunk组成。每一个Block可单独擦除。1.
一页(page,或chunk)为Flash的分配单元。2.
所有的访问(读或者写)都是基于页(或chunk)的。(或者译为:页对齐的)3.
当对NAND Flash编程时,只有二进制中的0被编程,而1则“不关心”。比如,一个字节包含的二进制数为1010,那么当编程1001,会
导致这两个数的位与操作。结果为1000.这和NOR FLASH不同。
4.
YAFFS 分别用块号和 chunk id 标示块和 chunk 。它将空块(填满0xFF)当作空闲块或者已擦除块。这样,格式化一个YAFFS分区等价于
擦除所有未损坏的块。
因此YAFFS最少需要一些函数能够擦除块,读一个页,写一个页。如果能够仅读取OOB数据,而仅仅为了读取/更新OOB数据就读写整个
页的方式,耗费大量总线串行读写周期。this is an overhead that can be avoided using the random access read and write features of some
nand chips
编写Balloon开发板(V3.01)上的三星628 K9F2G08U0M PCB0的驱动程序
坏块检测
三星芯片每一个坏块的第一个或第二个页的第一个字节不是0xFF 这些坏块的标记并被记录下来,并且当又发现一个坏块时,按同样的方
式添加坏块记录。Yaffs希望你能提供一个函数,在它认为必要的情况下,可以标记一个块为坏块。
YAFFS自己记录坏块,因此驱动程序不要担心mask out 坏块。
擦除一个块
读一个块
写一个块
如何使用YAFFS
从CVS中提取代码 第一步就是从获取YAFFS的代码。 译者注:这里的说明已经过时了,因此不再翻译。
对源码稍作修改
对最新的代码,你需要做一些小的改动,才能在编译时没有错误和警告。在本文档中有一个补丁文件(译者注:这是针对2009年的版本来
说的)
你需要提供一个loff_t的定义(在yaffs2/direct/ydirectenv.h)中。这个类型是存储文件字节大小的。因此为了支持你希望支持的最大的文
件大小,你得提供一个足够大的数据类型,unsigned long是一个不错的选择。 编辑 yaffsfs.c,将#if修改为#ifdef。然后你会得到一些相关的
警告和错误,你需要修正一些printf格式化字符串使之正确(将几个 '%d' 改变为 '%ld')
change yaffs/ydirectenv.h
+ typedef unsigned long loff_t;
change yaffs2/direct/yaffsfs.c ~line 1117
- #if CONFIG_YAFFS_WINCE
+ #ifdef CONFIG_YAFFS_WINCE
直接接口(Direct Interface)的相关文件
仅需要提取少量文件。使用yaffs的直接接口,你不需要所有的文件。你实际需要的文件列在下面,其余文件不需要编译。
direct/yaffsfs.c
yaffs_guts.c
direct/yaffscfg.c
yaffs_nand.c
yaffs_tagsvalidity.c
yaffs_checkptrw.c
yaffs_qsort.c
yaffs_tagscompat.c
yaffs_ecc.c
yaffs_packedtags2.c
一些相关的预编译标志
yaffs有很多不同的配置选项,这里给出一些你可能会用于Yaffs直接接口的选项。
CONFIG_YAFFS_DIRECT - 使用YAFFS直接接口1.
CONFIG_YAFFS_YAFFS2 - 使用YAFFS22.
CONFIG_YAFFS_PROVIDE_DEFS - 提供一些文件类型的定义以及 #includes linux/types.h, linux/fs.h, linux/stat.h (参见
yaffs2/devextras.h).
3.
CONFIG_YAFFSFS_PROVIDE_VALUES - 可能使用此选项,这样你可以自定义错误值,以及一些常数,比如O_RDONLY和系统数
值匹配, 如果没有定义这个选项,那么yaffs会包含errno.h,sys/stat.h and fcntl.h (参见yaffs2/direct/yaffsfs.h).
4.
在编译YAFFS的时候,指明这些选项,比如-DCONFIG_YAFFS_DIRECT
配置
你需要向YAFFS提供配置信息,包括,你所使用的YAFFS芯片的详细信息,以及它读/写/擦除flash时需要调用的函数。这些函数构成了
yaffs和底层硬件驱动程序的桥梁。这些自定义配置在yaffscfg.h中完成。在yaffscfg.h中,你需要提供一些类似操作系统的函数,以及一个
初始化yaffs的函数。比如,需要提供malloc和free函数。这里列出了需要实现的函数。
操作系统函数
void yaffsfs_SetError(int err);
报告系统错误,例如,若存在errno,则使用它。
void *yaffs_malloc(size_t size); void yaffs_free(void *ptr);
作为的标准的malloc和free,如果您的系统之已经包含了这两个函数,那么仅仅调用就成了。
void yaffsfs_LocalInitialisation(void);
void yaffsfs_Lock(void);
void yaffsfs_Unlock(void);
使用yaffsfs_LocalInitalisation初始化实时操作系统状态,如果该系统是多线程的,那么应该初始化信号量/互斥锁,用于加锁或解锁。在
LocalInitialisation 中应该使用信号量来加锁或解锁,在多线程访问的时候锁住YAFFS。
u32 yaffsfs_CurrentTime(void);
这个函数可以用于系统中任何时间的增加。如果不需要,将该函数直接返回0即可。
Yaffs 启动函数
int yaffs_StartUp(void);
返回值: YAFFS_OK 或者 YAFFS_FAIL
这个函数向yaffs提供很多底层nand设备的特性信息。在此函数中,你需要建立'yaffs_Device'(yaffs_guts.h),
'yaffsfs_DeviceConfiguration'(direct/yaffscfg.h),如何建立一个yaffs设备将在下一节描述。
一旦你建立了需要的yaffs_Device结构,你需要调用yaffs_initialise(yaffs_guts.h),通过一个以null指针结尾的 yaffs_DeviceConfiguration结
构。一个yaffs_DeviceConfiguration结构包含跟该设备相关的,一个指向yaffs_Device结构的指针和一个“挂载点”字符串(prefix)。
yaffs 设备
剩余16页未读,继续阅读
资源评论
xiaohua4758
- 粉丝: 13
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功