From 867b09c22459c4673a9c4e905ffe13ce073e34de Mon Sep 17 00:00:00 2001
From: Hauke Petersen <hauke.petersen@fu-berlin.de>
Date: Wed, 24 May 2017 12:35:50 +0200
Subject: [PATCH] cpu/kinetis: make UART mode configurable per board

---
 boards/frdm-k64f/include/periph_conf.h     |  1 +
 boards/mulle/include/periph_conf.h         |  2 ++
 boards/pba-d-01-kw2x/include/periph_conf.h |  2 ++
 cpu/kinetis_common/include/periph_cpu.h    | 29 ++++++++++++++++------
 cpu/kinetis_common/periph/uart.c           |  2 +-
 5 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/boards/frdm-k64f/include/periph_conf.h b/boards/frdm-k64f/include/periph_conf.h
index e919602e0b..cd74dd5c79 100644
--- a/boards/frdm-k64f/include/periph_conf.h
+++ b/boards/frdm-k64f/include/periph_conf.h
@@ -89,6 +89,7 @@ static const uart_conf_t uart_config[] = {
         .pcr_rx = PORT_PCR_MUX(3),
         .pcr_tx = PORT_PCR_MUX(3),
         .irqn   = UART0_RX_TX_IRQn,
+        .mode   = UART_MODE_8N1
     },
 };
 
diff --git a/boards/mulle/include/periph_conf.h b/boards/mulle/include/periph_conf.h
index 0b9125d271..5719bdc14b 100644
--- a/boards/mulle/include/periph_conf.h
+++ b/boards/mulle/include/periph_conf.h
@@ -106,6 +106,7 @@ static const uart_conf_t uart_config[] = {
         .pcr_rx = PORT_PCR_MUX(3),
         .pcr_tx = PORT_PCR_MUX(3),
         .irqn   = UART0_RX_TX_IRQn,
+        .mode   = UART_MODE_8N1
     },
     {
         .dev    = UART1,
@@ -116,6 +117,7 @@ static const uart_conf_t uart_config[] = {
         .pcr_rx = PORT_PCR_MUX(3),
         .pcr_tx = PORT_PCR_MUX(3),
         .irqn   = UART1_RX_TX_IRQn,
+        .mode   = UART_MODE_8N1
     },
 };
 
diff --git a/boards/pba-d-01-kw2x/include/periph_conf.h b/boards/pba-d-01-kw2x/include/periph_conf.h
index 6e1c317434..fb52ee9cb9 100644
--- a/boards/pba-d-01-kw2x/include/periph_conf.h
+++ b/boards/pba-d-01-kw2x/include/periph_conf.h
@@ -91,6 +91,7 @@ static const uart_conf_t uart_config[] = {
         .pcr_rx = PORT_PCR_MUX(3),
         .pcr_tx = PORT_PCR_MUX(3),
         .irqn   = UART2_RX_TX_IRQn,
+        .mode   = UART_MODE_8N1
     },
     {
         .dev    = UART0,
@@ -101,6 +102,7 @@ static const uart_conf_t uart_config[] = {
         .pcr_rx = PORT_PCR_MUX(3),
         .pcr_tx = PORT_PCR_MUX(3),
         .irqn   = UART0_RX_TX_IRQn,
+        .mode   = UART_MODE_8N1
     }
 };
 
diff --git a/cpu/kinetis_common/include/periph_cpu.h b/cpu/kinetis_common/include/periph_cpu.h
index 69e0228f9a..d4ca43c4b9 100644
--- a/cpu/kinetis_common/include/periph_cpu.h
+++ b/cpu/kinetis_common/include/periph_cpu.h
@@ -198,6 +198,18 @@ typedef enum {
 /** @} */
 #endif /* ndef DOXYGEN */
 
+/**
+ * @name    CPU specific UART modes values
+ * @{
+ */
+/** @brief 8 data bits, no parity, 1 stop bit */
+#define UART_MODE_8N1       (0)
+/** @brief 8 data bits, even parity, 1 stop bit */
+#define UART_MODE_8E1       (UART_C1_PE_MASK)
+/** @brief 8 data bits, odd parity, 1 stop bit */
+#define UART_MODE_8O1       (UART_C1_PE_MASK | UART_C1_PT_MASK)
+/** @} */
+
 #ifndef DOXYGEN
 /**
  * @brief   Override default ADC resolution values
@@ -302,14 +314,15 @@ enum {
  * @brief UART module configuration options
  */
 typedef struct {
-    UART_Type *dev;            /**< Pointer to module hardware registers */
-    volatile uint32_t *clken;  /**< Clock enable bitband register address */
-    uint32_t freq;             /**< Module clock frequency, usually CLOCK_CORECLOCK or CLOCK_BUSCLOCK */
-    gpio_t pin_rx;             /**< RX pin, GPIO_UNDEF disables RX */
-    gpio_t pin_tx;             /**< TX pin */
-    uint32_t pcr_rx;           /**< Pin configuration register bits for RX */
-    uint32_t pcr_tx;           /**< Pin configuration register bits for TX */
-    IRQn_Type irqn;            /**< IRQ number for this module */
+    UART_Type *dev;             /**< Pointer to module hardware registers */
+    volatile uint32_t *clken;   /**< Clock enable bitband register address */
+    uint32_t freq;              /**< Module clock frequency, usually CLOCK_CORECLOCK or CLOCK_BUSCLOCK */
+    gpio_t pin_rx;              /**< RX pin, GPIO_UNDEF disables RX */
+    gpio_t pin_tx;              /**< TX pin */
+    uint32_t pcr_rx;            /**< Pin configuration register bits for RX */
+    uint32_t pcr_tx;            /**< Pin configuration register bits for TX */
+    IRQn_Type irqn;             /**< IRQ number for this module */
+    uint8_t mode;               /**< UART mode: data bits, parity, stop bits */
 } uart_conf_t;
 
 /**
diff --git a/cpu/kinetis_common/periph/uart.c b/cpu/kinetis_common/periph/uart.c
index ed970df822..b25525aac7 100644
--- a/cpu/kinetis_common/periph/uart.c
+++ b/cpu/kinetis_common/periph/uart.c
@@ -98,7 +98,7 @@ static int init_base(uart_t uart, uint32_t baudrate)
     /* disable transmitter and receiver */
     dev->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);
     /* set defaults, 8-bit mode, no parity */
-    dev->C1 = 0;
+    dev->C1 = uart_config[uart].mode;
 
     /* calculate baudrate */
     ubd = (uint16_t)(clk / (baudrate * 16));
-- 
GitLab