u-boot中的Nand分区

12

我正在使用一块嵌入式ARM9开发板。我想重新排列我的nand分区。有人能告诉我如何做吗?

在我的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:256k@0(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闪存上创建分区?据我所知,内核不会在每次启动时都创建分区,但为什么会出现“Creating 3 MTD partitions”这个消息?

2个回答

30
对于闪存设备,无论是NAND还是NOR,在设备本身上都没有分区表。也就是说,你不能在闪存读卡器中读取设备并找到一张表,表明设备上有多少个分区以及每个分区的起始点和终止点。只有一系列未经区分的块。这是MTD闪存设备与像磁盘或MMC等设备的FTL设备之间的基本区别。
因此,闪存设备的分区在观察者眼中,即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分区。
3.在新内核中,通常支持使用类似于“root = /dev/mmcblk0p2 rootwait console = ttyS2,115200 mtdparts = nand:6656k(all),1m(squash),-(jffs2)”这样的命令行来定义内核命令行分区。
因此,您在内核中具有的分区支持类型取决于您使用的闪存类型,它是否支持内核命令行解析以及您的内核是否具有设备树支持。

无论如何,U-Boot和内核分区之间存在固有的冲突风险。因此,我的建议是在U-Boot的mtdparts变量中定义闪存分区,并将其传递到内核中的U-Boot内核命令行中,假设您的内核支持此选项。


你声称闪存设备上没有分区表是错误的。使用Tegra、OMAP或Qualcomm芯片的设备可以在闪存中拥有GPT。 - Melab
2
@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命令差异的简明描述。 - Jonathan Ben-Avraham
2
Melab是错的,Jonathan你是对的。MTD闪存没有分区表,分区是通过u-boot和Linux内核中的mtdparts字符串或.dts(因此是.dtb)来“定义”的。一些控制器可能不同,但这似乎是我在Sunxi Linux和Allwinner芯片上的经验。 - Kevin Parker

0

您可以在Uboot中设置mtdparts环境变量,内核仅在您将其传递给内核引导命令行时才使用它,否则它将默认使用内核源代码中针对平台的nand分区结构,此处为3个MTD分区的默认。


谢谢你的回答。但是我每次启动时都会收到“创建3个MTD分区”的消息。内核是否在每次启动时更改nand分区?如果我想通过u-boot更改nand分区,应该使用哪个命令? - yuvaeasy
1
很抱歉,我必须说你可以随时使用谷歌。http://www.denx.de/wiki/DULG/UBootCmdGroupFlash 这是我在 u-boot 官方网站上通过谷歌轻易找到的,你可能需要深入了解一下 u-boot。 - andycjw
你可能正在寻找的启动参数是 mtdparts= ... 你可以在你的 kernel/drivers/mtd/cmdlinepart.c 中找到完整的参数列表和文档。我不知道这是否会覆盖内核中硬编码的默认分区方式。通常情况下,这在 kernel/arch/(your-processor)/(board something).c 文件中。 - Luke Postema

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接