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環境が重複していないため、アップグレードプロセスはまだ完全に安全ではありません。 FATパーティションのrpiブートに単一のファイルとして保存されます。

セキュリティを強化するために、u-boot環境をmmcメモリ(SDカード)の2つの異なるパーティションに直接重複して保存しました。 SDカードイメージとcfgファイルを作成するには、genimage次のように使用しました。

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"
  }
}

を使用して作成された環境イメージをパーティション化してUbootEnvA使用します。UbootEnvBmkenvimage

デバイスが起動すると一般的なLoading Environment from MMC... *** Warning - bad CRC, using default environmentメッセージが表示され、uboot シェルでコマンドを使用すると次のリストがmmc part表示されます。

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そのようなものはサポートされていないようです。

誰もが正しい方向に私を指すことができますか?

関連情報