在i.MX51中从内核升级u-boot

时间:2012-08-31 12:58:38

标签: linux linux-kernel embedded-linux

我正在研发带有NAND闪存的i.MX35飞思卡尔主板。我正在尝试从内核升级u-boot。我在网上搜索,但我没有得到很多细节

这可以做到这一点,我该怎么做? 有人可以提供必要的命令和程序吗?

1 个答案:

答案 0 :(得分:2)

如果不了解更多关于内核配置的内容,就很难给出建议。

由于看起来你正在从NAND启动系统,我假设你的内核是用mtd支持构建的 - 尽管系统完全有可能从NAND启动u-boot,然后从内核和根文件系统启动别的地方。

我的经验是使用带有Micron NAND闪存的OMAP2板,但一般步骤应该是相同的。除了尝试之外,似乎没有特别好的文档来源。

1:运气好的话,您的NAND被分区并且mtd子系统被编译到您的内核子系统中,并且它在NAND上找到了分区(大小在内核引导线上指定,或者可能在您的板上以编程方式指定 - 文件)。

在启动时的控制台上你可能会看到如下内容:[警告:某些日志记录可能被禁用]

[    1.670471] Creating 5 MTD partitions on "omap2-nand.0":
[    1.676086] 0x000000000000-0x000000020000 : "xload"
[    1.684814] 0x000000020000-0x0000000a0000 : "barebox"
[    1.692626] 0x0000000a0000-0x0000000c0000 : "bareboxenv"
[    1.700622] 0x0000000c0000-0x0000004c0000 : "kernel"
[    1.709899] 0x0000004c0000-0x000040000000 : "root"

请注意,我在这里使用OMAP2系统,使用Barebox而不是u-boot,但同样适用。这里我们有主加载程序分区xload,主引导程序barebox,裸机(bareboxenv)的非易失性存储,内核和根文件系统。

2:如果是这样,你会发现每个分区都有/dev中的开发文件

root@fk-00A0DE4648fe:~# ls /dev/
block               mtd4                tty11               tty49
bus                 mtd4ro              tty12               tty52
char                mtdblock0           tty13               tty50
console             mtdblock1           tty14               tty51
core                mtdblock2           tty15               tty520
cpu_dma_latency     mtdblock3           tty16               tty53trl
disk                mtdblock4           tty17               tty54om

mtdblock个文件是原始块设备,对应于步骤1中的分区

3:您可以使用mtdinfo -a获取更多信息:

....
Name:                           barebox
Type:                           nand
Eraseblock size:                131072 bytes, 128.0 KiB
Amount of eraseblocks:          4 (524288 bytes, 512.0 KiB)
Minimum input/output unit size: 2048 bytes
Sub-page size:                  2048 bytes
OOB size:                       64 bytes
Character device major/minor:   90:2
Bad blocks are allowed:         true
Device is writable:             true
....

4:您可以删除分区(例如block1):

mtd_debug erase /dev/mtdblock1 0x0 0x8000

这两个地址是从块的起始位置开始的偏移量和要擦除的长度

5:将图像复制到新擦除的闪光灯

cp <uboot_image> /dev/mtdblock1

这似乎对我有用,这可能是令人惊讶的,尽管大多数NAND闪存具有非常特定的编程大小 - 尽管这些可能是块的倍数。

mtd_debug还提供了readwrite动词 - 这正是您所想象的。与cp

相比,我的成功率较低

显然毋庸置疑,你想要一个备用的引导装置(大概是MMC卡),并且在尝试之前验证它是否正常工作,因为如果闪存编程不起作用,你的系统可能无法启动。

对我来说错误并且证明是痛苦的事情是用于分区的不同ECC算法。闪存的前几个擦除单元通常保证更强大,并且将使用SoC支持的掩模PROM中的最小初始加载器的任何ECC。这可能不是你在设备的其他部分使用的 - 当然不是我正在使用的Micron部件。

这意味着引导加载程序和内核可能无法在不进行某些修改的情况下读取和写入彼此的分区。