mtd
MTD(memory?technology?device內存技術設備)是用于訪問memory設備(ROM、flash)的Linux的子系統。MTD的主要目的是為了使新的memory設備的驅動更加簡單,為此它在硬件和上層之間提供了一個抽象的接口。MTD的所有源代碼在/drivers/mtd子目錄下。CFI接口的MTD設備分為四層(從設備節點直到底層硬件驅動),這四層從上到下依次是:設備節點、MTD設備層、MTD原始設備層和硬件驅動層。
基本信息
基本介紹
MTD(memory technology device內存技術設備)是用于訪問memory設備(ROM、flash)的Linux的子系統。MTD的主要目的是為了使新的memory設備的驅動更加簡單,為此它在硬件和上層之間提供了一個抽象的接口。MTD的所有源代碼在/drivers/mtd子目錄下。CFI接口的MTD設備分為四層(從設備節點直到底層硬件驅動),這四層從上到下依次是:設備節點、MTD設備層、MTD原始設備層和硬件驅動層。
原始設備
所有組成MTD原始設備的Flash芯片必須是同類型(無論是interleave還是地址相連),在描述MTD原始設備數據結構中采用同一結構描述組成Flash芯片。每個MTD原始設備有一個mtd_info結構,其中的priv指針指向一個map_info結構,map_info結構中的fldrv_priv指向一個cfi_private結構,cfi_private結構的cfiq指針指向一個cfi_ident結構,chips指針指向一個flchip結構的數組。其中mtd_info、map_info和cfi_private結構用于描述MTD原始設備,因為組成MTD原始設備的NOR型Flash相同,cfi_ident結構用于描述Flash芯片信息;而flchip結構用于描述每個Flash芯片專有信息。
根文件系統
文件系統mtd
字符設備節點
MTD字符設備
MTD塊設備
MTD原始設備
FLASH硬件驅動
塊設備節點
一、Flash硬件驅動層:硬件驅動層負責在init時驅動Flash硬件,Linux MTD設備的NOR Flash芯片驅動遵循CFI接口標準,其驅動程序位于drivers/mtd/chips子目錄下。NAND型Flash的驅動程序則位于/drivers/mtd/nand子目錄下
二、MTD原始設備:原始設備層有兩部分組成,一部分是MTD原始設備的通用代碼,另一部分是各個特定的Flash的數據,例如分區。
用于描述MTD原始設備的數據結構是mtd_info,這其中定義了大量的關于MTD的數據和操作函數。mtd_table(mtdcore.c)則是所有MTD原始設備的列表,mtd_part(mtd_part.c)是用于表示MTD原始設備分區的結構,其中包含了mtd_info,因為每一個分區都是被看成一個MTD原始設備加在mtd_table中的,mtd_part.mtd_info中的大部分數據都從該分區的主分區mtd_part->master中獲得。
在drivers/mtd/maps/子目錄下存放的是特定的flash的數據,每一個文件都描述了一塊板子上的flash。其中調用add_mtd_device()、del_mtd_device()建立/刪除 mtd_info結構并將其加入/刪除mtd_table(或者調用add_mtd_partition()、del_mtd_partition() (mtdpart.c)建立/刪除mtd_part結構并將mtd_part.mtd_info加入/刪除mtd_table 中)。
三、MTD設備層:基于MTD原始設備,linux系統可以定義出MTD的塊設備(主設備號31)和字符設備(設備號90)。MTD字符設備的定義在mtdchar.c中實現,通過注冊一系列file operation函數(lseek、open、close、read、write)。MTD塊設備則是定義了一個描述MTD塊設備的結構 mtdblk_dev,并聲明了一個名為mtdblks的指針數組,這數組中的每一個mtdblk_dev和mtd_table中的每一個 mtd_info一一對應。
四、設備節點:通過mknod在/dev子目錄下建立MTD字符設備節點(主設備號為90)和MTD塊設備節點(主設備號為31),通過訪問此設備節點即可訪問MTD字符設備和塊設備。
五、根文件系統:在Bootloader中將JFFS(或JFFS2)的文件系統映像jffs.image(或jffs2.img)燒到flash的某一個分區中,在/arch/arm/mach-your/arch.c文件的 your_fixup函數中將該分區作為根文件系統掛載。
六、文件系統:內核啟動后,通過mount 命令可以將flash中的其余分區作為文件系統掛載到mountpoint上。
設備層和原始設備層的函數調用關系(紅色部分需要我們實現):
一個MTD原始設備可以通過mtd_part分割成數個MTD原始設備注冊進 mtd_table,mtd_table中的每個MTD原始設備都可以被注冊成一個MTD設備,其中字符設備的主設備號為90,次設備號為0、2、4、 6…(奇數次設備號為只讀設備),塊設備的主設備號為31,次設備號為0、1、2、3…
mtd_notifier mtd_notifier
字符設備 mtd_fops 塊設備 mtd_fops
(mtdchar.c) (mtdblock.c) mtdblks
設備層
register_mtd_user()
get_mtd_device()
unregister_mtd_user()
put_mtd_device()
erase_info
mtd_notifiers
mtd_table
mtd_info
mtd_part
(mtdcore.c)
(mtdpart.c)
Your Flash
(your-flash.c)
add_mtd_partitions()
del_mtd_partitions()
原始設備層 add_mtd_device()
del_mtd_device()
mtd_partition
NOR型Flash芯片驅動與MTD原始設備
所有的NOR型Flash的驅動(探測probe)程序都放在 drivers/mtd/chips下,一個MTD原始設備可以由一塊或者數塊相同的Flash芯片組成。假設由4塊devicetype為x8的 Flash,每塊大小為8M,interleave為2,起始地址為0x01000000,地址相連,則構成一個MTD原始設備(0x01000000-0x03000000),其中兩塊interleave成一個chip,其地址從0x01000000到0x02000000,另兩塊interleave成一個chip,其地址從0x02000000到0x03000000。
請注意,所有組成一個MTD原始設備的Flash芯片必須是同類型的(無論是interleave還是地址相連),在描述MTD原始設備的數據結構中也只是采用了同一個結構來描述組成它的Flash芯片。
0x03000000
0x02000000
0x01000000
每個MTD原始設備都有一個mtd_info 結構,其中的priv指針指向一個map_info結構,map_info結構中的fldrv_priv指向一個cfi_private結構,cfi_private結構的cfiq指針指向一個cfi_ident結構,chips指針指向一個flchip結構的數組。其中mtd_info、 map_info和cfi_private結構用于描述MTD原始設備;因為組成MTD原始設備的NOR型Flash相同,cfi_ident結構用于描述Flash芯片的信息;而flchip結構用于描述每個Flash芯片的專有信息(比如說起始地址)
總結
- 上一篇: 使用genext2fs制作ramdisk
- 下一篇: Bootloader概述