blob: 16678c917ac183c6a4c375fa684991360c1f07e8 [file] [log] [blame]
/***************************************************************************//**
* @file em_ebi.h
* @brief External Bus Interface (EBI) peripheral API
* @version 5.6.0
*******************************************************************************
* # License
* <b>Copyright 2016 Silicon Laboratories, Inc. www.silabs.com</b>
*******************************************************************************
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
* obligation to support this Software. Silicon Labs is providing the
* Software "AS IS", with no express or implied warranties of any kind,
* including, but not limited to, any implied warranties of merchantability
* or fitness for any particular purpose or warranties against infringement
* of any proprietary rights of a third party.
*
* Silicon Labs will not be liable for any consequential, incidental, or
* special damages, or any other relief, or for any claim by any third party,
* arising from your use of this Software.
*
******************************************************************************/
#ifndef EM_EBI_H
#define EM_EBI_H
#include "em_device.h"
#if defined(EBI_COUNT) && (EBI_COUNT > 0)
#include <stdint.h>
#include <stdbool.h>
#include "em_assert.h"
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************//**
* @addtogroup emlib
* @{
******************************************************************************/
/***************************************************************************//**
* @addtogroup EBI
* @{
******************************************************************************/
/***************************************************************************//**
* @verbatim
*
* --------- ---------
* | | /| |\ | Ext. |
* | EBI | / --------- \ | Async |
* | | \ --------- / | Device|
* | | \| |/ | |
* --------- ---------
* Parallel interface
*
* @endverbatim
******************************************************************************/
/*******************************************************************************
******************************* DEFINES ***********************************
******************************************************************************/
#define EBI_BANK0 (uint32_t)(1 << 1) /**< EBI address bank 0. */
#define EBI_BANK1 (uint32_t)(1 << 2) /**< EBI address bank 1. */
#define EBI_BANK2 (uint32_t)(1 << 3) /**< EBI address bank 2. */
#define EBI_BANK3 (uint32_t)(1 << 4) /**< EBI address bank 3. */
#define EBI_CS0 (uint32_t)(1 << 1) /**< EBI chip select line 0. */
#define EBI_CS1 (uint32_t)(1 << 2) /**< EBI chip select line 1. */
#define EBI_CS2 (uint32_t)(1 << 3) /**< EBI chip select line 2. */
#define EBI_CS3 (uint32_t)(1 << 4) /**< EBI chip select line 3. */
#if defined(_EBI_ROUTE_MASK) && defined(_EBI_ROUTE_APEN_MASK)
#define EBI_GENERIC_ALB_A0 EBI_ROUTE_ALB_A0
#define EBI_GENERIC_ALB_A8 EBI_ROUTE_ALB_A8
#define EBI_GENERIC_ALB_A16 EBI_ROUTE_ALB_A16
#define EBI_GENERIC_ALB_A24 EBI_ROUTE_ALB_A24
#define EBI_GENERIC_APEN_A0 EBI_ROUTE_APEN_A0
#define EBI_GENERIC_APEN_A5 EBI_ROUTE_APEN_A5
#define EBI_GENERIC_APEN_A6 EBI_ROUTE_APEN_A6
#define EBI_GENERIC_APEN_A7 EBI_ROUTE_APEN_A7
#define EBI_GENERIC_APEN_A8 EBI_ROUTE_APEN_A8
#define EBI_GENERIC_APEN_A9 EBI_ROUTE_APEN_A9
#define EBI_GENERIC_APEN_A10 EBI_ROUTE_APEN_A10
#define EBI_GENERIC_APEN_A11 EBI_ROUTE_APEN_A11
#define EBI_GENERIC_APEN_A12 EBI_ROUTE_APEN_A12
#define EBI_GENERIC_APEN_A13 EBI_ROUTE_APEN_A13
#define EBI_GENERIC_APEN_A14 EBI_ROUTE_APEN_A14
#define EBI_GENERIC_APEN_A15 EBI_ROUTE_APEN_A15
#define EBI_GENERIC_APEN_A16 EBI_ROUTE_APEN_A16
#define EBI_GENERIC_APEN_A17 EBI_ROUTE_APEN_A17
#define EBI_GENERIC_APEN_A18 EBI_ROUTE_APEN_A18
#define EBI_GENERIC_APEN_A19 EBI_ROUTE_APEN_A19
#define EBI_GENERIC_APEN_A20 EBI_ROUTE_APEN_A20
#define EBI_GENERIC_APEN_A21 EBI_ROUTE_APEN_A21
#define EBI_GENERIC_APEN_A22 EBI_ROUTE_APEN_A22
#define EBI_GENERIC_APEN_A23 EBI_ROUTE_APEN_A23
#define EBI_GENERIC_APEN_A24 EBI_ROUTE_APEN_A24
#define EBI_GENERIC_APEN_A25 EBI_ROUTE_APEN_A25
#define EBI_GENERIC_APEN_A26 EBI_ROUTE_APEN_A26
#define EBI_GENERIC_APEN_A27 EBI_ROUTE_APEN_A27
#define EBI_GENERIC_APEN_A28 EBI_ROUTE_APEN_A28
#elif defined(_EBI_ROUTEPEN_MASK)
#define EBI_GENERIC_ALB_A0 EBI_ROUTEPEN_ALB_A0
#define EBI_GENERIC_ALB_A8 EBI_ROUTEPEN_ALB_A8
#define EBI_GENERIC_ALB_A16 EBI_ROUTEPEN_ALB_A16
#define EBI_GENERIC_ALB_A24 EBI_ROUTEPEN_ALB_A24
#define EBI_GENERIC_APEN_A0 EBI_ROUTEPEN_APEN_A0
#define EBI_GENERIC_APEN_A5 EBI_ROUTEPEN_APEN_A5
#define EBI_GENERIC_APEN_A6 EBI_ROUTEPEN_APEN_A6
#define EBI_GENERIC_APEN_A7 EBI_ROUTEPEN_APEN_A7
#define EBI_GENERIC_APEN_A8 EBI_ROUTEPEN_APEN_A8
#define EBI_GENERIC_APEN_A9 EBI_ROUTEPEN_APEN_A9
#define EBI_GENERIC_APEN_A10 EBI_ROUTEPEN_APEN_A10
#define EBI_GENERIC_APEN_A11 EBI_ROUTEPEN_APEN_A11
#define EBI_GENERIC_APEN_A12 EBI_ROUTEPEN_APEN_A12
#define EBI_GENERIC_APEN_A13 EBI_ROUTEPEN_APEN_A13
#define EBI_GENERIC_APEN_A14 EBI_ROUTEPEN_APEN_A14
#define EBI_GENERIC_APEN_A15 EBI_ROUTEPEN_APEN_A15
#define EBI_GENERIC_APEN_A16 EBI_ROUTEPEN_APEN_A16
#define EBI_GENERIC_APEN_A17 EBI_ROUTEPEN_APEN_A17
#define EBI_GENERIC_APEN_A18 EBI_ROUTEPEN_APEN_A18
#define EBI_GENERIC_APEN_A19 EBI_ROUTEPEN_APEN_A19
#define EBI_GENERIC_APEN_A20 EBI_ROUTEPEN_APEN_A20
#define EBI_GENERIC_APEN_A21 EBI_ROUTEPEN_APEN_A21
#define EBI_GENERIC_APEN_A22 EBI_ROUTEPEN_APEN_A22
#define EBI_GENERIC_APEN_A23 EBI_ROUTEPEN_APEN_A23
#define EBI_GENERIC_APEN_A24 EBI_ROUTEPEN_APEN_A24
#define EBI_GENERIC_APEN_A25 EBI_ROUTEPEN_APEN_A25
#define EBI_GENERIC_APEN_A26 EBI_ROUTEPEN_APEN_A26
#define EBI_GENERIC_APEN_A27 EBI_ROUTEPEN_APEN_A27
#define EBI_GENERIC_APEN_A28 EBI_ROUTEPEN_APEN_A28
#endif
/*******************************************************************************
******************************** ENUMS ************************************
******************************************************************************/
/** EBI Mode of operation. */
typedef enum {
/** 8 data bits, 8 address bits. */
ebiModeD8A8 = EBI_CTRL_MODE_D8A8,
/** 16 data bits, 16 address bits, using address latch enable. */
ebiModeD16A16ALE = EBI_CTRL_MODE_D16A16ALE,
/** 8 data bits, 24 address bits, using address latch enable. */
ebiModeD8A24ALE = EBI_CTRL_MODE_D8A24ALE,
#if defined(EBI_CTRL_MODE_D16)
/** Mode D16. */
ebiModeD16 = EBI_CTRL_MODE_D16,
#endif
} EBI_Mode_TypeDef;
/** EBI Polarity configuration. */
typedef enum {
/** Active Low. */
ebiActiveLow = 0,
/** Active High. */
ebiActiveHigh = 1
} EBI_Polarity_TypeDef;
/** EBI Pin Line types. */
typedef enum {
/** Address Ready line. */
ebiLineARDY,
/** Address Latch Enable line. */
ebiLineALE,
/** Write Enable line. */
ebiLineWE,
/** Read Enable line. */
ebiLineRE,
/** Chip Select line. */
ebiLineCS,
#if defined(_EBI_POLARITY_BLPOL_MASK)
/** BL line. */
ebiLineBL,
#endif
#if defined(_EBI_TFTPOLARITY_MASK)
/** TFT VSYNC line. */
ebiLineTFTVSync,
/** TFT HSYNC line. */
ebiLineTFTHSync,
/** TFT Data enable line. */
ebiLineTFTDataEn,
/** TFT DCLK line. */
ebiLineTFTDClk,
/** TFT Chip select line. */
ebiLineTFTCS,
#endif
} EBI_Line_TypeDef;
#if !defined(_EFM32_GECKO_FAMILY)
/** Address Pin Enable, lower limit - lower range of pins to enable. */
typedef enum {
/** Address lines EBI_A[0] and upwards are enabled by APEN. */
ebiALowA0 = EBI_GENERIC_ALB_A0,
/** Address lines EBI_A[8] and upwards are enabled by APEN. */
ebiALowA8 = EBI_GENERIC_ALB_A8,
/** Address lines EBI_A[16] and upwards are enabled by APEN. */
ebiALowA16 = EBI_GENERIC_ALB_A16,
/** Address lines EBI_A[24] and upwards are enabled by APEN. */
ebiALowA24 = EBI_GENERIC_ALB_A24,
} EBI_ALow_TypeDef;
/** Address Pin Enable, high limit - higher limit of pins to enable. */
typedef enum {
/** All EBI_A pins are disabled. */
ebiAHighA0 = EBI_GENERIC_APEN_A0,
/** All EBI_A[4:ALow] are enabled. */
ebiAHighA5 = EBI_GENERIC_APEN_A5,
/** All EBI_A[5:ALow] are enabled. */
ebiAHighA6 = EBI_GENERIC_APEN_A6,
/** All EBI_A[6:ALow] are enabled. */
ebiAHighA7 = EBI_GENERIC_APEN_A7,
/** All EBI_A[7:ALow] are enabled. */
ebiAHighA8 = EBI_GENERIC_APEN_A8,
/** All EBI_A[8:ALow] are enabled. */
ebiAHighA9 = EBI_GENERIC_APEN_A9,
/** All EBI_A[9:ALow] are enabled. */
ebiAHighA10 = EBI_GENERIC_APEN_A10,
/** All EBI_A[10:ALow] are enabled. */
ebiAHighA11 = EBI_GENERIC_APEN_A11,
/** All EBI_A[11:ALow] are enabled. */
ebiAHighA12 = EBI_GENERIC_APEN_A12,
/** All EBI_A[12:ALow] are enabled. */
ebiAHighA13 = EBI_GENERIC_APEN_A13,
/** All EBI_A[13:ALow] are enabled. */
ebiAHighA14 = EBI_GENERIC_APEN_A14,
/** All EBI_A[14:ALow] are enabled. */
ebiAHighA15 = EBI_GENERIC_APEN_A15,
/** All EBI_A[15:ALow] are enabled. */
ebiAHighA16 = EBI_GENERIC_APEN_A16,
/** All EBI_A[16:ALow] are enabled. */
ebiAHighA17 = EBI_GENERIC_APEN_A17,
/** All EBI_A[17:ALow] are enabled. */
ebiAHighA18 = EBI_GENERIC_APEN_A18,
/** All EBI_A[18:ALow] are enabled. */
ebiAHighA19 = EBI_GENERIC_APEN_A19,
/** All EBI_A[19:ALow] are enabled. */
ebiAHighA20 = EBI_GENERIC_APEN_A20,
/** All EBI_A[20:ALow] are enabled. */
ebiAHighA21 = EBI_GENERIC_APEN_A21,
/** All EBI_A[21:ALow] are enabled. */
ebiAHighA22 = EBI_GENERIC_APEN_A22,
/** All EBI_A[22:ALow] are enabled. */
ebiAHighA23 = EBI_GENERIC_APEN_A23,
/** All EBI_A[23:ALow] are enabled. */
ebiAHighA24 = EBI_GENERIC_APEN_A24,
/** All EBI_A[24:ALow] are enabled. */
ebiAHighA25 = EBI_GENERIC_APEN_A25,
/** All EBI_A[25:ALow] are enabled. */
ebiAHighA26 = EBI_GENERIC_APEN_A26,
/** All EBI_A[26:ALow] are enabled. */
ebiAHighA27 = EBI_GENERIC_APEN_A27,
/** All EBI_A[27:ALow] are enabled. */
ebiAHighA28 = EBI_GENERIC_APEN_A28,
} EBI_AHigh_TypeDef;
#endif
#if defined(_EBI_ROUTE_LOCATION_MASK)
/** EBI I/O Alternate Pin Location. */
typedef enum {
/** EBI PIN I/O Location 0. */
ebiLocation0 = EBI_ROUTE_LOCATION_LOC0,
/** EBI PIN I/O Location 1. */
ebiLocation1 = EBI_ROUTE_LOCATION_LOC1,
/** EBI PIN I/O Location 2. */
ebiLocation2 = EBI_ROUTE_LOCATION_LOC2
} EBI_Location_TypeDef;
#endif
#if defined(_EBI_TFTCTRL_MASK)
/* TFT support. */
/** EBI TFT Graphics Bank Select. */
typedef enum {
/** Memory BANK0 contains frame buffer. */
ebiTFTBank0 = EBI_TFTCTRL_BANKSEL_BANK0,
/** Memory BANK1 contains frame buffer. */
ebiTFTBank1 = EBI_TFTCTRL_BANKSEL_BANK1,
/** Memory BANK2 contains frame buffer. */
ebiTFTBank2 = EBI_TFTCTRL_BANKSEL_BANK2,
/** Memory BANK3 contains frame buffer. */
ebiTFTBank3 = EBI_TFTCTRL_BANKSEL_BANK3
} EBI_TFTBank_TypeDef;
#if defined(_EBI_TFTCOLORFORMAT_MASK)
/** EBI TFT Color format.*/
typedef enum {
/** Set ARGB (Alpha, Red, Green, Blue) color format to 0555 */
ebiTFTARGB0555 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB0555,
/** Set ARGB (Alpha, Red, Green, Blue) color format to 0565 */
ebiTFTARGB0565 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB0565,
/** Set ARGB (Alpha, Red, Green, Blue) color format to 0666 */
ebiTFTARGB0666 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB0666,
/** Set ARGB (Alpha, Red, Green, Blue) color format to 0888 */
ebiTFTARGB0888 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB0888,
/** Set ARGB (Alpha, Red, Green, Blue) color format to 5555 */
ebiTFTARGB5555 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB5555,
/** Set ARGB (Alpha, Red, Green, Blue) color format to 6565 */
ebiTFTARGB6565 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB6565,
/** Set ARGB (Alpha, Red, Green, Blue) color format to 6666 */
ebiTFTARGB6666 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB6666,
/** Set ARGB (Alpha, Red, Green, Blue) color format to 8888 */
ebiTFTARGB8888 = EBI_TFTCOLORFORMAT_PIXEL0FORMAT_ARGB8888,
/** Set RGB (Red, Green, Blue) color format to 555 */
ebiTFTRGB555 = EBI_TFTCOLORFORMAT_PIXEL1FORMAT_RGB555,
/** Set RGB (Red, Green, Blue) color format to 565 */
ebiTFTRGB565 = EBI_TFTCOLORFORMAT_PIXEL1FORMAT_RGB565,
/** Set RGB (Red, Green, Blue) color format to 666 */
ebiTFTRGB666 = EBI_TFTCOLORFORMAT_PIXEL1FORMAT_RGB666,
/** Set RGB (Red, Green, Blue) color format to 888 */
ebiTFTRGB888 = EBI_TFTCOLORFORMAT_PIXEL1FORMAT_RGB888,
} EBI_TFTColorFormat_TypeDef;
#endif
/** Masking and Alpha blending source color.*/
typedef enum {
/** Use memory as source color for masking/alpha blending. */
ebiTFTColorSrcMem = EBI_TFTCTRL_COLOR1SRC_MEM,
/** Use PIXEL1 register as source color for masking/alpha blending. */
ebiTFTColorSrcPixel1 = EBI_TFTCTRL_COLOR1SRC_PIXEL1,
} EBI_TFTColorSrc_TypeDef;
/** Bus Data Interleave Mode. */
typedef enum {
/** Unlimited interleaved accesses per EBI_DCLK period. Can cause jitter. */
ebiTFTInterleaveUnlimited = EBI_TFTCTRL_INTERLEAVE_UNLIMITED,
/** Allow 1 interleaved access per EBI_DCLK period. */
ebiTFTInterleaveOnePerDClk = EBI_TFTCTRL_INTERLEAVE_ONEPERDCLK,
/** Only allow accesses during porch periods. */
ebiTFTInterleavePorch = EBI_TFTCTRL_INTERLEAVE_PORCH,
} EBI_TFTInterleave_TypeDef;
/** Control frame base pointer copy. */
typedef enum {
/** Trigger update of frame buffer pointer on vertical sync. */
ebiTFTFrameBufTriggerVSync = EBI_TFTCTRL_FBCTRIG_VSYNC,
/** Trigger update of frame buffer pointer on horizontal sync. */
ebiTFTFrameBufTriggerHSync = EBI_TFTCTRL_FBCTRIG_HSYNC,
} EBI_TFTFrameBufTrigger_TypeDef;
/** Control of mask and alpha blending mode. */
typedef enum {
/** Masking and blending are disabled. */
ebiTFTMBDisabled = EBI_TFTCTRL_MASKBLEND_DISABLED,
/** Internal masking. */
ebiTFTMBIMask = EBI_TFTCTRL_MASKBLEND_IMASK,
/** Internal alpha blending. */
ebiTFTMBIAlpha = EBI_TFTCTRL_MASKBLEND_IALPHA,
/** Internal masking and alpha blending are enabled. */
#if defined(EBI_TFTCTRL_MASKBLEND_IMASKIALPHA)
ebiTFTMBIMaskAlpha = EBI_TFTCTRL_MASKBLEND_IMASKIALPHA,
#else
ebiTFTMBIMaskAlpha = EBI_TFTCTRL_MASKBLEND_IMASKALPHA,
#endif
#if defined(EBI_TFTCTRL_MASKBLEND_EMASK)
/** External masking. */
ebiTFTMBEMask = EBI_TFTCTRL_MASKBLEND_EMASK,
/** External alpha blending. */
ebiTFTMBEAlpha = EBI_TFTCTRL_MASKBLEND_EALPHA,
/** External masking and alpha blending. */
ebiTFTMBEMaskAlpha = EBI_TFTCTRL_MASKBLEND_EMASKEALPHA,
#else
/** External masking. */
ebiTFTMBEMask = EBI_TFTCTRL_MASKBLEND_EFBMASK,
/** External alpha blending. */
ebiTFTMBEAlpha = EBI_TFTCTRL_MASKBLEND_EFBALPHA,
/** External masking and alpha blending. */
ebiTFTMBEMaskAlpha = EBI_TFTCTRL_MASKBLEND_EFBMASKALPHA,
/** Internal Frame Buffer masking. */
ebiTFTMBEIMask = EBI_TFTCTRL_MASKBLEND_IFBMASK,
/** Internal Frame Buffer alpha blending. */
ebiTFTMBEIAlpha = EBI_TFTCTRL_MASKBLEND_IFBALPHA,
/** Internal Frame Buffer masking and alpha blending. */
ebiTFTMBEIMaskAlpha = EBI_TFTCTRL_MASKBLEND_IFBMASKALPHA,
#endif
} EBI_TFTMaskBlend_TypeDef;
/** TFT Direct Drive mode. */
typedef enum {
/** Disabled. */
ebiTFTDDModeDisabled = EBI_TFTCTRL_DD_DISABLED,
/** Direct Drive from internal memory. */
ebiTFTDDModeInternal = EBI_TFTCTRL_DD_INTERNAL,
/** Direct Drive from external memory. */
ebiTFTDDModeExternal = EBI_TFTCTRL_DD_EXTERNAL,
} EBI_TFTDDMode_TypeDef;
/** TFT Data Increment Width. */
typedef enum {
/** Pixel increments are 1 byte at a time. */
ebiTFTWidthByte = EBI_TFTCTRL_WIDTH_BYTE,
/** Pixel increments are 2 bytes (half word). */
ebiTFTWidthHalfWord = EBI_TFTCTRL_WIDTH_HALFWORD,
} EBI_TFTWidth_TypeDef;
#endif // _EBI_TFTCTRL_MASK
/*******************************************************************************
******************************* STRUCTS ***********************************
******************************************************************************/
/** EBI Initialization structure. */
typedef struct {
/** EBI operation mode, data, and address limits. */
EBI_Mode_TypeDef mode;
/** Address Ready pin polarity, active high or low. */
EBI_Polarity_TypeDef ardyPolarity;
/** Address Latch Enable pin polarity, active high or low. */
EBI_Polarity_TypeDef alePolarity;
/** Write Enable pin polarity, active high or low. */
EBI_Polarity_TypeDef wePolarity;
/** Read Enable pin polarity, active high or low. */
EBI_Polarity_TypeDef rePolarity;
/** Chip Select pin polarity, active high or low. */
EBI_Polarity_TypeDef csPolarity;
#if !defined(_EFM32_GECKO_FAMILY)
/** Byte Lane pin polarity, active high or low. */
EBI_Polarity_TypeDef blPolarity;
/** Flag to enable or disable Byte Lane support. */
bool blEnable;
/** Flag to enable or disable idle state insertion between transfers. */
bool noIdle;
#endif
/** Flag to enable or disable Address Ready support. */
bool ardyEnable;
/** Set to turn off 32 cycle timeout ability. */
bool ardyDisableTimeout;
/** Mask of flags which selects address banks to configure EBI_BANK<0-3>. */
uint32_t banks;
/** Mask of flags which selects chip select lines to configure EBI_CS<0-3>. */
uint32_t csLines;
/** Number of cycles address is held after Address Latch Enable is asserted. */
uint32_t addrSetupCycles;
/** Number of cycles address is driven onto the ADDRDAT bus before ALE is asserted. */
uint32_t addrHoldCycles;
#if !defined(_EFM32_GECKO_FAMILY)
/** Enable or disables half cycle duration of the ALE strobe in the last address setup cycle. */
bool addrHalfALE;
#endif
/** Number of cycles for address setup before REn is asserted. */
uint32_t readSetupCycles;
/** Number of cycles REn is held active */
uint32_t readStrobeCycles;
/** Number of cycles CSn is held active after REn is deasserted. */
uint32_t readHoldCycles;
#if !defined(_EFM32_GECKO_FAMILY)
/** Enable or disable page mode reads. */
bool readPageMode;
/** Enables or disable prefetching from sequential addresses. */
bool readPrefetch;
/** Enabled or disables half cycle duration of the REn signal in the last strobe cycle. */
bool readHalfRE;
#endif
/** Number of cycles for address setup before WEn is asserted. */
uint32_t writeSetupCycles;
/** Number of cycles WEn is held active */
uint32_t writeStrobeCycles;
/** Number of cycles CSn is held active after WEn is deasserted. */
uint32_t writeHoldCycles;
#if !defined(_EFM32_GECKO_FAMILY)
/** Enable or disable the write buffer */
bool writeBufferDisable;
/** Enables or disables half cycle duration of the WEn signal in the last strobe cycle. */
bool writeHalfWE;
/** Lower address pin limit to enable. */
EBI_ALow_TypeDef aLow;
/** High address pin limit to enable. */
EBI_AHigh_TypeDef aHigh;
#endif
#if defined(_EBI_ROUTE_LOCATION_MASK)
/** Pin Location. */
EBI_Location_TypeDef location;
#endif
/** Flag, if EBI should be enabled after configuration. */
bool enable;
} EBI_Init_TypeDef;
/** Default configuration for EBI initialization structures. */
#if defined(_SILICON_LABS_32B_SERIES_1)
#define EBI_INIT_DEFAULT \
{ \
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, /* Enable BL. */ \
false, /* Enable NOIDLE. */ \
false, /* Enable ARDY. */ \
false, /* Do not disable ARDY timeout. */ \
EBI_BANK0, /* Enable bank 0. */ \
EBI_CS0, /* Enable chip select 0. */ \
0, /* Address setup cycles. */ \
1, /* Address hold cycles. */ \
false, /* Do not enable half cycle ALE strobe. */ \
0, /* Read setup cycles. */ \
0, /* Read strobe cycles. */ \
0, /* Read hold cycles. */ \
false, /* Disable page mode. */ \
false, /* Disable prefetch. */ \
false, /* Do not enable half cycle REn strobe. */ \
0, /* Write setup cycles. */ \
0, /* Write strobe cycles. */ \
1, /* Write hold cycles. */ \
false, /* Do not disable the write buffer. */ \
false, /* Do not enable half cycle WEn strobe. */ \
ebiALowA0, /* ALB - Low bound, address lines. */ \
ebiAHighA0, /* APEN - High bound, address lines. */ \
true, /* Enable EBI. */ \
}
#elif !defined(_EFM32_GECKO_FAMILY)
#define EBI_INIT_DEFAULT \
{ \
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, /* Enable BL. */ \
false, /* Enable NOIDLE. */ \
false, /* Enable ARDY. */ \
false, /* Do not disable ARDY timeout. */ \
EBI_BANK0, /* Enable bank 0. */ \
EBI_CS0, /* Enable chip select 0. */ \
0, /* Address setup cycles. */ \
1, /* Address hold cycles. */ \
false, /* Do not enable half cycle ALE strobe. */ \
0, /* Read setup cycles. */ \
0, /* Read strobe cycles. */ \
0, /* Read hold cycles. */ \
false, /* Disable page mode. */ \
false, /* Disable prefetch. */ \
false, /* Do not enable half cycle REn strobe. */ \
0, /* Write setup cycles. */ \
0, /* Write strobe cycles. */ \
1, /* Write hold cycles. */ \
false, /* Do not disable the write buffer. */ \
false, /* Do not enable half cycle WEn strobe. */ \
ebiALowA0, /* ALB - Low bound, address lines. */ \
ebiAHighA0, /* APEN - High bound, address lines. */ \
ebiLocation0, /* Use Location. 0 */ \
true, /* Enable EBI. */ \
}
#else
#define EBI_INIT_DEFAULT \
{ \
ebiModeD8A8, /* 8 bit address, 8 bit data. */ \
ebiActiveLow, /* ARDY polarity. */ \
ebiActiveLow, /* ALE polarity. */ \
ebiActiveLow, /* WE polarity. */ \
ebiActiveLow, /* RE polarity. */ \
ebiActiveLow, /* CS polarity. */ \
false, /* Enable ARDY. */ \
false, /* Do not disable ARDY timeout. */ \
EBI_BANK0, /* Enable bank 0. */ \
EBI_CS0, /* Enable chip select 0. */ \
0, /* Address setup cycles. */ \
1, /* Address hold cycles. */ \
0, /* Read setup cycles. */ \
0, /* Read strobe cycles. */ \
0, /* Read hold cycles. */ \
0, /* Write setup cycles. */ \
0, /* Write strobe cycles. */ \
1, /* Write hold cycles. */ \
true, /* Enable EBI. */ \
}
#endif
#if defined(_EBI_TFTCTRL_MASK)
/** TFT Initialization structure. */
typedef struct {
/** External memory bank for driving display. */
EBI_TFTBank_TypeDef bank;
/** Width. */
EBI_TFTWidth_TypeDef width;
/** Color source for masking and alpha blending. */
EBI_TFTColorSrc_TypeDef colSrc;
/** Bus Interleave mode. */
EBI_TFTInterleave_TypeDef interleave;
/** Trigger for updating frame buffer pointer. */
EBI_TFTFrameBufTrigger_TypeDef fbTrigger;
/** Drive DCLK from negative clock edge of internal clock. */
bool shiftDClk;
/** Masking and alpha blending mode. */
EBI_TFTMaskBlend_TypeDef maskBlend;
/** TFT Direct Drive mode. */
EBI_TFTDDMode_TypeDef driveMode;
/** TFT Polarity for Chip Select (CS) Line. */
EBI_Polarity_TypeDef csPolarity;
/** TFT Polarity for Data Clock (DCLK) Line. */
EBI_Polarity_TypeDef dclkPolarity;
/** TFT Polarity for Data Enable (DATAEN) Line. */
EBI_Polarity_TypeDef dataenPolarity;
/** TFT Polarity for Horizontal Sync (HSYNC) Line. */
EBI_Polarity_TypeDef hsyncPolarity;
/** TFT Polarity for Vertical Sync (VSYNC) Line. */
EBI_Polarity_TypeDef vsyncPolarity;
/** Horizontal size in pixels. */
int hsize;
/** Horizontal Front Porch Size. */
int hPorchFront;
/** Horizontal Back Porch Size. */
int hPorchBack;
/** Horizontal Synchronization Pulse Width. */
int hPulseWidth;
/** Vertical size in pixels. */
int vsize;
/** Vertical Front Porch Size. */
int vPorchFront;
/** Vertical Back Porch Size. */
int vPorchBack;
/** Vertical Synchronization Pulse Width. */
int vPulseWidth;
/** TFT Frame Buffer address, offset to EBI bank base address. */
uint32_t addressOffset;
/** TFT DCLK period in internal cycles. */
int dclkPeriod;
/** Starting position of External Direct Drive relative to DCLK inactive edge. */
int startPosition;
/** Number of cycles RGB data is driven before active edge of DCLK. */
int setupCycles;
/** Number of cycles RGB data is held after active edge of DCLK. */
int holdCycles;
} EBI_TFTInit_TypeDef;
/** Default configuration for EBI TFT initialization structure. */
#define EBI_TFTINIT_DEFAULT \
{ \
ebiTFTBank0, /* Select EBI Bank 0. */ \
ebiTFTWidthHalfWord, /* Select 2-byte increments. */ \
ebiTFTColorSrcMem, /* Use memory as source for mask/blending. */ \
ebiTFTInterleaveUnlimited, /* Unlimited interleaved accesses. */ \
ebiTFTFrameBufTriggerVSync, /* VSYNC as frame buffer update trigger. */ \
false, /* Drive DCLK from negative edge of internal clock. */ \
ebiTFTMBDisabled, /* No masking and alpha blending enabled. */ \
ebiTFTDDModeExternal, /* Drive from external memory. */ \
ebiActiveLow, /* CS Active Low polarity. */ \
ebiActiveLow, /* DCLK Active Low polarity. */ \
ebiActiveLow, /* DATAEN Active Low polarity. */ \
ebiActiveLow, /* HSYNC Active Low polarity. */ \
ebiActiveLow, /* VSYNC Active Low polarity. */ \
320, /* Horizontal size in pixels. */ \
1, /* Horizontal Front Porch. */ \
29, /* Horizontal Back Porch. */ \
2, /* Horizontal Synchronization Pulse Width. */ \
240, /* Vertical size in pixels. */ \
1, /* Vertical Front Porch. */ \
4, /* Vertical Back Porch. */ \
2, /* Vertical Synchronization Pulse Width. */ \
0x0000, /* Address offset to EBI memory base. */ \
5, /* DCLK Period. */ \
2, /* DCLK Start. */ \
1, /* DCLK Setup cycles. */ \
1, /* DCLK Hold cycles. */ \
}
#endif
/*******************************************************************************
***************************** PROTOTYPES **********************************
******************************************************************************/
void EBI_Init(const EBI_Init_TypeDef *ebiInit);
void EBI_Disable(void);
uint32_t EBI_BankAddress(uint32_t bank);
void EBI_BankEnable(uint32_t banks, bool enable);
#if defined(_EBI_NANDCTRL_MASK)
void EBI_NANDFlashEnable(uint32_t banks, bool enable);
#endif
#if defined(_EBI_TFTCTRL_MASK)
void EBI_TFTInit(const EBI_TFTInit_TypeDef *ebiTFTInit);
void EBI_TFTSizeSet(uint32_t horizontal, uint32_t vertical);
void EBI_TFTHPorchSet(uint32_t front, uint32_t back, uint32_t pulseWidth);
void EBI_TFTVPorchSet(uint32_t front, uint32_t back, uint32_t pulseWidth);
void EBI_TFTTimingSet(uint32_t dclkPeriod, uint32_t start, uint32_t setup, uint32_t hold);
#endif
#if !defined(_EFM32_GECKO_FAMILY)
/* This functionality is only available on devices with independent timing support. */
void EBI_BankReadTimingSet(uint32_t bank, uint32_t setupCycles, uint32_t strobeCycles, uint32_t holdCycles);
void EBI_BankReadTimingConfig(uint32_t bank, bool pageMode, bool prefetch, bool halfRE);
void EBI_BankWriteTimingSet(uint32_t bank, uint32_t setupCycles, uint32_t strobeCycles, uint32_t holdCycles);
void EBI_BankWriteTimingConfig(uint32_t bank, bool writeBufDisable, bool halfWE);
void EBI_BankAddressTimingSet(uint32_t bank, uint32_t setupCycles, uint32_t holdCycles);
void EBI_BankAddressTimingConfig(uint32_t bank, bool halfALE);
void EBI_BankPolaritySet(uint32_t bank, EBI_Line_TypeDef line, EBI_Polarity_TypeDef polarity);
void EBI_BankByteLaneEnable(uint32_t bank, bool enable);
void EBI_AltMapEnable(bool enable);
#endif
#if defined(_EBI_TFTCTRL_MASK)
/***************************************************************************//**
* @brief
* Enable or disable TFT Direct Drive.
*
* @param[in] mode
* Drive from Internal or External memory, or Disable Direct Drive.
******************************************************************************/
__STATIC_INLINE void EBI_TFTEnable(EBI_TFTDDMode_TypeDef mode)
{
EBI->TFTCTRL = (EBI->TFTCTRL & ~(_EBI_TFTCTRL_DD_MASK)) | (uint32_t) mode;
}
/***************************************************************************//**
* @brief
* Configure frame buffer pointer.
*
* @param[in] address
* Frame pointer address, as offset by EBI base address.
******************************************************************************/
__STATIC_INLINE void EBI_TFTFrameBaseSet(uint32_t address)
{
EBI->TFTFRAMEBASE = (uint32_t) address;
}
/***************************************************************************//**
* @brief Set TFT Pixel Color 0 or 1.
*
* @param[in] pixel
* Which pixel instance to set.
* @param[in] color
* Color of pixel, 16-bit value.
******************************************************************************/
__STATIC_INLINE void EBI_TFTPixelSet(int pixel, uint32_t color)
{
EFM_ASSERT(pixel == 0 || pixel == 1);
if (pixel == 0) {
EBI->TFTPIXEL0 = color;
}
if (pixel == 1) {
EBI->TFTPIXEL1 = color;
}
}
/***************************************************************************//**
* @brief Set TFT Direct Drive Data from Internal Memory
*
* @param[in] color
* Color of pixel
******************************************************************************/
__STATIC_INLINE void EBI_TFTDDSet(uint32_t color)
{
EBI->TFTDD = color & _EBI_TFTDD_MASK;
}
#if defined(_EBI_TFTCOLORFORMAT_MASK)
/***************************************************************************//**
* @brief Set TFT Color Format
*
* @param[in] color0
* ARGB color format to be used.
*
* @param[in] color1
* RGB color format to be used.
******************************************************************************/
__STATIC_INLINE void EBI_TFTColorFormatSet(EBI_TFTColorFormat_TypeDef color0, EBI_TFTColorFormat_TypeDef color1)
{
EBI->TFTCOLORFORMAT = color0 | color1;
}
#endif
/***************************************************************************//**
* @brief Masking and Blending Mode Set.
*
* @param[in] maskBlend
* Masking and alpha blending mode.
******************************************************************************/
__STATIC_INLINE void EBI_TFTMaskBlendMode(EBI_TFTMaskBlend_TypeDef maskBlend)
{
EBI->TFTCTRL = (EBI->TFTCTRL & (~_EBI_TFTCTRL_MASKBLEND_MASK)) | maskBlend;
}
/***************************************************************************//**
* @brief Masking and Blending Color1 Source Set.
*
* @param[in] colorSrc
* Color1 source.
******************************************************************************/
__STATIC_INLINE void EBI_TFTColorSrcSet(EBI_TFTColorSrc_TypeDef colorSrc)
{
EBI->TFTCTRL = (EBI->TFTCTRL & (~_EBI_TFTCTRL_COLOR1SRC_MASK)) | colorSrc;
}
/***************************************************************************//**
* @brief Set TFT Alpha Blending Factor.
*
* @param[in] alpha
* 8-bit value indicating blending factor.
******************************************************************************/
__STATIC_INLINE void EBI_TFTAlphaBlendSet(uint8_t alpha)
{
EBI->TFTALPHA = alpha;
}
/***************************************************************************//**
* @brief Set TFT mask value.
* Data accesses that matches this value are suppressed.
* @param[in] mask
******************************************************************************/
__STATIC_INLINE void EBI_TFTMaskSet(uint32_t mask)
{
EBI->TFTMASK = mask;
}
/***************************************************************************//**
* @brief Get current vertical position counter.
* @return
* Returns the current line position for the visible part of a frame.
******************************************************************************/
__STATIC_INLINE uint32_t EBI_TFTVCount(void)
{
return((EBI->TFTSTATUS & _EBI_TFTSTATUS_VCNT_MASK) >> _EBI_TFTSTATUS_VCNT_SHIFT);
}
/***************************************************************************//**
* @brief Get current horizontal position counter.
* @return
* Returns the current horizontal pixel position within a visible line.
******************************************************************************/
__STATIC_INLINE uint32_t EBI_TFTHCount(void)
{
return((EBI->TFTSTATUS & _EBI_TFTSTATUS_HCNT_MASK) >> _EBI_TFTSTATUS_HCNT_SHIFT);
}
/***************************************************************************//**
* @brief Set Frame Buffer Trigger.
*
* @details
* Frame buffer pointer will be updated either on each horizontal line (hsync)
* or vertical update (vsync).
*
* @param[in] sync
* Trigger update of frame buffer pointer on vertical or horizontal sync.
******************************************************************************/
__STATIC_INLINE void EBI_TFTFBTriggerSet(EBI_TFTFrameBufTrigger_TypeDef sync)
{
EBI->TFTCTRL = ((EBI->TFTCTRL & ~_EBI_TFTCTRL_FBCTRIG_MASK) | sync);
}
/***************************************************************************//**
* @brief Set horizontal TFT stride value in number of bytes.
*
* @param[in] nbytes
* Number of bytes to add to frame buffer pointer after each horizontal line
* update.
******************************************************************************/
__STATIC_INLINE void EBI_TFTHStrideSet(uint32_t nbytes)
{
EFM_ASSERT(nbytes < 0x1000);
EBI->TFTSTRIDE = (EBI->TFTSTRIDE & ~(_EBI_TFTSTRIDE_HSTRIDE_MASK))
| (nbytes << _EBI_TFTSTRIDE_HSTRIDE_SHIFT);
}
#endif // _EBI_TFTCTRL_MASK
#if defined(_EBI_IF_MASK)
/***************************************************************************//**
* @brief
* Clear one or more pending EBI interrupts.
* @param[in] flags
* Pending EBI interrupt source to clear. Use a logical OR combination
* of valid interrupt flags for the EBI module (EBI_IF_nnn).
******************************************************************************/
__STATIC_INLINE void EBI_IntClear(uint32_t flags)
{
EBI->IFC = flags;
}
/***************************************************************************//**
* @brief
* Set one or more pending EBI interrupts.
*
* @param[in] flags
* EBI interrupt sources to set to pending. Use a logical OR combination of
* valid interrupt flags for the EBI module (EBI_IF_nnn).
******************************************************************************/
__STATIC_INLINE void EBI_IntSet(uint32_t flags)
{
EBI->IFS = flags;
}
/***************************************************************************//**
* @brief
* Disable one or more EBI interrupts.
*
* @param[in] flags
* EBI interrupt sources to disable. Use logical OR combination of valid
* interrupt flags for the EBI module (EBI_IF_nnn)
******************************************************************************/
__STATIC_INLINE void EBI_IntDisable(uint32_t flags)
{
EBI->IEN &= ~(flags);
}
/***************************************************************************//**
* @brief
* Enable one or more EBI interrupts.
*
* @param[in] flags
* EBI interrupt sources to enable. Use logical OR combination of valid
* interrupt flags for the EBI module (EBI_IF_nnn)
******************************************************************************/
__STATIC_INLINE void EBI_IntEnable(uint32_t flags)
{
EBI->IEN |= flags;
}
/***************************************************************************//**
* @brief
* Get pending EBI interrupt flags.
*
* @note
* Event bits are not cleared by the use of this function.
*
* @return
* EBI interrupt sources pending, a logical combination of valid EBI
* interrupt flags, EBI_IF_nnn.
******************************************************************************/
__STATIC_INLINE uint32_t EBI_IntGet(void)
{
return EBI->IF;
}
/***************************************************************************//**
* @brief
* Get enabled and pending EBI interrupt flags.
* Useful for handling more interrupt sources in the same interrupt handler.
*
* @note
* Interrupt flags are not cleared by the use of this function.
*
* @return
* Pending and enabled EBI interrupt sources.
* The return value is the bitwise AND of
* - the enabled interrupt sources in EBI_IEN and
* - the pending interrupt flags EBI_IF.
******************************************************************************/
__STATIC_INLINE uint32_t EBI_IntGetEnabled(void)
{
uint32_t ien;
ien = EBI->IEN;
return EBI->IF & ien;
}
#endif // _EBI_IF_MASK
#if defined(_EBI_CMD_MASK)
/***************************************************************************//**
* @brief
* Start ECC generator on NAND flash transfers.
******************************************************************************/
__STATIC_INLINE void EBI_StartNandEccGen(void)
{
EBI->CMD = EBI_CMD_ECCSTART | EBI_CMD_ECCCLEAR;
}
/***************************************************************************//**
* @brief
* Stop NAND flash ECC generator and return generated ECC.
*
* @return
* The generated ECC.
******************************************************************************/
__STATIC_INLINE uint32_t EBI_StopNandEccGen(void)
{
EBI->CMD = EBI_CMD_ECCSTOP;
return EBI->ECCPARITY;
}
#endif // _EBI_CMD_MASK
void EBI_ChipSelectEnable(uint32_t banks, bool enable);
void EBI_ReadTimingSet(uint32_t setupCycles, uint32_t strobeCycles, uint32_t holdCycles);
void EBI_WriteTimingSet(uint32_t setupCycles, uint32_t strobeCycles, uint32_t holdCycles);
void EBI_AddressTimingSet(uint32_t setupCycles, uint32_t holdCycles);
void EBI_PolaritySet(EBI_Line_TypeDef line, EBI_Polarity_TypeDef polarity);
/** @} (end addtogroup EBI) */
/** @} (end addtogroup emlib) */
#ifdef __cplusplus
}
#endif
#endif /* defined(EBI_COUNT) && (EBI_COUNT > 0) */
#endif /* EM_EBI_H */