YAFFS2移植到AliOS Things指南

摘要: YAFFS2介紹 YAFFS(Yet Another Flash File System)是第一個專門爲NAND Flash存儲器設計的嵌入式文件系統,適用於大容量的存儲設備。YAFFS 是基於日誌的文件系統,提供磨損平衡和掉電恢復的健壯性。ios

點此查看原文: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網站

代碼分爲以下幾部分:spa

A、核心文件系統代碼,位於yaffs2目錄下
圖片描述
圖片描述操作系統

B、直接接口文件,位於yaffs2/direct目錄下
圖片描述

C、flash驅動程序示例,以及用於測試的模擬器和配置,位於yaffs2/direct/ test-framework目錄下

D、相關測試用例,位於其餘目錄下

詳見官方文檔:https://yaffs.net/documents/y...

2. 添加文件
將以下文件拷貝到AliOS-Things/kernel/modules/fs/yaffs2目錄下,並編寫相應makefile或者添加到相應的工程。
圖片描述

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的移植。

掃碼獲取更多資訊:
圖片描述

相關文章
相關標籤/搜索