USB DFU does not automatically reboot even configured

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=y
to 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

Related