YAFFS2移植到AliOS Things指南
摘要: YAFFS2介紹 YAFFS(Yet Another Flash File System)是第一個(gè)專門為NAND Flash存儲器設(shè)計(jì)的嵌入式文件系統(tǒng),適用于大容量的存儲設(shè)備。YAFFS 是基于日志的文件系統(tǒng),提供磨損平衡和掉電恢復(fù)的健壯性。
點(diǎn)此查看原文:http://click.aliyun.com/m/41950/
YAFFS2介紹
YAFFS(Yet Another Flash File System)是第一個(gè)專門為NAND Flash存儲器設(shè)計(jì)的嵌入式文件系統(tǒng),適用于大容量的存儲設(shè)備。YAFFS 是基于日志的文件系統(tǒng),提供磨損平衡和掉電恢復(fù)的健壯性。它還為大容量的Flash 芯片做了很好的調(diào)整,針對啟動時(shí)間和RAM 的使用做了優(yōu)化。它適用于大容量的存儲設(shè)備,Yaffs代碼已成功用于許多不同的32位和64位CPU,包括MIPS,68000,ARM,ColdFire,PowerPC和x86,甚至被用于各種DSP架構(gòu)芯片。
目前有YAFFS和YAFFS2兩個(gè)版本,YAFFS1和YAFFS2主要差異在于PAGE讀寫size的大小,YAFFS2可支持到2K Bytes page, 遠(yuǎn)高于YAFFS的512 Bytes, 因此對大容量NAND Flash更具優(yōu)勢。YAFFS2是目前NAND Flash的首選文件系統(tǒng)。
YAFFS2具有如下特點(diǎn):
YAFFS2移植
1. YAFFS2源碼獲取
官方網(wǎng)站:https://yaffs.net/get-yaffs
代碼分為如下幾部分:
A、核心文件系統(tǒng)代碼,位于yaffs2目錄下
| yaffs_allocator.c | 分配Yaffs對象和tnode結(jié)構(gòu) |
| yaffs_bitmap.c | block和chunk相關(guān)處理 |
| yaffs_ecc.c | ecc校驗(yàn)相關(guān)代碼 |
| yaffs_guts.c | yaffs主要算法 |
| affs_nameval.c | 用于處理擴(kuò)展屬性(xattr)的名稱/值代碼。 |
| yaffs_nand.c | nand flash抽象接口文件 |
| yaffs_packedtags1.c | yaffs1的tag相關(guān)定義代碼 |
| yaffs_packedtags2.c | yaffs2的tag相關(guān)定義代碼 |
| yaffs_summary.c | 處理塊信息相關(guān)代碼 |
| yaffs_tagscompat.c | 兼容yaffs1模式的tag相關(guān)代碼 |
| yaffs_tagsmarshall.c | 標(biāo)記編組代碼 |
| yaffs_verify.c | 校驗(yàn)相關(guān)代碼 |
| yaffs_yaffs1.c | yaffs1模式相關(guān)代碼 |
| yaffs_yaffs2.c | yaffs2模式相關(guān)代碼 |
B、直接接口文件,位于yaffs2/direct目錄下
| yaffs_attribs.c | 屬性處理代碼 |
| yaffs_error.c | 錯(cuò)誤報(bào)告代碼 |
| yaffsfs.c | Yaffs直接接口封裝代碼 |
| yaffs_hweight.c | 字節(jié)使用頻率統(tǒng)計(jì)代碼 |
| yaffs_qsort.c | yaffs2掃描使用到的qsort代碼 |
C、flash驅(qū)動程序示例,以及用于測試的模擬器和配置,位于yaffs2/direct/ test-framework目錄下
D、相關(guān)測試用例,位于其他目錄下
詳見官方文檔:https://yaffs.net/documents/yaffs-direct-interface
2. 添加文件
將如下文件拷貝到AliOS-Things/kernel/modules/fs/yaffs2目錄下,并編寫相應(yīng)makefile或者添加到相應(yīng)的工程。
a) 這些文件在位于源碼的yaffs2和yaffs2/direct目錄下。
b) yportenv.h、yaffs_attribs.c文件有多個(gè),前者使用direct目錄下版本,后者使用yaffs2目錄下版本。
c) yaffs_alios.c、yaffs_install_drv.c、yaffs_install_drv.h這三個(gè)文件用于適配AliOS-Things和驅(qū)動,見kernel/modules/fs/yaffs2目錄。
3. 代碼適配
3.1 增加相應(yīng)數(shù)據(jù)和函數(shù)定義
a) yportenv.h
增加如下代碼:
b) yaffsfs.c
增加如下代碼:
c) yaffs_list.h
增加如下代碼:
3.2 對接操作系統(tǒng)
與AliOS-Things適配的操作系統(tǒng)接口已經(jīng)實(shí)現(xiàn)好,直接包含yaffs_alios.c即可。
該文件中實(shí)現(xiàn)了yaffsfs_Lock、yaffsfs_Unlock、yaffsfs_CurrentTime、yaffsfs_malloc、yaffsfs_free等函數(shù)的對接,另外還創(chuàng)建了一個(gè)用于yaffs的后臺任務(wù)。
yaffsfs_CheckMemRegion函數(shù)用于檢查內(nèi)存地址是否有效,需用戶自己根據(jù)具體硬件補(bǔ)充實(shí)現(xiàn)。
操作系統(tǒng)接口函數(shù)列表如下:
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驅(qū)動
yaffs_install_drv.c用于yaffs對接nand flash驅(qū)動,用戶需根據(jù)硬件配置param中的參數(shù),并實(shí)現(xiàn)如下驅(qū)動函數(shù):
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的移植。
掃碼獲取更多資訊:
總結(jié)
以上是生活随笔為你收集整理的YAFFS2移植到AliOS Things指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三招提升数据不平衡模型的性能(附pyth
- 下一篇: 阿里云直播转点播最佳实践