2251161_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2251161_ja-JP

2251161_ja-JP

i.MX6ULLのセカンダリブートがリセット後にハングする

私はeMMCを搭載したi.MX6ULLを持っており、AN13872ガイドのセクション13.2.2に従ってセカンダリブートをテストしようとしています。「セカンダリ ブートを使用したブート イメージの作成」
次のコマンドを使用してヘッダーを作成しました。

dd if=/dev/zero of=./header.bin bs=1K count=1

次に、 hexeditツールを使用して、オフセット0x2080x00112233に変更し、 0x20C0に設定して、元の 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|
00000440

13.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

https://community.nxp.com/t5/i-MX-Security/Secondary-Redundant-boot-in-i-MX-6-7-8M-Family-of-Applica...

https://community.nxp.com/t5/i-MX-Security/BootROM-HABv4-Redundant-boot-support-is-not-triggered-whe...

しかし、解決策は見つかりませんでした。
何が間違っているのでしょうか?

Re: Secondary Boot on i.MX6ULL Hangs After Reset

さらにいくつかのテストを実行したところ、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 だと思います。ブート手順の他の部分も変更されている可能性がありますか?

Re: Secondary Boot on i.MX6ULL Hangs After Reset

あなたの説明と投稿された画像に基づくと、eMMC ユーザー パーティションが破損していますが、システムは引き続き起動できます。これは、i.MX6ULL のセカンダリ ブートに eMMC ブート パーティション (boot1 または boot 2) を使用していることを示します。専用のブート パーティションが必要な場合は、準備したイメージをそこに書き込む必要があります。もちろん、eMMC ブート パーティションは十分な大きさである必要があります。あるいは、Linux の u-boot コマンドまたは mmc ツールを使用して、ブート パーティションをユーザー パーティションに切り替えることもできます。

1.png

こちらはセカンダリブート用のコレクションです。


https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/iMX-secondary-boot-collection/ta-p/19169...


https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/i-MX8MM-SDCARD-Secondary-Boot-Demo/ta-p/...

Windows と Linux の両方で実行できるスクリプトがあり、セカンダリ ブート イメージの作成に役立ちます。

試してみましたが、とても良いです。


soc_name: imx6(imx6ファミリ全体)、imx8mq、imx8mm



Re: Secondary Boot on i.MX6ULL Hangs After Reset

奇妙なことに気付きました。次のコマンドでプライマリ イメージの 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 、この点について明確にしていただけますか?

Re: Secondary Boot on i.MX6ULL Hangs After Reset

16 進ダンプを見ると、オフセット 0x208 を 0x00112233 に変更し、0x20C を 0 に設定していることがわかりますが、firstSectorNumber フィールドが正しくない可能性があります。このフィールドは、セカンダリ イメージが始まるセクターを指す必要があります。

このテストでは、手順全体を検証するために、プライマリ U-Boot をセカンダリ U-Boot として使用しようとしていたため、 firstSectorNumber を0 に設定しました。

私の投稿の最後の 16 進ダンプでは、代わりに 2 つの異なる U-Boot イメージ (プライマリとセカンダリ) を使用して、より標準的なテストを実行しました。そのCASE、 firstSectorNumber0x2000に設定されました。これは、セカンダリ U-Boot が実際に始まるオフセットに対応します: 0x2000 * 512 (つまり、ブロック サイズ) + 1024 (つまり、MBR サイズ) = 0x400400 、投稿したリンクで説明されているとおりですが、システムはリセット後もハングしたままになります。
何か見逃しているのでしょうか?


Ps: あなたが投稿したこのコマンドは imx8 専用であり、imx6 には対応していないと思います。
mw.l 0x30390098 0x40000000

Re: Secondary Boot on i.MX6ULL Hangs After Reset

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 を再計算し、セカンダリ ブート イメージが正しいオフセットに配置されていることを確認してください。セカンダリ イメージは、プライマリ イメージが終了した後のセクター境界から開始する必要があります。

冗長ブートの実装に関する詳細は、次のコミュニティドキュメントを参照してください。

https://community.nxp.com/t5/i-MX-Security/Secondary-Redundant-boot-in-i-MX-6-7-8M-Family-of-Applica...



よろしくお願いします。

Re: Secondary Boot on i.MX6ULL Hangs After Reset
 
前述したように、セカンダリ ブートは使用パーティションだけでなくブート パーティションでも機能する必要があります。
 
eMMC ブート パーティションが十分な大きさの場合は、次の 2 つのコマンドを試して、セカンダリ ブートの flash.bin (flash_secondary_boot.bin) をブート パーティションに書き込むことができます。
 
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
 
前に提供したリンクのスクリプトを使用して、セカンダリ ブート イメージを作成CAN。
 
プライマリ イメージを完全にゼロで構成されたファイルに置き換えることで、プライマリ イメージの破損をシミュレートCANできます。
 
 

Re: Secondary Boot on i.MX6ULL Hangs After Reset

@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 が起動します。


Re: Secondary Boot on i.MX6ULL Hangs After Reset

ご説明ありがとうございます。
私の場合、前のメッセージの lsblk 出力に示されているように、Yocto が自動的に作成したと思われる 2 つのブート パーティション、「mmcblk1boot0」と「mmcblk1boot1」があります。

スクリプトによって生成されたバイナリを mmcblk1boot0 に配置する必要がありますか?
もしSOなら、mmcblk1boot1 の目的は何ですか?

Re: Secondary Boot on i.MX6ULL Hangs After Reset

コレクション全体を読むと、i.MX8QXP eMMC セカンダリ ブートの 2 つのブート パーティションが相互にバックアップされていることがわかります。ただし、i.MX8MM と iMX6 のブート パーティションは相互にバックアップされておらず、一方が独立しています。

https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/iMX-secondary-boot-collection/ta-p/19169...


https://community.nxp.com/t5/NXP-Tech-Blog/i-MX8QXP-eMMC-セカンダリブート/ba-p/1257704#M45

imx8qxp.png

Tags (1)
No ratings
Version history
Last update:
‎12-08-2025 01:31 AM
Updated by: