From 87d3e1972e4fc16a79af337e3ba5973d920e8279 Mon Sep 17 00:00:00 2001 From: jhchun Date: Fri, 19 Jun 2026 10:31:02 +0900 Subject: [PATCH] =?UTF-8?q?DFU=20=EC=99=84=EB=A3=8C=20=ED=9B=84=20?= =?UTF-8?q?=EC=A0=84=EC=9B=90=20=EB=9E=98=EC=B9=98=20Low=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80,=20zip=20=ED=8C=8C=EC=9D=BC=EB=AA=85=EC=97=90=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EC=A0=95=EB=B3=B4=20=ED=8F=AC=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- boards/nrf52840dk_nrf52840.overlay | 12 +++++ prj.conf | 14 +++++- sysbuild.cmake | 45 +++++++++++++++++++ sysbuild/mcuboot.overlay | 5 +++ .../mcuboot_power_hold_module/CMakeLists.txt | 4 ++ .../src/mcuboot_power_hold_early.c | 14 ++++++ .../zephyr/module.yml | 2 + 7 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 sysbuild/mcuboot_power_hold_module/CMakeLists.txt create mode 100644 sysbuild/mcuboot_power_hold_module/src/mcuboot_power_hold_early.c create mode 100644 sysbuild/mcuboot_power_hold_module/zephyr/module.yml diff --git a/boards/nrf52840dk_nrf52840.overlay b/boards/nrf52840dk_nrf52840.overlay index d46885d..169208e 100644 --- a/boards/nrf52840dk_nrf52840.overlay +++ b/boards/nrf52840dk_nrf52840.overlay @@ -25,6 +25,18 @@ status = "disabled"; }; +/* 실제 보드에 DK용 외부 QSPI flash가 없어서 부팅 시 probe 실패를 막음 */ +&qspi +{ + status = "disabled"; +}; + +/* DK 보드 정의에 포함된 MX25R64 외부 flash도 함께 비활성화 */ +&mx25r64 +{ + status = "disabled"; +}; + /* I2C0 핀 재설정: ICM42670P IMU (SCL=P1.14, SDA=P1.15) */ &i2c0_default { diff --git a/prj.conf b/prj.conf index 0f2aaf9..516da9d 100644 --- a/prj.conf +++ b/prj.conf @@ -68,6 +68,8 @@ CONFIG_BT_RX_STACK_SIZE=4096 # 애플리케이션이 MCUboot 환경(부트로더)에서 동작(MCUboot: FW 교체 판단, 서명 검증) CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_ZCBOR=y +# major.minor.revision+build 형식으로 버전 문자열 지정 (빌드 시스템에서 자동으로 버전 정보 채워 넣음) +CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION="0.0.2+0" # 내부 Flash Meory 활성화 CONFIG_FLASH=y @@ -87,7 +89,17 @@ CONFIG_MCUMGR_TRANSPORT_BT=y # BLE로 수신된 mcumgr 메시지에 대해 읽기/쓰기 권한 허용 CONFIG_MCUMGR=y CONFIG_MCUMGR_TRANSPORT_BT=y -CONFIG_MCUMGR_TRANSPORT_BT_PERM_RW=y +CONFIG_MCUMGR_TRANSPORT_BT_PERM_RW_AUTHEN=y +# BLE로 분할 수신된 SMP 패킷 재조립 +CONFIG_MCUMGR_TRANSPORT_BT_REASSEMBLY=y +# DFU image chunk를 받을 mcumgr transport 버퍼 크기 +CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE=1024 +# CBOR data byte string 최대 길이 +CONFIG_ZCBOR_MAX_STR_LEN=512 +# DFU 진행 상태를 앱 콜백으로 받기 +CONFIG_MCUMGR_MGMT_NOTIFICATION_HOOKS=y +CONFIG_MCUMGR_GRP_IMG_STATUS_HOOKS=y +CONFIG_MCUMGR_SMP_COMMAND_STATUS_HOOKS=y # mcumgr 이미지 관리 그룹 활성화 (이미지 업로드, 테스트, 확인, 슬롯 상태 조회) CONFIG_MCUMGR_GRP_IMG=y # mcumgr OS 관리 그룹 활성화 (시스템 정보 조회, 재부팅 등 OS 관련 명령 지원) diff --git a/sysbuild.cmake b/sysbuild.cmake index 965d725..884f2b3 100644 --- a/sysbuild.cmake +++ b/sysbuild.cmake @@ -29,4 +29,49 @@ if(SB_CONFIG_BOOTLOADER_MCUBOOT) CACHE INTERNAL "Extra devicetree overlay for the MCUboot image" ) + + list(APPEND mcuboot_EXTRA_ZEPHYR_MODULES + "${APP_DIR}/sysbuild/mcuboot_power_hold_module" + ) + list(REMOVE_DUPLICATES mcuboot_EXTRA_ZEPHYR_MODULES) + set( + mcuboot_EXTRA_ZEPHYR_MODULES + "${mcuboot_EXTRA_ZEPHYR_MODULES}" + CACHE INTERNAL + "Extra Zephyr modules for the MCUboot image" + ) +endif() + +# DFU ZIP 파일명에 MCUboot 서명 버전을 붙인 복사본 생성 +set(APP_PRJ_CONF "${APP_DIR}/prj.conf") +if(EXISTS "${APP_PRJ_CONF}") + file(READ "${APP_PRJ_CONF}" APP_PRJ_CONF_TEXT) + + if(APP_PRJ_CONF_TEXT MATCHES "CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION=\"([^\"]+)\"") + set(DFU_ZIP_VERSION "${CMAKE_MATCH_1}") + set(DFU_ZIP_SUFFIX "${DFU_ZIP_VERSION}") + + # 0.0.1+3 형식은 사용자가 구분하기 쉽도록 1+3만 사용 + if(DFU_ZIP_VERSION MATCHES "^0\\.0\\.([0-9]+\\+[^+]+)$") + set(DFU_ZIP_SUFFIX "${CMAKE_MATCH_1}") + endif() + + # 파일명에 쓰기 어려운 문자는 밑줄로 치환 + string(REGEX REPLACE "[^A-Za-z0-9_.+-]" "_" DFU_ZIP_SUFFIX "${DFU_ZIP_SUFFIX}") + + set(DFU_ZIP_SOURCE "${CMAKE_BINARY_DIR}/dfu_application.zip") + set(DFU_ZIP_VERSIONED "${CMAKE_BINARY_DIR}/dfu_application_${DFU_ZIP_SUFFIX}.zip") + + add_custom_command( + OUTPUT "${DFU_ZIP_VERSIONED}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${DFU_ZIP_SOURCE}" "${DFU_ZIP_VERSIONED}" + DEPENDS "${DFU_ZIP_SOURCE}" + COMMENT "Generating versioned DFU ZIP ${DFU_ZIP_VERSIONED}" + VERBATIM + ) + + add_custom_target(dfu_application_versioned_zip ALL + DEPENDS "${DFU_ZIP_VERSIONED}" + ) + endif() endif() diff --git a/sysbuild/mcuboot.overlay b/sysbuild/mcuboot.overlay index b88e085..0d0ba61 100644 --- a/sysbuild/mcuboot.overlay +++ b/sysbuild/mcuboot.overlay @@ -1,5 +1,10 @@ #include +/* MCUboot에서 P0.08을 UART0 RX로 잡지 않도록 비활성화 */ +&uart0 { + status = "disabled"; +}; + &gpio0 { power_hold_hog: power_hold_hog { gpio-hog; diff --git a/sysbuild/mcuboot_power_hold_module/CMakeLists.txt b/sysbuild/mcuboot_power_hold_module/CMakeLists.txt new file mode 100644 index 0000000..0ccef00 --- /dev/null +++ b/sysbuild/mcuboot_power_hold_module/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.20.0) + +zephyr_library() +zephyr_library_sources(src/mcuboot_power_hold_early.c) diff --git a/sysbuild/mcuboot_power_hold_module/src/mcuboot_power_hold_early.c b/sysbuild/mcuboot_power_hold_module/src/mcuboot_power_hold_early.c new file mode 100644 index 0000000..7ed7aac --- /dev/null +++ b/sysbuild/mcuboot_power_hold_module/src/mcuboot_power_hold_early.c @@ -0,0 +1,14 @@ +#include +#include + +#define POWER_HOLD_PIN 8U + +static int mcuboot_power_hold_early_init(void) +{ + nrf_gpio_pin_set(POWER_HOLD_PIN); + nrf_gpio_cfg_output(POWER_HOLD_PIN); + + return 0; +} + +SYS_INIT(mcuboot_power_hold_early_init, EARLY, 0); diff --git a/sysbuild/mcuboot_power_hold_module/zephyr/module.yml b/sysbuild/mcuboot_power_hold_module/zephyr/module.yml new file mode 100644 index 0000000..eb317c3 --- /dev/null +++ b/sysbuild/mcuboot_power_hold_module/zephyr/module.yml @@ -0,0 +1,2 @@ +build: + cmake: .