您好,登錄后才能下訂單哦!
YAFFS是第一個專門為NAND Flash存儲設計的嵌入式文件系統,適用于大容量的存儲設備,并且是在GPL協議下發布的,可在其網站免費獲得源代碼。YAFFS也是目前SylixOS下針對Flash類存儲設備的主要文件系統。
在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參數說明如下:
這里需要特別說明的是,掛載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; };
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確實存在這個問題。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。