YAFFS2移植到AliOS Things指南

maoerya · · 1075 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

摘要: YAFFS2介绍 YAFFS(Yet Another Flash File System)是第一个专门为NAND Flash存储器设计的嵌入式文件系统,适用于大容量的存储设备。YAFFS 是基于日志的文件系统,提供磨损平衡和掉电恢复的健壮性。 **点此查看原文:http://click.aliyun.com/m/41950/** **YAFFS2介绍** YAFFS(Yet Another Flash File System)是第一个专门为NAND Flash存储器设计的嵌入式文件系统,适用于大容量的存储设备。YAFFS 是基于日志的文件系统,提供磨损平衡和掉电恢复的健壮性。它还为大容量的Flash 芯片做了很好的调整,针对启动时间和RAM 的使用做了优化。它适用于大容量的存储设备,Yaffs代码已成功用于许多不同的32位和64位CPU,包括MIPS,68000,ARM,ColdFire,PowerPC和x86,甚至被用于各种DSP架构芯片。 目前有YAFFS和YAFFS2两个版本,YAFFS1和YAFFS2主要差异在于PAGE读写size的大小,YAFFS2可支持到2K Bytes page, 远高于YAFFS的512 Bytes, 因此对大容量NAND Flash更具优势。YAFFS2是目前NAND Flash的首选文件系统。 **YAFFS2具有如下特点:** 使用C代码编写,支持大端和小端处理器,易于移植。 提供nand flash坏块处理机制和ECC校验算法,可发现并纠正一定量的位翻转。 采用日志式文件系统设计,异常掉电不会造成文件系统破坏,掉电后恢复速度快。 拥有高度优化和可预测的垃圾收集策略,具有优异的性能和高度的确定性。 比大多数日志式文件系统具有更低的内存占用。 支持POSIX接口,易于使用。 **YAFFS2移植** **1. YAFFS2源码获取** 官方网站:https://yaffs.net/get-yaffs 代码分为如下几部分: A、核心文件系统代码,位于yaffs2目录下 ![图片描述](http://img.blog.csdn.net/20180208103405230?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![图片描述](http://img.blog.csdn.net/20180208103440250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) B、直接接口文件,位于yaffs2/direct目录下 ![图片描述](http://img.blog.csdn.net/20180208103533552?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) C、flash驱动程序示例,以及用于测试的模拟器和配置,位于yaffs2/direct/ test-framework目录下 D、相关测试用例,位于其他目录下 详见官方文档:https://yaffs.net/documents/yaffs-direct-interface **2. 添加文件** 将如下文件拷贝到AliOS-Things/kernel/modules/fs/yaffs2目录下,并编写相应makefile或者添加到相应的工程。 ![图片描述](http://img.blog.csdn.net/20180208103614163?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) a) 这些文件在位于源码的yaffs2和yaffs2/direct目录下。 b) yportenv.h、yaffs_attribs.c文件有多个,前者使用direct目录下版本,后者使用yaffs2目录下版本。 c) yaffs_alios.c、yaffs_install_drv.c、yaffs_install_drv.h这三个文件用于适配AliOS-Things和驱动,见kernel/modules/fs/yaffs2目录。 **3. 代码适配** **3.1 增加相应数据和函数定义** a) yportenv.h 增加如下代码: ``` #define CONFIG_YAFFS_DIRECT #define CONFIG_YAFFS_PROVIDE_DEFS #define CONFIG_YAFFSFS_PROVIDE_VALUES #define CONFIG_YAFFS_DEFINES_TYPES #define inline RHINO_INLINE typedef long off_t; typedef unsigned long loff_t; typedef long dev_t; typedef int mode_t; ``` b) yaffsfs.c 增加如下代码: ``` unsigned int yaffs_trace_mask = 0; unsigned int strnlen(const char *s, unsigned int max) { register const char *p; for(p = s; *p && max--; ++p); return(p - s); } ``` c) yaffs_list.h 增加如下代码: ``` #define inline RHINO_INLINE ``` **3.2 对接操作系统** 与AliOS-Things适配的操作系统接口已经实现好,直接包含yaffs_alios.c即可。 该文件中实现了yaffsfs_Lock、yaffsfs_Unlock、yaffsfs_CurrentTime、yaffsfs_malloc、yaffsfs_free等函数的对接,另外还创建了一个用于yaffs的后台任务。 yaffsfs_CheckMemRegion函数用于检查内存地址是否有效,需用户自己根据具体硬件补充实现。 操作系统接口函数列表如下: ``` void yaffsfs_Lock(void); void yaffsfs_Unlock(void); u32 yaffsfs_CurrentTime(void); int yaffsfs_GetLastError(void); void yaffsfs_SetError(int err); void *yaffsfs_malloc(size_t size); void yaffsfs_free(void *ptr); void yaffsfs_OSInitialisation(void); void yaffs_bug_fn(const char *file_name, int line_no); int yaffsfs_CheckMemRegion(const void *addr, size_t size, int write_request); ``` **3.3 对接nand flash驱动** yaffs_install_drv.c用于yaffs对接nand flash驱动,用户需根据硬件配置param中的参数,并实现如下驱动函数: ``` static int nand_WriteChunk(struct yaffs_dev *dev, int nand_chunk, const u8 *data, int data_len, const u8 *oob, int oob_len); static int nand_ReadChunk(struct yaffs_dev *dev, int nand_chunk, u8 *data, int data_len, u8 *oob, int oob_len, enum yaffs_ecc_result *ecc_result); static int nand_EraseBlock(struct yaffs_dev *dev, int block_no); static int nand_MarkBad(struct yaffs_dev *dev, int block_no); static int nand_CheckBad(struct yaffs_dev *dev, int block_no); static int nand_Initialise(struct yaffs_dev *dev); ``` 完成以上步骤即完成YAFFS2的移植。 扫码获取更多资讯: ![10070702-5325dfe24c52cdbd.jpg](https://static.studygolang.com/180205/1fa4743e2943691fff745b3285f14cbe.jpg)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1075 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传