cdc_uart: start AutoBaud on magic baud and set detected baud rate
diff --git a/src/cdc_uart.c b/src/cdc_uart.c index d60e7b4..dfe523b 100644 --- a/src/cdc_uart.c +++ b/src/cdc_uart.c
@@ -27,6 +27,7 @@ #include "FreeRTOS.h" #include "task.h" #include "tusb.h" +#include "autobaud.h" #include "probe_config.h" @@ -50,6 +51,8 @@ static uint rx_led_debounce; #endif +static BaudInfo_t baud_info; + void cdc_uart_init(void) { gpio_set_function(PROBE_UART_TX, GPIO_FUNC_UART); gpio_set_function(PROBE_UART_RX, GPIO_FUNC_UART); @@ -176,6 +179,22 @@ return keep_alive; } +void cdc_uart_set_baudrate(uint32_t baudrate) { + /* Set the tick thread interval to the amount of time it takes to + * fill up half a FIFO. Millis is too coarse for integer divide. + */ + uint32_t micros = (1000 * 1000 * 16 * 10) / MAX(baudrate, 1); + interval = MAX(1, micros / ((1000 * 1000) / configTICK_RATE_HZ)); + debounce_ticks = MAX(1, configTICK_RATE_HZ / (interval * DEBOUNCE_MS)); + probe_info("New baud rate %ld micros %ld interval %lu\n", + baudrate, micros, interval); + uart_deinit(PROBE_UART_INTERFACE); + tud_cdc_write_clear(); + tud_cdc_read_flush(); + + uart_init(PROBE_UART_INTERFACE, baudrate); +} + void cdc_thread(void *ptr) { BaseType_t delayed; @@ -202,23 +221,22 @@ void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* line_coding) { + if (line_coding->bit_rate == MAGIC_BAUD) { + if (!autobaud_running) + autobaud_start(); + return; + } + else if (autobaud_running) { + autobaud_wait_stop(); + } uart_parity_t parity; uint data_bits, stop_bits; - /* Set the tick thread interval to the amount of time it takes to - * fill up half a FIFO. Millis is too coarse for integer divide. - */ - uint32_t micros = (1000 * 1000 * 16 * 10) / MAX(line_coding->bit_rate, 1); + /* Modifying state, so park the thread before changing it. */ if (tud_cdc_connected()) vTaskSuspend(uart_taskhandle); - interval = MAX(1, micros / ((1000 * 1000) / configTICK_RATE_HZ)); - debounce_ticks = MAX(1, configTICK_RATE_HZ / (interval * DEBOUNCE_MS)); - probe_info("New baud rate %ld micros %ld interval %lu\n", - line_coding->bit_rate, micros, interval); - uart_deinit(PROBE_UART_INTERFACE); - tud_cdc_write_clear(); - tud_cdc_read_flush(); - uart_init(PROBE_UART_INTERFACE, line_coding->bit_rate); + + cdc_uart_set_baudrate(line_coding->bit_rate); switch (line_coding->parity) { case CDC_LINE_CODING_PARITY_ODD: