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



我有一张SD卡,上面有一张标准的Beaglebone Debian图像。我还有构建u-boot中的MLOu-boot.img文件。我想在SD卡上安装新的u引导,然后将修改后的图像闪存到Beaglebone Black上的MMC。

我可以闪板载MMC从SD卡刚刚好。我也可以通过串行连接到主板,并在u引导中停止。

我不知道如何将新的u-boot正确写入SD卡。我尝试了一些东西

  1. 这些elinux指令用于擦除SD卡并创建新的可引导分区。我实际上并没有尝试这个,因为我想将新的u-boot安装到现有的映像中。

    $ echo -e "onnnpn1nn+64Mnan1ntncnwn" | 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指令是同一事物的不同版本。我试着用这种方式编写MLO和u-boot.img,但没有擦除磁盘,但主板仍然使用原始的u-boot而不是新的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指令有一对略有不同的dd命令。我也试过这些,但主板仍然使用原来的u型引导。

    $ 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
    

附加说明

  • 理想情况下,我想将新的u-boot写入SD卡并在不闪烁的情况下进行测试。据推测,如果你在供电时按下S2,beaglebone会启动SD卡u引导(而不是MMC u引导),但我不确定这是否有效如何判断加载了哪个u-boot
  • 然而,我可以将MMC映像写入SD卡,因此也可以将新的u-boot写入MMC并进行测试
  • 最后,我愿意擦除SD卡,用上面的方法之一写u-boot,如果必须的话,手动设置/写分区。这是唯一的方法吗

SD卡/图像

SD卡包含beagleboard最新图像中的Debian 7.9 2015-11-12固件图像。

这是分区表。

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

我不知道如何将新的u-boot正确写入SD卡

SD卡包含Debian u have7.9 2015-11-12 beagleboard最新图像中的固件图像。

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

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

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


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

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

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

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

或者,你可以将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

如何判断加载了哪个u-boot?

您的意思是执行/引导哪个U-Boot映像
U-Boot在启动时显示的版本字符串(带有构建时间戳)难道不会指示哪个映像已经启动吗?


然而,这个引导加载程序并不是由所提供的脚本写入MMC的,所以它实际上并没有解决问题。

我读到的唯一"问题">在你的标题中有说明。


澄清

尽管您可以在原始扇区或eMMC或SD卡上以FAT文件的形式定位/存储MLO,但存储u-boot.bin映像的位置取决于u-boot SPL的配置/构建方式。(MLO只是U-Boot SPL,前面有520个字节用于目录和GP标头。)
例如,BBB的默认U-Boot配置将构建SPL/MLO,该SPL/MLO将期望U-Boot.bin存储在原始扇区0x300(或769,如果正确地不从零开始计数)
I.E.来自.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


这是我在任何地方都找不到的信息。

请参阅AM335x和AMIC110 Sitara处理器技术参考手册的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引导安装到SD卡。也没有必要使用SD卡引导加载程序引导板。

您可能需要通过在/opt/scripts中运行git pull来更新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并打开电源。新的引导程序和SD卡rootfs都将写入MMC。

最新更新