Hello, I observed this hebaviour on our own custom PCB with nrf5340: We would like to perform DFU over USB DFU class using dfu-util on the host. We tested our code on Thingy53 and it works as expected. In our prj.conf, we have enabled
CONFIG_USB_DFU_ENABLE_UPLOAD=y CONFIG_USB_DFU_PERMANENT_DOWNLOAD=yto allow automatic reboot and automatic image swap. However, this does not work on our own PCB board.
On our own board, the dfu-util download operation can be finished with success code. But the device won't automatically restart by itself. We have to press reset button on a nrf5340DK (connected via JTAG cable) to manually issue the reset. Then, we can observe a successful image swap, the new firmware is indeed on the device now. So the issue is: these two kconfigs works fine for Thingy53 but not our own PCB board.
The two prj.conf share most of the configurations but file system and disk drivers (Thingy53 is using littlefs on external flash while ours is using exfat on SD card). For reference, I attach my full prj.conf for our own PCB board:
# Enable GPIO CONFIG_GPIO=y # Enable I2C CONFIG_I2C=y # Enable SPI CONFIG_SPI=y # Enable log and use it via Jlink RTT rather than CDC ACM CONFIG_LOG=y CONFIG_USE_SEGGER_RTT=y CONFIG_LOG_BACKEND_RTT=y CONFIG_LOG_BACKEND_UART=n CONFIG_RTT_CONSOLE=n CONFIG_STDOUT_CONSOLE=n CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=4096 CONFIG_LOG_BUFFER_SIZE=8192 CONFIG_UART_CONSOLE=n CONFIG_CONSOLE=n # Enable Bluetooth LE CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DEVICE_NAME="BORUS" CONFIG_BT_BROADCASTER=y CONFIG_BT_OBSERVER=y CONFIG_BT_FILTER_ACCEPT_LIST=y CONFIG_BT_CTLR_ADVANCED_FEATURES=y CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y # Extended BLE CONFIG_BT_EXT_ADV=y CONFIG_BT_EXT_ADV_MAX_ADV_SET=2 # Enale floating point unit for float point calculation CONFIG_FPU=y CONFIG_CBPRINTF_FP_SUPPORT=y CONFIG_FPU_SHARING=y # Enable debugging CONFIG_DEBUG_THREAD_INFO=y CONFIG_DEBUG_OPTIMIZATIONS=y # Enable multithread CONFIG_MULTITHREADING=y # Enable battery voltage monitoring CONFIG_SENSOR=y CONFIG_PWM=n CONFIG_ADC=y CONFIG_VOLTAGE_DIVIDER=y CONFIG_NRFX_SAADC=y # Configure USB device CONFIG_USB_DEVICE_STACK=y CONFIG_USB_DEVICE_PRODUCT="BORUS" CONFIG_USB_DEVICE_PID=0x0001 CONFIG_USB_DEVICE_VID=0x0001 CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y CONFIG_SERIAL=n CONFIG_USB_CDC_ACM=n CONFIG_UART_INTERRUPT_DRIVEN=n CONFIG_UART_LINE_CTRL=n CONFIG_BOARD_SERIAL_BACKEND_CDC_ACM=n CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n # Configure USB device to appear as DFU class # Configure DFU autoupdate and reset CONFIG_USB_DFU_CLASS=y CONFIG_USB_REQUEST_BUFFER_SIZE=128 CONFIG_USB_DFU_ENABLE_UPLOAD=y CONFIG_USB_DFU_PERMANENT_DOWNLOAD=y CONFIG_USB_DFU_REBOOT=y CONFIG_IMG_MANAGER=y CONFIG_STREAM_FLASH=y CONFIG_BOOTLOADER_MCUBOOT=y # Configure file system CONFIG_FLASH_MAP=y CONFIG_FLASH=y CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_LITTLEFS=n CONFIG_FAT_FILESYSTEM_ELM=y CONFIG_FS_FATFS_LFN=y CONFIG_FS_FATFS_EXFAT=y CONFIG_FS_LOG_LEVEL_ERR=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NORDIC_QSPI_NOR=y CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 # Configure SPI RAM buffer size CONFIG_SPI_NRFX_RAM_BUFFER_SIZE=128 # Configure mass storage CONFIG_USB_MASS_STORAGE=y CONFIG_DISK_ACCESS=y CONFIG_USB_MASS_STORAGE_LOG_LEVEL_ERR=y CONFIG_DISK_LOG_LEVEL_ERR=y CONFIG_DISK_DRIVERS=y CONFIG_DISK_DRIVER_SDMMC=y CONFIG_MASS_STORAGE_DISK_NAME="SD" # Configure BLE encryption CONFIG_NRF_SECURITY=y CONFIG_MBEDTLS_PSA_CRYPTO_C=y CONFIG_PSA_CRYPTO_DRIVER_CC3XX=y CONFIG_PSA_CRYPTO_DRIVER_OBERON=n CONFIG_PSA_WANT_KEY_TYPE_AES=y CONFIG_PSA_WANT_ALG_CTR=y CONFIG_HEAP_MEM_POOL_SIZE=262144 CONFIG_MBEDTLS_ENABLE_HEAP=y CONFIG_MBEDTLS_HEAP_SIZE=8192 CONFIG_TEST_RANDOM_GENERATOR=y # Configure Settings subsystem CONFIG_SETTINGS=y CONFIG_SETTINGS_RUNTIME=y CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_MPU_ALLOW_FLASH_WRITE=y # Configure Watchdog CONFIG_WATCHDOG=y CONFIG_WDT_DISABLE_AT_BOOT=n # Enable State Machine Framework CONFIG_SMF=y # Enable DSP CONFIG_CMSIS_DSP=y CONFIG_CMSIS_DSP_FILTERING=y CONFIG_CMSIS_DSP_TRANSFORM=y CONFIG_CMSIS_DSP_STATISTICS=y CONFIG_CMSIS_DSP_FASTMATH=y CONFIG_REQUIRES_FULL_LIBC=y CONFIG_RING_BUFFER=y # Power management CONFIG_PM_DEVICE=y CONFIG_RAM_POWER_DOWN_LIBRARY=n CONFIG_POWEROFF=y CONFIG_REBOOT=y # Sensor drivers and threads CONFIG_BMI270=y CONFIG_BMI270_TRIGGER_GLOBAL_THREAD=y CONFIG_BMP388=y CONFIG_BMP388_TRIGGER_GLOBAL_THREAD=y CONFIG_BMP388_ODR_RUNTIME=y CONFIG_BMP388_OSR_RUNTIME=y # Enable Edge Impulse dependencies CONFIG_CPP=y CONFIG_STD_CPP11=y CONFIG_FP16=n # Enable Edge Impulse CONFIG_EDGE_IMPULSE=y CONFIG_EDGE_IMPULSE_URI="/Users/gw23523/Downloads/test-cpp-mcu-v10.zip" CONFIG_EI_WRAPPER=y CONFIG_EI_WRAPPER_DATA_BUF_SIZE=2500 CONFIG_EI_WRAPPER_THREAD_PRIORITY=7 # ------------------- Turn below ON for Optimisation ------------------- # Stack sizes (This needs to be optimised using the thread analyzer below) CONFIG_MAIN_STACK_SIZE=2048 CONFIG_ISR_STACK_SIZE=1536 CONFIG_IDLE_STACK_SIZE=320 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=1536 CONFIG_MASS_STORAGE_STACK_SIZE=1024 CONFIG_EI_WRAPPER_THREAD_STACK_SIZE=2048 # Thread analyser for debug purposes # CONFIG_THREAD_ANALYZER=y # CONFIG_THREAD_ANALYZER_USE_LOG=y # CONFIG_THREAD_ANALYZER_AUTO=y # CONFIG_THREAD_ANALYZER_AUTO_INTERVAL=10 # ----------------------------------------------------------------------
We are performing DFU an the application core only, the command we issued on the host side is:
dfu-util -S <serial number> -a 1 -D /Users/fsad/Documents/nordic/xxx/xxx/build/xxx/zephyr/zephyr.signed.bin
My current solution around this issue is to issue a warm system reboot on USB disconnect event. This works as expected to swap the image but definitely not the most ideal one. Can anyone help with this issue?
We are using NCS v3.0.1 and dfu-util v0.11