[英]Nand partitioning in 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)
内核启动消息显示以下内容:
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上创建partion? 至于我知道内核不是在每次启动时创建分区,而是为什么消息“ 创建3个MTD分区 ”?
对于闪存设备,NAND或NOR,设备本身没有分区表 。 也就是说,您无法在闪存读取器中读取设备,并找到一些表格,指示设备上有多少分区以及每个分区的开始和结束位置。 只有一个未分化的块序列。 这是MTD闪存设备与磁盘或FTL等设备(如MMC)之间的根本区别。
因此,闪存设备的分区是旁观者的眼睛,即U-Boot或内核,并且在旁观者运行时“创建”分区。 这就是为什么你看到Creating 3 MTD partitions
的消息。 它反映了闪存分区实际上只存在于正在运行的内核的MTD系统中而不是闪存设备本身的事实。
这导致U-Boot和内核可以具有不同的闪存分区定义的情况,这显然是在OP的情况下发生的情况。
在U-Boot中,您可以在mtdparts
环境变量中定义闪存分区。 在Linux内核中,flash分区在以下位置定义:
gpmi-nfc-mil.c
或其他驱动程序源代码进行硬编码。 (多么糟糕!)。 root=/dev/mmcblk0p2 rootwait console=ttyS2,115200 mtdparts=nand:6656k(all),1m(squash),-(jffs2)
因此,内核中的分区支持类型取决于您使用的闪存类型,它的驱动程序是否支持内核命令行解析以及您的内核是否具有设备树支持。
无论如何,U-Boot和闪存的内核分区之间存在固有的冲突风险。 因此,我的建议是在U-Boot mtdparts
变量中定义flash分区,并将其传递给U-Boot内核命令行中的内核,假设您的内核支持此选项。
你可以设置mtdparts环境变量在uboot中这样做,如果你在内核启动命令行中传递它,内核只使用它,否则它将默认为你平台的内核源代码中的nand分区结构,在这种情况下3 MTD分区默认。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.