This is an automated email from the ASF dual-hosted git repository.

janc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 3482af197 hw/scripts/nrfutil: make traits optional and improve device 
selection
3482af197 is described below

commit 3482af197e7df8210cc5a6946df1b94575c8f003
Author: Wiktor Kwiatkowski <[email protected]>
AuthorDate: Mon Nov 3 13:03:45 2025 +0100

    hw/scripts/nrfutil: make traits optional and improve device selection
    
    Traits are no longer by default. They are now optional and only used
    when the user explicitly wants to flash multiple boards at once.
    DFU mode is controlled through NRFUTIL_DFU_MODE, and NRFUTIL_DFU_SN
    can be used to select a specific DFU device when several are connected.
---
 hw/bsp/nordic_pca10059/syscfg.yml |  6 ++---
 hw/scripts/nrfutil.sh             | 54 ++++++++++++++++++++++++++-------------
 hw/scripts/syscfg.yml             | 15 ++++++++---
 3 files changed, 51 insertions(+), 24 deletions(-)

diff --git a/hw/bsp/nordic_pca10059/syscfg.yml 
b/hw/bsp/nordic_pca10059/syscfg.yml
index 6baacb3ad..979bf3728 100644
--- a/hw/bsp/nordic_pca10059/syscfg.yml
+++ b/hw/bsp/nordic_pca10059/syscfg.yml
@@ -30,16 +30,16 @@ syscfg.defs:
             tool without debugger.
         value: 0
 
-syscfg.BSP_NRF_SDK_FLASH_LAYOUT:
+syscfg.vals.BSP_NRF_SDK_FLASH_LAYOUT:
     # Change to use Nordic DFU bootloader which is likely to be used
     # when device still has original bootloader
-    NRFUTIL_TRAITS: nordicDfu
+    NRFUTIL_DFU_MODE: 1
+    BOOTUTIL_SINGLE_APPLICATION_SLOT: 1
 
 syscfg.vals:
     MYNEWT_DOWNLOADER: nrfutil
     JLINK_TARGET: nRF52840_xxAA
     PYOCD_TARGET: nrf52840
-    NRFUTIL_TRAITS: jlink
 
 # Enable nRF52840 MCU and common startup code
     MCU_TARGET: nRF52840
diff --git a/hw/scripts/nrfutil.sh b/hw/scripts/nrfutil.sh
index a6c854454..03c46d089 100755
--- a/hw/scripts/nrfutil.sh
+++ b/hw/scripts/nrfutil.sh
@@ -38,8 +38,14 @@ nrfutil_load () {
         echo "Missing filename"
         exit 1
     fi
+
+    NRF_TRAITS_OPT=""
+    if [ -n "${MYNEWT_VAL_NRFUTIL_TRAITS}" ]; then
+        NRF_TRAITS_OPT="--traits ${MYNEWT_VAL_NRFUTIL_TRAITS}"
+    fi
+
     # If nordicDfu is to be used, create hex file directly from ELF
-    if [ "$MYNEWT_VAL_NRFUTIL_TRAITS" == "nordicDfu" ] ; then
+    if [ "${MYNEWT_VAL_NRFUTIL_DFU_MODE:-0}" -eq 1 ] ; then
         arm-none-eabi-objcopy -O ihex ${ELF_FILE} ${HEX_FILE}
     elif [ ! -f "${FILE_NAME}" ]; then
         # tries stripping current path for readability
@@ -65,36 +71,48 @@ nrfutil_load () {
     fi
 
     ret=0
-    if [ -z ${NRFUTIL_TRAITS} ] ; then
-        if [ -z ${MYNEWT_VAL_NRFUTIL_TRAITS} ] ; then
-            NRFUTIL_TRAITS="--traits jlink"
+    if [ "${MYNEWT_VAL_NRFUTIL_DFU_MODE:-0}" -eq 1 ] ; then
+        ZIP_FILE=${BIN_BASENAME}.zip
+        if [ -n "${MYNEWT_VAL_NRFUTIL_DFU_SN}" ] ; then
+            PORT=$(nrfutil device list --traits nordicDfu | awk -v 
dfu_sn=$MYNEWT_VAL_NRFUTIL_DFU_SN \
+            'dfu_sn==$1 { sn_match=1 }
+             /^Ports/ { if(sn_match) { print $2; sn_match=0 }}
+             ')
+            if [ -z "$PORT" ] ; then
+              echo "Error: NRFUTIL_DFU_SN does not match any connected board."
+              return 1
+            fi
         else
-            NRFUTIL_TRAITS="--traits ${MYNEWT_VAL_NRFUTIL_TRAITS}"
-            if [ $MYNEWT_VAL_NRFUTIL_TRAITS == "nordicDfu" ] ; then
-                ZIP_FILE=${BIN_BASENAME}.zip
-                PORT=`nrfutil device list --traits nordicDfu | awk '/ports/ { 
print $2 }'`
-                # TODO: hw-version is probably incorrect for non NRF52 devices
-                nrfutil pkg generate --hw-version 52 --sd-req 0 --application 
${HEX_FILE} --application-version 1 ${ZIP_FILE}
-                echo "Downloading" ${ZIP_FILE}
-                nrfutil dfu usb-serial -p ${PORT} --package ${ZIP_FILE}
-                if [ $? -ne 0 ]; then
-                    ret=1
-                fi
+            PORT=$(nrfutil device list --traits nordicDfu | awk '/^Ports/ { 
print $2 }')
+            PORT_COUNT=$(echo "$PORT" | wc -w)
+            if [ "$PORT_COUNT" -eq 0 ]; then
+                echo "Error: No Nordic DFU devices found."
+                return 1
+            elif [ "$PORT_COUNT" -gt 1 ]; then
+                echo "Error: Found multiple DFU devices. Connect exactly one 
supported device or add NRFUTIL_DFU_SN to your target."
+                return 1
             fi
         fi
+
+        # TODO: hw-version is probably incorrect for non NRF52 devices
+        nrfutil pkg generate --hw-version 52 --sd-req 0 --application 
${HEX_FILE} --application-version 1 ${ZIP_FILE}
+        echo "Downloading" ${ZIP_FILE}
+        nrfutil dfu usb-serial -p ${PORT} --package ${ZIP_FILE}
+        if [ $? -ne 0 ]; then
+            ret=1
+        fi
     fi
 
     if [ -z ${ZIP_FILE} ] ; then
         jlink_sn
 
         echo "Downloading" ${HEX_FILE}
-
-        nrfutil device program --firmware ${HEX_FILE} $SRN_ARG ${NRFUTIL_ARG} 
${NRFUTIL_TRAITS} --options chip_erase_mode=ERASE_RANGES_TOUCHED_BY_FIRMWARE
+        nrfutil device program --firmware ${HEX_FILE} ${SRN_ARG} 
${NRF_TRAITS_OPT} ${NRFUTIL_ARG} --options 
chip_erase_mode=ERASE_RANGES_TOUCHED_BY_FIRMWARE
 
         if [ $? -ne 0 ]; then
             ret=1
         else
-            nrfutil device reset $SRN_ARG
+            nrfutil device reset $SRN_ARG ${NRF_TRAITS_OPT}
         fi
     fi
 
diff --git a/hw/scripts/syscfg.yml b/hw/scripts/syscfg.yml
index 012d6b709..77076dce5 100644
--- a/hw/scripts/syscfg.yml
+++ b/hw/scripts/syscfg.yml
@@ -89,11 +89,20 @@ syscfg.defs:
             Some NRF have more then one core. This can specify non-default core
             (i.e. CP_NETWORK for NRF5340).
         value:
+    NRFUTIL_DFU_MODE:
+        description: >
+            Enables firmware upload through nrfutil dfu usb-serial.
+        value:
     NRFUTIL_TRAITS:
         description: >
-            Traits passed to nrfutil command. If not set `jlink` is the 
default.
-            It can be 'nordicDfu' to upload binary using Nordic SDK DFU
-            bootloader protocol.
+              Optional device traits used by nrfutil to select boards for 
flashing.
+              When set (e.g. 'jlink'), all connected devices matching this 
trait
+              will be programmed.
+        value:
+    NRFUTIL_DFU_SN:
+        description: >
+            DFU serial number passed to the nrfutil script.
+            Used to select the target device for firmware upload.
         value:
     MYNEWT_DEBUGGER_SN:
         description: >

Reply via email to