diff --git a/cpu/cc2538/Makefile.features b/cpu/cc2538/Makefile.features index c113572813..2637f2f761 100644 --- a/cpu/cc2538/Makefile.features +++ b/cpu/cc2538/Makefile.features @@ -1,5 +1,6 @@ FEATURES_PROVIDED += periph_cpuid FEATURES_PROVIDED += periph_hwrng +FEATURES_PROVIDED += periph_uart_modecfg FEATURES_PROVIDED += puf_sram -include $(RIOTCPU)/cortexm_common/Makefile.features diff --git a/cpu/cc2538/include/periph_cpu.h b/cpu/cc2538/include/periph_cpu.h index 47386b8570..d74476377e 100644 --- a/cpu/cc2538/include/periph_cpu.h +++ b/cpu/cc2538/include/periph_cpu.h @@ -28,6 +28,7 @@ #include "cpu.h" #include "vendor/hw_ssi.h" +#include "vendor/hw_uart.h" #ifdef __cplusplus extern "C" { @@ -167,6 +168,46 @@ typedef struct { } uart_conf_t; /** @} */ +#ifndef DOXYGEN +/** + * @brief Override parity values + * @{ + */ +#define HAVE_UART_PARITY_T +typedef enum { + UART_PARITY_NONE = 0, /**< no parity */ + UART_PARITY_EVEN = (UART_LCRH_PEN | UART_LCRH_EPS), /**< even parity */ + UART_PARITY_ODD = UART_LCRH_PEN, /**< odd parity */ + UART_PARITY_MARK = (UART_LCRH_PEN | UART_LCRH_SPS), /**< mark */ + UART_PARITY_SPACE = (UART_LCRH_PEN | UART_LCRH_EPS | UART_LCRH_SPS) /**< space */ +} uart_parity_t; +/** @} */ + + /** + * @brief Override data bits length values + * @{ + */ +#define HAVE_UART_DATA_BITS_T +typedef enum { + UART_DATA_BITS_5 = (0 << UART_LCRH_WLEN_S), /**< 5 data bits */ + UART_DATA_BITS_6 = (1 << UART_LCRH_WLEN_S), /**< 6 data bits */ + UART_DATA_BITS_7 = (2 << UART_LCRH_WLEN_S), /**< 7 data bits */ + UART_DATA_BITS_8 = (3 << UART_LCRH_WLEN_S), /**< 8 data bits */ +} uart_data_bits_t; +/** @} */ + +/** + * @brief Override stop bits length values + * @{ + */ +#define HAVE_UART_STOP_BITS_T +typedef enum { + UART_STOP_BITS_1 = 0, /**< 1 stop bit */ + UART_STOP_BITS_2 = UART_LCRH_STP2, /**< 2 stop bits */ +} uart_stop_bits_t; +/** @} */ +#endif /* DOXYGEN */ + /** * @name Override SPI mode settings * @{ diff --git a/cpu/cc2538/periph/uart.c b/cpu/cc2538/periph/uart.c index 3baacd4064..884ec31d13 100644 --- a/cpu/cc2538/periph/uart.c +++ b/cpu/cc2538/periph/uart.c @@ -157,6 +157,35 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) return UART_OK; } +#ifdef MODULE_PERIPH_UART_MODECFG +int uart_mode(uart_t uart, uart_data_bits_t data_bits, uart_parity_t parity, + uart_stop_bits_t stop_bits) +{ + assert(uart < UART_NUMOF); + + assert(data_bits == UART_DATA_BITS_5 || + data_bits == UART_DATA_BITS_6 || + data_bits == UART_DATA_BITS_7 || + data_bits == UART_DATA_BITS_8); + + assert(parity == UART_PARITY_NONE || + parity == UART_PARITY_EVEN || + parity == UART_PARITY_ODD || + parity == UART_PARITY_MARK || + parity == UART_PARITY_SPACE); + + assert(stop_bits == UART_STOP_BITS_1 || + stop_bits == UART_STOP_BITS_2); + + cc2538_reg_t *lcrh = &(uart_config[uart].dev->cc2538_uart_lcrh.LCRH); + uint32_t tmp = *lcrh; + tmp &= ~(UART_LCRH_WLEN_M | UART_LCRH_FEN_M | UART_LCRH_STP2_M | + UART_LCRH_PEN | UART_LCRH_EPS | UART_LCRH_SPS); + *lcrh = tmp | data_bits | parity | stop_bits; + return 0; +} +#endif + void uart_write(uart_t uart, const uint8_t *data, size_t len) { assert(uart < UART_NUMOF);