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?
esp8266: Allow disable of REPL on UART0
This PR builds on the great initial work of @mhoffma in #2891. It rebases that work then extends those changes to address comments on #2891 by @dpgeorge, provide ability to enable/disable REPL and further decouple esp_mphal.c, machine_uart.c and uart.c from one-another
It pumps all UART RX into it's own ring buffer as well as conditionally to the main REPL input_buf. TX will go out on the UART as normal but this adds a conditional TX API for esp_mphal to use that will conditionally disable REPL TX to UART.
The conditional RX/TX behaviour is currently switched using an extra parameter to UART.init(). This would need to change to align with whatever is eventually decided in #3144. This shouldn't be very onerous if the uos.dupterm(obj, index) approach is adopted.
To make use of this behaviour the process is basically:
-
Boot ESP8266, connect via UART, use REPL on UART to setup webrepl.
-
Power down, connect whatever other device you want to your UART.
-
Boot and connect to webrepl.
-
Reinitalise the UART to disable REPL (and set other params as needed):
uart0.init(use_repl=0, baudrate=9600, rxbuflen=256) -
Use the webrepl and the Pythonic UART API to talk to your other device using UART without any weird REPL interaction!