我有一张SD卡,上面有一张标准的Beaglebone Debian图像。我还有构建u-boot中的MLO
和u-boot.img
文件。我想在SD卡上安装新的u引导,然后将修改后的图像闪存到Beaglebone Black上的MMC。
我可以闪板载MMC从SD卡刚刚好。我也可以通过串行连接到主板,并在u引导中停止。
我不知道如何将新的u-boot正确写入SD卡。我尝试了一些东西:
-
这些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
-
这些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
-
这些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
-
有人建议我使用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卡将MLO和u-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。