diff --git a/main.c b/main.c index ba1e0e4013..a2e4b9f729 100644 --- a/main.c +++ b/main.c @@ -127,6 +127,7 @@ bool start_mp(safe_mode_t safe_mode) { pyexec_result_t result; bool found_main = false; + if (safe_mode != NO_SAFE_MODE) { serial_write(MSG_SAFE_MODE_NO_MAIN); } else { diff --git a/ports/atmel-samd/background.c b/ports/atmel-samd/background.c index 6515e448b4..2fdf059823 100644 --- a/ports/atmel-samd/background.c +++ b/ports/atmel-samd/background.c @@ -26,9 +26,11 @@ #include "background.h" // #include "common-hal/audioio/AudioOut.h" +#include "usb.h" #include "usb_mass_storage.h" void run_background_tasks(void) { // audioout_background(); usb_msc_background(); + usb_cdc_background(); } diff --git a/ports/atmel-samd/usb.c b/ports/atmel-samd/usb.c index e0b9ddc41c..bd712a5d2c 100644 --- a/ports/atmel-samd/usb.c +++ b/ports/atmel-samd/usb.c @@ -56,13 +56,13 @@ static uint8_t usb_rx_buf[USB_RX_BUF_SIZE]; // Receive buffer head -static volatile uint8_t usb_rx_buf_head; +static volatile uint8_t usb_rx_buf_head = 0; // Receive buffer tail -static volatile uint8_t usb_rx_buf_tail; +static volatile uint8_t usb_rx_buf_tail = 0; // Number of bytes in receive buffer -volatile uint8_t usb_rx_count; +volatile uint8_t usb_rx_count = 0; volatile bool mp_cdc_enabled = false; volatile bool usb_transmitting = false; @@ -133,8 +133,11 @@ static bool read_complete(const uint8_t ep, const enum usb_xfer_code rc, const u uint8_t c = cdc_packet_buffer[i]; if (c == mp_interrupt_char) { mp_keyboard_interrupt(); - // Don't put the interrupt into the buffer, just continue. - continue; + // If interrupted, flush all the input. + usb_rx_count = 0; + usb_rx_buf_head = 0; + usb_rx_buf_tail = 0; + break; } else { // The count of characters present in receive buffer is // incremented. @@ -144,7 +147,7 @@ static bool read_complete(const uint8_t ep, const enum usb_xfer_code rc, const u if (usb_rx_buf_tail == USB_RX_BUF_SIZE) { // Reached the end of buffer, revert back to beginning of // buffer. - usb_rx_buf_tail = 0x00; + usb_rx_buf_tail = 0; } } } @@ -219,8 +222,7 @@ void init_usb(void) { mscdf_register_callback(MSCDF_CB_TEST_DISK_READY, (FUNC_PTR)usb_msc_disk_is_ready); mscdf_register_callback(MSCDF_CB_XFER_BLOCKS_DONE, (FUNC_PTR)usb_msc_xfer_done); - int32_t result = usbdc_start(&multi_desc); - while (result != ERR_NONE) {} + usbdc_start(&multi_desc); usbdc_attach(); } @@ -315,3 +317,12 @@ void usb_write(const char* buffer, uint32_t len) { bool usb_connected(void) { return cdc_enabled(); } + +// Poll for input if keyboard interrupts are enabled, +// so that we can check for the interrupt char. read_complete() does the checking. +void usb_cdc_background() { + // + if (mp_interrupt_char != -1 && cdc_enabled() && !pending_read) { + start_read(); + } +} diff --git a/ports/atmel-samd/usb.h b/ports/atmel-samd/usb.h index 754331211d..45c05df9c0 100644 --- a/ports/atmel-samd/usb.h +++ b/ports/atmel-samd/usb.h @@ -37,5 +37,6 @@ int usb_read(void); void usb_write(const char* buffer, uint32_t len); bool usb_bytes_available(void); bool usb_connected(void); +void usb_cdc_background(void); #endif // __MICROPY_INCLUDED_ATMEL_SAMD_USB_H__