使用 MMC 中的 U-Boot 和冗余 U-Boot 环境为 RPi 创建 SD 卡映像

使用 MMC 中的 U-Boot 和冗余 U-Boot 环境为 RPi 创建 SD 卡映像

我对嵌入式 Linux 相当陌生,目前正在使用 Raspberry Pi 3B+ 的设备上工作。操作系统是使用 Buildroot 构建的,并且可以使用 U-Boot (v2019.01) 通过双复制策略升级设备,swupdate但目前升级过程尚未完全安全,因为 u-boot 环境是不是多余的,它作为单个文件存储在 rpi 启动 FAT 分区中。

为了让事情更安全,我尝试将 u-boot 环境直接冗余地存储在两个不同分区的 mmc 内存(SD 卡)中。要创建我使用的 SD 卡映像genimage和 cfg 文件,如下所示:

image boot.vfat {
  vfat {
    files = {
      "bcm2710-rpi-3-b.dtb",
      "bcm2710-rpi-3-b-plus.dtb",
      "bcm2710-rpi-cm3.dtb",
      "rpi-firmware/bootcode.bin",
      "rpi-firmware/cmdline.txt",
      "rpi-firmware/config.txt",
      "rpi-firmware/fixup.dat",
      "rpi-firmware/start.elf",
      "rpi-firmware/overlays",
      "zImage",
      "u-boot.bin",
    }
  }
  size = 16777216
}


image user-data.ext4 {
  ext4 {
  }

  size = 64M
  mountpoint = "user-data"
}


image sdcard.img {
  hdimage {
  }

  partition boot {
    partition-type = 0xC
    bootable = "true"
    image = "boot.vfat"
  }

  partition UbootEnvA {
    partition-type = 0xA3
    image = "uboot-env.bin"
    size = 16384
  }

  partition UbootEnvB {
    partition-type = 0xA3
    image = "uboot-env.bin"
    size = 16384
  }

  partition rootfsA {
    partition-type = 0x83
    image = "rootfs.ext4"
  }

  partition rootfsB {
    partition-type = 0x83
    image = "rootfs.ext4"
  }

  partition film-dev-data {
    partition-type = 0x83
    image = "user-data.ext4"
  }
}

分区UbootEnvAUbootEnvB使用使用创建的环境映像mkenvimage

当设备启动时,我会收到通常的Loading Environment from MMC... *** Warning - bad CRC, using default environment消息,如果我mmc part在 uboot shell 中使用该命令,我会收到以下列表:

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors UUID        Type
  1 1           32768       00000000-01 0c Boot
  2 32769       32          00000000-02 a3
  3 32801       32          00000000-03 a3
  4 32833       950275      00000000-04 0f Extd
  5 32834       409600      00000000-05 83
  6 442435      409600      00000000-06 83
  7 852036      131072      00000000-07 83

分区 2 和 3 对应于UbootEnvAUbootEnvB,扇区长度为 512 字节,因此我认为 U-Boot 源代码中使用的环境的偏移量可以计算为:

32769 * 512 = 16777728 (for the primary one)
32801 * 512 = 16794112 (for the redundant one)

于是我通过打补丁的方式在U-boot源代码中添加了如下定义uboot-2019.01/include/configs/rpi.h,然后重新编译:

#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_ENV_OFFSET 16777728
#define CONFIG_ENV_OFFSET_REDUND 16794112

但此后,当 U-Boot 尝试加载环境时,我仍然遇到相同的“Bad CRC”错误。

我显然在这里遗漏了一些东西,因为我不是嵌入式 Linux 专家。我不确定它是否在genimagecfg 文件中、在 U-Boot 环境偏移中或在我计算偏移的方式中。

我真的希望我可以在 FAT 启动分区中使用冗余环境,但在查看该uboot-2019.01/env/fat.c文件后,似乎不支持这样的事情。

有人能指出我正确的方向吗?

相关内容