YAFFS2移植到AliOS Things指南
摘要: YAFFS2介紹 YAFFS(Yet Another Flash File System)是第一個專門為NAND Flash存儲器設計的嵌入式文件系統(tǒng),適用于大容量的存儲設備。YAFFS 是基于日志的文件系統(tǒng),提供磨損平衡和掉電恢復的健壯性。
點此查看原文:http://click.aliyun.com/m/41950/
YAFFS2介紹
YAFFS(Yet Another Flash File System)是第一個專門為NAND Flash存儲器設計的嵌入式文件系統(tǒng),適用于大容量的存儲設備。YAFFS 是基于日志的文件系統(tǒng),提供磨損平衡和掉電恢復的健壯性。它還為大容量的Flash 芯片做了很好的調整,針對啟動時間和RAM 的使用做了優(yōu)化。它適用于大容量的存儲設備,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更具優(yōu)勢。YAFFS2是目前NAND Flash的首選文件系統(tǒng)。
YAFFS2具有如下特點:
YAFFS2移植
1. YAFFS2源碼獲取
官方網站:https://yaffs.net/get-yaffs
代碼分為如下幾部分:
A、核心文件系統(tǒng)代碼,位于yaffs2目錄下
| yaffs_allocator.c | 分配Yaffs對象和tnode結構 |
| yaffs_bitmap.c | block和chunk相關處理 |
| yaffs_ecc.c | ecc校驗相關代碼 |
| yaffs_guts.c | yaffs主要算法 |
| affs_nameval.c | 用于處理擴展屬性(xattr)的名稱/值代碼。 |
| yaffs_nand.c | nand flash抽象接口文件 |
| yaffs_packedtags1.c | yaffs1的tag相關定義代碼 |
| yaffs_packedtags2.c | yaffs2的tag相關定義代碼 |
| yaffs_summary.c | 處理塊信息相關代碼 |
| yaffs_tagscompat.c | 兼容yaffs1模式的tag相關代碼 |
| yaffs_tagsmarshall.c | 標記編組代碼 |
| yaffs_verify.c | 校驗相關代碼 |
| yaffs_yaffs1.c | yaffs1模式相關代碼 |
| yaffs_yaffs2.c | yaffs2模式相關代碼 |
B、直接接口文件,位于yaffs2/direct目錄下
| yaffs_attribs.c | 屬性處理代碼 |
| yaffs_error.c | 錯誤報告代碼 |
| yaffsfs.c | Yaffs直接接口封裝代碼 |
| yaffs_hweight.c | 字節(jié)使用頻率統(tǒng)計代碼 |
| yaffs_qsort.c | yaffs2掃描使用到的qsort代碼 |
C、flash驅動程序示例,以及用于測試的模擬器和配置,位于yaffs2/direct/ test-framework目錄下
D、相關測試用例,位于其他目錄下
詳見官方文檔:https://yaffs.net/documents/yaffs-direct-interface
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
增加如下代碼:
b) yaffsfs.c
增加如下代碼:
c) yaffs_list.h
增加如下代碼:
3.2 對接操作系統(tǒng)
與AliOS-Things適配的操作系統(tǒng)接口已經實現(xiàn)好,直接包含yaffs_alios.c即可。
該文件中實現(xiàn)了yaffsfs_Lock、yaffsfs_Unlock、yaffsfs_CurrentTime、yaffsfs_malloc、yaffsfs_free等函數的對接,另外還創(chuàng)建了一個用于yaffs的后臺任務。
yaffsfs_CheckMemRegion函數用于檢查內存地址是否有效,需用戶自己根據具體硬件補充實現(xiàn)。
操作系統(tǒng)接口函數列表如下:
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中的參數,并實現(xiàn)如下驅動函數:
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的移植。
掃碼獲取更多資訊:
總結
以上是生活随笔為你收集整理的YAFFS2移植到AliOS Things指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三招提升数据不平衡模型的性能(附pyth
- 下一篇: 理解卷积神经网络的利器:9篇重要的深度学