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

4

2 回答 2

29

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

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

这导致 U-Boot 和内核可以对闪存分区有不同的定义,这显然是 OP 的情况。

mtdparts在 U-Boot 中,您在环境变量中定义闪存分区。在 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-Bootmtdparts变量中定义闪存分区,并在 U-Boot 内核命令行中将其传递给内核,假设您的内核支持此选项。

于 2014-01-15T08:17:20.557 回答
0

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

于 2011-12-22T08:48:20.327 回答