1 /***************************************************************************//**
\r
3 * @brief Board Controller Communications (BCC) definitions
\r
5 *******************************************************************************
\r
7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
\r
8 *******************************************************************************
\r
10 * This file is licensed under the Silabs License Agreement. See the file
\r
11 * "Silabs_License_Agreement.txt" for details. Before using this software for
\r
12 * any purpose, you must agree to the terms of that agreement.
\r
14 ******************************************************************************/
\r
19 #include "em_device.h"
\r
21 #include "em_gpio.h"
\r
25 #if defined( BSP_BCC_LEUART )
\r
26 #include "em_leuart.h"
\r
28 #include "em_usart.h"
\r
31 #if defined( BSP_STK )
\r
33 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
\r
35 /* Module local variables */
\r
36 static uint32_t rxByteCount;
\r
37 static uint32_t txByteCount;
\r
39 /* Module local prototypes */
\r
40 static void TxByte( uint8_t data );
\r
41 static uint8_t RxByte( void );
\r
45 /***************************************************************************//**
\r
48 ******************************************************************************/
\r
50 /***************************************************************************//**
\r
51 * @addtogroup BSP_STK API for STKs and WSTKs
\r
53 ******************************************************************************/
\r
55 /**************************************************************************//**
\r
56 * @brief Deinitialize board controller communication support (BCC)
\r
57 * functionality. Reverse actions performed by @ref BSP_BccInit().
\r
59 * @return @ref BSP_STATUS_OK.
\r
60 *****************************************************************************/
\r
61 int BSP_BccDeInit( void )
\r
63 /* Reset counters */
\r
64 rxByteCount = 0xFFFFFFFFUL;
\r
65 txByteCount = 0xFFFFFFFFUL;
\r
67 BSP_BccPinsEnable( false );
\r
69 #if defined( BSP_BCC_LEUART )
\r
71 LEUART_Reset( BSP_BCC_LEUART );
\r
74 USART_Reset( BSP_BCC_USART );
\r
78 CMU_ClockEnable( BSP_BCC_CLK, false );
\r
80 return BSP_STATUS_OK;
\r
83 /**************************************************************************//**
\r
84 * @brief Initialize board controller communication support (BCC)
\r
87 * @return @ref BSP_STATUS_OK.
\r
88 *****************************************************************************/
\r
89 int BSP_BccInit( void )
\r
91 #if defined( BSP_BCC_LEUART )
\r
92 LEUART_Init_TypeDef leuartInit = LEUART_INIT_DEFAULT;
\r
94 USART_InitAsync_TypeDef usartInit = USART_INITASYNC_DEFAULT;
\r
100 /* Enable High Frequency Peripherals */
\r
101 CMU_ClockEnable(cmuClock_HFPER, true);
\r
103 /* Enable clocks to GPIO */
\r
104 CMU_ClockEnable(cmuClock_GPIO, true);
\r
106 /* Enable UART clock */
\r
107 CMU_ClockEnable( BSP_BCC_CLK, true );
\r
109 #if defined( BSP_BCC_LEUART )
\r
110 /* Enable CORE LE clock in order to access LE modules */
\r
111 CMU_ClockEnable(cmuClock_CORELE, true);
\r
113 /* Select CORE LE clock for LE modules */
\r
114 CMU_ClockSelectSet( cmuClock_LFB, cmuSelect_CORELEDIV2 );
\r
116 /* Initialize LEUART */
\r
117 leuartInit.baudrate = 115200;
\r
118 LEUART_Init( BSP_BCC_LEUART, &leuartInit );
\r
120 /* Initialize USART */
\r
121 USART_InitAsync( BSP_BCC_USART, &usartInit );
\r
124 /* Initialize UART pins */
\r
125 BSP_BccPinsEnable( true );
\r
127 return BSP_STATUS_OK;
\r
130 /**************************************************************************//**
\r
131 * @brief Get a packet from the board controller.
\r
133 * @param[in] pkt Pointer to a @ref BCP_Packet instance.
\r
135 * @return True if packet received without errors, false otherwise.
\r
136 *****************************************************************************/
\r
137 bool BSP_BccPacketReceive( BCP_Packet *pkt )
\r
143 /* Setup a byte pointer to start of packet buffer */
\r
144 bptr = (uint8_t *) pkt;
\r
146 /* Receive packet magic */
\r
147 *bptr++ = RxByte();
\r
148 if (pkt->magic != BSP_BCP_MAGIC)
\r
153 /* Receive packet type */
\r
154 *bptr++ = RxByte();
\r
155 if ( (pkt->type < BSP_BCP_FIRST) || (pkt->type > BSP_BCP_LAST) )
\r
160 /* Receive packet length */
\r
161 *bptr++ = RxByte();
\r
162 if (pkt->payloadLength > BSP_BCP_PACKET_SIZE)
\r
167 #if ( BSP_BCP_VERSION == 2 )
\r
168 /* Receive reserved byte */
\r
169 *bptr++ = RxByte();
\r
172 /* Receive packet data length field and sanity check it */
\r
173 length = pkt->payloadLength;
\r
174 if (length > BSP_BCP_PACKET_SIZE)
\r
176 length = BSP_BCP_PACKET_SIZE;
\r
179 /* Receive packet payload */
\r
180 for( i=0; i<length; i++ )
\r
182 *bptr++ = RxByte();
\r
188 /**************************************************************************//**
\r
189 * @brief Send a packet to the board controller.
\r
191 * @param[in] pkt Pointer to a @ref BCP_Packet instance.
\r
193 * @return @ref BSP_STATUS_OK.
\r
194 *****************************************************************************/
\r
195 int BSP_BccPacketSend( BCP_Packet *pkt )
\r
200 pkt->magic = BSP_BCP_MAGIC;
\r
202 /* Transmit packet magic */
\r
203 TxByte( pkt->magic );
\r
205 /* Transmit packet type */
\r
206 TxByte( pkt->type );
\r
208 /* Transmit packet length */
\r
209 TxByte( pkt->payloadLength );
\r
211 #if ( BSP_BCP_VERSION == 2 )
\r
212 /* Transmit reserved byte */
\r
213 TxByte( pkt->reserved );
\r
216 /* Transmit packet payload */
\r
217 for ( i=0; i<pkt->payloadLength; i++ )
\r
219 TxByte( pkt->data[i] );
\r
222 return BSP_STATUS_OK;
\r
225 /**************************************************************************//**
\r
226 * @brief Enable GPIO pins for the USART/LEUART used for board communication.
\r
228 * @param[in] enable Set to true to enable pins, set to false to disable.
\r
229 *****************************************************************************/
\r
230 void BSP_BccPinsEnable( bool enable )
\r
234 /* Configure GPIO pin for UART TX */
\r
235 /* To avoid false start, configure output as high. */
\r
236 GPIO_PinModeSet( BSP_BCC_TXPORT, BSP_BCC_TXPIN, gpioModePushPull, 1 );
\r
238 /* Configure GPIO pin for UART RX */
\r
239 GPIO_PinModeSet( BSP_BCC_RXPORT, BSP_BCC_RXPIN, gpioModeInput, 1 );
\r
241 /* Enable the switch that enables UART communication. */
\r
242 GPIO_PinModeSet( BSP_BCC_ENABLE_PORT, BSP_BCC_ENABLE_PIN, gpioModePushPull, 1 );
\r
244 #if defined( BSP_BCC_LEUART )
\r
245 BSP_BCC_LEUART->ROUTE |= LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN | BSP_BCC_LOCATION;
\r
248 #if defined( USART_ROUTEPEN_TXPEN )
\r
249 BSP_BCC_USART->ROUTEPEN = USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN;
\r
250 BSP_BCC_USART->ROUTELOC0 =
\r
251 ( BSP_BCC_USART->ROUTELOC0 &
\r
252 ~( _USART_ROUTELOC0_TXLOC_MASK | _USART_ROUTELOC0_RXLOC_MASK ) )
\r
253 | ( BSP_BCC_TX_LOCATION << _USART_ROUTELOC0_TXLOC_SHIFT )
\r
254 | ( BSP_BCC_RX_LOCATION << _USART_ROUTELOC0_RXLOC_SHIFT );
\r
256 BSP_BCC_USART->ROUTE |= USART_ROUTE_RXPEN | USART_ROUTE_TXPEN | BSP_BCC_LOCATION;
\r
262 GPIO_PinModeSet( BSP_BCC_ENABLE_PORT, BSP_BCC_ENABLE_PIN, gpioModeDisabled, 0 );
\r
264 #if defined( BSP_BCC_LEUART )
\r
265 BSP_BCC_LEUART->ROUTE &= ~(LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN);
\r
267 #if defined( USART_ROUTEPEN_TXPEN )
\r
268 BSP_BCC_USART->ROUTEPEN &= ~(USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN);
\r
270 BSP_BCC_USART->ROUTE &= ~(USART_ROUTE_RXPEN | USART_ROUTE_TXPEN);
\r
274 GPIO_PinModeSet( BSP_BCC_TXPORT, BSP_BCC_TXPIN, gpioModeDisabled, 0 );
\r
276 GPIO_PinModeSet( BSP_BCC_RXPORT, BSP_BCC_RXPIN, gpioModeDisabled, 0 );
\r
280 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
\r
282 static uint8_t RxByte( void )
\r
286 /* Poll RX data available flag and return a character when one is available */
\r
288 #if defined( BSP_BCC_LEUART )
\r
289 while (!(BSP_BCC_LEUART->IF & LEUART_IF_RXDATAV)) ;
\r
290 byte = BSP_BCC_LEUART->RXDATA;
\r
292 while (!(BSP_BCC_USART->STATUS & USART_STATUS_RXDATAV)) ;
\r
293 byte = BSP_BCC_USART->RXDATA;
\r
300 static void TxByte( uint8_t data )
\r
302 /* Check TX buffer and allow for a pending transfer to complete */
\r
304 #if defined( BSP_BCC_LEUART )
\r
305 while (!(BSP_BCC_LEUART->STATUS & LEUART_STATUS_TXBL)) ;
\r
306 BSP_BCC_LEUART->TXDATA = (uint32_t) data;
\r
308 while (!(BSP_BCC_USART->STATUS & USART_STATUS_TXBL)) ;
\r
309 BSP_BCC_USART->TXDATA = (uint32_t) data;
\r
317 /** @} (end group BSP_STK) */
\r
318 /** @} (end group BSP) */
\r
320 #endif /* BSP_STK */
\r