Skip to content

Commit

Permalink
Merge pull request #18946 from jue89/feature/efm32-uart-mode
Browse files Browse the repository at this point in the history
cpu/efm32: add periph_uart_modecfg support for Gecko Series 2
  • Loading branch information
jue89 authored Nov 22, 2022
2 parents 0621150 + 2a81a2a commit 35a84d2
Show file tree
Hide file tree
Showing 28 changed files with 96 additions and 42 deletions.
1 change: 0 additions & 1 deletion boards/common/slwstk6000b/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ config BOARD_COMMON_SLWSTK6000B
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG
# additional hardware present in the board
select HAVE_SAUL_GPIO
select HAVE_SI7021
Expand Down
2 changes: 1 addition & 1 deletion boards/common/slwstk6000b/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/e180-zg120b-tb/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ config BOARD_E180_ZG120B_TB
select HAS_PERIPH_RTT
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG
select HAS_EFM32_CORETEMP
select HAS_RIOTBOOT

Expand Down
2 changes: 1 addition & 1 deletion boards/e180-zg120b-tb/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ FEATURES_PROVIDED += periph_adc
FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

# Put other features for this board (in alphabetical order)
FEATURES_PROVIDED += efm32_coretemp
Expand Down
1 change: 0 additions & 1 deletion boards/ikea-tradfri/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ config BOARD_IKEA_TRADFRI
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG
select HAS_EFM32_CORETEMP
select HAS_RIOTBOOT

Expand Down
2 changes: 1 addition & 1 deletion boards/ikea-tradfri/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

# Put other features for this board (in alphabetical order)
FEATURES_PROVIDED += efm32_coretemp
Expand Down
1 change: 0 additions & 1 deletion boards/slstk3400a/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ config BOARD_SLSTK3400A
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG

select MODULE_SILABS_BC if TEST_KCONFIG
# additional hardware present in the board
Expand Down
2 changes: 1 addition & 1 deletion boards/slstk3400a/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/slstk3401a/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ config BOARD_SLSTK3401A
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG

select MODULE_SILABS_AEM if TEST_KCONFIG
select MODULE_SILABS_BC if TEST_KCONFIG
Expand Down
2 changes: 1 addition & 1 deletion boards/slstk3401a/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/slstk3402a/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ config BOARD_SLSTK3402A
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG

select MODULE_SILABS_AEM if TEST_KCONFIG
select MODULE_SILABS_BC if TEST_KCONFIG
Expand Down
2 changes: 1 addition & 1 deletion boards/slstk3402a/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/sltb001a/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ config BOARD_SLTB001A
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG
select MODULE_SILABS_PIC if TEST_KCONFIG

# additional hardware present in the board
Expand Down
2 changes: 1 addition & 1 deletion boards/sltb001a/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/sltb009a/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ config BOARD_SLTB009A
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG
select HAVE_SAUL_GPIO

source "$(RIOTBOARD)/common/silabs/Kconfig"
2 changes: 1 addition & 1 deletion boards/sltb009a/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/slwstk6220a/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ config BOARD_SLWSTK6220A
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG

select MODULE_SILABS_AEM if TEST_KCONFIG
select MODULE_SILABS_BC if TEST_KCONFIG
Expand Down
2 changes: 1 addition & 1 deletion boards/slwstk6220a/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/stk3200/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ config BOARD_STK3200
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG

select HAVE_SAUL_GPIO
select MODULE_SILABS_BC if TEST_KCONFIG
Expand Down
2 changes: 1 addition & 1 deletion boards/stk3200/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/stk3600/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ config BOARD_STK3600
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG

select HAVE_SAUL_GPIO
select MODULE_SILABS_AEM if TEST_KCONFIG
Expand Down
2 changes: 1 addition & 1 deletion boards/stk3600/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 0 additions & 1 deletion boards/stk3700/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ config BOARD_STK3700
select HAS_PERIPH_SPI
select HAS_PERIPH_TIMER
select HAS_PERIPH_UART
select HAS_PERIPH_UART_MODECFG

select HAVE_SAUL_GPIO
select MODULE_SILABS_AEM if TEST_KCONFIG
Expand Down
2 changes: 1 addition & 1 deletion boards/stk3700/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ FEATURES_PROVIDED += periph_rtc
FEATURES_PROVIDED += periph_rtt
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart periph_uart_modecfg
FEATURES_PROVIDED += periph_uart

include $(RIOTBOARD)/common/silabs/Makefile.features
1 change: 1 addition & 0 deletions cpu/efm32/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ config CPU_COMMON_EFM32
select HAS_PERIPH_GPIO_LL
select HAS_PERIPH_RTT_SET_COUNTER
select HAS_PERIPH_RTT_OVERFLOW
select HAS_PERIPH_UART_MODECFG
select HAS_PERIPH_WDT
select HAVE_SHARED_PERIPH_RTT_PERIPH_RTC

Expand Down
1 change: 1 addition & 0 deletions cpu/efm32/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ FEATURES_PROVIDED += periph_gpio periph_gpio_irq
FEATURES_PROVIDED += periph_gpio_ll
FEATURES_PROVIDED += periph_rtt_set_counter
FEATURES_PROVIDED += periph_rtt_overflow
FEATURES_PROVIDED += periph_uart_modecfg
FEATURES_PROVIDED += periph_wdt

FEATURES_CONFLICT += periph_rtc:periph_rtt
Expand Down
41 changes: 36 additions & 5 deletions cpu/efm32/include/periph_cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -429,42 +429,73 @@ typedef struct {
* @brief UART device configuration.
*/
#ifndef DOXYGEN
/**
* @brief Marker for unsupported UART modes
*/
#define UART_MODE_UNSUPPORTED 0xf0

/**
* @brief Override parity values
* @{
*/
#define HAVE_UART_PARITY_T
#if defined(_SILICON_LABS_32B_SERIES_0) || defined(_SILICON_LABS_32B_SERIES_1)
typedef enum {
UART_PARITY_NONE = 0,
UART_PARITY_ODD = 1,
UART_PARITY_EVEN = 2,
UART_PARITY_MARK = 3,
UART_PARITY_SPACE = 4,
UART_PARITY_NONE = 0,
UART_PARITY_ODD = 1,
UART_PARITY_EVEN = 2,
UART_PARITY_MARK = 3,
UART_PARITY_SPACE = 4,
} uart_parity_t;
#else
typedef enum {
UART_PARITY_NONE = 0,
UART_PARITY_EVEN = 2,
UART_PARITY_ODD = 3,
UART_PARITY_MARK = UART_MODE_UNSUPPORTED | 0,
UART_PARITY_SPACE = UART_MODE_UNSUPPORTED | 1,
} uart_parity_t;
#endif
/** @} */

/**
* @brief Override data bits length values
* @{
*/
#define HAVE_UART_DATA_BITS_T
#if defined(_SILICON_LABS_32B_SERIES_0) || defined(_SILICON_LABS_32B_SERIES_1)
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;
#else
typedef enum {
UART_DATA_BITS_5 = UART_MODE_UNSUPPORTED | 0,
UART_DATA_BITS_6 = UART_MODE_UNSUPPORTED | 1,
UART_DATA_BITS_7 = 1,
UART_DATA_BITS_8 = 2,
} uart_data_bits_t;
#endif
/** @} */

/**
* @brief Override stop bits length values
* @{
*/
#define HAVE_UART_STOP_BITS_T
#if defined(_SILICON_LABS_32B_SERIES_0) || defined(_SILICON_LABS_32B_SERIES_1)
typedef enum {
UART_STOP_BITS_1 = 2,
UART_STOP_BITS_2 = 4,
} uart_stop_bits_t;
#else
typedef enum {
UART_STOP_BITS_1 = 1,
UART_STOP_BITS_2 = 3,
} uart_stop_bits_t;
#endif
/** @} */
#endif /* ndef DOXYGEN */

Expand Down
59 changes: 46 additions & 13 deletions cpu/efm32/periph/uart_series2.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,29 @@ static inline void _set_pm_mode(uart_t dev) { (void) dev; }
static inline void _setup_pm_mode(uart_t dev, uint8_t mode) { (void) dev; (void) mode; }
#endif /* !IS_ACTIVE(MODULE_PM_LAYERED) */

static void _uart_enable(uart_t dev)
{
EUSART_TypeDef *uart = uart_config[dev].dev;

/* enable tx */
EUSART_Enable_TypeDef enable = eusartEnableTx;

/* enable rx if needed */
if (isr_ctx[dev].rx_cb) {
enable |= eusartEnableRx;
}

EUSART_Enable(uart, enable);
}

static void _uart_disable(uart_t dev)
{
EUSART_TypeDef *uart = uart_config[dev].dev;

/* disable tx and rx */
EUSART_Enable(uart, eusartDisable);
}

#define GET_PIN(x) (x & 0xf)
#define GET_PORT(x) (x >> 4)

Expand Down Expand Up @@ -170,35 +193,45 @@ int uart_init(uart_t dev, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
return 0;
}

void uart_poweron(uart_t dev)
#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)
{
EUSART_TypeDef *uart = uart_config[dev].dev;

CMU_ClockEnable(uart_config[dev].cmu, true);
if (data_bits >= UART_MODE_UNSUPPORTED || parity >= UART_MODE_UNSUPPORTED) {
return UART_NOMODE;
}

/* enable tx */
EUSART_Enable_TypeDef enable = eusartEnableTx;
/* uart must be disabled to alter modes */
_uart_disable(dev);

/* enable rx if needed */
if (isr_ctx[dev].rx_cb) {
enable |= eusartEnableRx;
}
uart->FRAMECFG = (data_bits << _EUSART_FRAMECFG_DATABITS_SHIFT)
| (parity << _EUSART_FRAMECFG_PARITY_SHIFT)
| (stop_bits << _EUSART_FRAMECFG_STOPBITS_SHIFT);

EUSART_Enable(uart, enable);
_uart_enable(dev);

return UART_OK;
}
#endif

void uart_poweron(uart_t dev)
{
CMU_ClockEnable(uart_config[dev].cmu, true);

_uart_enable(dev);

/* block power mode */
_set_pm_mode(dev);
}

void uart_poweroff(uart_t dev)
{
EUSART_TypeDef *uart = uart_config[dev].dev;

/* unblock power mode */
_clear_pm_mode(dev);

/* disable tx and rx */
EUSART_Enable(uart, eusartDisable);
_uart_disable(dev);

CMU_ClockEnable(uart_config[dev].cmu, false);
}
Expand Down

0 comments on commit 35a84d2

Please sign in to comment.