【问题标题】:Nand partitioning in u-bootu-boot中的Nand分区
【发布时间】:2012-01-25 00:45:14
【问题描述】:

我正在开发嵌入式 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 flash 上创建分区?至于我知道内核不会在每次启动时创建分区,但为什么会出现消息“Creating 3 MTD partitions”?

【问题讨论】:

    标签: embedded kernel arm u-boot


    【解决方案1】:

    对于闪存设备,无论是 NAND 还是 NOR,设备本身没有分区表。也就是说,您无法在闪存阅读器中读取设备并找到一些表来指示设备上有多少个分区以及每个分区的开始和结束位置。只有一个未分化的块序列。这是 MTD 闪存设备与磁盘等设备或 MMC 等 FTL 设备之间的根本区别。

    因此flash设备的分区在情人眼中,即U-Boot或内核,在情人运行时“创建”分区。这就是您看到消息Creating 3 MTD partitions 的原因。这反映了flash分区实际上只存在于运行内核的MTD系统中,而不存在于flash设备本身。

    这导致 U-Boot 和内核可以对 flash 分区有不同的定义,这显然是 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:您提到的 SoC 支持 MMC、eMMC 或 SD 外设。尽管这些通常基于闪存技术,但它们与 OP 询问的原始闪存或 MTD 不同。 OP 询问的 U-Boot mtdparts 命令与原始 NAND 或 NOR 闪存有关,而不是与 MMC、eMMC 或 SD 等“托管”闪存有关。您可以在processors.wiki.ti.com/index.php/… 中找到对 U-Boot 命令差异的简洁描述。
    • Melab 错了乔纳森,你是对的。 MTD flash 没有分区表,是的,分区是通过 u-boot 和 linux 内核的 mtdparts 字符串或通过 .dts(因此是 .dtb)“定义”的。有些控制器可能会有所不同,但这似乎是我在 Sunxi linux 和 Allwinner 芯片上的经验。
    【解决方案2】:

    你可以在 uboot 中设置 mtdparts 环境变量,如果你在内核引导命令行中传递它,内核只使用它,否则它将默认为你平台的内核源代码中的 nand 分区结构,在本例中为 3 MTD 分区默认值。

    【讨论】:

    • 感谢您的回答。但我在每次启动时收到消息 Creating 3 MTD partitions。内核是否会在每次启动时更改 nand 分区?如果我想更改 nand 分区通过 u-boot 我应该使用哪个命令?
    • 我很抱歉这么说,但是您可以随时使用谷歌。 denx.de/wiki/DULG/UBootCmdGroupFlash这是我通过谷歌在u-boot官方网站上轻松找到的,你可能想了解一下你对u-boot的理解。
    • 您可能正在寻找的引导参数是 mtdparts= ... 您可以在 kernel/drivers/mtd/cmdlinepart.c 中找到完整的参数列表和文档。我不知道这是否会覆盖内核中硬编码的默认分区。这通常在 kernel/arch/(your-processor)/(board something).c 中的一个文件中
    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    相关资源
    最近更新 更多