こんにちは、Core 0を使ってLPC55XpressoS69でZephyrのMCUbootを動かそうとしています。私はZephyrでシンプルなBlinkyサンプルアプリケーションを使っています。
エラーもなくアプリケーションは問題なく動いています。
しかし、mcumgrを使ってUART経由でデバイスファームウェアアップデート(DFU)を送信しようとしているのですが、なぜかmcumgrとデバイス間の接続すら確立できません。「NMPタイムアウト」が繰り返し発生します。
参考までに、私のディレクトリ構造は以下のようになっています。
|
__ボード
|__ lpcxpresso55s69_lpc55s69_cpu0.overlay
__ src
|__ main.c
__sysbuild
|__mcuboot.conf
__mcuboot.overlay
__prj.conf
__sysbuild.conf
私のprj.confファイルは以下のようになっています。
# Enable MCUMGR subsystem and OS/Image management commands
CONFIG_MCUMGR=y
CONFIG_MCUMGR_GRP_OS=y
CONFIG_MCUMGR_GRP_IMG=y
# DIRECT SMP over UART
CONFIG_MCUMGR_TRANSPORT_UART=y
CONFIG_MCUMGR_TRANSPORT_SHELL=n
# Dedicate flexcomm0 to SMP — nothing else on the UART
CONFIG_CONSOLE=n
CONFIG_UART_CONSOLE=n
CONFIG_LOG=n
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
# Required for SMP UART processing thread
CONFIG_NET_BUF=y
CONFIG_ZCBOR=y
CONFIG_BASE64=y
# Required subsystems for DFU
CONFIG_FLASH=y
CONFIG_IMG_MANAGER=y
CONFIG_MCUBOOT_IMG_MANAGER=y
# Dependencies for System/Reboot management via DFU
CONFIG_REBOOT=y
私のsysbuild.confは以下のとおりです。
SB_CONFIG_BOOTLOADER_MCUBOOT=y
SB_CONFIG_MCUBOOT_MODE_OVERWRITE_ONLY=y私のmcuboot.confは次のようになっています。
CONFIG_LOG=y
CONFIG_MCUBOOT_LOG_LEVEL_INF=y
CONFIG_MCUBOOT_SERIAL=y
CONFIG_BOOT_SERIAL_UART=y
CONFIG_UART_CONSOLE=n/* Step 3.4 - Configure button and LED for Serial Recovery */
// zephyr,console = &flexcomm0;
// zephyr,uart-mcumgr = &flexcomm0;
/ {
chosen {
zephyr,code-partition = &boot_partition;
zephyr,uart-mcumgr = &flexcomm0;
zephyr,shell-uart = &flexcomm0;
};
};
&flexcomm0 {
status = "okay";
};
/ {
aliases {
mcuboot-button0 = &user_button_3;
mcuboot-led0 = &blue_led;
};
};
&gpio0 {
status = "okay";
};
&gpio1 {
status = "okay";
};
&blue_led {
status = "okay";
};
/* Enlarge boot partition to 64KB to fit MCUboot with serial recovery */
&boot_partition {
reg = <0x00000000 DT_SIZE_K(64)>;
};
&slot0_partition {
reg = <0x00010000 DT_SIZE_K(160)>;
};
&slot1_partition {
reg = <0x00038000 DT_SIZE_K(160)>;
};
&storage_partition {
reg = <0x00060000 DT_SIZE_K(50)>;
};
そして最後に、私のlpCXpresso55s69_lpc55s69_cpu0.overlayは次のようになります。
/ {
chosen {
zephyr,code-partition = &slot0_partition;
zephyr,mgmt-smp = &flexcomm0;
zephyr,uart-mcumgr = &flexcomm0;
};
};
&flexcomm0 {
status = "okay";
};
/* Enlarge boot partition to 64KB to fit MCUboot with serial recovery */
&boot_partition {
reg = <0x00000000 DT_SIZE_K(64)>;
};
&slot0_partition {
reg = <0x00010000 DT_SIZE_K(160)>;
};
&slot1_partition {
reg = <0x00038000 DT_SIZE_K(160)>;
};
&storage_partition {
reg = <0x00060000 DT_SIZE_K(50)>;
};
以下の MCUmgr コマンドを実行すると、以下に示すように NMP タイムアウトが発生します。
> mcumgr --conntype serial --connstring "dev=COM11,baud=115200" echo "test"
Error: NMP timeoutつまり、mcumgrはポートが利用可能であることを確実に認識しています(そうでなければアクセスを拒否します)が、タイムアウトが続いています。
これは設定オプションのエラーだと思います。設定オプションを何度も変更してみましたが、どれもうまくいきません。おそらく、この機能を動作させるために不可欠な設定オプションがどこかに抜けているのだと思います。
できるだけ多くのアプリケーションノートやユーザーマニュアルを調べました。私のケースにはどれも役に立たないようです。例えば、Zephyrアプリケーションを動かすLPC55Sxxチップ上のDFU MCUbootを使う場合です。
どんな助けでもありがたいですが、誰かが自分のボードで試すのが一番良いかもしれません。LPCXpresso55S69を送り、どんな簡単なプログラムでもUART DFUを実行できるか確認してください。
LPC55S6x LPC55S69-EVK
こんにちは、 @ZQ2さん
LPCXpresso55S69ボード上で、この設定を再現し、検証することができました。
1.重要な点は、この構成ではMCUmgrをMCUbootと併用する必要があるということです。アプリケーションはslot0にリンクされている(フラッシュベースアドレスではありません)ため、smp_svrアプリケーションを単独でビルディングしてフラッシュするだけでは正しく動作しません。起動と制御をアプリケーションに引き渡すにはMCUbootが必要です。
2. /c/SDK/zephyrproject/zephyr/samples/subsys/mgmt/mcumgr/smp_svr/boardsのオーバーレイファイルlpcxpresso55s69_lpc55s69_cpu0.overlayを追加します。
&boot_partition {
reg = <0x00000000 DT_SIZE_K(64)>;
};
&slot0_partition {
reg = <0x00010000 DT_SIZE_K(160)>;
};
&slot1_partition {
reg = <0x00038000 DT_SIZE_K(160)>;
};
&storage_partition {
reg = <0x00060000 DT_SIZE_K(50)>;
};
3. 以下のコマンドを使用してプロジェクトをビルドしました。
west build -p always -b lpcxpresso55s69/lpc55s69/cpu0 --sysbuild samples/subsys/mgmt/mcumgr/smp_svr -- -DEXTRA_CONF_FILE="serial.conf" -DEXTRA_DTC_OVERLAY_FILE="C:/SDK/zephyrproject/zephyr/samples/subsys/mgmt/mcumgr/smp_svr/boards/lpcxpresso55s69_lpc55s69_cpu0.overlay" -Dmcuboot_EXTRA_DTC_OVERLAY_FILE="C:/SDK/zephyrproject/zephyr/samples/subsys/mgmt/mcumgr/smp_svr/boards/lpcxpresso55s69_lpc55s69_cpu0.overlay"
4. それを建てた後。コマンドを使うことができます
grep -A20 -B5 "boot_partition" build/mcuboot/zephyr/zephyr.dts
5. そして西の閃光
6.
7.
これは、UARTトランスポート、SMPサーバー、MCUmgr、およびMCUbootの統合がすべて正しく動作していることを確認するものです。
BR
ハリー
こんにちは、 @Harry_Zhang さん。
あなたの解決策は確かに効果があります。実際、私はコマンドを単に
west build -p always -b lpcxpresso55s69/lpc55s69/cpu0 --sysbuild samples/subsys/mgmt/mcumgr/smp_svr -- -DEXTRA_CONF_FILE="serial.conf"これも効果があった。私の問題を再現していただき、本当にありがとうございます。大変感謝しています。
こんにちは、 @ZQ2さん
mcumgr echoはすでにNMPタイムアウトを返しているので、MCUbootのDFUフローをデバッグする前にMCUmgr UART通信を検証できると思います。
以下のことを確認できます:
flexcomm0はLPCXpresso55S69ボード上のCOM11に接続されたUARTです。
アプリケーションは通常通り動作しており(MCUbootのシリアルリカバリーモードにとどまっていません)。
コンソール、シェル、ログ出力のいずれも、MCUmgrが使用するUARTを共有していません。
mcumgr --conntype serial --connstring "dev=COM11,baud=115200" echo "test"
BR
ハリー
こんにちは、 @Harry_Zhang さん。
偶然にも、昨日この質問を投稿した直後にZephyrのsmp_svr サンプルを使っていました。
私も全く同じ問題に直面しています。
以下の リンクにあるZephyrのサンプルドキュメントに従って確認しました。
サンプル用のプロジェクトを作成し、ドキュメントに記載されている以下のコマンドを使用して、 Raw UART (serial) smp_svr オプションの設定を有効にして、コードを正常にビルドしました。
west build -p always -b lpcxpresso55s69/lpc55s69/cpu0 --sysbuild -- -DEXTRA_CONF_FILE="raw-serial.conf;fs.conf"
そして、コードの書き込みに成功しました。
それにもかかわらず:
C:\Users\Dev>mcumgr --conntype serial --connstring "dev=COM11,baud=115200" echo "test"
Error: NMP timeout
デバッガープローブをLink2からJLinkに変更してみたところ、デバッグプローブがCOM16に接続されるようになりました。念のため、JLinkコマンドーを使ってマスストレージデバイスの機能も無効にしました。
次に、フラッシュして実行してみました。
> west flash -r jlink
しかし、またしても:
C:\Users\Dev> mcumgr --conntype serial --connstring "dev=COM16,baud=115200" echo "test"
エラー:NMPタイムアウト
一体何を見落としているのでしょうか?設定に関係があるのでしょうか?もしそうなら、なぜZephyrの公式サンプルがLPC55S69 smp_svrと互換性がなく、改造が必要なのか疑問です。