@@ -51,6 +51,8 @@ static enum dfu_state current_dfu_state;
5151static enum dfu_status current_dfu_status ;
5252static size_t current_dfu_offset ;
5353
54+ static bool dfu_modified_firmware = false;
55+
5456static uint8_t dfu_download_buffer [USB_CONTROL_BUF_SIZE ];
5557static size_t dfu_download_size ;
5658
@@ -131,6 +133,9 @@ static void dfu_on_download_request(usbd_device* usbd_dev, struct usb_setup_data
131133 bool ok = target_flash_program_array (dest , data , dfu_download_size /2 );
132134 target_flash_lock ();
133135
136+ /* Record that we touched the application firmware */
137+ dfu_modified_firmware = true;
138+
134139 if (ok ) {
135140 current_dfu_offset += dfu_download_size ;
136141 /* We could go back to STATE_DFU_DNLOAD_SYNC, but then
@@ -141,7 +146,6 @@ static void dfu_on_download_request(usbd_device* usbd_dev, struct usb_setup_data
141146 }
142147}
143148
144- #if DFU_WILL_DETACH
145149static void dfu_on_manifest_request (usbd_device * usbd_dev , struct usb_setup_data * req ) {
146150 (void )usbd_dev ;
147151 (void )req ;
@@ -154,7 +158,6 @@ static void dfu_on_manifest_request(usbd_device* usbd_dev, struct usb_setup_data
154158 didn't already do it */
155159 scb_reset_system ();
156160}
157- #endif
158161
159162static enum usbd_request_return_codes
160163dfu_control_class_request (usbd_device * usbd_dev ,
@@ -314,7 +317,11 @@ dfu_control_class_request(usbd_device *usbd_dev,
314317#endif
315318
316319 case DFU_DETACH : {
317- * complete = & dfu_on_detach_complete ;
320+ if (dfu_modified_firmware ) {
321+ * complete = & dfu_on_manifest_request ;
322+ } else {
323+ * complete = & dfu_on_detach_complete ;
324+ }
318325 status = USBD_REQ_HANDLED ;
319326 break ;
320327 }
@@ -355,14 +362,16 @@ static void dfu_on_usb_reset(void) {
355362 return ;
356363 }
357364
358- /* On subsequent USB reset requests, either manifest by resetting
365+ /* On subsequent USB reset requests, either reset/ manifest
359366 or enter the error state if firmware is invalid, per the spec */
360367 if (validate_application ()) {
361- /* Manifest by resetting after responding */
362- dfu_set_state (STATE_DFU_MANIFEST );
368+ if (dfu_modified_firmware ) {
369+ /* Manifest by resetting after responding */
370+ dfu_set_state (STATE_DFU_MANIFEST );
363371
364- if (dfu_manifest_request_callback ) {
365- dfu_manifest_request_callback ();
372+ if (dfu_manifest_request_callback ) {
373+ dfu_manifest_request_callback ();
374+ }
366375 }
367376
368377 /* Reset and launch the application if the manifest callback
0 commit comments