summaryrefslogtreecommitdiff
path: root/chip/stm32
diff options
context:
space:
mode:
authorBossen WU <bossen.wu@stmicro.corp-partner.google.com>2021-06-21 16:43:26 +0800
committerCommit Bot <commit-bot@chromium.org>2021-06-30 08:37:00 +0000
commit743590937b1a6029d69c8f392d7292030fd42c5b (patch)
tree534345dea15d22041d6cfe6df21d104a7fdeba1c /chip/stm32
parent2369680160d048fbfd8ed89aa76f0520009d3375 (diff)
downloadchrome-ec-743590937b1a6029d69c8f392d7292030fd42c5b.tar.gz
stm32: add stm32l431 ec in chip/stm32 : uart
stm32l431 related driver: uart The stm32l476g-eval is the only board which would be impacted. BRANCH=main BUG=b:188117811 TEST=make buildall Signed-off-by: Bossen WU <bossen.wu@stmicro.corp-partner.google.com> Change-Id: I861d1cf38430d6b1b5d7c09bd565d727961a4128 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2975168 Reviewed-by: Ting Shen <phoenixshen@chromium.org> Reviewed-by: Eric Yilun Lin <yllin@google.com>
Diffstat (limited to 'chip/stm32')
-rw-r--r--chip/stm32/uart.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/chip/stm32/uart.c b/chip/stm32/uart.c
index 39727d71f1..0632fc6687 100644
--- a/chip/stm32/uart.c
+++ b/chip/stm32/uart.c
@@ -234,6 +234,9 @@ static void uart_freq_change(void)
freq = 8000000;
#elif defined(CHIP_FAMILY_STM32H7)
freq = 64000000; /* from 64 Mhz HSI */
+#elif defined(CHIP_FAMILY_STM32L4)
+ /* UART clocked from HSI 16 */
+ freq = 16000000;
#else
/* UART clocked from the main clock */
freq = clock_get_freq();
@@ -289,17 +292,29 @@ void uart_init(void)
#elif defined(CHIP_FAMILY_STM32L4) || defined(CHIP_FAMILY_STM32G4)
/* USART1 clock source from SYSCLK */
STM32_RCC_CCIPR &= ~STM32_RCC_CCIPR_USART1SEL_MASK;
+#ifdef CHIP_FAMILY_STM32L4
+ /* For STM32L4, use HSI for UART, to wake up from low power mode */
STM32_RCC_CCIPR |=
- (STM32_RCC_CCIPR_UART_SYSCLK << STM32_RCC_CCIPR_USART1SEL_SHIFT);
+ (STM32_RCC_CCIPR_UART_HSI16 << STM32_RCC_CCIPR_USART1SEL_SHIFT);
+#else
+ STM32_RCC_CCIPR |= (STM32_RCC_CCIPR_UART_SYSCLK
+ << STM32_RCC_CCIPR_USART1SEL_SHIFT);
+#endif
/* LPUART1 clock source from SYSCLK */
STM32_RCC_CCIPR &= ~STM32_RCC_CCIPR_LPUART1SEL_MASK;
- STM32_RCC_CCIPR |=
- (STM32_RCC_CCIPR_UART_SYSCLK << STM32_RCC_CCIPR_LPUART1SEL_SHIFT);
+ STM32_RCC_CCIPR |= (STM32_RCC_CCIPR_UART_SYSCLK
+ << STM32_RCC_CCIPR_LPUART1SEL_SHIFT);
#endif /* CHIP_FAMILY_STM32F0 || CHIP_FAMILY_STM32F3 */
/* Enable USART clock */
#if (UARTN == 1)
STM32_RCC_APB2ENR |= STM32_RCC_PB2_USART1;
+#ifdef CHIP_FAMILY_STM32L4
+#if defined(CONFIG_UART_RX_DMA) || defined(CONFIG_UART_TX_DMA)
+ STM32_RCC_AHB1ENR |= STM32_RCC_HB1_DMA1;
+ STM32_RCC_AHB1ENR |= STM32_RCC_HB1_DMA2;
+#endif
+#endif
#elif (UARTN == 6)
STM32_RCC_APB2ENR |= STM32_RCC_PB2_USART6;
#elif (UARTN == 9)
@@ -318,7 +333,7 @@ void uart_init(void)
gpio_config_module(MODULE_UART, 1);
#if defined(CHIP_FAMILY_STM32F0) || defined(CHIP_FAMILY_STM32F3) \
-|| defined(CHIP_FAMILY_STM32H7)
+|| defined(CHIP_FAMILY_STM32H7) || defined(CHIP_FAMILY_STM32L4)
/*
* Wake up on start bit detection. WUS can only be written when UE=0,
* so clear UE first.
@@ -337,8 +352,13 @@ void uart_init(void)
* UART enabled, 8 Data bits, oversampling x16, no parity,
* TX and RX enabled.
*/
+#ifdef CHIP_FAMILY_STM32L4
+ STM32_USART_CR1(UARTN_BASE) =
+ STM32_USART_CR1_TE | STM32_USART_CR1_RE;
+#else
STM32_USART_CR1(UARTN_BASE) =
STM32_USART_CR1_UE | STM32_USART_CR1_TE | STM32_USART_CR1_RE;
+#endif
/* 1 stop bit, no fancy stuff */
STM32_USART_CR2(UARTN_BASE) = 0x0000;
@@ -375,6 +395,10 @@ void uart_init(void)
/* Enable interrupts */
task_enable_irq(STM32_IRQ_USART(UARTN));
+#ifdef CHIP_FAMILY_STM32L4
+ STM32_USART_CR1(UARTN_BASE) |= STM32_USART_CR1_UE;
+#endif
+
init_done = 1;
}