← index #8560Issue #5405
Off-topic · high · value 0.883
QUERY · ISSUE

How can I access non-REPL UART over USB?

openby sk0gopened 2022-04-18updated 2024-09-08
port-rp2

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

CANDIDATE · ISSUE

Move esp32 REPL to a different UART

openby lerouxbopened 2019-12-09updated 2021-06-20

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?

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied