通过 /dev/mtd 进行内核更新

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在处理嵌入式设备,其中内核映像存储在闪存的/dev/mtd4分区中。我想更新这个内核而不使用Uboot。

如何实现呢? 我尝试调用:

echo ./kernel.bin > /dev/mtdblock4 

但是它不起作用。存储的数据在下一次启动时未被识别为内核。

3
建议您使用cat而不是echo,例如 cat ./kernel.bin > /dev/mtdblock4 - Paul R
当然可以。我在/dev/mtd中发现了./kernel.bin字符串时就提到过它了...将cat ./kernel.bin > /dev/mtdblock4执行得非常完美。 - Bartlomiej Grzeskowiak
5个回答

10

你应该使用 mtdutils 工具的 flashcp :

flashcp -v ./kernel.bin /dev/mtd4

flashcp将负责擦除、写入和验证,而cat则不会。请注意它与字符驱动程序一起使用,而不是块驱动程序。-v用于详细操作。


在我的NAND闪存上,flashcp在烧录时损坏了我的rootfs,而flash_eraseall+nandwrite -p则正常工作。也许我们应该关注一下工具描述中的“将数据复制到NOR闪存”这一点? - Daniel Alder

4
我从未使用过flashcp。我在使用flash_erase或flash_eraseall,然后再使用nandwrite。如果您没有这些实用程序,可以在此处获取源代码here,并为您的目标构建它们。
要更新我的系统,我使用:
# /usr/bin/flash_erase /dev/mtd3
# /usr/bin/nandwrite -m -p /dev/mtd3 /uImage

这是NAND闪存吗?如果是的话,我认为echo或cat命令不能正确地跳过坏块。


4

至少应该使用cat kernel.bin > /dev/mtdblock4,但这可能也不起作用。

这取决于你的内核实际上是如何加载的(引导程序是什么)。


它可以工作。当我在我的/dev/mtd中发现./kernel.bin字符串时,我提到了它的失败...将cat ./kernel.bin > /dev/mtdblock4执行得非常完美。 - Bartlomiej Grzeskowiak
2
我必须将其减1,因为对于基于NAND的设备(大多数情况下),在写入之前必须擦除闪存;仅仅写入不会产生正确的结果。这里的其他答案描述了正确的方法。 - Jason C
那个擦除的工作可能是设备驱动程序的工作。当你看到一个文件系统时,它是不相关的。 - Basile Starynkevitch
值得注意的是,在引导内核中运行的设备驱动程序可能没有足够详细的硬件感知、坏块方案等,不能安全地用于写操作。在其他情况下可能可以。这基本上是一种“看看简单方法是否适用于这个问题”的尝试。 - Chris Stratton
这是错误的建议!在写入闪存之前,您永远不应该忘记先删除它!@Luke的答案是重写内核映像的更好、更聪明的方式。 - maguirre

0

为了更新不同的mtd块,我使用以下例程:

# flash_eraseall /dev/mtd3
# dd if="kernel.bin" of=/dev/mtd3 bs=16k conv=sync

0

我也有一个设备,我更新内核映像并使用uBoot。

我的工作流程是:

  • 我将新的映像文件传输到设备的tmp目录中
  • 我擦除闪存mtd目录:

    flash_eraseall /dev/mtd3

  • 然后我从tmp复制到flash目录(/tmp/ --> /dev/mtd3)

    flashcp /tmp/uImage /dev/mtd3

希望这可以帮助到您, 敬礼


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接