mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Revision:
179:b0033dcd6934
Parent:
150:02e0a0aed4ec
Child:
180:96ed750bd169
--- a/targets/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c	Thu Nov 23 11:57:25 2017 +0000
+++ b/targets/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c	Thu Dec 07 14:01:42 2017 +0000
@@ -78,7 +78,7 @@
 /* Interrupt handler from mbed common */
 static uart_irq_handler irq_handler;
 /* Keep track of incoming DMA IRQ's */
-static bool serial_dma_irq_fired[DMACTRL_CH_CNT] = { false };
+static bool serial_dma_irq_fired[DMA_CHAN_COUNT] = { false };
 
 /* Serial interface on USBTX/USBRX retargets stdio */
 int stdio_uart_inited = 0;
@@ -120,6 +120,18 @@
 static void usart2_rx_irq() { uart_irq(USART_2, RxIrq); }
 static void usart2_tx_irq() { uart_irq(USART_2, TxIrq); USART_IntClear((USART_TypeDef*)USART_2, USART_IFC_TXC);}
 #endif
+#ifdef USART3
+static void usart3_rx_irq() { uart_irq(USART_3, RxIrq); }
+static void usart3_tx_irq() { uart_irq(USART_3, TxIrq); USART_IntClear((USART_TypeDef*)USART_3, USART_IFC_TXC);}
+#endif
+#ifdef USART4
+static void usart4_rx_irq() { uart_irq(USART_4, RxIrq); }
+static void usart4_tx_irq() { uart_irq(USART_4, TxIrq); USART_IntClear((USART_TypeDef*)USART_4, USART_IFC_TXC);}
+#endif
+#ifdef USART5
+static void usart5_rx_irq() { uart_irq(USART_5, RxIrq); }
+static void usart5_tx_irq() { uart_irq(USART_5, TxIrq); USART_IntClear((USART_TypeDef*)USART_5, USART_IFC_TXC);}
+#endif
 #ifdef LEUART0
 static void leuart0_irq()
 {
@@ -250,6 +262,18 @@
     if (serial_ptr == USART_2) return index;
     index++;
 #endif
+#ifdef USART3
+    if (serial_ptr == USART_3) return index;
+    index++;
+#endif
+#ifdef USART4
+    if (serial_ptr == USART_4) return index;
+    index++;
+#endif
+#ifdef USART5
+    if (serial_ptr == USART_5) return index;
+    index++;
+#endif
 #ifdef LEUART0
     if (serial_ptr == LEUART_0) return index;
     index++;
@@ -301,6 +325,18 @@
         case USART_2:
             return USART2_RX_IRQn;
 #endif
+#ifdef USART3
+        case USART_3:
+            return USART3_RX_IRQn;
+#endif
+#ifdef USART4
+        case USART_4:
+            return USART4_RX_IRQn;
+#endif
+#ifdef USART5
+        case USART_5:
+            return USART5_RX_IRQn;
+#endif
 #ifdef LEUART0
         case LEUART_0:
             return LEUART0_IRQn;
@@ -344,6 +380,18 @@
         case USART_2:
             return USART2_TX_IRQn;
 #endif
+#ifdef USART3
+        case USART_3:
+            return USART3_TX_IRQn;
+#endif
+#ifdef USART4
+        case USART_4:
+            return USART4_TX_IRQn;
+#endif
+#ifdef USART5
+        case USART_5:
+            return USART5_TX_IRQn;
+#endif
 #ifdef LEUART0
         case LEUART_0:
             return LEUART0_IRQn;
@@ -387,6 +435,18 @@
         case USART_2:
             return cmuClock_USART2;
 #endif
+#ifdef USART3
+        case USART_3:
+            return cmuClock_USART3;
+#endif
+#ifdef USART4
+        case USART_4:
+            return cmuClock_USART4;
+#endif
+#ifdef USART5
+        case USART_5:
+            return cmuClock_USART5;
+#endif
 #ifdef LEUART0
         case LEUART_0:
             return cmuClock_LEUART0;
@@ -407,7 +467,7 @@
     UARTName uart_rx = (UARTName) pinmap_peripheral(rx, PinMap_UART_RX);
     /* Check that pins are connected to same UART */
     UARTName uart = (UARTName) pinmap_merge(uart_tx, uart_rx);
-    MBED_ASSERT((int) uart != NC);
+    MBED_ASSERT((unsigned int) uart != NC);
 
     obj->serial.periph.uart = (USART_TypeDef *) uart;
 
@@ -418,7 +478,7 @@
 #if defined(_SILICON_LABS_32B_PLATFORM_1)
     /* Check that pins are used by same location for the given UART */
     obj->serial.location = pinmap_merge(uart_tx_loc, uart_rx_loc);
-    MBED_ASSERT(obj->serial.location != (uint32_t)NC);
+    MBED_ASSERT(obj->serial.location != NC);
 #else
     obj->serial.location_tx = uart_tx_loc;
     obj->serial.location_rx = uart_rx_loc;
@@ -466,6 +526,27 @@
             NVIC_SetPriority(USART2_TX_IRQn, 1);
             break;
 #endif
+#ifdef USART3
+        case USART_3:
+            NVIC_SetVector(USART3_RX_IRQn, (uint32_t) &usart3_rx_irq);
+            NVIC_SetVector(USART3_TX_IRQn, (uint32_t) &usart3_tx_irq);
+            NVIC_SetPriority(USART3_TX_IRQn, 1);
+            break;
+#endif
+#ifdef USART4
+        case USART_4:
+            NVIC_SetVector(USART4_RX_IRQn, (uint32_t) &usart4_rx_irq);
+            NVIC_SetVector(USART4_TX_IRQn, (uint32_t) &usart4_tx_irq);
+            NVIC_SetPriority(USART4_TX_IRQn, 1);
+            break;
+#endif
+#ifdef USART5
+        case USART_5:
+            NVIC_SetVector(USART5_RX_IRQn, (uint32_t) &usart5_rx_irq);
+            NVIC_SetVector(USART5_TX_IRQn, (uint32_t) &usart5_tx_irq);
+            NVIC_SetPriority(USART5_TX_IRQn, 1);
+            break;
+#endif
 #ifdef LEUART0
         case LEUART_0:
             NVIC_SetVector(LEUART0_IRQn, (uint32_t) &leuart0_irq);
@@ -507,12 +588,12 @@
     if(LEUART_REF_VALID(obj->serial.periph.leuart)) {
 #ifdef _LEUART_ROUTE_LOCATION_SHIFT
         obj->serial.periph.leuart->ROUTE = (obj->serial.location << _LEUART_ROUTE_LOCATION_SHIFT);
-        if(obj->serial.tx_pin != (uint32_t)NC) {
+        if(obj->serial.tx_pin != NC) {
             obj->serial.periph.leuart->ROUTE |= LEUART_ROUTE_TXPEN;
         } else {
             obj->serial.periph.leuart->ROUTE &= ~LEUART_ROUTE_TXPEN;
         }
-        if(obj->serial.rx_pin != (uint32_t)NC) {
+        if(obj->serial.rx_pin != NC) {
             obj->serial.periph.leuart->ROUTE |= LEUART_ROUTE_RXPEN;
         } else {
             obj->serial.periph.leuart->CMD    = LEUART_CMD_RXBLOCKEN;
@@ -536,12 +617,12 @@
     } else {
 #ifdef _USART_ROUTE_LOCATION_SHIFT
         obj->serial.periph.uart->ROUTE = (obj->serial.location << _LEUART_ROUTE_LOCATION_SHIFT);
-        if(obj->serial.tx_pin != (uint32_t)NC) {
+        if(obj->serial.tx_pin != NC) {
             obj->serial.periph.uart->ROUTE |= USART_ROUTE_TXPEN;
         } else {
             obj->serial.periph.uart->ROUTE &= ~USART_ROUTE_TXPEN;
         }
-        if(obj->serial.rx_pin != (uint32_t)NC) {
+        if(obj->serial.rx_pin != NC) {
             obj->serial.periph.uart->ROUTE |= USART_ROUTE_RXPEN;
         } else {
             obj->serial.periph.uart->CMD    = USART_CMD_RXBLOCKEN;
@@ -1174,6 +1255,21 @@
                 channelConfig.select = DMAREQ_USART2_TXBL;
                 break;
 #endif
+#ifdef USART3
+            case USART_3:
+                channelConfig.select = DMAREQ_USART3_TXBL;
+                break;
+#endif
+#ifdef USART4
+            case USART_4:
+                channelConfig.select = DMAREQ_USART4_TXBL;
+                break;
+#endif
+#ifdef USART5
+            case USART_5:
+                channelConfig.select = DMAREQ_USART5_TXBL;
+                break;
+#endif
 #ifdef LEUART0
             case LEUART_0:
                 channelConfig.select = DMAREQ_LEUART0_TXBL;
@@ -1219,6 +1315,21 @@
                 channelConfig.select = DMAREQ_USART2_RXDATAV;
                 break;
 #endif
+#ifdef USART3
+            case USART_3:
+                channelConfig.select = DMAREQ_USART3_RXDATAV;
+                break;
+#endif
+#ifdef USART4
+            case USART_4:
+                channelConfig.select = DMAREQ_USART4_RXDATAV;
+                break;
+#endif
+#ifdef USART5
+            case USART_5:
+                channelConfig.select = DMAREQ_USART5_RXDATAV;
+                break;
+#endif
 #ifdef LEUART0
             case LEUART_0:
                 channelConfig.select = DMAREQ_LEUART0_RXDATAV;
@@ -1453,6 +1564,34 @@
                 obj->serial.periph.uart->CMD = USART_CMD_RXEN | USART_CMD_CLEARRX;
                 break;
 #endif
+#ifdef USART2
+            case USART_2:
+                dma_periph = ldmaPeripheralSignal_USART2_RXDATAV;
+                source_addr = &USART2->RXDATA;
+                obj->serial.periph.uart->CMD = USART_CMD_RXEN | USART_CMD_CLEARRX;
+                break;
+#endif
+#ifdef USART3
+            case USART_3:
+                dma_periph = ldmaPeripheralSignal_USART3_RXDATAV;
+                source_addr = &USART3->RXDATA;
+                obj->serial.periph.uart->CMD = USART_CMD_RXEN | USART_CMD_CLEARRX;
+                break;
+#endif
+#ifdef USART4
+            case USART_4:
+                dma_periph = ldmaPeripheralSignal_USART4_RXDATAV;
+                source_addr = &USART4->RXDATA;
+                obj->serial.periph.uart->CMD = USART_CMD_RXEN | USART_CMD_CLEARRX;
+                break;
+#endif
+#ifdef USART5
+            case USART_5:
+                dma_periph = ldmaPeripheralSignal_USART5_RXDATAV;
+                source_addr = &USART5->RXDATA;
+                obj->serial.periph.uart->CMD = USART_CMD_RXEN | USART_CMD_CLEARRX;
+                break;
+#endif
 #ifdef LEUART0
             case LEUART_0:
                 dma_periph = ldmaPeripheralSignal_LEUART0_RXDATAV;