From e3e385e16d32a80d177794326119467bb85bb17b Mon Sep 17 00:00:00 2001 From: Mikko Polojarvi Date: Thu, 15 Oct 2015 13:02:16 +0300 Subject: [PATCH] SiLabs Pearl: Serial HAL USART/LEUART pin routing Serial pin routing for Pearl. Note that this currently requires the pins to be in the same "location", even though this is not needed by the Pearl HW. --- .../TARGET_EFM32/serial_api.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c index cbc895781c..863f79c0fe 100644 --- a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c @@ -448,11 +448,23 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) /* Enable pins for UART at correct location */ if(LEUART_REF_VALID(obj->serial.periph.leuart)) { +#ifdef _LEUART_ROUTE_LOCATION_SHIFT obj->serial.periph.leuart->ROUTE = LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN | (obj->serial.location << _LEUART_ROUTE_LOCATION_SHIFT); +#else + obj->serial.periph.leuart->ROUTELOC0 = (obj->serial.location << _LEUART_ROUTELOC0_TXLOC_SHIFT) | + (obj->serial.location << _LEUART_ROUTELOC0_RXLOC_SHIFT); + obj->serial.periph.leuart->ROUTEPEN = LEUART_ROUTEPEN_RXPEN | LEUART_ROUTEPEN_TXPEN; +#endif obj->serial.periph.leuart->IFC = LEUART_IFC_TXC; obj->serial.periph.leuart->CTRL |= LEUART_CTRL_RXDMAWU | LEUART_CTRL_TXDMAWU; } else { +#ifdef _USART_ROUTE_LOCATION_SHIFT obj->serial.periph.uart->ROUTE = USART_ROUTE_RXPEN | USART_ROUTE_TXPEN | (obj->serial.location << _USART_ROUTE_LOCATION_SHIFT); +#else + obj->serial.periph.uart->ROUTELOC0 = (obj->serial.location << _USART_ROUTELOC0_TXLOC_SHIFT) | + (obj->serial.location << _USART_ROUTELOC0_RXLOC_SHIFT); + obj->serial.periph.uart->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; +#endif obj->serial.periph.uart->IFC = USART_IFC_TXC; } @@ -587,7 +599,13 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b LEUART_Init(obj->serial.periph.leuart, &init); /* Re-enable pins for UART at correct location */ +#ifdef _LEUART_ROUTE_LOCATION_SHIFT obj->serial.periph.leuart->ROUTE = LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN | (obj->serial.location << _LEUART_ROUTE_LOCATION_SHIFT); +#else + obj->serial.periph.leuart->ROUTELOC0 = (obj->serial.location << _LEUART_ROUTELOC0_TXLOC_SHIFT) | + (obj->serial.location << _LEUART_ROUTELOC0_RXLOC_SHIFT); + obj->serial.periph.leuart->ROUTEPEN = LEUART_ROUTEPEN_RXPEN | LEUART_ROUTEPEN_TXPEN; +#endif /* Re-enable interrupts */ if(was_enabled != 0) { @@ -632,7 +650,13 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b USART_InitAsync(obj->serial.periph.uart, &init); /* Re-enable pins for UART at correct location */ +#ifdef _USART_ROUTE_LOCATION_SHIFT obj->serial.periph.uart->ROUTE = USART_ROUTE_RXPEN | USART_ROUTE_TXPEN | (obj->serial.location << _USART_ROUTE_LOCATION_SHIFT); +#else + obj->serial.periph.uart->ROUTELOC0 = (obj->serial.location << _USART_ROUTELOC0_TXLOC_SHIFT) | + (obj->serial.location << _USART_ROUTELOC0_RXLOC_SHIFT); + obj->serial.periph.uart->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; +#endif /* Re-enable interrupts */ if(was_enabled != 0) {