summaryrefslogtreecommitdiffstatshomepage
path: root/shared/tinyusb/mp_usbd_cdc.c
diff options
context:
space:
mode:
Diffstat (limited to 'shared/tinyusb/mp_usbd_cdc.c')
-rw-r--r--shared/tinyusb/mp_usbd_cdc.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/shared/tinyusb/mp_usbd_cdc.c b/shared/tinyusb/mp_usbd_cdc.c
index 0fbecb0a86..b4151f685c 100644
--- a/shared/tinyusb/mp_usbd_cdc.c
+++ b/shared/tinyusb/mp_usbd_cdc.c
@@ -138,9 +138,12 @@ void tud_sof_cb(uint32_t frame_count) {
#endif
-#if MICROPY_HW_ENABLE_USBDEV && (MICROPY_HW_USB_CDC_1200BPS_TOUCH || MICROPY_HW_USB_CDC)
+#if MICROPY_HW_ENABLE_USBDEV && ( \
+ MICROPY_HW_USB_CDC_1200BPS_TOUCH || \
+ MICROPY_HW_USB_CDC || \
+ MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER)
-#if MICROPY_HW_USB_CDC_1200BPS_TOUCH
+#if MICROPY_HW_USB_CDC_1200BPS_TOUCH || MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER
static mp_sched_node_t mp_bootloader_sched_node;
static void usbd_cdc_run_bootloader_task(mp_sched_node_t *node) {
@@ -149,6 +152,13 @@ static void usbd_cdc_run_bootloader_task(mp_sched_node_t *node) {
}
#endif
+#if MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER
+static struct {
+ bool dtr : 1;
+ bool rts : 1;
+} prev_line_state = {0};
+#endif
+
void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {
#if MICROPY_HW_USB_CDC && !MICROPY_EXCLUDE_SHARED_TINYUSB_USBD_CDC
if (dtr) {
@@ -159,6 +169,15 @@ void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {
tud_sof_cb_enable(true);
}
#endif
+ #if MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER
+ if (dtr && !rts) {
+ if (prev_line_state.rts && !prev_line_state.dtr) {
+ mp_sched_schedule_node(&mp_bootloader_sched_node, usbd_cdc_run_bootloader_task);
+ }
+ }
+ prev_line_state.rts = rts;
+ prev_line_state.dtr = dtr;
+ #endif
#if MICROPY_HW_USB_CDC_1200BPS_TOUCH
if (dtr == false && rts == false) {
// Device is disconnected.