From 007e495e0d88eabc6dae31fad311df38f8914607 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" <19971886+dok-net@users.noreply.github.com> Date: Wed, 20 Nov 2019 17:17:42 +0100 Subject: [PATCH] Implement invert for HardwareSerial (#6816) * Simple i/f to turn on inverted logic on UART0. * Refactor invert from HardwareSerial to uart * Final refactoring of invert bits into config bitmap. * Overload instead of default arg for subclassing. * Prevent unwanted effects if setting invert on other than UART0 - only that has these flags defined and documented. --- cores/esp8266/HardwareSerial.cpp | 4 ++-- cores/esp8266/HardwareSerial.h | 13 +++++++++---- cores/esp8266/uart.cpp | 6 +++++- cores/esp8266/uart.h | 2 +- tests/host/common/MockUART.cpp | 3 ++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp index 129b55eda..194a0553e 100644 --- a/cores/esp8266/HardwareSerial.cpp +++ b/cores/esp8266/HardwareSerial.cpp @@ -36,10 +36,10 @@ HardwareSerial::HardwareSerial(int uart_nr) : _uart_nr(uart_nr), _rx_size(256) {} -void HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin) +void HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin, bool invert) { end(); - _uart = uart_init(_uart_nr, baud, (int) config, (int) mode, tx_pin, _rx_size); + _uart = uart_init(_uart_nr, baud, (int) config, (int) mode, tx_pin, _rx_size, invert); #if defined(DEBUG_ESP_PORT) && !defined(NDEBUG) if (static_cast(this) == static_cast(&DEBUG_ESP_PORT)) { diff --git a/cores/esp8266/HardwareSerial.h b/cores/esp8266/HardwareSerial.h index dd36e6c28..dd12e96d2 100644 --- a/cores/esp8266/HardwareSerial.h +++ b/cores/esp8266/HardwareSerial.h @@ -73,18 +73,23 @@ public: void begin(unsigned long baud) { - begin(baud, SERIAL_8N1, SERIAL_FULL, 1); + begin(baud, SERIAL_8N1, SERIAL_FULL, 1, false); } void begin(unsigned long baud, SerialConfig config) { - begin(baud, config, SERIAL_FULL, 1); + begin(baud, config, SERIAL_FULL, 1, false); } void begin(unsigned long baud, SerialConfig config, SerialMode mode) { - begin(baud, config, mode, 1); + begin(baud, config, mode, 1, false); } - void begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin); + void begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin) + { + begin(baud, config, mode, tx_pin, false); + } + + void begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin, bool invert); void end(); diff --git a/cores/esp8266/uart.cpp b/cores/esp8266/uart.cpp index 05a425c9c..fd8170b58 100644 --- a/cores/esp8266/uart.cpp +++ b/cores/esp8266/uart.cpp @@ -577,7 +577,7 @@ uart_get_baudrate(uart_t* uart) } uart_t* -uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size) +uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size, bool invert) { uart_t* uart = (uart_t*) malloc(sizeof(uart_t)); if(uart == NULL) @@ -657,6 +657,10 @@ uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx } uart_set_baudrate(uart, baudrate); + if(uart->uart_nr == UART0 && invert) + { + config |= BIT(UCDTRI) | BIT(UCRTSI) | BIT(UCTXI) | BIT(UCDSRI) | BIT(UCCTSI) | BIT(UCRXI); + } USC0(uart->uart_nr) = config; if(!gdbstub_has_uart_isr_control() || uart->uart_nr != UART0) { diff --git a/cores/esp8266/uart.h b/cores/esp8266/uart.h index fd6158568..4871b5e93 100644 --- a/cores/esp8266/uart.h +++ b/cores/esp8266/uart.h @@ -113,7 +113,7 @@ extern "C" { struct uart_; 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); +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); diff --git a/tests/host/common/MockUART.cpp b/tests/host/common/MockUART.cpp index db0d8c889..d86e0418f 100644 --- a/tests/host/common/MockUART.cpp +++ b/tests/host/common/MockUART.cpp @@ -323,10 +323,11 @@ uart_get_bit_length(const int uart_nr) } uart_t* -uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size) +uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size, bool invert) { (void) config; (void) tx_pin; + (void) invert; uart_t* uart = (uart_t*) malloc(sizeof(uart_t)); if(uart == NULL) return NULL;