From 657cce18176057f8a3917698c328b918e6e2225d Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 29 Jan 2021 02:11:55 +0100 Subject: [PATCH] dfu: let the device reset itself dfu flashing the ST12 was easy, but i was never able to get ST34 into dfu mode. Changing the firmware so it resets itself just like the octsim instead of starting a timer and waiting for a reset from the host made it work every time for me. Change-Id: Ida636ec925f40d6d56551f170150181350d03bbd --- firmware/atmel_softpack_libraries/usb/device/dfu/dfu.h | 4 ++-- .../atmel_softpack_libraries/usb/device/dfu/dfu_runtime.c | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/firmware/atmel_softpack_libraries/usb/device/dfu/dfu.h b/firmware/atmel_softpack_libraries/usb/device/dfu/dfu.h index 5bd8684e..84ce14e5 100644 --- a/firmware/atmel_softpack_libraries/usb/device/dfu/dfu.h +++ b/firmware/atmel_softpack_libraries/usb/device/dfu/dfu.h @@ -39,8 +39,8 @@ struct dfu_desc { #define DFU_FUNC_DESC { \ .bLength = USB_DT_DFU_SIZE, \ .bDescriptorType = USB_DT_DFU, \ - .bmAttributes = USB_DFU_CAN_UPLOAD | USB_DFU_CAN_DOWNLOAD, \ - .wDetachTimeOut = 0xff00, \ + .bmAttributes = USB_DFU_CAN_UPLOAD | USB_DFU_CAN_DOWNLOAD | USB_DFU_WILL_DETACH, \ + .wDetachTimeOut = 0x00, \ .wTransferSize = BOARD_DFU_PAGE_SIZE, \ .bcdDFUVersion = 0x0100, \ } diff --git a/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_runtime.c b/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_runtime.c index 4467cc9f..f2cf64ca 100644 --- a/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_runtime.c +++ b/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_runtime.c @@ -165,6 +165,8 @@ void USBDFU_Runtime_RequestHandler(const USBGenericRequest *request) * will then trigger DFURT_SwitchToDFU() below */ TRACE_DEBUG("\r\n====dfu_detach\n\r"); g_dfu->state = DFU_STATE_appDETACH; + USBD_Write(0, 0, 0, 0, 0); + DFURT_SwitchToDFU(); ret = DFU_RET_ZLP; goto out; break; @@ -209,13 +211,14 @@ out: void DFURT_SwitchToDFU(void) { + __disable_irq(); + /* store the magic value that the DFU loader can detect and * activate itself, rather than boot into the application */ g_dfu->magic = USB_DFU_MAGIC; - + __DMB(); /* Disconnect the USB by removing the pull-up */ USBD_Disconnect(); - __disable_irq(); /* reset the processor, we will start execution with the * ResetVector of the bootloader */