SDK: 15.3.0
BOARD: custom nRF52840 pre-product
Hi, I want to implement usb dfu trigger library.
but, faced with a problem.
My project are started from usb cli example.
I have succeed to display DFU Trigger and CDC ACM in device manager.

but, nrfutil and nrf-programmer failed to trigger dfu.
error: LIBUSB_ERROR_NOT_SUPPORTED

My sdk_config.h file, what I'm missing?
#ifndef APP_USBD_VID #define APP_USBD_VID 0x1915 #endif #ifndef APP_USBD_PID #define APP_USBD_PID 0xC00A #endif #ifndef APP_USBD_NRF_DFU_TRIGGER_ENABLED #define APP_USBD_NRF_DFU_TRIGGER_ENABLED 1 #endif #ifndef NRF_DFU_TRIGGER_USB_USB_SHARED #define NRF_DFU_TRIGGER_USB_USB_SHARED 1 #endif #ifndef NRF_DFU_TRIGGER_USB_INTERFACE_NUM #define NRF_DFU_TRIGGER_USB_INTERFACE_NUM 0 #endif #ifndef NRF_CLI_CDC_ACM_COMM_INTERFACE #define NRF_CLI_CDC_ACM_COMM_INTERFACE 1 #endif #ifndef NRF_CLI_CDC_ACM_DATA_INTERFACE #define NRF_CLI_CDC_ACM_DATA_INTERFACE 2 #endif #ifndef APP_USBD_CONFIG_SELF_POWERED #define APP_USBD_CONFIG_SELF_POWERED 0 #endif #ifndef APP_USBD_CONFIG_MAX_POWER #define APP_USBD_CONFIG_MAX_POWER 100 #endif #ifndef APP_USBD_CONFIG_POWER_EVENTS_PROCESS #define APP_USBD_CONFIG_POWER_EVENTS_PROCESS 1 #endif #ifndef APP_USBD_CONFIG_EVENT_QUEUE_ENABLE #define APP_USBD_CONFIG_EVENT_QUEUE_ENABLE 0 #endif
and add functions in main.c
void enable_reset()
{
if (((NRF_UICR->PSELRESET[0] & UICR_PSELRESET_CONNECT_Msk) != (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos)) ||
((NRF_UICR->PSELRESET[1] & UICR_PSELRESET_CONNECT_Msk) != (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos)))
{
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_UICR->PSELRESET[0] = 18;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_UICR->PSELRESET[1] = 18;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NVIC_SystemReset();
}
}
/**
* Function for configuring UICR_REGOUT0 register
* to set GPIO output voltage to 3.0V.
*/
static void gpio_output_voltage_setup(void)
{
// Configure UICR_REGOUT0 register only if it is set to default value.
if ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) ==
(UICR_REGOUT0_VOUT_DEFAULT << UICR_REGOUT0_VOUT_Pos))
{
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_UICR->REGOUT0 = (NRF_UICR->REGOUT0 & ~((uint32_t)UICR_REGOUT0_VOUT_Msk)) |
(UICR_REGOUT0_VOUT_3V0 << UICR_REGOUT0_VOUT_Pos);
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
// System reset is needed to update UICR registers.
NVIC_SystemReset();
}
}
if (NRF_POWER->MAINREGSTATUS &
(POWER_MAINREGSTATUS_MAINREGSTATUS_High << POWER_MAINREGSTATUS_MAINREGSTATUS_Pos))
{
gpio_output_voltage_setup();
}
enable_reset();
I don't fully understand this code. I got this from github in similar issue. link.
I also connected a gpio pin to reset pin.