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
こんにちは、 @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>;
};
よろしくお願いします、
ギャビン
ご返信ありがとうございます
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)>;
};おすすめいただいたマクロも追加しました。
私は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がアプリケーションイメージに実行制御を渡す前に、初期のシリアルコンソールログをキャプチャするための推奨される方法は何ですか?
このスワップ処理がなぜサイレントに失敗しているのかについて、何かアドバイスがあれば大変ありがたいです。
こんにちは、 @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
よろしくお願いします、
ギャビン