如何在不擦除 OS 的情况下将新的 MLO 和 u-boot.img 写入 SD 卡

How to write new MLO and u-boot.img to an SD card without erasing the OS

我有一张带有标准 Beaglebone Debian 映像的 SD 卡。我还有来自构建 u-boot 的 MLOu-boot.img 文件。我想在 SD 卡上安装新的 u-boot,然后在 Beaglebone Black 上将修改后的映像刷入 MMC。

我可以从SD卡刷入板载MMC就好了。我也可以通过串行连接到电路板并在 u-boot 中停止。

不知道怎么把新的u-boot正确写入SD卡。我已经尝试了一些东西:

  1. 这些elinux instructions用于擦除SD卡并创建一个新的bootable分区。我实际上并没有尝试这个,因为我想将新的 u-boot 安装到现有图像。

    $ echo -e "o\nn\np\n1\n\n+64M\na\n1\nt\nc\nw\n" | sudo fdisk /dev/MYDISK ; sudo fdisk /dev/MYDISK -l
    $ sudo mount /dev/MYDISK /mnt
    $ sudo cp MLO /mnt
    $ sudo cp u-boot.img  /mnt
    $ sudo sync
    $ sudo umount  /mnt
    
  2. 这些digikey instructions是同一事物的不同版本。我试过用这种方式写MLO和u-boot.img,没有擦除磁盘,但是板子仍然使用原来的u-boot而不是新的启动。

    $ sudo dd if=/dev/zero of=${DISK} bs=1M count=10
    $ sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k
    $ sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k
    
  3. 这些 beyondlogic instructions 有一对略有不同的 dd 命令。我也尝试了这些,但是板子仍然使用原来的 u-boot 启动。

    $ sudo dd if=MLO of=/dev/sdb bs=512 seek=256 count=256 conv=notrunc
    $ sudo dd if=u-boot.img of=/dev/sdb bs=512 seek=768 count=1024 conv=notrunc
    $ sudo blockdev --flushbufs /dev/sdb
    
  4. 有人建议我用tftp把新的u-boot写入MMC。我可以使用相同的程序写入 SD 卡吗?如果是这样,我如何找到起始地址?以及如何加载和写入文件?我尝试搜索,但没有找到我需要的东西。

    - boot into u-boot
    - discover the existing MLO and uboot.img start addresses
    - load the new MLO and uboot.img into RAM using tftp
    - write the new MLO and uboot.img to the correct location in MMC
    

补充说明

SD卡/图片

SD 卡包含来自 beagleboard latest images 的 Debian 7.9 2015-11-12 固件映像。

这是分区table。

Model: Generic- USB3.0 CRW -SD (scsi)
Disk /dev/sdb: 31.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  102MB   101MB   primary  fat16        boot, lba
 2      102MB   3565MB  3463MB  primary  ext4

引导分区不包含要替换的 MLO 或 u-boot.img 文件:

total 96
drwxr-xr-x 2 root root  2048 Nov 12  2015 App
-rwxr-xr-x 1 root root   288 Nov 12  2015 autorun.inf
drwxr-xr-x 4 root root  2048 Nov 12  2015 Docs
drwxr-xr-x 5 root root  2048 Nov 12  2015 Drivers
-rwxr-xr-x 1 root root    40 Nov 12  2015 ID.txt
-rwxr-xr-x 1 root root 41174 Nov 12  2015 LICENSE.txt
-rwxr-xr-x 1 root root  1008 Nov 12  2015 nfs-uEnv.txt
-rwxr-xr-x 1 root root 16838 Nov 12  2015 README.htm
-rwxr-xr-x 1 root root   428 Nov 12  2015 README.md
drwxr-xr-x 2 root root  2048 Nov 12  2015 scripts
-rwxr-xr-x 1 root root 16838 Nov 12  2015 START.htm
-rwxr-xr-x 1 root root  1179 Nov 12  2015 uEnv.txt

What I don't know how to do is write the new u-boot to the SD card correctly.
...
The SD card contains the Debian u have7.9 2015-11-12 firmware image from beagleboard latest images.

问题的症结在于 AM335x SoC 的 ROM 引导代码能够以原始扇区模式从 SD 卡(或 eMMC)读取 MLO 或者在 FAT 文件模式下。此外,在原始模式下,有四个可能的区域来定位引导映像,但当介质的第一个扇区包含 MBR 时,则只有三个区域。

AM335x SoC 将首先使用原始模式检查引导映像。
因此,如果您想将 MLO 作为文件安装在 FAT 文件系统中,则必须确保存储在原始扇区中的任何先前 MLO已删除。

IOW 有多种方法可以将 MLO 存储在 eMMC/SD 卡上,检查它们的顺序决定了使用哪个映像启动。 FAT 文件将是引导顺序中的最后一个映像。


您拥有的带有 Debian 映像的 SD 卡将 MLOu-boot.img 作为原始扇区 (即注意 FAT 文件系统从扇区 2049 开始,偏移量为 0x100000,因此在第一个分区之前有未分配的扇区)。

[请注意,扇区编号从 1 开始,而不是 0。]

您 SD 卡上现有的 MLO 存储在扇区 257(偏移量 0x20000 或 128K),其中包括一个用于其 TOC(Table 目录)的扇区和一个 eight-byte GP header.
SD 卡上现有的 u-boot.img 存储在扇区 769(偏移量 0x60000 或 384K)。

您可以使用 beyondlogic 指令替换这两个图像,因为 seek= 位移对于您的 SD 卡上已有的内容是正确的。
Digikey 指令指定类似的 seek= 位移,但使用不同的块大小和计数。第一个命令还将删除 MBR(并使 FAT 和 ext 文件系统无法访问)。

或者您可以 zero-out TOC,这样原始模式将失败,然后 ROM 引导将恢复到 FAT 文件模式。
然后您可以省去 dd 命令和扇区偏移量,并使用普通的文件系统命令。

你的SD卡只有一个TOC需要清除,所以一条命令就可以了:

dd if=/dev/zero bs=512 count=1 seek=256 of=/dev/sdX

如果您不知道图像的位置,则需要清除其他可能的区域:

dd if=/dev/zero bs=512 count=1 seek=512 of=/dev/sdX
dd if=/dev/zero bs=512 count=1 seek=768 of=/dev/sdX

How can I tell which u-boot is loaded?

你是说哪个 U-Boot 图片是 executed/booted?
U-Boot 显示在 start-up 上的版本字符串(带有构建时间戳)不会指示哪个映像已启动吗?


However, this bootloader isn't written to the MMC by the provided script, so it doesn't actually solve the problem.

我读到的唯一"problem"在你的标题里。


澄清

虽然您可以 locate/store MLO 在原始扇区或作为 eMMC 或 SD 卡上的 FAT 文件,您存储 u-boot.bin 图像由 U-Boot SPL 的 configured/built 决定。 (MLO 只是 U-Boot SPL 前面有 520 字节的 Table 内容和 GP header。)
例如,default U-Boot configuration for the BBB 将构建一个 SPL/MLO,期望 u-boot.bin 存储在原始扇区 0x300(或 769,如果不正确)从零开始计数)。
IE。来自 .config 文件:

CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x300

这似乎与您正在使用的 Debian SD 卡映像的配置相同。

如果要将u-boot.bin图像作为文件存储在SD卡的FAT文件系统中,则必须重新配置U-Boot SPL(即 make menuconfig)并重建以获得新的 MLO


This is the information that I couldn't find anywhere.

请参阅 AM335x and AMIC110 Sitara Processors Technical Reference Manual 的第 26.1.8.5 MMC/ SD Cards 章。

如果您使用init-eMMC-flasher-v3.sh将SD卡刷入MMC,您只需将MLO和u-boot.img文件复制到SD卡上的/opt/backup/uboot即可。除了设置分区和写入 rootfs 之外,脚本还使用这些文件写入 MMC 引导加载程序(如果存在)。

不需要将新的u-boot安装到SD卡上。也没有必要使用 SD 卡引导加载程序引导电路板。

您可能需要通过 运行 git pull 在 /opt/scripts 中更新 SD 卡上的刷机脚本。

所以,假设SD卡驱动为/dev/sdb:

$ mount /dev/sdb2 /mnt/sd
$ cp MLO /mnt/sd/opt/backup/uboot
$ cp uboot.img /mnt/sd/opt/backup/uboot
$ cd /mnt/sd/opt/scripts
$ git pull
$ umount /mnt/sd

当然还有编辑 uEnv.txt 以启用 eMMC 闪存。

然后就可以将SD卡插入beaglebone并开机了。新的bootloader和SD卡rootfs都会写入MMC