mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
Diff: targets/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c
- 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;