如何在不擦除 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 的 MLO
和 u-boot.img
文件。我想在 SD 卡上安装新的 u-boot,然后在 Beaglebone Black 上将修改后的映像刷入 MMC。
我可以从SD卡刷入板载MMC就好了。我也可以通过串行连接到电路板并在 u-boot 中停止。
不知道怎么把新的u-boot正确写入SD卡。我已经尝试了一些东西:
这些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
这些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
这些 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
有人建议我用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-boot(而不是 MMC u-boot),但我不确定这是否有效。 如何判断加载了哪个 u-boot?
- 不过,我可以将MMC镜像写入SD卡,所以将新的u-boot写入MMC进行测试也可以。
- 最后,我愿意擦除 SD 卡,使用上述方法之一写入 u-boot,并在必要时手动 setup/write 分区。这是唯一的方法吗?
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 卡将 MLO 和 u-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
我有一张带有标准 Beaglebone Debian 映像的 SD 卡。我还有来自构建 u-boot 的 MLO
和 u-boot.img
文件。我想在 SD 卡上安装新的 u-boot,然后在 Beaglebone Black 上将修改后的映像刷入 MMC。
我可以从SD卡刷入板载MMC就好了。我也可以通过串行连接到电路板并在 u-boot 中停止。
不知道怎么把新的u-boot正确写入SD卡。我已经尝试了一些东西:
这些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
这些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
这些 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
有人建议我用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-boot(而不是 MMC u-boot),但我不确定这是否有效。 如何判断加载了哪个 u-boot?
- 不过,我可以将MMC镜像写入SD卡,所以将新的u-boot写入MMC进行测试也可以。
- 最后,我愿意擦除 SD 卡,使用上述方法之一写入 u-boot,并在必要时手动 setup/write 分区。这是唯一的方法吗?
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 卡将 MLO 和 u-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