From ea003da13f37357a248a1f9aa4300957936a7762 Mon Sep 17 00:00:00 2001 From: Konstantin Sharlaimov Date: Fri, 17 Jul 2026 10:45:50 +0200 Subject: [PATCH] Add UART line inversion support (#5522) * feat(machine): add UART line inversion support. Add InvertTX and InvertRX to UARTConfig to allow enabling hardware line inversion on supported targets. Added hardware implementation for RP2 (RP2040, RP2350), STM32 (newer families), SAM (SAMD51, SAME5x), and ESP (ESP32, ESP32-C3, ESP32-C6). * refactor(machine): Refactor UART inversion with pin setter helpers. RP2: Extract setOutOver/setInOver methods on Pin, removing inline IO control register manipulation from UART configure. SAM: Switch to SetCTRLA_TXINV/SetCTRLA_RXINV methods, dropping the unused device/sam import and raw SetBits/ClearBits calls. --------- Co-authored-by: Konstantin Sharlaimov --- src/machine/machine_atsamd21.go | 3 +++ src/machine/machine_atsamd51.go | 3 +++ src/machine/machine_esp32.go | 10 ++++++++++ src/machine/machine_esp32c3.go | 12 ++++++++++-- src/machine/machine_esp32c6.go | 12 ++++++++++-- src/machine/machine_rp2_gpio.go | 10 ++++++++++ src/machine/machine_rp2_uart.go | 10 ++++++++++ src/machine/machine_sam_uart_invert.go | 17 +++++++++++++++++ src/machine/machine_sam_uart_noinvert.go | 7 +++++++ src/machine/machine_stm32_uart.go | 3 +++ src/machine/machine_stm32_uart_invert.go | 17 +++++++++++++++++ src/machine/machine_stm32_uart_noinvert.go | 7 +++++++ src/machine/serial.go | 2 ++ 13 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 src/machine/machine_sam_uart_invert.go create mode 100644 src/machine/machine_sam_uart_noinvert.go create mode 100644 src/machine/machine_stm32_uart_invert.go create mode 100644 src/machine/machine_stm32_uart_noinvert.go diff --git a/src/machine/machine_atsamd21.go b/src/machine/machine_atsamd21.go index b46dcef94..5768d8f04 100644 --- a/src/machine/machine_atsamd21.go +++ b/src/machine/machine_atsamd21.go @@ -621,6 +621,9 @@ func (uart *UART) Configure(config UARTConfig) error { //sercom->USART.CTRLB.reg |= SERCOM_USART_CTRLB_TXEN | SERCOM_USART_CTRLB_RXEN ; uart.Bus.CTRLB.SetBits(sam.SERCOM_USART_CTRLB_TXEN | sam.SERCOM_USART_CTRLB_RXEN) + // Configure RX/TX inversion + uart.setInversion(config) + // Enable USART1 port. // sercom->USART.CTRLA.bit.ENABLE = 0x1u; uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_ENABLE) diff --git a/src/machine/machine_atsamd51.go b/src/machine/machine_atsamd51.go index 158be4911..1c7ea0411 100644 --- a/src/machine/machine_atsamd51.go +++ b/src/machine/machine_atsamd51.go @@ -1102,6 +1102,9 @@ func (uart *UART) Configure(config UARTConfig) error { //sercom->USART.CTRLB.reg |= SERCOM_USART_CTRLB_TXEN | SERCOM_USART_CTRLB_RXEN ; uart.Bus.CTRLB.SetBits(sam.SERCOM_USART_INT_CTRLB_TXEN | sam.SERCOM_USART_INT_CTRLB_RXEN) + // Configure RX/TX inversion + uart.setInversion(config) + // Enable USART1 port. // sercom->USART.CTRLA.bit.ENABLE = 0x1u; uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_INT_CTRLA_ENABLE) diff --git a/src/machine/machine_esp32.go b/src/machine/machine_esp32.go index 3f715e6de..060a3b0ba 100644 --- a/src/machine/machine_esp32.go +++ b/src/machine/machine_esp32.go @@ -332,10 +332,20 @@ func (uart *UART) Configure(config UARTConfig) { if config.RX != NoPin { config.RX.configure(PinConfig{Mode: PinInputPullup}, uart.TXRXSignal) + if config.InvertRX { + inFunc(uart.TXRXSignal).Set(esp.GPIO_FUNC_IN_SEL_CFG_SEL | uint32(config.RX)<