Skip to content

Commit

Permalink
shared/tinyusb: Buffer startup stdout/banner to send on cdc connection.
Browse files Browse the repository at this point in the history
Signed-off-by: Andrew Leech <andrew@alelec.net>
  • Loading branch information
pi-anl committed May 16, 2024
1 parent 5bedc84 commit 526af51
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 24 deletions.
2 changes: 1 addition & 1 deletion lib/tinyusb
Submodule tinyusb updated 1041 files
65 changes: 42 additions & 23 deletions shared/tinyusb/mp_usbd_cdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@
#include "py/mpconfig.h"
#include "extmod/modmachine.h"

#if MICROPY_HW_USB_CDC
#if MICROPY_HW_USB_CDC && MICROPY_HW_ENABLE_USBDEV
#include "tusb.h"
#include "device/usbd.h"

#include "shared/tinyusb/mp_usbd.h"

static uint8_t cdc_itf_pending; // keep track of cdc interfaces which need attention to poll
Expand Down Expand Up @@ -83,40 +85,50 @@ void tud_cdc_rx_cb(uint8_t itf) {

mp_uint_t mp_usbd_cdc_tx_strn(const char *str, mp_uint_t len) {
size_t i = 0;
if (tud_cdc_connected()) {
while (i < len) {
uint32_t n = len - i;
if (n > CFG_TUD_CDC_EP_BUFSIZE) {
n = CFG_TUD_CDC_EP_BUFSIZE;
}
int timeout = 0;
// Wait with a max of USC_CDC_TIMEOUT ms
while (n > tud_cdc_write_available() && timeout++ < MICROPY_HW_USB_CDC_TX_TIMEOUT) {
mp_event_wait_ms(1);
while (i < len) {
uint32_t n = len - i;
if (n > CFG_TUD_CDC_EP_BUFSIZE) {
n = CFG_TUD_CDC_EP_BUFSIZE;
}
int timeout = 0;
// Wait with a max of USC_CDC_TIMEOUT ms
while (n > tud_cdc_write_available()
&& timeout++ < MICROPY_HW_USB_CDC_TX_TIMEOUT
&& tud_cdc_connected()) {
mp_event_wait_ms(1);

// Explicitly run the USB stack as the scheduler may be locked (eg we
// are in an interrupt handler), while there is data pending.
mp_usbd_task();
}
if (timeout >= MICROPY_HW_USB_CDC_TX_TIMEOUT) {
break;
}
uint32_t n2 = tud_cdc_write(str + i, n);
tud_cdc_write_flush();
i += n2;
// Explicitly run the USB stack as the scheduler may be locked (eg we
// are in an interrupt handler), while there is data pending.
mp_usbd_task();
}
n = MIN(n, tud_cdc_write_available());
if (n == 0) {
break;
}
uint32_t n2 = tud_cdc_write(str + i, n);
tud_cdc_write_flush();
i += n2;
}
return i;
}

#if MICROPY_HW_USB_CDC_1200BPS_TOUCH && MICROPY_HW_ENABLE_USBDEV
static int8_t cdc_connected_flush_delay = 0;

void tud_sof_cb(uint32_t frame_count) {
if (--cdc_connected_flush_delay < 0) {
tud_cdc_write_flush();
tud_sof_cb_enable(false);
}
}

#if MICROPY_HW_USB_CDC_1200BPS_TOUCH
static mp_sched_node_t mp_bootloader_sched_node;

static void usbd_cdc_run_bootloader_task(mp_sched_node_t *node) {
mp_hal_delay_ms(250);
machine_bootloader(0, NULL);
}
#endif // MICROPY_HW_USB_CDC_1200BPS_TOUCH

void
#if MICROPY_HW_USB_EXTERNAL_TINYUSB
Expand All @@ -125,6 +137,13 @@ mp_usbd_line_state_cb
tud_cdc_line_state_cb
#endif
(uint8_t itf, bool dtr, bool rts) {
if (dtr) {
// The host has started to open the cdc serial port.
// Wait a few ms for host to be ready then send tx buffer.
cdc_connected_flush_delay = (tud_speed_get() == TUSB_SPEED_HIGH) ? 64 : 8;
tud_sof_cb_enable(true);
}
#if MICROPY_HW_USB_CDC_1200BPS_TOUCH
if (dtr == false && rts == false) {
// Device is disconnected.
cdc_line_coding_t line_coding;
Expand All @@ -134,7 +153,7 @@ tud_cdc_line_state_cb
mp_sched_schedule_node(&mp_bootloader_sched_node, usbd_cdc_run_bootloader_task);
}
}
#endif
}

#endif
#endif
1 change: 1 addition & 0 deletions shared/tinyusb/tusb_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
#if CFG_TUD_CDC
#define CFG_TUD_CDC_RX_BUFSIZE ((CFG_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED) ? 512 : 256)
#define CFG_TUD_CDC_TX_BUFSIZE ((CFG_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED) ? 512 : 256)
#define CFG_TUD_CDC_PERSISTENT_TX_BUFF (1)
#endif

// MSC Configuration
Expand Down

0 comments on commit 526af51

Please sign in to comment.