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 카드)의 서로 다른 두 파티션에 직접 중복 저장해 보았습니다. 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은 에 해당하고 UbootEnvA, UbootEnvB섹터 길이는 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그런 것은 지원되지 않는 것 같습니다.

누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

관련 정보