日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MTD和 uboot中的bootargs 下属 mtdparts

發(fā)布時(shí)間:2023/11/30 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MTD和 uboot中的bootargs 下属 mtdparts 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

MTD 設(shè)備是象閃存芯片、小型閃存卡、記憶棒等之類的設(shè)備,它們在嵌入式設(shè)備中的使用正在不斷增長。

MTD 驅(qū)動程序是在 Linux 下專門為嵌入式環(huán)境開發(fā)的新的一類驅(qū)動程序。相對于常規(guī)塊設(shè)備驅(qū)動程序,使用 MTD 驅(qū)動程序的主要優(yōu)點(diǎn)在于 MTD 驅(qū)動程序是專門為基于閃存的設(shè)備所設(shè)計(jì)的,所以它們通常有更好的支持、更好的管理和基于扇區(qū)的擦除和讀寫操作的更好的接口。Linux 下的 MTD 驅(qū)動程序接口被劃分為兩類模塊:用戶模塊和硬件模塊。

?

MTD 驅(qū)動程序設(shè)置?
為了訪問特定的閃存設(shè)備并將文件系統(tǒng)置于其上,需要將 MTD 子系統(tǒng)編譯到內(nèi)核中。這包括選擇適當(dāng)?shù)?MTD 硬件和用戶模塊。當(dāng)前,MTD 子系統(tǒng)支持為數(shù)眾多的閃存設(shè)備 ― 并且有越來越多的驅(qū)動程序正被添加進(jìn)來以用于不同的閃存芯片。

?

有兩個(gè)流行的用戶模塊可啟用對閃存的訪問: MTD_CHAR 和 MTD_BLOCK 。?
MTD_CHAR 提供對閃存的原始字符訪問,而 MTD_BLOCK 將閃存設(shè)計(jì)為可以在上面創(chuàng)建文件系統(tǒng)的常規(guī)塊設(shè)備(象 IDE 磁盤)。與 MTD_CHAR 關(guān)聯(lián)的設(shè)備是 /dev/mtd0、mtd1、mtd2(等等),而與 MTD_BLOCK 關(guān)聯(lián)的設(shè)備是 /dev/mtdblock0、mtdblock1(等等)。由于 MTD_BLOCK 設(shè)備提供象塊設(shè)備那樣的模擬,通常更可取的是在這個(gè)模擬基礎(chǔ)上創(chuàng)建象 FTL 和 JFFS2 那樣的文件系統(tǒng)。

?

為了進(jìn)行這個(gè)操作,可能需要?jiǎng)?chuàng)建分區(qū)表將閃存設(shè)備分拆到引導(dǎo)裝載程序節(jié)、內(nèi)核節(jié)和文件系統(tǒng)節(jié)中。
Linux 中 MTD 子系統(tǒng)的主要目標(biāo)是在系統(tǒng)的硬件驅(qū)動程序和上層,或用戶模塊之間提供通用接口。硬件驅(qū)動程序不需要知道象 JFFS2 和 FTL 那樣的用戶模塊使用的方法。所有它們真正需要提供的就是一組對底層閃存系統(tǒng)進(jìn)行 read 、 write 和 erase 操作的簡單例程。

?

MTD 驅(qū)動程序是專門針對嵌入式Linux的一種驅(qū)動程序,相對于常規(guī)塊設(shè)備驅(qū)動程序(比如PC中的IDE硬盤)而言,MTD驅(qū)動程序能更好的支持和管理閃存設(shè)備,因?yàn)樗旧砭褪菍殚W存設(shè)備而設(shè)計(jì)的。MTD設(shè)備是指不同于傳統(tǒng)字符設(shè)備和塊設(shè)備的flash存儲設(shè)備,使得上層的文件系統(tǒng)像訪問傳統(tǒng)的字符或塊設(shè)備一樣訪問flash,為上層軟件系統(tǒng)提供一個(gè)同一的接口。
??? 具體地講,基于MTD的FLASH驅(qū)動,承上可以很好地支持cramfs,jffs2和yaffs等文件系統(tǒng),啟下也能對FLASH的擦除,讀寫,FLASH壞塊以及損耗平衡進(jìn)行很好的管理。所謂損耗平衡,是指對NAND的擦寫不能總是集中在某一個(gè)或某幾個(gè)block中,這是由NAND芯片有限的擦寫次數(shù)的特性決定的。

?


一、MTD?的概念和層次

MTD(memory technology device?存儲?技術(shù)設(shè)備?)?是用于訪問?memory?設(shè)備(?ROM?、?flash?)的?Linux?的子系統(tǒng)。?MTD?的主要目的是為了使新的?memory?設(shè)備的驅(qū)動更加簡單,為此它在硬件和上層之間提供了一個(gè)抽象的接口。?MTD?的所有源代碼在?/drivers/mtd?子目錄下?。[1]

傳統(tǒng)上,?UNIX?只認(rèn)識塊設(shè)備和字符設(shè)備。字符設(shè)備是類似鍵盤或者鼠標(biāo)的這類設(shè)備,你必須從它讀取當(dāng)前數(shù)據(jù),但是不可以定位也沒有大小。塊設(shè)備有固定的大小并且可以定位, 它們恰好組織成許多字節(jié)的塊,通常為?512字節(jié)。

閃存既不滿足塊設(shè)備描述也不滿足字符設(shè)備的描述。它們表現(xiàn)的類似塊設(shè)備,但又有所不同。比如,塊設(shè)備不區(qū)分寫和擦除操作。因此,一種符合閃存特性的特殊設(shè)備類型誕生了, 就是?MTD?設(shè)備。所以?MTD?既不是塊設(shè)備,也不是字符設(shè)備?。?[


二.?MTD hardware device drivers

These provide physical access(?物理訪問?)?to memory devices, and are not used directly - they are accessed through the user modules above(?他們是通過上層的用戶模塊來訪問的?)?.

On-board memory

Many PC chipsets(?芯片組?)?are incapable of correctly(?不能正確地?)?caching system memory above 64M or 512M. A driver exists which allows you to use this memory with the linux-mtd system.?(?有些?PC?芯片組不能正確緩存高于?64M?或者?512M?的系統(tǒng)內(nèi)存,那么就可以通過?linux??mtd?來使用這些內(nèi)存?)

PCMCIA devices

PCMCIA flash (not CompactFlash but real flash) cards are now supported by the pcmciamtd driver in CVS.?(PCMCIA?閃存卡?-??不是?CF?卡但是是真實(shí)的?flash)

Common Flash Interface (CFI) onboard NOR flash

This is a common solution and is well-tested and supported, most often using JFFS2 or cramfs file systems.

Onboard NAND flash

NAND flash is rapidly overtaking NOR flash due to its larger size and lower cost; JFFS2 support for NAND flash is approaching production quality.?(NAND?因其大容量和低成本正在飛速超越?NOR)

M-Systems' DiskOnChip 2000 and Millennium

The DiskOnChip 2000, Millennium and Millennium Plus devices should be fully supported, using their native NFTL and INFTL 'translation layers'. Support for JFFS2 on DiskOnChip 2000 and Millennium is also operational although lacking proper support for bad block handling.

CompactFlash?-?http://www.compactflash.org/

CompactFlash emulates an IDE disk, either through the PCMCIA-ATA standard, or by connecting directly to an IDE interface.

As such, it has no business being on this page, as to the best of my knowledge it doesn't have any alternative method of accessing the flash - you have to use the IDE emulation - I mention it here for completeness.


uboot 與系統(tǒng)內(nèi)核中MTD分區(qū)的關(guān)系:

分區(qū)只是內(nèi)核的概念,就是說A~B地址放內(nèi)核,C~D地址放文件系統(tǒng),(也就是規(guī)定哪個(gè)地址區(qū)間放內(nèi)核或者文件系統(tǒng))等等。

1:在內(nèi)核MTD中可以定義分區(qū)A~B,C~D。。。。。。并予以絕對的地址賦值給每個(gè)分區(qū)。我們可以來看看在內(nèi)核中是怎樣來對MTD進(jìn)行分區(qū)的:arch/arm/plat-s3c24xx/common-smdk.c

static struct mtd_partition smdk_default_nand_part[] = {
?[0] = {
??.name?= "Boot",
??.size?= SZ_16K,
??.offset?= 0,
?},
?[1] = {
??.name?= "S3C2410 flash partition 1",
??.offset = 0,
??.size?= SZ_2M,
?},
?[2] = {
??.name?= "S3C2410 flash partition 2",
??.offset = SZ_4M,
??.size?= SZ_4M,
?},
?[3] = {
??.name?= "S3C2410 flash partition 3",
??.offset?= SZ_8M,
??.size?= SZ_2M,
?},
?[4] = {
??.name?= "S3C2410 flash partition 4",
??.offset = SZ_1M * 10,
??.size?= SZ_4M,
?},

......
?};

一般我們只需要分3-4個(gè)區(qū),第一個(gè)為boot區(qū),一個(gè)為boot參數(shù)區(qū)(傳遞給內(nèi)核的參數(shù)),一個(gè)為內(nèi)核區(qū),一個(gè)為文件系統(tǒng)區(qū)。

而對于bootloader中只要能將內(nèi)核下載到A~B區(qū)的A地址開始處就可以,C~D區(qū)的C起始地址下載文件系統(tǒng)。。。這些起始地址在MTD的分區(qū)信息中能找到。所以bootloader對分區(qū)的概念不重要,只要它能把內(nèi)核燒到A位置,把文件系統(tǒng)燒到C位置。
所以,在bootloader對Flash進(jìn)行操作時(shí),哪塊區(qū)域放什么是以內(nèi)核為主。

而為了方便操作,bootloader類似也引入分區(qū)的概念,如,可以使用“nand write 0x3000000 kernel 200000”命令將uImage燒到kernel分區(qū),而不必寫那么長:nand write 3000000 A 200000,也就是用分區(qū)名來代替具體的地址。

這要對bootloader對內(nèi)核重新分區(qū):這需要重新設(shè)置一下bootloader環(huán)境參數(shù),就可以同步更新內(nèi)核分區(qū)信息

如:

setenv bootargs 'noinitrd console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2

???????????????????????????mtdparts=nand_flash:128k(u-boot)ro,64k(u-boot envs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'

內(nèi)核配置時(shí)選上Device Drivers? ---> Memory Technology Device (MTD) support? ---> Command line partition table parsing

在設(shè)置了mtdparts變量之后,就可以在nand read/write/erase命令中直接使用分區(qū)的名字而不必指定分區(qū)的偏移位置.而這需要內(nèi)核MTD最好沒有規(guī)劃分區(qū)。

如果你是通過uboot的內(nèi)核命令行給MTD層傳遞MTD分區(qū)信息,這種情況下,內(nèi)核讀取到的分區(qū)信息始終和u-boot中的保持一致(推薦的做法)

如果你是把分區(qū)信息寫在內(nèi)核源代碼MTD里定義好的方法,那最好保證它和u-boot中的保持一致,即同步修改uboot及內(nèi)核的相關(guān)部分。

2:

內(nèi)核通過bootargs找到文件系統(tǒng),bootargs中的mtdblockx即代表分區(qū),block1,2,3代表哪個(gè)分區(qū)。

事實(shí)上,bootargs中的"root=/dev/mtdblockx"只是告訴內(nèi)核,root fs從第x個(gè)(x=0,1,2...)MTD分區(qū)掛載,mtdblock0對應(yīng)第一個(gè)分區(qū),mtdblock1對應(yīng)第二個(gè)分區(qū),以此類推.

3:分區(qū)方法

1) MTD層的分區(qū)

2) 通過U-boot傳遞給內(nèi)核的命令行中的mtdparts=...

3) 其他可以讓內(nèi)核知道分區(qū)信息的任何辦法,(內(nèi)核默認(rèn)的命令參數(shù))

下面說到mtdparts,及它的用法:

mtdparts

mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)

要想這個(gè)參數(shù)起作用,內(nèi)核中的mtd驅(qū)動必須要支持,即內(nèi)核配置時(shí)需要選上Device Drivers? ---> Memory Technology Device (MTD) support? ---> Command line partition table parsing

?

mtdparts的格式如下:

mtdparts=<mtddef>[;<mtddef]

<mtddef>? := <mtd-id>:<partdef>[,<partdef>]

?<partdef> := <size>[@offset][<name>][ro]

?<mtd-id>? := unique id used in mapping driver/device

<size>??? := standard linux memsize OR "-" to denote all remaining space

<name>?? ?:= (NAME)

因此你在使用的時(shí)候需要按照下面的格式來設(shè)置:

mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)

這里面有幾個(gè)必須要注意的:

a.??mtd-id?必須要跟你當(dāng)前平臺的flash的mtd-id一致,不然整個(gè)mtdparts會失效?怎樣獲取到當(dāng)前平臺的flash的mtd-id?

在bootargs參數(shù)列表中可以指定當(dāng)前flash的mtd-id,如指定?mtdids:nand0=gen_nand.1,前面的nand0則表示第一個(gè)flash

b.? size在設(shè)置的時(shí)候可以為實(shí)際的size(xxM,xxk,xx),也可以為'-'這表示剩余的所有空間。

相關(guān)信息可以查看drivers/mtd/cmdlinepart.c中的注釋找到相關(guān)描述。

總結(jié)

以上是生活随笔為你收集整理的MTD和 uboot中的bootargs 下属 mtdparts的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。