首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不擦除操作系统的情况下将新的MLO和u-boot.img写入SD卡

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

Stack Overflow用户
提问于 2020-03-26 17:35:43
回答 2查看 4.8K关注 0票数 6

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

我可以从SD卡上闪现MMC。我也可以连接到板的串行和停止在u-引导。

我不知道如何正确地将新的u引导写入SD卡。我试过几样东西

  1. 这些elinux指令用于擦除SD卡并创建一个新的可引导分区。实际上,我并没有尝试这样做,因为我想将新的u引导安装到现有的映像中。 $ echo -e "o\nn\np\n1\n\n+64M\na\n1\nt\nc\nw\n“\ sudo /dev/MYDISK;sudo /dev/MYDISK -l $ sudo挂载/dev/MYDISK /mnt $ sudo cp MLO /mnt $ sudo cp boot.img /mnt $ sudo /mnt $ sudo umount /mnt
  2. 这些数字指令是同一事物的不同版本。我试着用这种方式编写MLO和u-boot.img,而没有擦除磁盘,但是板仍然使用原始的u引导而不是新的启动。 $ sudo if=/dev/ of=${DISK} bs=1M count=10 $ sudo if=./u- of=${DISK} count=1 seek=1 bs=128k $ sudo =./u/u-boot.img of=${DISK} count=2 seek=1 bs=384k
  3. 这些超越逻辑指令有一对稍微不同的dd命令。我也试过这些,但董事会仍然坚持原来的u引导。 $ sudo dd if=MLO of=/dev/sdb bs=512 seek=256 count=256 conv=notrunc $ sudo dd如果=u-boot.img of=/dev/sdb bs=512 seek=768 count=1024 conv=notrunc $ sudo块开发-flushbufs /dev/sdb
  4. 有人建议我使用tftp为MMC编写新的u引导。我可以用同样的程序写入SD卡吗?如果是的话,我如何找到开始地址?我如何加载和编写文件?我试过搜索,但没找到我需要的东西。
  • 引导到u引导-发现现有的MLO和uboot.img启动地址-使用tftp将新MLO和uboot.img加载到内存中-将新MLO和uboot.img写到MMC中的正确位置。

附加备注

  • 理想情况下,我想写新的u引导到SD卡,并测试它不闪烁。假设beaglebone将启动SD卡u引导(而不是MMC u引导),如果您在供电时按下S2,但我不确定这是否有效。我怎么知道哪只u靴装好了?
  • 但是,我可以将MMC映像写到SD卡上,所以它也可以编写新的u引导到MMC并对其进行测试。
  • 最后,我愿意擦除SD卡,用上述方法之一编写u引导,并在必要时手动设置/写入分区。这是唯一的办法吗?

SD卡/图像

SD卡包含来自beagleboard最新图片的Debian7.92015-11-12固件映像.

这是分区表。

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-27 04:47:11

我不知道如何正确地将新的u引导写入SD卡。 ..。 SD卡包含Debian有7.9 2015-11-12固件图像来自beagleboard最新的图像。

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

AM335x SoC将首先使用原始模式检查引导映像。

因此,如果希望将MLO安装为FAT文件系统中的文件,则必须确保删除存储在原始扇区中的任何以前的MLO

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

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

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

SD卡上现有的MLO存储在扇区257 (偏移量为0x20000或128 K),其中包括一个用于其TOC (目录)的扇区和一个8字节的GP头。

SD卡上现有的u-boot.img存储在扇区769 (偏移量为0x60000或384 K)。

您可以使用超逻辑指令替换这两个图像,因为对于SD卡上已经存在的内容,seek=位移是正确的。

Digikey指令指定类似的seek=位移,但使用不同的块和计数。第一个命令还将删除MBR (并使FAT和ext文件系统不可访问)。

或者,您可以将TOC清零,这样原始模式将失败,然后ROM引导将恢复到FAT文件模式。

然后,您可以免除dd命令和扇区偏移,并使用普通的文件系统命令。

您的SD卡只有一个TOC可删除,因此一个命令就足够了:

代码语言:javascript
复制
dd if=/dev/zero bs=512 count=1 seek=256 of=/dev/sdX

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

代码语言:javascript
复制
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靴装好了?

你的意思是哪个U引导映像被执行/引导?

booted在启动时显示的版本字符串(带有构建时间戳)不会指示哪个映像已被引导吗?

但是,这个引导加载程序并不是通过提供的脚本写入MMC的,因此它实际上并不能解决这个问题。

我读到的唯一的“问题”是在你的标题中。

Clarification

虽然您可以在原始扇区或在或SD卡上作为FAT文件找到/存储,但是存储u-boot.bin映像的方式取决于U是如何配置/构建的。( MLO只是内容表和GP头的U,前面有520个字节。)

例如,BBB的默认U引导配置将构建一个SPL/MLO,它将期望u-boot.bin存储在原始扇区0x300 (如果不从零中正确计数,则存储在769 )。

即来自.config文件:

代码语言:javascript
复制
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x300

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

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

这是我哪儿都找不到的信息。

请参阅26.1.8.5 MMC/ SD CardsAM335x和AMIC110 Sitara处理器技术参考手册章节。

票数 11
EN

Stack Overflow用户

发布于 2020-03-27 20:16:24

如果您使用init-eMMC-flasher-v3.sh将SD卡闪存到MMC,则只需将mlo.img文件复制到SD卡上的/opt/backup/uboot。除了设置分区和编写rootfs之外,如果存在这些文件,脚本将使用这些文件编写MMC引导加载程序。

没有必要将新的u引导安装到SD卡上。使用SD卡引导加载程序启动板也是不必要的。

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

所以,假设SD卡驱动器是/dev/sdb

代码语言:javascript
复制
$ 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60873038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档