How can I access non-REPL UART over USB?
So I'm using the RP2 port of MicroPython.
Is there a way to, at runtime, switch to EG UART1 communication? By default I get the Python REPL, which is fine but I'm trying to expose UART1, with all its relevant programming, over the USB connection. Ideally would avoid the hardware pin-connected adapter if at all possible.
I can see USB_VCP [0] is a thing, but it's only for PyBoard. CircuitPython [1] for example allows defining another virtual USB device, and mapping it to UART from what I can tell. There is also a community patch that does just this, but it's a git patch and possibly leads to other issues [2].
[0] https://docs.micropython.org/en/latest/library/pyb.USB_VCP.html
[1] https://learn.adafruit.com/customizing-usb-devices-in-circuitpython?view=all#add-a-second-serial-port-3096573-2
[2] https://forums.raspberrypi.com/viewtopic.php?t=305834
Move esp32 REPL to a different UART
Hi.
I'm trying to change the ESP32 REPL to use UART2 rather than UART0. I'm using an Adafruit Feather Huzzah32 and I want to be able to use the REPL over the feather's RX/16 and TX/17 pins rather than the USB port. I believe this is UART2.
I've tried the following:
diff --git a/ports/esp32/mphalport.c b/ports/esp32/mphalport.c
index 305e87593..7edb40321 100644
--- a/ports/esp32/mphalport.c
+++ b/ports/esp32/mphalport.c
@@ -38,6 +38,8 @@
#include "rom/uart.h"
#endif
+#include "driver/uart.h"
+
#include "py/obj.h"
#include "py/stream.h"
#include "py/mpstate.h"
@@ -80,6 +82,7 @@ void mp_hal_stdout_tx_strn(const char *str, uint32_t len) {
if (release_gil) {
MP_THREAD_GIL_EXIT();
}
+ uart_tx_switch(UART_NUM_2);
for (uint32_t i = 0; i < len; ++i) {
uart_tx_one_char(str[i]);
}
diff --git a/ports/esp32/uart.c b/ports/esp32/uart.c
index 10a4ba462..1de31dc0c 100644
--- a/ports/esp32/uart.c
+++ b/ports/esp32/uart.c
@@ -37,13 +37,13 @@ STATIC void uart_irq_handler(void *arg);
void uart_init(void) {
uart_isr_handle_t handle;
- uart_isr_register(UART_NUM_0, uart_irq_handler, NULL, ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM, &handle);
- uart_enable_rx_intr(UART_NUM_0);
+ uart_isr_register(UART_NUM_2, uart_irq_handler, NULL, ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM, &handle);
+ uart_enable_rx_intr(UART_NUM_2);
}
// all code executed in ISR must be in IRAM, and any const data must be in DRAM
STATIC void IRAM_ATTR uart_irq_handler(void *arg) {
- volatile uart_dev_t *uart = &UART0;
+ volatile uart_dev_t *uart = &UART2;
uart->int_clr.rxfifo_full = 1;
uart->int_clr.frm_err = 1;
uart->int_clr.rxfifo_tout = 1;
But this doesn't seem to be enough. I've searched all over this codebase and cannot figure out how this fits together. Is there something obvious I'm missing?