2380426_ja-JP

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

2380426_ja-JP

2380426_ja-JP

Zephyr 3.5.0環境下で、i.MX RT1020のMCUbootイメージのスワップが再起動時にサイレントエラーで失敗する。(FlexSPI/RAMFUNCの問題)
私は、 Zephyr RTOSバージョン3.5.0 が動作する MIMXRT1020-EVK ボード上で、 MCUboot MCUmgr/SMP UDPトランスポートスタック を使用して、マルチイメージOTAファームウェアアップデートパイプラインを実装しています。Sysbuild経由。
ネットワーク接続、アップロード、状態書き込みの各セグメントは問題なく動作しているにもかかわらず、 MCUbootは再起動時にイメージスワップ操作を完全にスキップ/拒否し、目に見えるエラーログを表示することなく、古いスロット0のイメージにそのまま戻ってしまう。
私はIntercreateのsmpmgrスクリプトを使用して、UDP経由で署名付きアプリケーションアップデートを送信しています。OSリセットをトリガーする直前のフラッシュテーブルのスナップショットクエリは、セカンダリスロットが適切に有効化され、フラグが付けられていることを示しています。

ImageState( slot=0, version='1.0.0', hash=HashBytes('00ECFDFD...'), bootable=True, pending=False, confirmed=True, active=True, permanent=False )

ImageState( slot=1, version='1.0.0', hash=HashBytes('2FD1F2FC...'), bootable=True, pending=True, confirmed=False, active=False, permanent=True )

リモートリセットコマンドを実行すると、ボードは正常にシステム再起動をトリガーしますが、MCUbootはセクターシャッフリングや遅延処理を実行しません。スロット 0 のまったく同じ HashBytes 00ECFDFD... に即座に起動します。

Flashレイアウト設定(.overlay)

&flexspi {
ステータス = "正常";
reg = <0x402a8000 0x4000>, <0x60000000 DT_SIZE_M(8)>;

is25wp064: is25wp064@0 {
compatible = "nxp,imx-flexspi-nor";
サイズ = <67108864>;
reg = <0>;
spi-max-frequency = <133000000>;
ステータス = "正常";
jedec-id = [9d 70 17];
消去ブロックサイズ = <4096>;
書き込みブロックサイズ = <1>;

パーティション {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;

/* ステップ 1: ベースボード dts から競合するすべてのストックパーティションを削除します */
/delete-node/ partition@0;
/delete-node/ partition@10000;
/delete-node/ partition@310000;
/delete-node/ partition@610000;
/delete-node/ partition@630000;

ブートパーティション: パーティション@0 {
ラベル = "mcuboot";
reg = <0x00000000 DT_SIZE_K(64)>;
};
/* slot0 のサイズを 3.5MB から 3.4MB (0x366000) に縮小しました */
slot0_partition: partition@10000 {
ラベル = "image-0";
reg = <0x00010000 0x366000>; /* 3.5MB */
};
slot1_partition: partition@390000 {
ラベル = "画像-1";
reg = <0x00376000 0x366000>; /* 3.5MB */
};
スクラッチパーティション: パーティション@710000 {
ラベル = "image-scratch";
reg = <0x00710000 DT_SIZE_K(128)>;
};
ストレージパーティション: パーティション@730000 {
ラベル = "ストレージ";
reg = <0x00730000 DT_SIZE_K(832)>;
};
};
};
};

app/prj.conf
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_XIP=y
CONFIG_MCUBOOT_BOOTLOADER_MODE_SWAP_WITHOUT_SCRATCH=y
CONFIG_USE_DT_CODE_PARTITION=y

app/sysbuild/mcuboot.conf

CONFIG_XIP=y
CONFIG_BOOT_SWAP_USING_MOVE=y
CONFIG_BOOT_SIGNATURE_TYPE_RSA=y
CONFIG_BOOT_SIGNATURE_KEY_FILE="bootloader/mcuboot/root-rsa-2048.pem"
CONFIG_BOOT_VALIDATE_SLOT0=y

# Zephyr 3.5.0 用の RAM 機能分離フラグの試行
CONFIG_FLEXSPI_CONFIG_IN_RAM=y

NXP FlexSPIドライバがフラッシュチャネルからコマンドを実行する際に、フラッシュブロックへの書き込みや消去を安全に行えないという実行インプレース(XIP)制約に引っかかっている可能性があり、その結果、MCUbootがシステムを保護するために起動時にトランザクションを安全に破棄していると考えられます。
しかし、最新のNXP RAM機能フラグ(CONFIG_CODE_FLEXSPI_RAMFUNCやCONFIG_MCUX_CODE_QUICK_ACCESS_RAMFUNCなど)のいくつかは、「未定義シンボル」コンパイラ例外または依存関係警告をスローします。



  • Zephyr 3.5.0では、MCUboot子イメージコンテキストにおいて、すべてのフラッシュドライバ操作フックを内部SRAM(ITCM/SRAM)に安全に強制的に移行させるために必要なKconfig変数は具体的に何ですか?
  • RT1020固有の隠れたハードウェアアライメント制限、FlexSPIルックアップテーブル(LUT)構成、または書き込みブロックサイズによって、MCUbootがパーマネント=Trueとマークされたセカンダリイメージスロットをサイレントにスキップしてしまうことはありますか?
Re: i.MX RT1020 MCUboot image swap failing silently on reboot under Zephyr 3.5.0 (FlexSPI/RAMFUNC is

こんにちは、 @Deepa-khatri2588 さん

NXP MIMXRTシリーズにご関心をお寄せいただきありがとうございます!

KConfigファイルとDTSファイルを確認しましたが、いくつか問題があるようです。例えば、`CONFIG_FLEXSPI_CONFIG_IN_RAM` と `CONFIG_CODE_FLEXSPI_RAMFUNC` は Zephyr 3.5.0 には存在しません。

KConfigの設定については、こちらの公式ドキュメントをご確認ください。

https://docs.zephyrproject.org/3.5.0/kconfig.html

以下のKConfig設定に注意することをお勧めします。

CONFIG_CODE_FLEXSPI=y
CONFIG_XIP=y

CONFIG_FLASH_MCUX_FLEXSPI_XIP=y

CONFIG_FLASH_MCUX_FLEXSPI_XIP_MEM_ITCM=y

CONFIG_FLASH_MCUX_FLEXSPI_NOR_WRITE_BUFFER=y

CONFIG_FLASH_LOG_LEVEL_OFF=y
CONFIG_MEMC_LOG_LEVEL_OFF=y

CONFIG_MEMC=y

DTSでは、ノードIDとオフセットアドレスが一致しないという問題があり、これも確認する必要があるかもしれません。

slot1_partition: partition@390000 {

 ラベル = "画像-1";

reg = < 0x00376000 0x366000>;

 };


よろしくお願いします、
ギャビン


Re: i.MX RT1020 MCUboot image swap failing silently on reboot under Zephyr 3.5.0 (FlexSPI/RAMFUNC is

ご返信ありがとうございます
mimxrt1020_evk.overlayファイル内のノードアドレス/オフセットラベルの不一致を修正し、3.4MBパーティション全体で構造的な整合性が完全に保たれるようにしました。

boot_partition: partition@0 {
                label = "mcuboot";
                reg = <0x00000000 DT_SIZE_K(64)>;
            };
             /* Reduced slot0 to 3.4MB (0x366000) instead of 3.4MB */
            slot0_partition: partition@10000 {
                label = "image-0";
                reg = <0x00010000 0x366000>;      /* 3.5MB */
            };
            slot1_partition: partition@376000 {
                label = "image-1";
                reg = <0x00376000 0x366000>;      /* 3.5MB */
            };
            scratch_partition: partition@6dc000 {
                label = "image-scratch";
                reg = <0x006DC000 DT_SIZE_K(128)>;
            };
            storage_partition: partition@6fc000 {
                label = "storage";
                reg = <0x006FC000 DT_SIZE_K(1040)>;
            };

おすすめいただいたマクロも追加しました。

# MCUboot子イメージのスワップスクラッチモードを有効にする
#CONFIG_BOOT_SWAP_USING_SCRATCH=y
#CONFIG_BOOT_SWAP_USING_MOVE=y
CONFIG_BOOT_SWAP_USING_SCRATCH =y
# メインのMCUbootバイナリをフラッシュメモリから実行し続ける
CONFIG_XIP =y
# MCUbootにプロジェクトのRSA署名キーを使用してビルドするように明示的に強制する
CONFIG_BOOT_SIGNATURE_TYPE_RSA =y
CONFIG_BOOT_SIGNATURE_KEY_FILE = "bootloader/mcuboot/root-rsa-2048.pem"
# MCUbootに対し、起動時に物理的に検証チェックを実行するように指示する
CONFIG_BOOT_VALIDATE_SLOT0 =y

# 起動時にイメージ検証チェックを有効にする
CONFIG_IMG_ENABLE_IMAGE_CHECK =y

# デバッグ中に予期しないセーフティ再起動を防ぐ
CONFIG_WATCHDOG =n

# NXP i.MX RTにとって重要: マスタークロック制御ツリードライバを強制する
CONFIG_CLOCK_CONTROL =y
CONFIG_CLOCK_CONTROL_MCUX_CCM =y

# MCUbootイメージ用のIntel HEXファイル生成を強制する
CONFIG_BUILD_OUTPUT_HEX =y

# コアフラッシュハードウェアのイネーブルメント
CONFIG_FLASH =y

# 低オーバーヘッドのUARTコンソール設定
CONFIG_LOG =y
CONFIG_SERIAL =y
CONFIG_UART_CONSOLE =y

# 標準の対話型シェルを無効にして、容量を節約し、ブートローダーのデッドロックを防ぎます
CONFIG_SHELL =n

# ====================================================================
# NXP ネイティブ ZEPHYR 3.5.0RAM実行構成
# ====================================================================
CONFIG_MEMC =y
CONFIG_CODE_FLEXSPI =y
CONFIG_FLASH_MCUX_FLEXSPI_XIP =y
CONFIG_FLASH_MCUX_FLEXSPI_XIP_MEM_ITCM =y
CONFIG_FLASH_MCUX_FLEXSPI_NOR_WRITE_BUFFER =y

# 詳細なフラッシュログをオフにして、ログエンジンが XIP RAM コードをブロックしないようにします
CONFIG_FLASH_LOG_LEVEL_OFF =y
CONFIG_MEMC_LOG_LEVEL_OFF =y
CONFIG_MCUBOOT_UTIL_LOG_LEVEL_INF =y

私はSMPマネージャツールを使用して、署名済みのバイナリをUDP経由で送信します。アップロード後、イメージ状態書き込みコマンドを明示的に実行します。スロット1において、保留フラグと永続フラグの両方が正常にTrueに変更されていることを確認しました。リセットコマンドを送信する直前にフラッシュの状態をスナップショットとして読み取ることで、メタデータが有効になっていることが証明されます。

ImageState(
    slot=0, version='1.0.0', 
    hash=HashBytes('6835E08D...'), 
    bootable=True, pending=False, confirmed=True, active=True, permanent=False
)
ImageState(
    slot=1, version='1.0.0', 
    hash=HashBytes('139D3CC6...'), 
    bootable=True, pending=True, confirmed=True, active=False, permanent=True
)

スロット1は永続的なアップグレード(pending=True、permanent=True)に対応しているにもかかわらず、OSリセットを実行すると、ボードには古いコードがロードされたままになっている。

MCUboot子イメージコンテキストのシリアルロギングを有効にし、デバッグインターフェースのUARTチャネル(lpuart1 / UART7)にルーティングしようと試みました。しかし、ハードウェアがリセットされると、 MCUbootからのコンソールテキストやエラーの痕跡は一切表示されません。端末に最初に表示されるログは、スロット0アプリケーションから発信された初期化文字列です。

RT1020 EVK上のMCUbootがアプリケーションイメージに実行制御を渡す前に、初期のシリアルコンソールログをキャプチャするための推奨される方法は何ですか?

このスワップ処理がなぜサイレントに失敗しているのかについて、何かアドバイスがあれば大変ありがたいです。


Re: i.MX RT1020 MCUboot image swap failing silently on reboot under Zephyr 3.5.0 (FlexSPI/RAMFUNC is

こんにちは、 @Deepa-khatri2588 さん

LOGレベルの設定については、こちらのファイルを確認することをお勧めします: https://github.com/zephyrproject-rtos/zephyr/blob/94f5b2c2e828ed51a8e20c55d3f172dbf4a2dea8/tests/boo...

また、スロットセクターのサイズが大きすぎる可能性があることに気づきました。以下の2つのKConfig設定を確認してください。

CONFIG_BOOT_MAX_IMG_SECTORS_AUTO

CONFIG_BOOT_MAX_IMG_SECTORs

よろしくお願いします、
ギャビン

Tags (1)
No ratings
Version history
Last update:
‎06-16-2026 04:28 AM
Updated by: