00001
00034 #ifndef __SILICON_LABS_EM_EBI_H_
00035 #define __SILICON_LABS_EM_EBI_H_
00036
00037 #include "em_device.h"
00038
00039 #if defined(EBI_COUNT) && (EBI_COUNT > 0)
00040 #include "em_assert.h"
00041
00042 #include <stdint.h>
00043 #include <stdbool.h>
00044
00045 #ifdef __cplusplus
00046 extern "C" {
00047 #endif
00048
00049
00054
00059
00073
00074
00075
00076
00077 #define EBI_BANK0 (uint32_t)(1 << 1)
00078 #define EBI_BANK1 (uint32_t)(1 << 2)
00079 #define EBI_BANK2 (uint32_t)(1 << 3)
00080 #define EBI_BANK3 (uint32_t)(1 << 4)
00082 #define EBI_CS0 (uint32_t)(1 << 1)
00083 #define EBI_CS1 (uint32_t)(1 << 2)
00084 #define EBI_CS2 (uint32_t)(1 << 3)
00085 #define EBI_CS3 (uint32_t)(1 << 4)
00087
00088
00089
00090
00092 typedef enum
00093 {
00095 ebiModeD8A8 = EBI_CTRL_MODE_D8A8,
00097 ebiModeD16A16ALE = EBI_CTRL_MODE_D16A16ALE,
00099 ebiModeD8A24ALE = EBI_CTRL_MODE_D8A24ALE,
00100 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00101
00102 ebiModeD16 = EBI_CTRL_MODE_D16,
00103 #endif
00104 } EBI_Mode_TypeDef;
00105
00107 typedef enum
00108 {
00110 ebiActiveLow = 0,
00112 ebiActiveHigh = 1
00113 } EBI_Polarity_TypeDef;
00114
00116 typedef enum
00117 {
00119 ebiLineARDY,
00121 ebiLineALE,
00123 ebiLineWE,
00125 ebiLineRE,
00127 ebiLineCS,
00128 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00129
00130 ebiLineBL,
00131 #endif
00132 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00133
00134 ebiLineTFTVSync,
00136 ebiLineTFTHSync,
00138 ebiLineTFTDataEn,
00140 ebiLineTFTDClk,
00142 ebiLineTFTCS,
00143 #endif
00144 } EBI_Line_TypeDef;
00145
00146 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00147
00148 typedef enum
00149 {
00151 ebiALowA0 = EBI_ROUTE_ALB_A0,
00153 ebiALowA8 = EBI_ROUTE_ALB_A8,
00155 ebiALowA16 = EBI_ROUTE_ALB_A16,
00157 ebiALowA24 = EBI_ROUTE_ALB_A24,
00158 } EBI_ALow_TypeDef;
00159
00161 typedef enum
00162 {
00164 ebiAHighA0 = EBI_ROUTE_APEN_A0,
00166 ebiAHighA5 = EBI_ROUTE_APEN_A5,
00168 ebiAHighA6 = EBI_ROUTE_APEN_A6,
00170 ebiAHighA7 = EBI_ROUTE_APEN_A7,
00172 ebiAHighA8 = EBI_ROUTE_APEN_A8,
00174 ebiAHighA9 = EBI_ROUTE_APEN_A9,
00176 ebiAHighA10 = EBI_ROUTE_APEN_A10,
00178 ebiAHighA11 = EBI_ROUTE_APEN_A11,
00180 ebiAHighA12 = EBI_ROUTE_APEN_A12,
00182 ebiAHighA13 = EBI_ROUTE_APEN_A13,
00184 ebiAHighA14 = EBI_ROUTE_APEN_A14,
00186 ebiAHighA15 = EBI_ROUTE_APEN_A15,
00188 ebiAHighA16 = EBI_ROUTE_APEN_A16,
00190 ebiAHighA17 = EBI_ROUTE_APEN_A17,
00192 ebiAHighA18 = EBI_ROUTE_APEN_A18,
00194 ebiAHighA19 = EBI_ROUTE_APEN_A19,
00196 ebiAHighA20 = EBI_ROUTE_APEN_A20,
00198 ebiAHighA21 = EBI_ROUTE_APEN_A21,
00200 ebiAHighA22 = EBI_ROUTE_APEN_A22,
00202 ebiAHighA23 = EBI_ROUTE_APEN_A23,
00204 ebiAHighA24 = EBI_ROUTE_APEN_A24,
00206 ebiAHighA25 = EBI_ROUTE_APEN_A25,
00208 ebiAHighA26 = EBI_ROUTE_APEN_A26,
00210 ebiAHighA27 = EBI_ROUTE_APEN_A27,
00212 ebiAHighA28 = EBI_ROUTE_APEN_A28,
00213 } EBI_AHigh_TypeDef;
00214
00216 typedef enum {
00218 ebiLocation0 = EBI_ROUTE_LOCATION_LOC0,
00220 ebiLocation1 = EBI_ROUTE_LOCATION_LOC1,
00222 ebiLocation2 = EBI_ROUTE_LOCATION_LOC2
00223 } EBI_Location_TypeDef;
00224 #endif
00225
00226
00227 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00228
00229 typedef enum
00230 {
00232 ebiTFTBank0 = EBI_TFTCTRL_BANKSEL_BANK0,
00234 ebiTFTBank1 = EBI_TFTCTRL_BANKSEL_BANK1,
00236 ebiTFTBank2 = EBI_TFTCTRL_BANKSEL_BANK2,
00238 ebiTFTBank3 = EBI_TFTCTRL_BANKSEL_BANK3
00239 } EBI_TFTBank_TypeDef;
00240
00242 typedef enum
00243 {
00245 ebiTFTColorSrcMem = EBI_TFTCTRL_COLOR1SRC_MEM,
00247 ebiTFTColorSrcPixel1 = EBI_TFTCTRL_COLOR1SRC_PIXEL1,
00248 } EBI_TFTColorSrc_TypeDef;
00249
00251 typedef enum
00252 {
00254 ebiTFTInterleaveUnlimited = EBI_TFTCTRL_INTERLEAVE_UNLIMITED,
00256 ebiTFTInterleaveOnePerDClk = EBI_TFTCTRL_INTERLEAVE_ONEPERDCLK,
00258 ebiTFTInterleavePorch = EBI_TFTCTRL_INTERLEAVE_PORCH,
00259 } EBI_TFTInterleave_TypeDef;
00260
00262 typedef enum
00263 {
00265 ebiTFTFrameBufTriggerVSync = EBI_TFTCTRL_FBCTRIG_VSYNC,
00267 ebiTFTFrameBufTriggerHSync = EBI_TFTCTRL_FBCTRIG_HSYNC,
00268 } EBI_TFTFrameBufTrigger_TypeDef;
00269
00271 typedef enum
00272 {
00274 ebiTFTMBDisabled = EBI_TFTCTRL_MASKBLEND_DISABLED,
00276 ebiTFTMBIMask = EBI_TFTCTRL_MASKBLEND_IMASK,
00278 ebiTFTMBIAlpha = EBI_TFTCTRL_MASKBLEND_IALPHA,
00280 ebiTFTMBIMaskAlpha = EBI_TFTCTRL_MASKBLEND_IMASKIALPHA,
00282 ebiTFTMBEMask = EBI_TFTCTRL_MASKBLEND_EMASK,
00284 ebiTFTMBEAlpha = EBI_TFTCTRL_MASKBLEND_EALPHA,
00286 ebiTFTMBEMaskAlpha = EBI_TFTCTRL_MASKBLEND_EMASKEALPHA,
00287 } EBI_TFTMaskBlend_TypeDef;
00288
00290 typedef enum
00291 {
00293 ebiTFTDDModeDisabled = EBI_TFTCTRL_DD_DISABLED,
00295 ebiTFTDDModeInternal = EBI_TFTCTRL_DD_INTERNAL,
00297 ebiTFTDDModeExternal = EBI_TFTCTRL_DD_EXTERNAL,
00298 } EBI_TFTDDMode_TypeDef;
00299
00301 typedef enum
00302 {
00304 ebiTFTWidthByte = EBI_TFTCTRL_WIDTH_BYTE,
00306 ebiTFTWidthHalfWord = EBI_TFTCTRL_WIDTH_HALFWORD,
00307 } EBI_TFTWidth_TypeDef;
00308
00309 #endif
00310
00311
00312
00313
00314
00316 typedef struct
00317 {
00319 EBI_Mode_TypeDef mode;
00321 EBI_Polarity_TypeDef ardyPolarity;
00323 EBI_Polarity_TypeDef alePolarity;
00325 EBI_Polarity_TypeDef wePolarity;
00327 EBI_Polarity_TypeDef rePolarity;
00329 EBI_Polarity_TypeDef csPolarity;
00330 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00331
00332 EBI_Polarity_TypeDef blPolarity;
00334 bool blEnable;
00336 bool noIdle;
00337 #endif
00338
00339 bool ardyEnable;
00341 bool ardyDisableTimeout;
00343 uint32_t banks;
00345 uint32_t csLines;
00347 int addrSetupCycles;
00349 int addrHoldCycles;
00350 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00351
00352 bool addrHalfALE;
00353 #endif
00354
00355 int readSetupCycles;
00357 int readStrobeCycles;
00359 int readHoldCycles;
00360 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00361
00362 bool readPageMode;
00364 bool readPrefetch;
00366 bool readHalfRE;
00367 #endif
00368
00369 int writeSetupCycles;
00371 int writeStrobeCycles;
00373 int writeHoldCycles;
00374 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00375
00376 bool writeBufferDisable;
00378 bool writeHalfWE;
00380 EBI_ALow_TypeDef aLow;
00382 EBI_AHigh_TypeDef aHigh;
00384 EBI_Location_TypeDef location;
00385 #endif
00386
00387 bool enable;
00388 } EBI_Init_TypeDef;
00389
00391 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00392 #define EBI_INIT_DEFAULT \
00393 { ebiModeD8A8, \
00394 ebiActiveLow, \
00395 ebiActiveLow, \
00396 ebiActiveLow, \
00397 ebiActiveLow, \
00398 ebiActiveLow, \
00399 ebiActiveLow, \
00400 false, \
00401 false, \
00402 false, \
00403 false, \
00404 EBI_BANK0, \
00405 EBI_CS0, \
00406 0, \
00407 1, \
00408 false, \
00409 0, \
00410 0, \
00411 0, \
00412 false, \
00413 false, \
00414 false, \
00415 0, \
00416 0, \
00417 1, \
00418 false, \
00419 false, \
00420 ebiALowA0, \
00421 ebiAHighA0, \
00422 ebiLocation0, \
00423 true, \
00424 }
00425 #else
00426 #define EBI_INIT_DEFAULT \
00427 { ebiModeD8A8, \
00428 ebiActiveLow, \
00429 ebiActiveLow, \
00430 ebiActiveLow, \
00431 ebiActiveLow, \
00432 ebiActiveLow, \
00433 false, \
00434 false, \
00435 EBI_BANK0, \
00436 EBI_CS0, \
00437 0, \
00438 1, \
00439 0, \
00440 0, \
00441 0, \
00442 0, \
00443 0, \
00444 1, \
00445 true, \
00446 }
00447 #endif
00448
00449 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00450
00452 typedef struct
00453 {
00455 EBI_TFTBank_TypeDef bank;
00457 EBI_TFTWidth_TypeDef width;
00459 EBI_TFTColorSrc_TypeDef colSrc;
00461 EBI_TFTInterleave_TypeDef interleave;
00463 EBI_TFTFrameBufTrigger_TypeDef fbTrigger;
00465 bool shiftDClk;
00467 EBI_TFTMaskBlend_TypeDef maskBlend;
00469 EBI_TFTDDMode_TypeDef driveMode;
00471 EBI_Polarity_TypeDef csPolarity;
00473 EBI_Polarity_TypeDef dclkPolarity;
00475 EBI_Polarity_TypeDef dataenPolarity;
00477 EBI_Polarity_TypeDef hsyncPolarity;
00479 EBI_Polarity_TypeDef vsyncPolarity;
00481 int hsize;
00483 int hPorchFront;
00485 int hPorchBack;
00487 int hPulseWidth;
00489 int vsize;
00491 int vPorchFront;
00493 int vPorchBack;
00495 int vPulseWidth;
00497 uint32_t addressOffset;
00499 int dclkPeriod;
00501 int startPosition;
00503 int setupCycles;
00505 int holdCycles;
00506 } EBI_TFTInit_TypeDef;
00507
00509 #define EBI_TFTINIT_DEFAULT \
00510 { ebiTFTBank0, \
00511 ebiTFTWidthHalfWord, \
00512 ebiTFTColorSrcMem, \
00513 ebiTFTInterleaveUnlimited, \
00514 ebiTFTFrameBufTriggerVSync, \
00515 false, \
00516 ebiTFTMBDisabled, \
00517 ebiTFTDDModeExternal, \
00518 ebiActiveLow, \
00519 ebiActiveLow, \
00520 ebiActiveLow, \
00521 ebiActiveLow, \
00522 ebiActiveLow, \
00523 320, \
00524 1, \
00525 29, \
00526 2, \
00527 240, \
00528 1, \
00529 4, \
00530 2, \
00531 0x0000, \
00532 5, \
00533 2, \
00534 1, \
00535 1, \
00536 }
00537
00538 #endif
00539
00540
00541
00542
00543 void EBI_Init(const EBI_Init_TypeDef *ebiInit);
00544 void EBI_Disable(void);
00545 uint32_t EBI_BankAddress(uint32_t bank);
00546 void EBI_BankEnable(uint32_t banks, bool enable);
00547
00548 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00549 void EBI_TFTInit(const EBI_TFTInit_TypeDef *ebiTFTInit);
00550 void EBI_TFTSizeSet(uint32_t horizontal, uint32_t vertical);
00551 void EBI_TFTHPorchSet(int front, int back, int pulseWidth);
00552 void EBI_TFTVPorchSet(int front, int back, int pulseWidth);
00553 void EBI_TFTTimingSet(int dclkPeriod, int start, int setup, int hold);
00554 #endif
00555
00556 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00557
00558 void EBI_BankReadTimingSet(uint32_t bank, int setupCycles, int strobeCycles, int holdCycles);
00559 void EBI_BankReadTimingConfig(uint32_t bank, bool pageMode, bool prefetch, bool halfRE);
00560
00561 void EBI_BankWriteTimingSet(uint32_t bank, int setupCycles, int strobeCycles, int holdCycles);
00562 void EBI_BankWriteTimingConfig(uint32_t bank, bool writeBufDisable, bool halfWE);
00563
00564 void EBI_BankAddressTimingSet(uint32_t bank, int setupCycles, int holdCycles);
00565 void EBI_BankAddressTimingConfig(uint32_t bank, bool halfALE);
00566
00567 void EBI_BankPolaritySet(uint32_t bank, EBI_Line_TypeDef line, EBI_Polarity_TypeDef polarity);
00568 void EBI_BankByteLaneEnable(uint32_t bank, bool enable);
00569 void EBI_AltMapEnable(bool enable);
00570
00571
00578 __STATIC_INLINE void EBI_TFTEnable(EBI_TFTDDMode_TypeDef mode)
00579 {
00580 EBI->TFTCTRL = (EBI->TFTCTRL & ~(_EBI_TFTCTRL_DD_MASK)) | (uint32_t) mode;
00581 }
00582
00583
00584
00591 __STATIC_INLINE void EBI_TFTFrameBaseSet(uint32_t address)
00592 {
00593 EBI->TFTFRAMEBASE = (uint32_t) address;
00594 }
00595
00596
00597
00605 __STATIC_INLINE void EBI_TFTPixelSet(int pixel, uint32_t color)
00606 {
00607 EFM_ASSERT(pixel == 0 || pixel == 1);
00608
00609 if (pixel == 0)
00610 {
00611 EBI->TFTPIXEL0 = color;
00612 }
00613 if (pixel == 1)
00614 {
00615 EBI->TFTPIXEL1 = color;
00616 }
00617 }
00618
00619
00620
00626 __STATIC_INLINE void EBI_TFTMaskBlendMode(EBI_TFTMaskBlend_TypeDef maskBlend)
00627 {
00628 EBI->TFTCTRL = (EBI->TFTCTRL & (~_EBI_TFTCTRL_MASKBLEND_MASK))|maskBlend;
00629 }
00630
00631
00632
00638 __STATIC_INLINE void EBI_TFTAlphaBlendSet(uint8_t alpha)
00639 {
00640 EBI->TFTALPHA = alpha;
00641 }
00642
00643
00644
00649 __STATIC_INLINE void EBI_TFTMaskSet(uint32_t mask)
00650 {
00651 EBI->TFTMASK = mask;
00652 }
00653
00654
00655
00660 __STATIC_INLINE uint32_t EBI_TFTVCount(void)
00661 {
00662 return((EBI->TFTSTATUS & _EBI_TFTSTATUS_VCNT_MASK) >> _EBI_TFTSTATUS_VCNT_SHIFT);
00663 }
00664
00665
00666
00671 __STATIC_INLINE uint32_t EBI_TFTHCount(void)
00672 {
00673 return((EBI->TFTSTATUS & _EBI_TFTSTATUS_HCNT_MASK) >> _EBI_TFTSTATUS_HCNT_SHIFT);
00674 }
00675
00676
00677
00687 __STATIC_INLINE void EBI_TFTFBTriggerSet(EBI_TFTFrameBufTrigger_TypeDef sync)
00688 {
00689 EBI->TFTCTRL = ((EBI->TFTCTRL & ~_EBI_TFTCTRL_FBCTRIG_MASK)|sync);
00690 }
00691
00692
00693
00700 __STATIC_INLINE void EBI_TFTHStrideSet(uint32_t nbytes)
00701 {
00702 EFM_ASSERT(nbytes < 0x1000);
00703
00704 EBI->TFTSTRIDE = (EBI->TFTSTRIDE & ~(_EBI_TFTSTRIDE_HSTRIDE_MASK))|
00705 (nbytes<<_EBI_TFTSTRIDE_HSTRIDE_SHIFT);
00706 }
00707
00708
00709
00716 __STATIC_INLINE void EBI_IntClear(uint32_t flags)
00717 {
00718 EBI->IFC = flags;
00719 }
00720
00721
00722
00730 __STATIC_INLINE void EBI_IntSet(uint32_t flags)
00731 {
00732 EBI->IFS = flags;
00733 }
00734
00735
00736
00744 __STATIC_INLINE void EBI_IntDisable(uint32_t flags)
00745 {
00746 EBI->IEN &= ~(flags);
00747 }
00748
00749
00750
00758 __STATIC_INLINE void EBI_IntEnable(uint32_t flags)
00759 {
00760 EBI->IEN |= flags;
00761 }
00762
00763
00764
00775 __STATIC_INLINE uint32_t EBI_IntGet(void)
00776 {
00777 return(EBI->IF);
00778 }
00779
00780
00781
00785 __STATIC_INLINE void EBI_StartNandEccGen(void)
00786 {
00787 EBI->CMD = EBI_CMD_ECCSTART | EBI_CMD_ECCCLEAR;
00788 }
00789
00790
00791
00798 __STATIC_INLINE uint32_t EBI_StopNandEccGen( void )
00799 {
00800 EBI->CMD = EBI_CMD_ECCSTOP;
00801 return EBI->ECCPARITY;
00802 }
00803 #endif
00804
00805 void EBI_ChipSelectEnable(uint32_t banks, bool enable);
00806 void EBI_ReadTimingSet(int setupCycles, int strobeCycles, int holdCycles);
00807 void EBI_WriteTimingSet(int setupCycles, int strobeCycles, int holdCycles);
00808 void EBI_AddressTimingSet(int setupCycles, int holdCycles);
00809 void EBI_PolaritySet(EBI_Line_TypeDef line, EBI_Polarity_TypeDef polarity);
00810
00814 #ifdef __cplusplus
00815 }
00816 #endif
00817
00818 #endif
00819
00820 #endif