summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/discovery-stm32f072/board.c2
-rw-r--r--board/discovery/board.c1
-rw-r--r--board/servo_micro/board.c3
-rw-r--r--board/servo_v4/board.c2
-rw-r--r--board/tigertail/board.c1
-rw-r--r--chip/stm32/usart.c13
-rw-r--r--chip/stm32/usart.h36
-rw-r--r--driver/mcdp28x0.c1
8 files changed, 43 insertions, 16 deletions
diff --git a/board/discovery-stm32f072/board.c b/board/discovery-stm32f072/board.c
index 360f970001..7a16208498 100644
--- a/board/discovery-stm32f072/board.c
+++ b/board/discovery-stm32f072/board.c
@@ -65,6 +65,7 @@ static struct usart_config const loopback_usart =
loopback_rx_dma.usart_rx,
loopback_tx_dma.usart_tx,
115200,
+ 0,
loopback_queue,
loopback_queue);
@@ -89,6 +90,7 @@ static struct usart_config const forward_usart =
usart_rx_interrupt,
forward_tx_dma.usart_tx,
115200,
+ 0,
usart_to_usb,
usb_to_usart);
diff --git a/board/discovery/board.c b/board/discovery/board.c
index 81fe437850..8de20f19ce 100644
--- a/board/discovery/board.c
+++ b/board/discovery/board.c
@@ -55,6 +55,7 @@ static struct usart_config const loopback_usart =
loopback_rx_dma.usart_rx,
loopback_tx_dma.usart_tx,
115200,
+ 0,
loopback_queue,
loopback_queue);
diff --git a/board/servo_micro/board.c b/board/servo_micro/board.c
index 644d8ce293..61827ecd2c 100644
--- a/board/servo_micro/board.c
+++ b/board/servo_micro/board.c
@@ -50,6 +50,7 @@ static struct usart_config const usart2 =
usart_rx_interrupt,
usart_tx_interrupt,
115200,
+ 0,
usart2_to_usb,
usb_to_usart2);
@@ -81,6 +82,7 @@ static struct usart_config const usart3 =
usart_rx_interrupt,
usart_tx_interrupt,
115200,
+ 0,
usart3_to_usb,
usb_to_usart3);
@@ -112,6 +114,7 @@ static struct usart_config const usart4 =
usart_rx_interrupt,
usart_tx_interrupt,
115200,
+ 0,
usart4_to_usb,
usb_to_usart4);
diff --git a/board/servo_v4/board.c b/board/servo_v4/board.c
index baa6ffcaa5..17a653af41 100644
--- a/board/servo_v4/board.c
+++ b/board/servo_v4/board.c
@@ -162,6 +162,7 @@ static struct usart_config const usart3 =
usart_rx_interrupt,
usart_tx_interrupt,
115200,
+ 0,
usart3_to_usb,
usb_to_usart3);
@@ -192,6 +193,7 @@ static struct usart_config const usart4 =
usart_rx_interrupt,
usart_tx_interrupt,
9600,
+ 0,
usart4_to_usb,
usb_to_usart4);
diff --git a/board/tigertail/board.c b/board/tigertail/board.c
index d2908fa394..6b68ce8444 100644
--- a/board/tigertail/board.c
+++ b/board/tigertail/board.c
@@ -55,6 +55,7 @@ static struct usart_config const usart1 =
usart_rx_interrupt,
usart_tx_interrupt,
115200,
+ 0,
usart1_to_usb,
usb_to_usart1);
diff --git a/chip/stm32/usart.c b/chip/stm32/usart.c
index d47d13e149..75859fa979 100644
--- a/chip/stm32/usart.c
+++ b/chip/stm32/usart.c
@@ -17,6 +17,7 @@
void usart_init(struct usart_config const *config)
{
intptr_t base = config->hw->base;
+ uint32_t cr2;
/*
* Enable clock to USART, this must be done first, before attempting
@@ -40,8 +41,18 @@ void usart_init(struct usart_config const *config)
* 8N1, 16 samples per bit. error interrupts, and special modes
* disabled.
*/
+
+ cr2 = 0x0000;
+#if defined(CHIP_FAMILY_STM32F0) || defined(CHIP_FAMILY_STM32F3) || \
+ defined(CHIP_FAMILY_STM32L4)
+ if (config->flags & USART_CONFIG_FLAG_RX_INV)
+ cr2 |= (1 << 16);
+ if (config->flags & USART_CONFIG_FLAG_TX_INV)
+ cr2 |= (1 << 17);
+#endif
+
STM32_USART_CR1(base) = 0x0000;
- STM32_USART_CR2(base) = 0x0000;
+ STM32_USART_CR2(base) = cr2;
STM32_USART_CR3(base) = 0x0000;
/*
diff --git a/chip/stm32/usart.h b/chip/stm32/usart.h
index cbfd8eca21..e158382b58 100644
--- a/chip/stm32/usart.h
+++ b/chip/stm32/usart.h
@@ -133,6 +133,11 @@ struct usart_config {
*/
int baud;
+ /* Other flags. */
+#define USART_CONFIG_FLAG_RX_INV (1 << 0)
+#define USART_CONFIG_FLAG_TX_INV (1 << 1)
+ unsigned int flags;
+
struct consumer consumer;
struct producer producer;
};
@@ -154,21 +159,22 @@ struct usart_config {
* BUILD_ASSERT(RX_QUEUE.unit_bytes == 1);
* BUILD_ASSERT(TX_QUEUE.unit_bytes == 1);
*/
-#define USART_CONFIG(HW, RX, TX, BAUD, RX_QUEUE, TX_QUEUE) \
- ((struct usart_config const) { \
- .hw = &HW, \
- .rx = &RX, \
- .tx = &TX, \
- .state = &((struct usart_state){}), \
- .baud = BAUD, \
- .consumer = { \
- .queue = &TX_QUEUE, \
- .ops = &TX.consumer_ops, \
- }, \
- .producer = { \
- .queue = &RX_QUEUE, \
- .ops = &RX.producer_ops, \
- }, \
+#define USART_CONFIG(HW, RX, TX, BAUD, FLAGS, RX_QUEUE, TX_QUEUE) \
+ ((struct usart_config const) { \
+ .hw = &HW, \
+ .rx = &RX, \
+ .tx = &TX, \
+ .state = &((struct usart_state){}), \
+ .baud = BAUD, \
+ .flags = FLAGS, \
+ .consumer = { \
+ .queue = &TX_QUEUE, \
+ .ops = &TX.consumer_ops, \
+ }, \
+ .producer = { \
+ .queue = &RX_QUEUE, \
+ .ops = &RX.producer_ops, \
+ }, \
})
/*
diff --git a/driver/mcdp28x0.c b/driver/mcdp28x0.c
index 3af0eec0c9..d8e5318317 100644
--- a/driver/mcdp28x0.c
+++ b/driver/mcdp28x0.c
@@ -53,6 +53,7 @@ static struct usart_config const usart_mcdp = USART_CONFIG(CONFIG_MCDP28X0,
usart_rx_interrupt,
usart_tx_interrupt,
115200,
+ 0,
usart_mcdp_rx_queue,
usart_mcdp_tx_queue);