私はeMMCを搭載したi.MX6ULLを持っており、AN13872ガイドのセクション13.2.2に従ってセカンダリブートをテストしようとしています。「セカンダリ ブートを使用したブート イメージの作成」 。
次のコマンドを使用してヘッダーを作成しました。
dd if=/dev/zero of=./header.bin bs=1K count=1次に、 hexeditツールを使用して、オフセット0x208を0x00112233に変更し、 0x20Cを0に設定して、元の U-Boot がテスト目的でセカンダリ ブート イメージとして起動するSOにしました。
これは 16 進ダンプです:
$ hexdump -C header.bin
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200 00 00 00 00 00 00 00 00 33 22 11 00 00 00 00 00 |........3"......|
00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400次に、ヘッダーをシステムの U-Boot と連結しました。
cat header.bin u-boot-tagged.imx > u-boot-primary-secondary.imx結果のファイルを SCP 経由でボードにコピーしました。
最後に、i.MX6 内部から、次のコマンドを使用してイメージを eMMC にフラッシュしました。
root@imx6ull:~# dd if=./u-boot-primary-secondary.imx of=/dev/mmcblk1 bs=512 skip=1 seek=1結果の 16 進ダンプは次のとおりです。
root@imx6ull:~# hexdump -C /dev/mmcblk1 -n 1088
00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 2a 4a 6c 07 00 00 80 00 |........*Jl.....|
000001c0 01 40 0c 03 42 9f 00 20 00 00 e2 af 00 00 00 00 |.@..B.. ........|
000001d0 41 c0 83 03 e0 ff 00 e0 00 00 3e 70 1a 00 00 00 |A.........>p....|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200 00 00 00 00 00 00 00 00 33 22 11 00 00 00 00 00 |........3"......|
00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...|
00000410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............|
00000420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 f0 40 |...............@|
00000430 cc 01 ec 04 02 0c 40 04 00 00 00 00 02 0c 40 68 |......@.......@h|
0000044013.2.3節で説明したように、U-Bootからのセカンダリブートをテストするコマンドを実行すると、次のような結果が出ます:
Hit any key to stop autoboot: 0
=> mw.l 20D8044 40000000
=> md.l 20D8044 1
020d8044: 40000000 ...@
=> reset
resetting ...しかし、この時点でシステムはハングします。
同じ U-Boot を 2 回連結し、それに応じてオフセット0x20Cの値を調整してみましたが、結果は変わりませんでした。これはこのテストの結果の 16 進ダンプです。
user@machine:~/linux-maker$ hexdump -C swu_singlecopy_rescue_imx6ull_emmc_20251128.sdcard -n 1072
00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 4e 58 99 cc 00 00 00 03 |........NX......|
000001c0 e0 ff 0c 03 e0 ff 00 20 03 00 00 c0 03 00 00 03 |....... ........|
000001d0 e0 ff 83 03 e0 ff 00 e0 06 00 00 40 1f 00 00 00 |...........@....|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200 00 00 00 00 00 00 00 00 33 22 11 00 00 20 00 00 |........3"... ..|
00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...|
00000410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............|
00000420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 e8 40 |...............@|
00000430
user@machine:~/linux-maker$ hexdump -C swu_singlecopy_rescue_imx6ull_emmc_20251128.sdcard -n 1072 -s 0x400000
00400000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00400400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...|
00400410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............|
00400420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 e8 40 |...............@|
00400430
以下の投稿を検索して読みました。
https://community.nxp.com/t5/i-MX-Processors/iMX6SX-Redundant-Boot/mp/715959
しかし、解決策は見つかりませんでした。
何が間違っているのでしょうか?
さらにいくつかのテストを実行したところ、i.MX6ULL が mmcblk1boot0 をプライマリ ブート パーティションとして使用していることがわかりました。実際、このパーティションを破損させようとすると、システムは起動に失敗します。
パーティションの内容は次のとおりです。
root@imx6ull:~# hexdump -C /dev/mmcblk1boot0 -n 4096
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...|
00000410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............|
00000420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 e8 40 |...............@|
00000430 cc 01 e4 04 02 0c 40 68 ff ff ff ff 02 0c 40 6c |......@h......@l|
00000440 ff ff ff ff 02 0c 40 70 ff ff ff ff 02 0c 40 74 |......@p......@t|
00000450 ff ff ff ff 02 0c 40 78 ff ff ff ff 02 0c 40 7c |......@x......@||
00000460 ff ff ff ff 02 0c 40 80 ff ff ff ff 02 0e 04 b4 |......@.........|
00000470 00 0c 00 00 02 0e 04 ac 00 00 00 00 02 0e 02 7c |...............||
00000480 00 00 00 30 02 0e 02 50 00 00 00 30 02 0e 02 4c |...0...P...0...L|
00000490 00 00 00 30 02 0e 04 90 00 00 00 30 02 0e 02 88 |...0.......0....|この領域にセカンダリベクターテーブル (SVT) を書き込もうとすると、システムが起動しなくなります。SO、SVT はどこに記述すればよいのでしょうか?
私はいつも uuu を使用してシステムをフラッシュしてきました。特に、イメージ全体をフラッシュする必要がある場合は、次のようにします。
uuu -b emmc_all U-Boot のみを更新する必要がある場合は、次のようにします。
uuu -b emmc mmcblk1boot0 パーティションを作成して書き込むのは uuu だと思います。ブート手順の他の部分も変更されている可能性がありますか?
あなたの説明と投稿された画像に基づくと、eMMC ユーザー パーティションが破損していますが、システムは引き続き起動できます。これは、i.MX6ULL のセカンダリ ブートに eMMC ブート パーティション (boot1 または boot 2) を使用していることを示します。専用のブート パーティションが必要な場合は、準備したイメージをそこに書き込む必要があります。もちろん、eMMC ブート パーティションは十分な大きさである必要があります。あるいは、Linux の u-boot コマンドまたは mmc ツールを使用して、ブート パーティションをユーザー パーティションに切り替えることもできます。
こちらはセカンダリブート用のコレクションです。
Windows と Linux の両方で実行できるスクリプトがあり、セカンダリ ブート イメージの作成に役立ちます。
試してみましたが、とても良いです。
soc_name: imx6(imx6ファミリ全体)、imx8mq、imx8mm
奇妙なことに気付きました。次のコマンドでプライマリ イメージの IVT を破損させようとすると、
sudo dd if=/dev/zero of=/dev/mmcblk1 bs=1 seek=1024 count=32 && syncセカンダリ U-Boot がなくてもシステムは起動します。
私が持っている mmc パーティションは次のとおりです。
root@imx6ull:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk1 179:0 0 58.2G 0 disk
|-mmcblk1p1 179:1 0 120M 0 part /boot
`-mmcblk1p2 179:2 0 1000M 0 part /
mmcblk1boot0 179:8 0 4M 1 disk
mmcblk1boot1 179:16 0 4M 1 disk U-Boot バイナリも mmcblk1boot0 に書き込まれているようです。
システムが実際に mmcblk1boot0 に保存されている U-Boot を使用していて、そこに SIT とセカンダリ U-Boot を書き込む必要がある可能性はありますか?
@Bio_TICFSL 、この点について明確にしていただけますか?
16 進ダンプを見ると、オフセット 0x208 を 0x00112233 に変更し、0x20C を 0 に設定していることがわかりますが、firstSectorNumber フィールドが正しくない可能性があります。このフィールドは、セカンダリ イメージが始まるセクターを指す必要があります。
このテストでは、手順全体を検証するために、プライマリ U-Boot をセカンダリ U-Boot として使用しようとしていたため、 firstSectorNumber を0 に設定しました。
私の投稿の最後の 16 進ダンプでは、代わりに 2 つの異なる U-Boot イメージ (プライマリとセカンダリ) を使用して、より標準的なテストを実行しました。そのCASE、 firstSectorNumberは0x2000に設定されました。これは、セカンダリ U-Boot が実際に始まるオフセットに対応します: 0x2000 * 512 (つまり、ブロック サイズ) + 1024 (つまり、MBR サイズ) = 0x400400 、投稿したリンクで説明されているとおりですが、システムはリセット後もハングしたままになります。
何か見逃しているのでしょうか?
Ps: あなたが投稿したこのコマンドは imx8 専用であり、imx6 には対応していないと思います。
mw.l 0x30390098 0x40000000
Hello
この問題は、セカンダリ イメージ テーブル (SIT) 構成に関係しているようです。eMMC を使用して i.MX6ULL の冗長ブートを実装する場合、SIT の firstSectorNumber フィールドをプライマリ ブート イメージのサイズに応じて正しく設定する必要があります。
適切なセカンダリブートの実装:
1. SIT に以下の重要な値があることを確認します。
- タグ = 0x00112233 (正しく設定されています)
- firstSectorNumber = プライマリイメージのアラインサイズ/512バイト
- すべての予約フィールドが適切に設定されていることを確認する
2. セカンダリ イメージが 0x1000 境界でプライマリ イメージの後に正しく配置されていることを確認します。
3.イメージをフラッシュした後、次のコマンドを使用して PERSIST_SECONDARY_BOOT フラグを設定します。
「」
mw.l 0x30390098 0x40000000
「」
16 進ダンプを見ると、オフセット 0x208 を 0x00112233 に変更し、0x20C を 0 に設定していることがわかりますが、firstSectorNumber フィールドが正しくない可能性があります。このフィールドは、セカンダリ イメージが始まるセクターを指す必要があります。
プライマリ U-Boot イメージのサイズ (適切に調整) に基づいて firstSectorNumber を再計算し、セカンダリ ブート イメージが正しいオフセットに配置されていることを確認してください。セカンダリ イメージは、プライマリ イメージが終了した後のセクター境界から開始する必要があります。
冗長ブートの実装に関する詳細は、次のコミュニティドキュメントを参照してください。
よろしくお願いします。
uuu emmc uuu emmc [flash_secondary_boot.bin] 注: ここでのflash.binは通常使用するプライマリブートイメージのみです。uuuヘルプを確認してください。
uuu [-d -m -v -bmap -no-bmap] -b[run] arg...
Run Built-in scripts
emmc burn boot loader to eMMC boot partition
arg0: _flash.bin bootloader
arg1: _image[Optional] image burn to emmc, default is the same as bootloader @kawateb265 さんのご回答のおかげで、ようやく問題を解決できました。imx6 は boot0 パーティションから起動していました。ユーザー パーティションから起動するには、u-boot で次のコマンドを実行する必要がありました。
=> mmc partconf 1 1 7 0
EXT_CSD[179], PARTITION_CONFIG:
BOOT_ACK: 0x1
BOOT_PARTITION_ENABLE: 0x7
PARTITION_ACCESS: 0x0
ここで '0x7' はユーザー パーティションを有効にします。説明は次のとおりです: https://docs.u-boot.org/en/v2025.01/usage/cmd/mmc.html#:~:text=0x7,boot
この変更を適用すると、「md.l 20D8044 1」によるテストは正常に動作し、リセット コマンド後にセカンダリ U-Boot が起動します。
ご説明ありがとうございます。
私の場合、前のメッセージの lsblk 出力に示されているように、Yocto が自動的に作成したと思われる 2 つのブート パーティション、「mmcblk1boot0」と「mmcblk1boot1」があります。
スクリプトによって生成されたバイナリを mmcblk1boot0 に配置する必要がありますか?
もしSOなら、mmcblk1boot1 の目的は何ですか?
コレクション全体を読むと、i.MX8QXP eMMC セカンダリ ブートの 2 つのブート パーティションが相互にバックアップされていることがわかります。ただし、i.MX8MM と iMX6 のブート パーティションは相互にバックアップされておらず、一方が独立しています。
https://community.nxp.com/t5/NXP-Tech-Blog/i-MX8QXP-eMMC-セカンダリブート/ba-p/1257704#M45