【问题标题】:Upload firmware from Flash using U-Boot使用 U-Boot 从 Flash 上传固件
【发布时间】:2014-04-11 21:01:13
【问题描述】:

我有问题。我的系统是一个嵌入式 Linux 平台。我正在使用串行端口连接到我的开发板,并且可以访问 U-Boot。

我需要通过控制台或以太网提取驻留在闪存中的完整固件。看起来使用 TFTP 或串行(Kermit 等)很容易下载,但将其上传到主机 PC 进行备份并不明显。

有谁知道如何做到这一点?

【问题讨论】:

  • 正确答案取决于您使用的 U-Boot 版本、内核是否可以看到闪存以及根文件系统上是否安装了mtd-utils。例如,如果 U-Boot 将根文件系统从 flash 加载到 RAMdisk 并且内核没有 flash 分区信息,要么是因为它没有编译到或不在 dtb 中,要么没有在内核命令行中提供,那么您无法从用户空间复制闪存,也可能无法从 U-Boot 复制。
  • u-boot 有 nand flash 命令,似乎转储了 2k 的闪存。是否有任何工具可以运行此命令并下载完整的 nand flash(即使速度很慢)?这是闪存的每字节副本吗?

标签: linux embedded-linux u-boot


【解决方案1】:

假设您使用的是 NAND 闪存和 U-Boot 2013.07 或类似版本:

  1. 使用nand info 命令查看 U-Boot 检测到的每个 NAND 设备的 NAND 设备名称、大小和擦除块大小
  2. 使用nand read 命令从 NAND 读取到 RAM。将多少 NAND 读入 RAM 取决于 RAM 大小
  3. 如果您有 SD (MMC) 驱动器,则可以使用 mmc write 命令从 RAM 写入 SD
  4. 如果您有 USB 设备,您可以使用 start usb 扫描 USB 以查找大容量存储或“以太网”(即 OTG)设备
  5. 如果start usb 检测到大容量存储设备,您可以使用usb write 命令从RAM 写入大容量存储设备
  6. 无法从 RAM 传输到 USB 或以太网网络连接
  7. 使用md命令将任意大小的内存块十六进制转储到串行线路,然后使用一些程序将ASCII十六进制转换回二进制

【讨论】:

  • 在设备上使用 md.b,在计算机上使用 cut -b 12-58 | xxd -r -p,效果很好,感谢 G-d :-)
  • 像这样调用md.bmd.b 0x<offset> <length_in_bytes>
【解决方案2】:

如果您愿意重建 uboot 并重新刷新您的主板,您可以使用 CONFIG_CMD_TFTPPUT 选项启用 tftpput 命令。 (假设是最新版本的 uboot。)

假设不是,在嵌入式 Linux 中,您可以通过/dev/mtd* 访问您的闪存(cat /proc/mtd 查看分区)。您可以使用dd 将一个分区复制到一个ramdisk 文件,然后使用cat 将文件合并为一个映像,然后使用ftpput 将其发送到您的主机。 (这假设您的嵌入式busybox 已使用这些命令构建。)

【讨论】:

  • tftp 会将 u-boot 加载到 RAM 吗?
  • 对不起,我不明白你的问题。
猜你喜欢
  • 1970-01-01
  • 2011-06-28
  • 2021-10-24
  • 1970-01-01
  • 2016-08-30
  • 2021-01-18
  • 2016-07-19
  • 1970-01-01
  • 2015-01-02
相关资源
最近更新 更多