JFFS2 & MTD 
1
分為NOR 和NAND 兩種 
寫入之前必須先做erase動作 
每個位元只能從1 轉變為0 
有10萬次的清除上限次數 
空間無法太大 
2 
Flash的特性
NOR 和NAND 的差異性 
3 
NOR Flash 
• 可以任意位置讀寫 
• 每一個block size較大(ex: 
128K) 
• 需要的定位空間為全部 
flash大小 
• 單位成較高 
• 可以做為開機使用 
NAND Flash 
• 必須整個sector讀寫 
(ex:512bytes) 
• 單位成本較低 
• 需要的定位空間固定且很 
少(ex:8K) 
• 需要特殊硬體支援才能做 
為開機使用
Flash做為檔案系統的間題 
寫入時斷電問題 
4 
Erase 
block 
Write 
data 
斷電 
• 檔案系統問題(FAT/EXT2/EXT3) 
• 都在同一地方寫入 
• Flash 10 萬次上限
一種log型式的檔案系統 
有斷電保護作用 
有延長Flash壽命的特性 
一種小型的檔案系統 
支援線上壓縮及解壓縮的功能 
另一種較大的檔案系統YAFFS 
5 
JFFS2特性
Application 
VFS (Virtual File System) 
JFFS2 File System 
MTD Device Driver 
6 
JFFS2的系統架構 
Flash (NOR or NAND) 
Kernel
MTD DEVICE DRIVER 
7
一種專為Flash所寫的Device Driver 
支援block & character mode 
支援多種Flash 
1) NOR 
2) NAND 
3) NFTL 
支援MTD to Block – 可讓CF & SD card也可使 
用JFFS2 file system 
8 
什麼是MTD Driver
File manager 
JFFS2 
mtdblock/mtdchar 
maps 
9 
MTD的系統架構 
Chip or device (NOR or NAND)
如何撰寫maps device driver 
10 
事先規劃好 
flash如何使用 
依據事先規劃 
好的flash撰寫 
描述結構 
Remap flash 
physical address 
to virtual address 
Call do_map_probe()來檢測 
何種flash及大小, 並取得 
mtd file handle 
Call add_mtd_paritions() 
來註冊事先規劃好的 
partition
static struct mtd_partition superh_se_partitions[] = { 
/* Reserved for boot code, read-only */ 
{ 
.name = "flash_boot", 
.offset = 0x00000000, 
.size = CONFIG_MTD_SUPERH_RESERVE, 
.mask_flags = MTD_WRITEABLE, 
}, 
/* All else is writable (e.g. JFFS) */ 
{ 
.name = "Flash FS", 
.offset = MTDPART_OFS_NXTBLK, 
.size = MTDPART_SIZ_FULL, 
} 
}; 
#define MTDPART_OFS_NXTBLK (-2) 
#define MTDPART_OFS_APPEND (-1) 
#define MTDPART_SIZ_FULL(0) 
11 
Partition描述結構
12 
example 
Boot loader 
kernel 
Root file system 
user 
static struct mtd_partition mcpu_flash_partitions[] = { 
{ 
.name = "BootLoader", 
.size = BOOT_LOADER_SIZE, 
.offset = 0, 
//.mask_flags = MTD_WRITEABLE, 
}, { 
.name = "Kernel", 
.size = KERNEL_SIZE, 
.offset = MTDPART_OFS_APPEND, 
//.mask_flags = MTD_WRITEABLE, 
}, { 
.name = "RootDisk", 
.size = ROOT_DISK_SIZE, 
.offset = MTDPART_OFS_APPEND, 
//.mask_flags = MTD_WRITEABLE, 
}, { 
.name = "UserDisk", 
.size = USER_DISK_SIZE, 
.offset = MTDPART_OFS_APPEND, 
//.mask_flags = MTD_WRITEABLE, 
} 
};
使用MTD在kernel中必選的項目 
config MTD_CONCAT 
config MTD_PARTITIONS 
config MTD_CHAR 
config MTD_BLOCK 
config MTD_CFI 
config MTD_MAP_BANK_WIDTH_2 
config MTD_CFI_INTELEXT 
13
當系統在寫入時做reboot動作易讓flash停留在非讀取狀態, 會 
造成無法進入boot loader 
解決方案, 註冊一個reboot的call back function 
14 
Reboot問題 
static int mtd_reboot(struct notifier_block *n, unsigned long code, void *p) 
{ 
if(code != SYS_RESTART) 
return NOTIFY_DONE; 
*( u16 *)(CPE_FLASH_VA_BASE + (0x55 * 2)) = 0xff; 
return NOTIFY_DONE; 
} 
static struct notifier_block mtd_notifier = { 
notifier_call: mtd_reboot, 
next: NULL, 
priority: 0 
}; 
int __init mcpu_mtd_init(void) 
{ 
………………………. 
register_reboot_notifier(&mtd_notifier); 
………………………. 
}

Linux Jffs2 & Linux MTD Device

  • 1.
  • 2.
    分為NOR 和NAND 兩種 寫入之前必須先做erase動作 每個位元只能從1 轉變為0 有10萬次的清除上限次數 空間無法太大 2 Flash的特性
  • 3.
    NOR 和NAND 的差異性 3 NOR Flash • 可以任意位置讀寫 • 每一個block size較大(ex: 128K) • 需要的定位空間為全部 flash大小 • 單位成較高 • 可以做為開機使用 NAND Flash • 必須整個sector讀寫 (ex:512bytes) • 單位成本較低 • 需要的定位空間固定且很 少(ex:8K) • 需要特殊硬體支援才能做 為開機使用
  • 4.
    Flash做為檔案系統的間題 寫入時斷電問題 4 Erase block Write data 斷電 • 檔案系統問題(FAT/EXT2/EXT3) • 都在同一地方寫入 • Flash 10 萬次上限
  • 5.
    一種log型式的檔案系統 有斷電保護作用 有延長Flash壽命的特性 一種小型的檔案系統 支援線上壓縮及解壓縮的功能 另一種較大的檔案系統YAFFS 5 JFFS2特性
  • 6.
    Application VFS (VirtualFile System) JFFS2 File System MTD Device Driver 6 JFFS2的系統架構 Flash (NOR or NAND) Kernel
  • 7.
  • 8.
    一種專為Flash所寫的Device Driver 支援block& character mode 支援多種Flash 1) NOR 2) NAND 3) NFTL 支援MTD to Block – 可讓CF & SD card也可使 用JFFS2 file system 8 什麼是MTD Driver
  • 9.
    File manager JFFS2 mtdblock/mtdchar maps 9 MTD的系統架構 Chip or device (NOR or NAND)
  • 10.
    如何撰寫maps device driver 10 事先規劃好 flash如何使用 依據事先規劃 好的flash撰寫 描述結構 Remap flash physical address to virtual address Call do_map_probe()來檢測 何種flash及大小, 並取得 mtd file handle Call add_mtd_paritions() 來註冊事先規劃好的 partition
  • 11.
    static struct mtd_partitionsuperh_se_partitions[] = { /* Reserved for boot code, read-only */ { .name = "flash_boot", .offset = 0x00000000, .size = CONFIG_MTD_SUPERH_RESERVE, .mask_flags = MTD_WRITEABLE, }, /* All else is writable (e.g. JFFS) */ { .name = "Flash FS", .offset = MTDPART_OFS_NXTBLK, .size = MTDPART_SIZ_FULL, } }; #define MTDPART_OFS_NXTBLK (-2) #define MTDPART_OFS_APPEND (-1) #define MTDPART_SIZ_FULL(0) 11 Partition描述結構
  • 12.
    12 example Bootloader kernel Root file system user static struct mtd_partition mcpu_flash_partitions[] = { { .name = "BootLoader", .size = BOOT_LOADER_SIZE, .offset = 0, //.mask_flags = MTD_WRITEABLE, }, { .name = "Kernel", .size = KERNEL_SIZE, .offset = MTDPART_OFS_APPEND, //.mask_flags = MTD_WRITEABLE, }, { .name = "RootDisk", .size = ROOT_DISK_SIZE, .offset = MTDPART_OFS_APPEND, //.mask_flags = MTD_WRITEABLE, }, { .name = "UserDisk", .size = USER_DISK_SIZE, .offset = MTDPART_OFS_APPEND, //.mask_flags = MTD_WRITEABLE, } };
  • 13.
    使用MTD在kernel中必選的項目 config MTD_CONCAT config MTD_PARTITIONS config MTD_CHAR config MTD_BLOCK config MTD_CFI config MTD_MAP_BANK_WIDTH_2 config MTD_CFI_INTELEXT 13
  • 14.
    當系統在寫入時做reboot動作易讓flash停留在非讀取狀態, 會 造成無法進入bootloader 解決方案, 註冊一個reboot的call back function 14 Reboot問題 static int mtd_reboot(struct notifier_block *n, unsigned long code, void *p) { if(code != SYS_RESTART) return NOTIFY_DONE; *( u16 *)(CPE_FLASH_VA_BASE + (0x55 * 2)) = 0xff; return NOTIFY_DONE; } static struct notifier_block mtd_notifier = { notifier_call: mtd_reboot, next: NULL, priority: 0 }; int __init mcpu_mtd_init(void) { ………………………. register_reboot_notifier(&mtd_notifier); ………………………. }