Skip to content

Commit 6b78574

Browse files
author
Konstantin Sharlaimov
committed
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.
1 parent 47f7830 commit 6b78574

3 files changed

Lines changed: 18 additions & 10 deletions

File tree

src/machine/machine_rp2_gpio.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,16 @@ func (p Pin) setSchmitt(trigger bool) {
141141
p.padCtrl().ReplaceBits(boolToBit(trigger)<<rp.PADS_BANK0_GPIO0_SCHMITT_Pos, rp.PADS_BANK0_GPIO0_SCHMITT_Msk, 0)
142142
}
143143

144+
// setOutOver sets the output override (OUTOVER field) for the pin.
145+
func (p Pin) setOutOver(over uint32) {
146+
p.ioCtrl().ReplaceBits(over<<rp.IO_BANK0_GPIO0_CTRL_OUTOVER_Pos, rp.IO_BANK0_GPIO0_CTRL_OUTOVER_Msk, 0)
147+
}
148+
149+
// setInOver sets the input override (INOVER field) for the pin.
150+
func (p Pin) setInOver(over uint32) {
151+
p.ioCtrl().ReplaceBits(over<<rp.IO_BANK0_GPIO0_CTRL_INOVER_Pos, rp.IO_BANK0_GPIO0_CTRL_INOVER_Msk, 0)
152+
}
153+
144154
// setFunc will set pin function to fn.
145155
func (p Pin) setFunc(fn pinFunc) {
146156
// Set input enable, Clear output disable

src/machine/machine_rp2_uart.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,17 @@ func (uart *UART) Configure(config UARTConfig) error {
5353
if config.TX != NoPin {
5454
config.TX.Configure(PinConfig{Mode: PinUART})
5555
if config.InvertTX {
56-
config.TX.ioCtrl().ReplaceBits(rp.IO_BANK0_GPIO0_CTRL_OUTOVER_INVERT<<rp.IO_BANK0_GPIO0_CTRL_OUTOVER_Pos, rp.IO_BANK0_GPIO0_CTRL_OUTOVER_Msk, 0)
56+
config.TX.setOutOver(rp.IO_BANK0_GPIO0_CTRL_OUTOVER_INVERT)
5757
} else {
58-
config.TX.ioCtrl().ReplaceBits(rp.IO_BANK0_GPIO0_CTRL_OUTOVER_NORMAL<<rp.IO_BANK0_GPIO0_CTRL_OUTOVER_Pos, rp.IO_BANK0_GPIO0_CTRL_OUTOVER_Msk, 0)
58+
config.TX.setOutOver(rp.IO_BANK0_GPIO0_CTRL_OUTOVER_NORMAL)
5959
}
6060
}
6161
if config.RX != NoPin {
6262
config.RX.Configure(PinConfig{Mode: PinUART})
6363
if config.InvertRX {
64-
config.RX.ioCtrl().ReplaceBits(rp.IO_BANK0_GPIO0_CTRL_INOVER_INVERT<<rp.IO_BANK0_GPIO0_CTRL_INOVER_Pos, rp.IO_BANK0_GPIO0_CTRL_INOVER_Msk, 0)
64+
config.RX.setInOver(rp.IO_BANK0_GPIO0_CTRL_INOVER_INVERT)
6565
} else {
66-
config.RX.ioCtrl().ReplaceBits(rp.IO_BANK0_GPIO0_CTRL_INOVER_NORMAL<<rp.IO_BANK0_GPIO0_CTRL_INOVER_Pos, rp.IO_BANK0_GPIO0_CTRL_INOVER_Msk, 0)
66+
config.RX.setInOver(rp.IO_BANK0_GPIO0_CTRL_INOVER_NORMAL)
6767
}
6868
}
6969
if config.RTS != 0 {

src/machine/machine_sam_uart_invert.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,16 @@
22

33
package machine
44

5-
import "device/sam"
6-
75
// Configure UART TX/RX line inversion using SVD-generated APIs.
86
func (uart *UART) setInversion(config UARTConfig) {
97
if config.InvertTX {
10-
uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_INT_CTRLA_TXINV)
8+
uart.Bus.SetCTRLA_TXINV(1)
119
} else {
12-
uart.Bus.CTRLA.ClearBits(sam.SERCOM_USART_INT_CTRLA_TXINV)
10+
uart.Bus.SetCTRLA_TXINV(0)
1311
}
1412
if config.InvertRX {
15-
uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_INT_CTRLA_RXINV)
13+
uart.Bus.SetCTRLA_RXINV(1)
1614
} else {
17-
uart.Bus.CTRLA.ClearBits(sam.SERCOM_USART_INT_CTRLA_RXINV)
15+
uart.Bus.SetCTRLA_RXINV(0)
1816
}
1917
}

0 commit comments

Comments
 (0)