yaffs学习1

yaffs主要用于 NANDFLASH,在学习yaffs是自然离不开对nandflash的学习。

nandflash相关的概念有:block 块、chunk/page 页。对nandflash的操作读写时是以chunk/page为单位,擦除时以block为单位。

nandfalsh在生产过程中会造成损坏,也就是每个nandflash都存在坏块,这是不可避免的,但是没个nandflash在生产出来之后,它所有的坏块都会被检测出来,并且加以标记,标记信息就保存在nandflash里,这里就要说一下nandflash的分区。前面说过nandflash分为block和chunk/page,而每个chunk根据保存的信息不同又分为 spare/oob区和 data区,nandflash的坏块信息就保存在spare/oob区,当然,spare/oob区还保存了其他信息。对于大容量的nandflash来说,每个chunk/page的大小为2048+64字节,其中2k,也就是2048字节的区域为data区,64字节的区域划为spare/oob区;而对于小容量的nandflash来说,每个chunk/page的大小为512+16字节,data区的大小为512字节,spare/oob区的大小为16字节。

大小容量的nandflash关于坏块标记的保存位置也不一样,以三星生产的nandflash为标准,大容量nandflash的坏块信息存放在spare/oob区,一个块的第一页或者第二页的第2048个字节(也就是spare/oob区的第一个字节)不是0xff就表示该块为坏块;而对于小容量nandflash,它的坏块信息则保存在spare/oob区的第六个字节的位置,坏块信息保存的位置为各大生产厂商默认统一的,记住就行。

yaffs文件系统可以看成是某个或者某几个大牛写的、用于对flash进行管理的一对函数代码,我们就下载下来使用就行了,但是拿过这么多源文件和头文件过来,我们往往是一头雾水,我不知道代码都怎么写的我就是想调用一下还不行吗?不行,因为你连怎么调用都不会,才发现原来坐享别人的成果也不是那么容易。

看了这么多天yaffs,能找到的有用资料并不多,进度一直很慢,在此稍微做一下记录,后面继续学习。yaffs把所有的文件、连接、路径等都当成一个object(对象)来进行处理,yaffs的代码里定义了很多很多的结构体,用来保存每个object的相关信息,yaffs将很多函数都封装好了,至于怎么调用yaffs的函数,[这篇博客]写的挺好的。yaffs虽然 将绝大多数的函数都写好了,但是因为每个人应用yaffs的环境或者平台不同,所有在使用yaffs必然有些函数是需要用户自己定义的,对于nandflash,需要用户自己定义的函数主要有:坏块检测函数(可以对nandflash的块进行检测,若为坏块可以标记)、块的擦除函数(nandflash的擦除是以block块为单位的)、nandflash的读写函数(nandflash的读写是以chunk/page为单位的),这几个函数在调用int yaffs_StartUp(void);函数时要用到,yaffs_StartUp()是yaffs的启动函数,就是配置一些初始值,在应用yaffs时这些信息的配置必不可少,yaffs定义了struct yaffs_DeviceStruct结构体来保存这些信息,也包括上面那几个函数的函数指针。

在应用yaffs时,首先需要运行的就是yaffs_StartUp()函数,它被定义在direct/yaffscfg.h中,在这个函数里,你需要填充yaffs_DeviceStruct结构体,将结构体中的一些主要参数进行配置,在建立了你需要的yaffs_DeviceStruct结构体之后,接着调用yaffs_initialise(yaffs_guts.h)函数将你定义的信息与设备联系起来,在yaffs_initialise函数中,通过一个以null指针结尾的 yaffs_DeviceConfiguration结构体表示设备,这个结构体包括一个指向yaffs_Device结构的指针和一个“挂载点”字符串(prefix)。至此设备的初始化工作完成。

这里再对yaffs_DeviceStruct结构体的建立进行一下详细的介绍,yaffs_DeviceStruct结构体里面包含了许许多多的参数,我们在初始化时不需要将每一个参数都进行配置,只需要赋值几个主要参数即可,其他参数在后期用到时再配置。其中主要的参数包括下面几个:int nDataBytesPerChunk(每个chunk的字节数,注意不包括spar/oob数据,只表示data数据的字节数)、int nChunksPerBlock(每个block包含的chunk数,最小为2)、int spareBytesPerChunk(这个才是表示每个chunk的spare/oob区的字节数)、int startBlock/int endBlock(设备开始块和结束块的序号,设备就好比咱们电脑上的C、D、E盘,它不是占用了整个nandflash,可以只占用一部分,也就是说一个nandflash可以有多个设备。另外注意startBlock不能为0,nandflash的第一个块 必须空闲,若startBlock设为0那么startBlock和endBlock均会自动加1)、int nReservedBlocks(最小为2最好为5,这是yaffs必须保留用于垃圾回收和块错误恢复的)、int nShortOpCaches(0值表示不使用cache。对于大多数系统,推荐使用10到20之间的一个数值。不能大于YAFFS_MAX_SHORT_OP_CACHES定义的数值)、int useNANDECC(这是个标志位,表示计算ECC的方式,为0表示软件ECC计算,由yaffs执行,为1表示硬件ECC计算,有nandflash的驱动程序执行,这就需要用户自己添加相关代码,这几个 函数就要涉及到nandflash的底层驱动了)、其他参见 上面引用的博客内容、最后是几个函数指针 write/readChunkWithTagsFromNAND, markNANDBlockBad、queryNANDBlock(需要我们自己定义然后将函数名赋给这几个指针,这几个函数也就是前面提到的擦除、读写nandflash的那几个)。

在初始化参数都设置完成后,需要给设备定义一个盘符,也就是将设备挂载到yaffs,用函数yaffs_mount()完成,至此int yaffs_StartUp(void)就完成了,可以通过yaffs的接口函数对nandflash进行访问。

yaffs早已经将通过文件系统操作nandflash的函数写好了,保存在yaffsfs.c中,我们可以直接调用 ,也可以自己对这些函数进行简单的封装。下面看一个简单例子:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值