drivers: serial: stm32: add err_check
Adds 'err_check' implementation.
Signed-off-by: Georgij Cernysiov <g.cernysiov@elco-automation.de>
diff --git a/drivers/serial/uart_stm32.c b/drivers/serial/uart_stm32.c
index fb86640..8719790 100644
--- a/drivers/serial/uart_stm32.c
+++ b/drivers/serial/uart_stm32.c
@@ -395,6 +395,47 @@
LL_USART_TransmitData8(UartInstance, (u8_t)c);
}
+static int uart_stm32_err_check(struct device *dev)
+{
+ USART_TypeDef *UartInstance = UART_STRUCT(dev);
+ u32_t err = 0U;
+
+ /* Check for errors, but don't clear them here.
+ * Some SoC clear all error flags when at least
+ * one is cleared. (e.g. F4X, F1X, and F2X)
+ */
+ if (LL_USART_IsActiveFlag_ORE(UartInstance)) {
+ err |= UART_ERROR_OVERRUN;
+ }
+
+ if (LL_USART_IsActiveFlag_PE(UartInstance)) {
+ err |= UART_ERROR_PARITY;
+ }
+
+ if (LL_USART_IsActiveFlag_FE(UartInstance)) {
+ err |= UART_ERROR_FRAMING;
+ }
+
+ if (err & UART_ERROR_OVERRUN) {
+ LL_USART_ClearFlag_ORE(UartInstance);
+ }
+
+ if (err & UART_ERROR_PARITY) {
+ LL_USART_ClearFlag_PE(UartInstance);
+ }
+
+ if (err & UART_ERROR_FRAMING) {
+ LL_USART_ClearFlag_FE(UartInstance);
+ }
+
+ /* Clear noise error as well,
+ * it is not represented by the errors enum
+ */
+ LL_USART_ClearFlag_NE(UartInstance);
+
+ return err;
+}
+
static inline void __uart_stm32_get_clock(struct device *dev)
{
struct uart_stm32_data *data = DEV_DATA(dev);
@@ -568,6 +609,7 @@
static const struct uart_driver_api uart_stm32_driver_api = {
.poll_in = uart_stm32_poll_in,
.poll_out = uart_stm32_poll_out,
+ .err_check = uart_stm32_err_check,
.configure = uart_stm32_configure,
.config_get = uart_stm32_config_get,
#ifdef CONFIG_UART_INTERRUPT_DRIVEN