温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SylixOS下YAFFS挂载参数说明

发布时间:2020-05-02 13:20:37 来源:网络 阅读:1119 作者:jiangheng12138 栏目:编程语言
  1. 文件系统简介

    YAFFS是第一个专门为NAND Flash存储设计的嵌入式文件系统,适用于大容量的存储设备,并且是在GPL协议下发布的,可在其网站免费获得源代码。YAFFS也是目前SylixOS下针对Flash类存储设备的主要文件系统。

  2. YAFFS挂载参数说明

    在SylixOS中,想要在Flash类存储设备上挂载YAFFS文件系统,需要创建struct yaffs_dev结构体,并填充一系列的启动参数,并再将yaffs_dev结构体注册进YAFFS,其具体流程如程序清单2. 1所示。

    程序清单2. 1 YAFFS启动参数

     

    static struct yaffs_dev    __GyaffsDev;             /* 定义YAFFS设备结构体      */
    __GyaffsDev.param.name	                     = cBootDevName;                                                                                        __GyaffsDev.param.total_bytes_per_chunk	     = pmtdinfoMtd->writesize;
    __GyaffsDev.param.chunks_per_block           =
    pmtdinfoMtd->erasesize/pmtdinfoMtd->writesize;
    __GyaffsDev.param.n_reserved_blocks          = 10;
    __GyaffsDev.param.start_block         	     = NAND_N0_SATRT_BLOCK;
    __GyaffsDev.param.end_block 		     =		
    __GyaffsDev.param.start_block +NAND_N0_BLOCK_NUM;
    __GyaffsDev.param.spare_bytes_per_chunk	     = pmtdinfoMtd->oobsize;
    __GyaffsDev.param.is_yaffs2                  = 1;
    __GyaffsDev.param.use_nand_ecc               = 1;
    __GyaffsDev.param.no_tags_ecc                = 0;
    __GyaffsDev.param.n_caches                   = 10;
    __GyaffsDev.driver_context                   = (void *)pmtdinfoMtd;
    __GyaffsDev.os_context                       = (void *)&__GyaffsDev;
    __GyaffsDev.param.inband_tags                = 1;
    
    yaffs_mtd_drv_install(&__GyaffsDev);
    yaffs_add_device(&__GyaffsDev);                       /* 添加到YAFFS设备          */
    yaffs_mount(cBootDevName);                            /* 挂载YAFFS设备            */

    __GyaffsDev.param参数说明如下:

  • chunks_per_block:每块页数;
  • total_bytes_per_chunk:每页字节数;
  • name:设备名称;
  • n_reserved_block:保留块数;
  • start_block:YAFFS起始块号;
  • end_block:YAFFS结束块号;
  • spare_bytes_per_chunk:Flash的OOB区大小;
  • is_yaffs2:是否使用YAFFS2;
  • use_nand_ecc:是否使用ECC校验;
  • no_tags_ecc:YAFFS的tags数据是否使用ECC校验;
  • n_caches:YAFFS缓冲区块数;
  • inband_tags:tags数据的位子。

这里需要特别说明的是,挂载YAFFS文件系统后,Flash的每一页都会存在一个tags的结构体,用来记录YAFFS的相关信息,上面的参数inband_tags就表示tags存放的位置,tags的大小为16字节,其定义如程序清单2. 2所示。

程序清单2. 2 tags信息

 

struct yaffs_packed_tags2_tags_only {
	unsigned 	seq_number;
	unsigned 	obj_id;
	unsigned 	chunk_id;
	unsigned	 n_bytes;
};

  • seq_number:本页所属块序列号;
  • obj_id:对象ID;
  • chunk_id:该页在文件中的位置;
  • n_bytes:页内有效数据字节数。

inband_tags参数的值为0时,表示tags存放在Flash页的OOB区域内,值为1时,表示tags存放在Flash页的数据区域内,值得注意的是,对于页大小为512字节的Nand Flash,它的OOB区域大小只有16字节,并且这些字节需要用于记录坏块、ECC校验等信息,不足以保存YAFFS的tags信息,因此页大小为512字节的Nand Flash需要将inband_tags参数设置为1。

另外,对于页大小非512字节的Nand Flash,如果由于控制器需要记录额外信息等原因导致OOB区不足,理论上也可以将tags存放到数据区域内,但在SylixOS中使用时会出现错误,原因未知,可能是YAFFS版本过低导致的,因为低版本YAFFS确实存在这个问题。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI