bsp_bcc.c

Go to the documentation of this file.
00001 /***************************************************************************/
00018 #include <string.h>
00019 #include "em_device.h"
00020 #include "em_cmu.h"
00021 #include "em_gpio.h"
00022 
00023 #include "bsp.h"
00024 
00025 #if defined( BSP_BCC_LEUART )
00026 #include "em_leuart.h"
00027 #else
00028 #include "em_usart.h"
00029 #endif
00030 
00031 #if defined( BSP_STK )
00032 
00035 /* Module local variables */
00036 static uint32_t rxByteCount;
00037 static uint32_t txByteCount;
00038 
00039 /* Module local prototypes */
00040 static void    TxByte( uint8_t data );
00041 static uint8_t RxByte( void );
00042 
00045 /***************************************************************************/
00050 /***************************************************************************/
00055 /**************************************************************************/
00061 int BSP_BccDeInit( void )
00062 {
00063   /* Reset counters */
00064   rxByteCount = 0xFFFFFFFFUL;
00065   txByteCount = 0xFFFFFFFFUL;
00066 
00067   BSP_BccPinsEnable( false );
00068 
00069 #if defined( BSP_BCC_LEUART )
00070   /* Reset LEUART */
00071   LEUART_Reset( BSP_BCC_LEUART );
00072 #else
00073   /* Reset USART */
00074   USART_Reset( BSP_BCC_USART );
00075 #endif
00076 
00077   /* Disable clock */
00078   CMU_ClockEnable( BSP_BCC_CLK, false );
00079 
00080   return BSP_STATUS_OK;
00081 }
00082 
00083 /**************************************************************************/
00089 int BSP_BccInit( void )
00090 {
00091 #if defined( BSP_BCC_LEUART )
00092   LEUART_Init_TypeDef leuartInit = LEUART_INIT_DEFAULT;
00093 #else
00094   USART_InitAsync_TypeDef usartInit = USART_INITASYNC_DEFAULT;
00095 #endif
00096 
00097   rxByteCount = 0;
00098   txByteCount = 0;
00099 
00100   /* Enable High Frequency Peripherals */
00101   CMU_ClockEnable(cmuClock_HFPER, true);
00102 
00103   /* Enable clocks to GPIO */
00104   CMU_ClockEnable(cmuClock_GPIO, true);
00105 
00106   /* Enable UART clock */
00107   CMU_ClockEnable( BSP_BCC_CLK, true );
00108 
00109 #if defined( BSP_BCC_LEUART )
00110   /* Enable CORE LE clock in order to access LE modules */
00111   CMU_ClockEnable(cmuClock_CORELE, true);
00112 
00113   /* Select CORE LE clock for LE modules */
00114   CMU_ClockSelectSet( cmuClock_LFB, cmuSelect_CORELEDIV2 );
00115 
00116    /* Initialize LEUART */
00117    leuartInit.baudrate = 115200;
00118    LEUART_Init( BSP_BCC_LEUART, &leuartInit );
00119 #else
00120   /* Initialize USART */
00121   USART_InitAsync( BSP_BCC_USART, &usartInit );
00122 #endif
00123 
00124   /* Initialize UART pins */
00125   BSP_BccPinsEnable( true );
00126 
00127   return BSP_STATUS_OK;
00128 }
00129 
00130 /**************************************************************************/
00137 bool BSP_BccPacketReceive( BCP_Packet *pkt )
00138 {
00139   int i;
00140   int length;
00141   uint8_t *bptr;
00142 
00143   /* Setup a byte pointer to start of packet buffer */
00144   bptr   = (uint8_t *) pkt;
00145 
00146   /* Receive packet magic */
00147   *bptr++ = RxByte();
00148   if (pkt->magic != BSP_BCP_MAGIC)
00149   {
00150      return false;
00151   }
00152 
00153   /* Receive packet type */
00154   *bptr++ = RxByte();
00155   if ( (pkt->type < BSP_BCP_FIRST) || (pkt->type > BSP_BCP_LAST) )
00156   {
00157      return false;
00158   }
00159 
00160   /* Receive packet length */
00161   *bptr++ = RxByte();
00162   if (pkt->payloadLength > BSP_BCP_PACKET_SIZE)
00163   {
00164      return false;
00165   }
00166 
00167 #if ( BSP_BCP_VERSION == 2 )
00168    /* Receive reserved byte */
00169    *bptr++ = RxByte();
00170 #endif
00171 
00172   /* Receive packet data length field and sanity check it */
00173   length  = pkt->payloadLength;
00174   if (length > BSP_BCP_PACKET_SIZE)
00175   {
00176      length = BSP_BCP_PACKET_SIZE;
00177   }
00178 
00179   /* Receive packet payload */
00180   for( i=0; i<length; i++ )
00181   {
00182      *bptr++ = RxByte();
00183   }
00184 
00185   return true;
00186 }
00187 
00188 /**************************************************************************/
00195 int BSP_BccPacketSend( BCP_Packet *pkt )
00196 {
00197   int i;
00198 
00199   /* Apply magic */
00200   pkt->magic = BSP_BCP_MAGIC;
00201 
00202   /* Transmit packet magic */
00203   TxByte( pkt->magic );
00204 
00205   /* Transmit packet type */
00206   TxByte( pkt->type );
00207 
00208   /* Transmit packet length */
00209   TxByte( pkt->payloadLength );
00210 
00211 #if ( BSP_BCP_VERSION == 2 )
00212   /* Transmit reserved byte */
00213   TxByte( pkt->reserved );
00214 #endif
00215 
00216   /* Transmit packet payload */
00217   for ( i=0; i<pkt->payloadLength; i++ )
00218   {
00219     TxByte( pkt->data[i] );
00220   }
00221 
00222   return BSP_STATUS_OK;
00223 }
00224 
00225 /**************************************************************************/
00230 void BSP_BccPinsEnable( bool enable )
00231 {
00232   if (enable)
00233   {
00234     /* Configure GPIO pin for UART TX */
00235     /* To avoid false start, configure output as high. */
00236     GPIO_PinModeSet( BSP_BCC_TXPORT, BSP_BCC_TXPIN, gpioModePushPull, 1 );
00237 
00238     /* Configure GPIO pin for UART RX */
00239     GPIO_PinModeSet( BSP_BCC_RXPORT, BSP_BCC_RXPIN, gpioModeInput, 1 );
00240 
00241     /* Enable the switch that enables UART communication. */
00242     GPIO_PinModeSet( BSP_BCC_ENABLE_PORT, BSP_BCC_ENABLE_PIN, gpioModePushPull, 1 );
00243 
00244     #if defined( BSP_BCC_LEUART )
00245     BSP_BCC_LEUART->ROUTE |= LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN | BSP_BCC_LOCATION;
00246     #else
00247 
00248       #if defined( USART_ROUTEPEN_TXPEN )
00249     BSP_BCC_USART->ROUTEPEN = USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN;
00250     BSP_BCC_USART->ROUTELOC0 =
00251       ( BSP_BCC_USART->ROUTELOC0 &
00252         ~( _USART_ROUTELOC0_TXLOC_MASK | _USART_ROUTELOC0_RXLOC_MASK ) )
00253       | ( BSP_BCC_TX_LOCATION  << _USART_ROUTELOC0_TXLOC_SHIFT  )
00254       | ( BSP_BCC_RX_LOCATION  << _USART_ROUTELOC0_RXLOC_SHIFT  );
00255       #else
00256     BSP_BCC_USART->ROUTE |= USART_ROUTE_RXPEN | USART_ROUTE_TXPEN | BSP_BCC_LOCATION;
00257       #endif
00258     #endif
00259   }
00260   else
00261   {
00262     GPIO_PinModeSet( BSP_BCC_ENABLE_PORT, BSP_BCC_ENABLE_PIN, gpioModeDisabled, 0 );
00263 
00264     #if defined( BSP_BCC_LEUART )
00265       BSP_BCC_LEUART->ROUTE &= ~(LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN);
00266     #else
00267       #if defined( USART_ROUTEPEN_TXPEN )
00268       BSP_BCC_USART->ROUTEPEN &= ~(USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN);
00269       #else
00270       BSP_BCC_USART->ROUTE &= ~(USART_ROUTE_RXPEN | USART_ROUTE_TXPEN);
00271       #endif
00272     #endif
00273 
00274     GPIO_PinModeSet( BSP_BCC_TXPORT, BSP_BCC_TXPIN, gpioModeDisabled, 0 );
00275 
00276     GPIO_PinModeSet( BSP_BCC_RXPORT, BSP_BCC_RXPIN, gpioModeDisabled, 0 );
00277   }
00278 }
00279 
00282 static uint8_t RxByte( void )
00283 {
00284   uint8_t byte;
00285 
00286   /* Poll RX data available flag and return a character when one is available */
00287 
00288 #if defined( BSP_BCC_LEUART )
00289   while (!(BSP_BCC_LEUART->IF & LEUART_IF_RXDATAV)) ;
00290   byte = BSP_BCC_LEUART->RXDATA;
00291 #else
00292   while (!(BSP_BCC_USART->STATUS & USART_STATUS_RXDATAV)) ;
00293   byte = BSP_BCC_USART->RXDATA;
00294 #endif
00295 
00296   rxByteCount++;
00297   return byte;
00298 }
00299 
00300 static void TxByte( uint8_t data )
00301 {
00302   /* Check TX buffer and allow for a pending transfer to complete */
00303 
00304 #if defined( BSP_BCC_LEUART )
00305   while (!(BSP_BCC_LEUART->STATUS & LEUART_STATUS_TXBL)) ;
00306   BSP_BCC_LEUART->TXDATA = (uint32_t) data;
00307 #else
00308   while (!(BSP_BCC_USART->STATUS & USART_STATUS_TXBL)) ;
00309   BSP_BCC_USART->TXDATA = (uint32_t) data;
00310 #endif
00311 
00312   txByteCount++;
00313 }
00314 
00320 #endif /* BSP_STK */