7

I have a problem. My system is an embedded Linux plaform. I am connecting to my board using serial port and I can access U-Boot.

I need to extract the complete firmware residing in flash through the console or through Ethernet. It looks like downloading is easy using TFTP or serial (Kermit, etc), but uploading it to the host PC for backup isn't obvious.

Does anyone know how this can be done?

sawdust
  • 16,103
  • 3
  • 40
  • 50
user3396423
  • 73
  • 1
  • 1
  • 4
  • The correct answer depends on the version of U-Boot that you are using, whether the kernel can see the flash at all, and if `mtd-utils` are installed on the root filesystem. For example, if U-Boot loads the root filesystem from flash into a RAMdisk and the kernel does not have the flash partitioning information, either because it is not compiled in or is not in the dtb or is not provided on the kernel commandline, then you can't copy the flash from userspace, and possibly not from U-Boot. – Jonathan Ben-Avraham Mar 08 '14 at 23:14
  • u-boot has the nand flash command that seems to dump 2k of flash. Is there any tool that can run this command and download the complete nand flash (even if slow)? Is this a byte per byte copy of the flash? – user3396423 Mar 09 '14 at 23:14

2 Answers2

5

Assuming that you are using NAND flash and U-Boot 2013.07 or similar:

  1. Use the nand info command to see the NAND device names, sizes and erase block sizes for each NAND device that U-Boot detects
  2. Use the nand read command to read from the NAND into RAM. How much NAND to read into RAM depends on the RAM size
  3. If you have an SD (MMC) drive you can write from RAM to SD using the mmc write command
  4. If you have a USB device you can use start usb to scan the USB for a mass storage or "ethernet" (i.e. OTG) device
  5. If start usb detects a mass storage device, you can write from RAM to the mass storage device using the usb write command
  6. There is no way to transfer from RAM to a USB or Ethernet network connection
  7. Use the md command to hex dump arbitrary size block of memory to the serial line, then use some program to translate the ASCII hex back into binary
Jonathan Ben-Avraham
  • 4,615
  • 2
  • 34
  • 37
2

If you're willing to rebuild uboot and reflash your board, you can enable the tftpput command with the CONFIG_CMD_TFTPPUT option. (Assuming a recent version of uboot.)

Assuming not, within the embedded Linux, you can access your flash through /dev/mtd* (cat /proc/mtd to see the partitions). You can use dd to copy a partition to a ramdisk file, then use cat to combine the files into a single image, and the use ftpput to send it to your host. (This assumes that your embedded busybox has been built with these commands.)

DoxyLover
  • 3,366
  • 1
  • 15
  • 19