diff --git a/cpu/efm32/include/periph_cpu.h b/cpu/efm32/include/periph_cpu.h index a024187215..ca52b522f6 100644 --- a/cpu/efm32/include/periph_cpu.h +++ b/cpu/efm32/include/periph_cpu.h @@ -376,6 +376,46 @@ typedef struct { /** * @brief UART device configuration. */ +#ifndef DOXYGEN +/** + * @brief Override parity values + * @{ + */ +#define HAVE_UART_PARITY_T +typedef enum { + UART_PARITY_NONE = 0, + UART_PARITY_ODD = 1, + UART_PARITY_EVEN = 2, + UART_PARITY_MARK = 3, + UART_PARITY_SPACE = 4, +} uart_parity_t; +/** @} */ + +/** + * @brief Override data bits length values + * @{ + */ +#define HAVE_UART_DATA_BITS_T +typedef enum { + UART_DATA_BITS_5 = 5, + UART_DATA_BITS_6 = 6, + UART_DATA_BITS_7 = 7, + UART_DATA_BITS_8 = 8, +} uart_data_bits_t; +/** @} */ + +/** + * @brief Override stop bits length values + * @{ + */ +#define HAVE_UART_STOP_BITS_T +typedef enum { + UART_STOP_BITS_1 = 2, + UART_STOP_BITS_2 = 4, +} uart_stop_bits_t; +/** @} */ +#endif /* ndef DOXYGEN */ + typedef struct { void *dev; /**< UART, USART or LEUART device used */ gpio_t rx_pin; /**< pin used for RX */ diff --git a/cpu/efm32/periph/uart.c b/cpu/efm32/periph/uart.c index 8d0d5f72e1..17f428400c 100644 --- a/cpu/efm32/periph/uart.c +++ b/cpu/efm32/periph/uart.c @@ -154,6 +154,42 @@ int uart_init(uart_t dev, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) return 0; } +#ifdef MODULE_PERIPH_UART_MODECFG +int uart_mode(uart_t dev, uart_data_bits_t data_bits, uart_parity_t parity, + uart_stop_bits_t stop_bits) +{ + if (parity == UART_PARITY_MARK || parity == UART_PARITY_SPACE) { + return UART_NOMODE; + } + +#ifdef USE_LEUART + if (_is_usart(dev)) { +#endif + USART_TypeDef *uart = (USART_TypeDef *) uart_config[dev].dev; + + USART_FrameSet(uart, + USART_DataBits2Def(data_bits), + USART_StopBits2Def(stop_bits), + USART_Parity2Def(parity)); +#ifdef USE_LEUART + } else { + if (data_bits != UART_DATA_BITS_8) { + return UART_NOMODE; + } + + LEUART_TypeDef *leuart = (LEUART_TypeDef *) uart_config[dev].dev; + + LEUART_FrameSet(leuart, + LEUART_DataBits2Def(data_bits), + LEUART_StopBits2Def(stop_bits), + LEUART_Parity2Def(parity)); + } +#endif + + return UART_OK; +} +#endif + void uart_write(uart_t dev, const uint8_t *data, size_t len) { #ifdef USE_LEUART