cpu/cc2538: Add periph_uart_mode implementation

This commit adds the periph_uart_mode USEMODULE
It implements all functionality defined in the common uart driver
This means all parity modes, data bits, and stop bits
This commit is contained in:
MrKevinWeiss 2019-05-09 12:16:42 +02:00
parent 5d63e28e59
commit 0aa6b04249
3 changed files with 71 additions and 0 deletions

View File

@ -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

View File

@ -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
* @{

View File

@ -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);