diff options
Diffstat (limited to 'watch-library')
-rw-r--r-- | watch-library/watch/tusb_config.h | 4 | ||||
-rw-r--r-- | watch-library/watch/watch_private.c | 9 | ||||
-rw-r--r-- | watch-library/watch/watch_uart.c | 21 |
3 files changed, 30 insertions, 4 deletions
diff --git a/watch-library/watch/tusb_config.h b/watch-library/watch/tusb_config.h index fa981f3a..a22b2b99 100644 --- a/watch-library/watch/tusb_config.h +++ b/watch-library/watch/tusb_config.h @@ -43,8 +43,8 @@ #define CFG_TUSB_OS OPT_OS_NONE -// Do not use TinyUSB debug, as our printf method prints stuff to the USB console. -// if you must, modify _write in watch_private.c to use an alternate destination like a UART. +// disable TinyUSB debug. our printf method prints stuff to the USB console, so you just get infinite noise. +// if you need to debug tinyUSB issues, use the alternate _write function in watch_private.c to echo to the UART. #define CFG_TUSB_DEBUG 0 /* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment. diff --git a/watch-library/watch/watch_private.c b/watch-library/watch/watch_private.c index c9f0b3c0..550419a2 100644 --- a/watch-library/watch/watch_private.c +++ b/watch-library/watch/watch_private.c @@ -106,6 +106,15 @@ int _read() { return 0; } +// Alternate function that outputs to the debug UART. useful for debugging USB issues. +// int _write(int file, char *ptr, int len) { +// (void)file; +// int pos = 0; +// while(pos < len) watch_debug_putc(ptr[pos++]); + +// return 0; +// } + void USB_Handler(void) { tud_int_handler(0); } diff --git a/watch-library/watch/watch_uart.c b/watch-library/watch/watch_uart.c index 68ac872e..afebff1b 100644 --- a/watch-library/watch/watch_uart.c +++ b/watch-library/watch/watch_uart.c @@ -53,8 +53,25 @@ #include "peripheral_clk_config.h" void watch_enable_debug_uart(uint32_t baud) { - /// FIXME: UART baud rate calculation will be incorrect if plugged into USB / running at 16 MHz - uint64_t br = (uint64_t)65536 * (CONF_CPU_FREQUENCY - 16 * baud) / CONF_CPU_FREQUENCY; + uint8_t fsel = hri_oscctrl_get_OSC16MCTRL_FSEL_bf(OSCCTRL, OSCCTRL_OSC16MCTRL_MASK); + uint32_t freq = 0; + switch (fsel) { + case OSCCTRL_OSC16MCTRL_FSEL_4_Val: + freq = 4000000; + break; + case OSCCTRL_OSC16MCTRL_FSEL_8_Val: + freq = 8000000; + break; + case OSCCTRL_OSC16MCTRL_FSEL_12_Val: + freq = 12000000; + break; + case OSCCTRL_OSC16MCTRL_FSEL_16_Val: + freq = 16000000; + break; + default: + return; + } + uint64_t br = (uint64_t)65536 * ((freq * 4) - 16 * baud) / (freq * 4); gpio_set_pin_direction(D1, GPIO_DIRECTION_IN); gpio_set_pin_function(D1, PINMUX_PB00C_SERCOM3_PAD2); |