blob: 35aaa39012994c7c9aa4b16421c8afb562b58030 [file] [log] [blame]
/***************************************************************************//**
* @file
* @brief Board support package API implementation STK's.
* @version 4.2.1
*******************************************************************************
* @section License
* <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
*******************************************************************************
*
* This file is licensed under the Silabs License Agreement. See the file
* "Silabs_License_Agreement.txt" for details. Before using this software for
* any purpose, you must agree to the terms of that agreement.
*
******************************************************************************/
#include <string.h>
#include "em_device.h"
#include "em_cmu.h"
#include "em_gpio.h"
#include "bsp.h"
#if defined( BSP_STK_USE_EBI )
#include "em_ebi.h"
#endif
#if defined( BSP_STK )
/***************************************************************************//**
* @addtogroup BSP
* @{
******************************************************************************/
/***************************************************************************//**
* @addtogroup BSP_STK API for STK's and WSTK's
* @{
******************************************************************************/
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
/**************************************************************************//**
* @brief Deinitialize board support package functionality.
* Reverse actions performed by @ref BSP_Init().
*
* @return @ref BSP_STATUS_OK.
*****************************************************************************/
int BSP_Disable(void)
{
BSP_BccDeInit();
BSP_EbiDeInit();
return BSP_STATUS_OK;
}
/** @endcond */
/**************************************************************************//**
* @brief Initialize the EBI interface for accessing the onboard nandflash.
*
* @note This function is not relevant for Gxxx_STK's.
*
* @return
* @ref BSP_STATUS_OK or @ref BSP_STATUS_NOT_IMPLEMENTED
*****************************************************************************/
int BSP_EbiInit(void)
{
#if defined( BSP_STK_USE_EBI )
/* ------------------------------------------ */
/* NAND Flash, Bank0, Base Address 0x80000000 */
/* Micron flash NAND256W3A */
/* ------------------------------------------ */
EBI_Init_TypeDef ebiConfig =
{ ebiModeD8A8, /* 8 bit address, 8 bit data */
ebiActiveLow, /* ARDY polarity */
ebiActiveLow, /* ALE polarity */
ebiActiveLow, /* WE polarity */
ebiActiveLow, /* RE polarity */
ebiActiveLow, /* CS polarity */
ebiActiveLow, /* BL polarity */
false, /* disble BL */
true, /* enable NOIDLE */
false, /* disable ARDY */
true, /* disable ARDY timeout */
EBI_BANK0, /* enable bank 0 */
0, /* no chip select */
0, /* addr setup cycles */
0, /* addr hold cycles */
false, /* disable half cycle ALE strobe */
0, /* read setup cycles */
2, /* read strobe cycles */
1, /* read hold cycles */
false, /* disable page mode */
false, /* disable prefetch */
false, /* disable half cycle REn strobe */
0, /* write setup cycles */
2, /* write strobe cycles */
1, /* write hold cycles */
false, /* enable the write buffer */
false, /* disable half cycle WEn strobe */
ebiALowA24, /* ALB - Low bound, address lines */
ebiAHighA26, /* APEN - High bound, address lines */
ebiLocation1, /* Use Location 1 */
true, /* enable EBI */
};
/* Enable clocks */
CMU_ClockEnable(cmuClock_HFPER, true);
CMU_ClockEnable(cmuClock_GPIO, true);
CMU_ClockEnable(cmuClock_EBI, true);
/* Enable GPIO's */
/* ALE and CLE */
GPIO_PinModeSet(gpioPortC, 1, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortC, 2, gpioModePushPull, 0);
/* WP, CE and R/B */
GPIO_PinModeSet(gpioPortD, 13, gpioModePushPull, 0); /* active low write-protect */
GPIO_PinModeSet(gpioPortD, 14, gpioModePushPull, 1); /* active low chip-enable */
GPIO_PinModeSet(gpioPortD, 15, gpioModeInput, 0); /* ready/busy */
/* IO pins */
GPIO_PinModeSet(gpioPortE, 8, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortE, 9, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortE, 10, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortE, 11, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortE, 12, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortE, 13, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortE, 14, gpioModePushPull, 0);
GPIO_PinModeSet(gpioPortE, 15, gpioModePushPull, 0);
/* WE and RE */
GPIO_PinModeSet(gpioPortF, 8, gpioModePushPull, 1);
GPIO_PinModeSet(gpioPortF, 9, gpioModePushPull, 1);
/* NAND Power Enable */
GPIO_PinModeSet(gpioPortB, 15, gpioModePushPull, 1);
EBI_Init(&ebiConfig);
EBI->NANDCTRL = (EBI_NANDCTRL_BANKSEL_BANK0 | EBI_NANDCTRL_EN);
return BSP_STATUS_OK;
#else
return BSP_STATUS_NOT_IMPLEMENTED;
#endif
}
/**************************************************************************//**
* @brief Deinitialize the EBI interface for accessing the onboard nandflash.
*
* @note This function is not relevant for Gxxx_STK's.
* This function is provided for API completeness, it does not perform
* an actual EBI deinitialization.
*
* @return
* @ref BSP_STATUS_OK or @ref BSP_STATUS_NOT_IMPLEMENTED
*****************************************************************************/
int BSP_EbiDeInit( void )
{
#if defined( BSP_STK_USE_EBI )
return BSP_STATUS_OK;
#else
return BSP_STATUS_NOT_IMPLEMENTED;
#endif
}
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
/**************************************************************************//**
* @brief Initialize board support package functionality.
*
* @param[in] flags Initialization mask, use 0 or @ref BSP_INIT_BCC.
*
* @return
* @ref BSP_STATUS_OK
*****************************************************************************/
int BSP_Init( uint32_t flags )
{
if ( flags & BSP_INIT_BCC )
{
BSP_BccInit();
}
return BSP_STATUS_OK;
}
/** @endcond */
/**************************************************************************//**
* @brief Request AEM (Advanced Energy Monitoring) current from board controller.
*
* @note Assumes that BSP_Init() has been called with @ref BSP_INIT_BCC
* bitmask.
*
* @return
* The current expressed in milliamperes. Returns 0.0 on board controller
* communication error.
*****************************************************************************/
float BSP_CurrentGet( void )
{
BCP_Packet pkt;
float *pcurrent;
pkt.type = BSP_BCP_CURRENT_REQ;
pkt.payloadLength = 0;
/* Send Request/Get reply */
BSP_BccPacketSend( &pkt );
BSP_BccPacketReceive( &pkt );
/* Process reply */
pcurrent = (float *)pkt.data;
if ( pkt.type != BSP_BCP_CURRENT_REPLY )
{
*pcurrent = 0.0f;
}
return *pcurrent;
}
/**************************************************************************//**
* @brief Request AEM (Advanced Energy Monitoring) voltage from board controller.
*
* @note Assumes that BSP_Init() has been called with @ref BSP_INIT_BCC
* bitmask.
*
* @return
* The voltage. Returns 0.0 on board controller communication
* error.
*****************************************************************************/
float BSP_VoltageGet( void )
{
BCP_Packet pkt;
float *pvoltage;
pkt.type = BSP_BCP_VOLTAGE_REQ;
pkt.payloadLength = 0;
/* Send Request/Get reply */
BSP_BccPacketSend( &pkt );
BSP_BccPacketReceive( &pkt );
/* Process reply */
pvoltage = (float *)pkt.data;
if ( pkt.type != BSP_BCP_VOLTAGE_REPLY )
{
*pvoltage = 0.0f;
}
return *pvoltage;
}
/** @} (end group BSP_STK) */
/** @} (end group BSP) */
#endif /* BSP_STK */