2011-12-21 27 views
10

我正在開發嵌入式ARM9開發板。在那我想重新安排我的nand分區。任何人都可以告訴我該怎麼做?Nand在u-boot中分區

在我的u-boot shell中,如果我給出命令mtdparts給出以下信息。

Boardcon> mtdparts  

device nand0 <nandflash0>, # parts = 7 

#: name    size   offset   mask_flags 
0: bios    0x00040000  0x00000000  0 
1: params    0x00020000  0x00040000  0 
2: toc     0x00020000  0x00060000  0 
3: eboot    0x00080000  0x00080000  0 
4: logo    0x00100000  0x00100000  0 
5: kernel    0x00200000  0x00200000  0 
6: root    0x03c00000  0x00400000  0 

active partition: nand0,0 - (bios) 0x00040000 @ 0x00000000 

defaults: 
mtdids : nand0=nandflash0 
mtdparts: mtdparts=nandflash0:[email protected](bios),128k(params),128k(toc),512k(eboot),1024k(logo),2m(kernel),-(root) 

內核啓動的消息顯示如下:

Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit": 
0x000000000000-0x000000040000 : "Boardcon_Board_uboot" 
0x000000200000-0x000000400000 : "Boardcon_Board_kernel" 
0x000000400000-0x000003ff8000 : "Boardcon_Board_yaffs2" 

任何人都可以請解釋我什麼既是這些信息之間的關係。哪一個內核或u-boot負責在nand flash上​​創建部分?至於我知道內核不是在每次啓動時創建分區,但爲什麼消息「創建3個MTD分區」?

回答

1

您可以在uboot中設置mtdparts環境變量,如果您在內核引導命令行中傳遞此內核,內核將僅使用此參數,否則它將默認爲您的內核源代碼中的nand分區結構平臺,在這種情況下,3 MTD分區默認。

+0

謝謝你的回答。但是我得到的消息**在每次啓動時創建3個MTD分區**。內核在每次啓動時都會改變nand分區?如果我想通過u-boot更改nand分區,使用? – yuvaeasy 2011-12-23 04:45:12

+1

我很抱歉地說這個,但是,你總是可以使用谷歌。 http://www.denx.de/wiki/DULG/UBootCmdGroupFlash這是我通過谷歌輕鬆找到的u-boot官方網站上的內容,您可能想了解一下您對u-boot的理解。 – andycjw 2011-12-27 05:40:02

+0

謝謝,我會試着去理解。 – yuvaeasy 2011-12-27 06:37:45

20

對於閃存設備,NAND或NOR,,設備本身沒有分區表。也就是說,您無法在閃存閱讀器中讀取設備,並找到一些表格指出設備上有多少個分區以及每個分區的開始和結束位置。只有一個沒有區別的區塊序列。這是MTD閃存設備與諸如磁盤或FTL設備(如MMC)之類的設備之間的根本區別。

因此,閃存設備的分區在旁觀者的眼中,即U-Boot或內核,並且分區在占卜符運行時被「創建」。這就是爲什麼你看到消息Creating 3 MTD partitions。它反映了閃存分區確實只存在於正在運行的內核的MTD系統中,而不是閃存設備本身。

這導致U-Boot和內核可能具有不同的閃存分區定義,這顯然是在OP的情況下發生的情況。

在U-Boot中,您定義了mtdparts環境變量中的閃存分區。在Linux內核,閃存分區在下列地方定義:

  1. 在舊的內核(例如,用於i.MX28 2.6.35)閃存分區可以在gpmi-nfc-mil.c或其他驅動源代碼硬編碼。 (真是無賴!)。
  2. 與設備樹支持較新幹線的內核,可以在設備樹定義MTD paritions
  3. 在較新的核心有通常爲內核命令行分區定義使用命令行像root=/dev/mmcblk0p2 rootwait console=ttyS2,115200 mtdparts=nand:6656k(all),1m(squash),-(jffs2)
支持

您在內核中擁有的分區支持類型取決於您使用的閃存類型,驅動程序是否支持內核命令行分析以及您的內核是否支持設備樹。

無論如何,閃存的U-Boot和內核分區之間存在固有的衝突風險。因此,我的建議是在U-Boot mtdparts變量中定義閃存分區,並將其傳遞給U-Boot內核命令行中的內核,假定您的內核支持此選項。

+0

您聲稱在閃存設備上沒有分區表是錯誤的。使用Tegra,OMAP或Qualcomm芯片的設備可以在閃存中使用GPT。 – Melab 2015-12-07 14:56:15

+1

@Melab:您提到的SoC支持MMC,eMMC或SD外設。儘管這些通常基於閃存技術,但它們與OP要求的原始閃存或MTD不同。 OP詢問的U-Boot mtdparts命令與原始NAND或NOR閃存有關,而不是MMC,eMMC或SD等「受管理」閃存。您可以在http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User%27s_Guide#Using_NAND中找到U-Boot命令差異的簡要說明。 – 2015-12-08 10:15:51

+0

Melab是錯的喬納森你是對的。 MTD閃存沒有分區表,是的分區通過mtdparts字符串爲u-boot和linux內核或通過.dts(因此.dtb)「定義」。有些控制器可能不同,但這似乎是我在Sunxi linux和Allwinner芯片上的經驗。 – 2016-01-25 17:22:09