在u-boot中进行Nand分区

yuv*_*asy 10 embedded kernel arm u-boot

我正在开发嵌入式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) 
Run Code Online (Sandbox Code Playgroud)

内核启动消息显示以下内容:

 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"
Run Code Online (Sandbox Code Playgroud)

任何人都可以请解释我这两个消息之间的关系.哪个内核或u-boot负责在nand flash上​​创建partion?至于我知道内核不是在每次启动时创建分区,而是为什么消息" 创建3个MTD分区 "?

Jon*_*ham 23

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

因此,闪存设备的分区是旁观者的眼睛,即U-Boot或内核,并且在旁观者运行时"创建"分区.这就是你看到这条消息的原因Creating 3 MTD partitions.它反映了闪存分区实际上只存在于正在运行的内核的MTD系统中而不是闪存设备本身的事实.

这导致U-Boot和内核可以具有不同的闪存分区定义的情况,这显然是在OP的情况下发生的情况.

在U-Boot中,您可以在mtdparts环境变量中定义闪存分区.在Linux内核中,flash分区在以下位置定义:

  1. 在较旧的内核中(例如i.MX28的2.6.35),flash分区可以是硬编码的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内核命令行中将其传递给内核,假设您的内核支持此选项.

  • @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 命令差异的简洁描述。 (2认同)
  • 梅拉布错了乔纳森你是对的。MTD 闪存没有分区表,是的,分区是通过 u-boot 和 linux 内核的 mtdparts 字符串或通过 .dts(以及 .dtb)“定义”的。有些控制器可能会有所不同,但这似乎是我在 Sunxi linux 和 Allwinner 芯片上的经验。 (2认同)

and*_*cjw 0

您可以在 uboot 中设置 mtdparts 环境变量来执行此操作,并且只有在内核启动命令行中传递此参数时,内核才会使用此变量,否则它将默认为您平台的内核源代码中的 nand 分区结构,该结构在本例默认为 3 个 MTD 分区。