diff options
Diffstat (limited to 'src/generic')
-rw-r--r-- | src/generic/usb_cdc.c | 12 | ||||
-rw-r--r-- | src/generic/usb_cdc.h | 1 |
2 files changed, 13 insertions, 0 deletions
diff --git a/src/generic/usb_cdc.c b/src/generic/usb_cdc.c index 7f6b2f34..d395a3c0 100644 --- a/src/generic/usb_cdc.c +++ b/src/generic/usb_cdc.c @@ -402,6 +402,15 @@ usb_req_set_configuration(struct usb_ctrlrequest *req) } static struct usb_cdc_line_coding line_coding; +static uint8_t line_control_state; + +static void +check_reboot(void) +{ + if (line_coding.dwDTERate == 1200 && !(line_control_state & 0x01)) + // A baud of 1200 is an Arduino style request to enter the bootloader + usb_request_bootloader(); +} static void usb_req_set_line_coding(struct usb_ctrlrequest *req) @@ -412,6 +421,7 @@ usb_req_set_line_coding(struct usb_ctrlrequest *req) return; } usb_do_xfer(&line_coding, sizeof(line_coding), UX_READ); + check_reboot(); } static void @@ -432,7 +442,9 @@ usb_req_set_line(struct usb_ctrlrequest *req) usb_do_stall(); return; } + line_control_state = req->wValue; usb_do_xfer(NULL, 0, UX_SEND); + check_reboot(); } static void diff --git a/src/generic/usb_cdc.h b/src/generic/usb_cdc.h index 4771d08c..1763a843 100644 --- a/src/generic/usb_cdc.h +++ b/src/generic/usb_cdc.h @@ -21,6 +21,7 @@ int_fast8_t usb_send_ep0_progmem(const void *data, uint_fast8_t len); void usb_stall_ep0(void); void usb_set_address(uint_fast8_t addr); void usb_set_configure(void); +void usb_request_bootloader(void); // usb_cdc.c void usb_notify_bulk_in(void); |