Skip to content

Commit 191a092

Browse files
committed
Refine manifest request event criteria
If the firmware has been written to at least once, treat a detach/USB reset as an implicit manifestation request and run the manifest request callback. Otherwise treat it as a detach request and simply reset.
1 parent 9bf8c4d commit 191a092

1 file changed

Lines changed: 17 additions & 8 deletions

File tree

src/dfu.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ static enum dfu_state current_dfu_state;
5151
static enum dfu_status current_dfu_status;
5252
static size_t current_dfu_offset;
5353

54+
static bool dfu_modified_firmware = false;
55+
5456
static uint8_t dfu_download_buffer[USB_CONTROL_BUF_SIZE];
5557
static 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
145149
static 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

159162
static enum usbd_request_return_codes
160163
dfu_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

Comments
 (0)