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