From 2cf76ba784daa9eefa6a939944c0d66ec92ab2ef Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 28 Mar 2021 21:57:46 +0200 Subject: [PATCH] HW Serial swap and pin setting work only on a few pins, return false on failure. --- cores/esp8266/HardwareSerial.h | 16 ++++----- cores/esp8266/uart.cpp | 60 ++++++++++++++++++++++++---------- cores/esp8266/uart.h | 6 ++-- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/cores/esp8266/HardwareSerial.h b/cores/esp8266/HardwareSerial.h index b8747f09d..8c27d2777 100644 --- a/cores/esp8266/HardwareSerial.h +++ b/cores/esp8266/HardwareSerial.h @@ -101,31 +101,31 @@ public: return uart_get_rx_buffer_size(_uart); } - void swap() + bool swap() { - swap(1); + return swap(1); } - void swap(uint8_t tx_pin) //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX + bool swap(uint8_t tx_pin) //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX { - uart_swap(_uart, tx_pin); + return uart_swap(_uart, tx_pin); } /* * Toggle between use of GPIO1 and GPIO2 as TX on UART 0. * Note: UART 1 can't be used if GPIO2 is used with UART 0! */ - void set_tx(uint8_t tx_pin) + bool set_tx(uint8_t tx_pin) { - uart_set_tx(_uart, tx_pin); + return uart_set_tx(_uart, tx_pin); } /* * UART 0 possible options are (1, 3), (2, 3) or (15, 13) * UART 1 allows only TX on 2 if UART 0 is not (2, 3) */ - void pins(uint8_t tx, uint8_t rx) + bool pins(uint8_t tx, uint8_t rx) { - uart_set_pins(_uart, tx, rx); + return uart_set_pins(_uart, tx, rx); } int available(void) override; diff --git a/cores/esp8266/uart.cpp b/cores/esp8266/uart.cpp index 3359ae6fd..7ad926cb9 100644 --- a/cores/esp8266/uart.cpp +++ b/cores/esp8266/uart.cpp @@ -760,11 +760,11 @@ uart_uninit(uart_t* uart) free(uart); } -void +bool uart_swap(uart_t* uart, int tx_pin) { if(uart == NULL) - return; + return false; switch(uart->uart_nr) { @@ -788,6 +788,7 @@ uart_swap(uart_t* uart, int tx_pin) pinMode(uart->rx_pin, FUNCTION_4); //RX IOSWAP |= (1 << IOSWAPU0); + return true; } else { @@ -808,6 +809,7 @@ uart_swap(uart_t* uart, int tx_pin) pinMode(3, SPECIAL); //RX IOSWAP &= ~(1 << IOSWAPU0); + return true; } break; case UART1: @@ -816,13 +818,14 @@ uart_swap(uart_t* uart, int tx_pin) default: break; } + return false; } -void +bool uart_set_tx(uart_t* uart, int tx_pin) { if(uart == NULL) - return; + return false; switch(uart->uart_nr) { @@ -834,12 +837,14 @@ uart_set_tx(uart_t* uart, int tx_pin) pinMode(uart->tx_pin, INPUT); uart->tx_pin = 2; pinMode(uart->tx_pin, FUNCTION_4); + return true; } else if (uart->tx_pin == 2 && tx_pin != 2) { pinMode(uart->tx_pin, INPUT); uart->tx_pin = 1; pinMode(uart->tx_pin, SPECIAL); + return true; } } @@ -850,33 +855,54 @@ uart_set_tx(uart_t* uart, int tx_pin) default: break; } + return false; } -void +bool uart_set_pins(uart_t* uart, int tx, int rx) { if(uart == NULL) - return; + return false; - if(uart->uart_nr == UART0) // Only UART0 allows pin changes + if(uart->uart_nr != UART0) // Only UART0 allows pin changes + return false; + + if(uart->tx_enabled && uart->tx_pin != tx) { - if(uart->tx_enabled && uart->tx_pin != tx) + if( rx == 13 && tx == 15) { - if( rx == 13 && tx == 15) + if (!uart_swap(uart, 15)) + return false; + } + else if (rx == 3 && (tx == 1 || tx == 2)) + { + if (uart->rx_pin != rx) { - uart_swap(uart, 15); + if (!uart_swap(uart, tx)) + return false; } - else if (rx == 3 && (tx == 1 || tx == 2)) + else { - if (uart->rx_pin != rx) - uart_swap(uart, tx); - else - uart_set_tx(uart, tx); + if (!uart_set_tx(uart, tx)) + return false; } } - if(uart->rx_enabled && uart->rx_pin != rx && rx == 13 && tx == 15) - uart_swap(uart, 15); + else + return false; } + + if (uart->rx_enabled && uart->rx_pin != rx) + { + if (rx == 13 && tx == 15) + { + if (!uart_swap(uart, 15)) + return false; + } + else + return false; + } + + return true; } diff --git a/cores/esp8266/uart.h b/cores/esp8266/uart.h index d792de665..8e08da021 100644 --- a/cores/esp8266/uart.h +++ b/cores/esp8266/uart.h @@ -116,9 +116,9 @@ typedef struct uart_ uart_t; uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size, bool invert); void uart_uninit(uart_t* uart); -void uart_swap(uart_t* uart, int tx_pin); -void uart_set_tx(uart_t* uart, int tx_pin); -void uart_set_pins(uart_t* uart, int tx, int rx); +bool uart_swap(uart_t* uart, int tx_pin); +bool uart_set_tx(uart_t* uart, int tx_pin); +bool uart_set_pins(uart_t* uart, int tx, int rx); bool uart_tx_enabled(uart_t* uart); bool uart_rx_enabled(uart_t* uart);