mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
179:b0033dcd6934
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 2 * @file em_ebi.c
<> 144:ef7eb2e8f9f7 3 * @brief External Bus Interface (EBI) Peripheral API
AnnaBridge 179:b0033dcd6934 4 * @version 5.3.3
<> 144:ef7eb2e8f9f7 5 *******************************************************************************
AnnaBridge 179:b0033dcd6934 6 * # License
<> 150:02e0a0aed4ec 7 * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
<> 144:ef7eb2e8f9f7 8 *******************************************************************************
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Permission is granted to anyone to use this software for any purpose,
<> 144:ef7eb2e8f9f7 11 * including commercial applications, and to alter it and redistribute it
<> 144:ef7eb2e8f9f7 12 * freely, subject to the following restrictions:
<> 144:ef7eb2e8f9f7 13 *
<> 144:ef7eb2e8f9f7 14 * 1. The origin of this software must not be misrepresented; you must not
<> 144:ef7eb2e8f9f7 15 * claim that you wrote the original software.
<> 144:ef7eb2e8f9f7 16 * 2. Altered source versions must be plainly marked as such, and must not be
<> 144:ef7eb2e8f9f7 17 * misrepresented as being the original software.
<> 144:ef7eb2e8f9f7 18 * 3. This notice may not be removed or altered from any source distribution.
<> 144:ef7eb2e8f9f7 19 *
<> 144:ef7eb2e8f9f7 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
<> 144:ef7eb2e8f9f7 21 * obligation to support this Software. Silicon Labs is providing the
<> 144:ef7eb2e8f9f7 22 * Software "AS IS", with no express or implied warranties of any kind,
<> 144:ef7eb2e8f9f7 23 * including, but not limited to, any implied warranties of merchantability
<> 144:ef7eb2e8f9f7 24 * or fitness for any particular purpose or warranties against infringement
<> 144:ef7eb2e8f9f7 25 * of any proprietary rights of a third party.
<> 144:ef7eb2e8f9f7 26 *
<> 144:ef7eb2e8f9f7 27 * Silicon Labs will not be liable for any consequential, incidental, or
<> 144:ef7eb2e8f9f7 28 * special damages, or any other relief, or for any claim by any third party,
<> 144:ef7eb2e8f9f7 29 * arising from your use of this Software.
<> 144:ef7eb2e8f9f7 30 *
<> 144:ef7eb2e8f9f7 31 ******************************************************************************/
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 #include "em_ebi.h"
<> 144:ef7eb2e8f9f7 34 #if defined(EBI_COUNT) && (EBI_COUNT > 0)
<> 144:ef7eb2e8f9f7 35 #include "em_assert.h"
<> 144:ef7eb2e8f9f7 36 #include "em_bus.h"
<> 144:ef7eb2e8f9f7 37
<> 144:ef7eb2e8f9f7 38 /***************************************************************************//**
<> 150:02e0a0aed4ec 39 * @addtogroup emlib
<> 144:ef7eb2e8f9f7 40 * @{
<> 144:ef7eb2e8f9f7 41 ******************************************************************************/
<> 144:ef7eb2e8f9f7 42
<> 144:ef7eb2e8f9f7 43 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 44 * @addtogroup EBI
<> 144:ef7eb2e8f9f7 45 * @brief EBI External Bus Interface (EBI) Peripheral API
<> 150:02e0a0aed4ec 46 * @details
<> 150:02e0a0aed4ec 47 * This module contains functions to control the EBI peripheral of Silicon
<> 150:02e0a0aed4ec 48 * Labs 32-bit MCUs and SoCs. The EBI is used for accessing external parallel
<> 150:02e0a0aed4ec 49 * devices. The devices appear as part of the internal memory map of the MCU.
<> 144:ef7eb2e8f9f7 50 * @{
<> 144:ef7eb2e8f9f7 51 ******************************************************************************/
<> 144:ef7eb2e8f9f7 52
AnnaBridge 179:b0033dcd6934 53 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
AnnaBridge 179:b0033dcd6934 54
AnnaBridge 179:b0033dcd6934 55 /* The ROUTE register has been renamed in the newest platform so these register
AnnaBridge 179:b0033dcd6934 56 * field names have been created in order to make it easier to work with both
AnnaBridge 179:b0033dcd6934 57 * the new and the old names in a generic way. */
AnnaBridge 179:b0033dcd6934 58 #if defined(_EBI_ROUTE_MASK)
AnnaBridge 179:b0033dcd6934 59 #define _EBI_GENERIC_ALEPEN_SHIFT _EBI_ROUTE_ALEPEN_SHIFT
AnnaBridge 179:b0033dcd6934 60 #define _EBI_GENERIC_BLPEN_SHIFT _EBI_ROUTE_BLPEN_SHIFT
AnnaBridge 179:b0033dcd6934 61 #define _EBI_GENERIC_EBIPEN_SHIFT _EBI_ROUTE_EBIPEN_SHIFT
AnnaBridge 179:b0033dcd6934 62 #define _EBI_GENERIC_CS0PEN_SHIFT _EBI_ROUTE_CS0PEN_SHIFT
AnnaBridge 179:b0033dcd6934 63 #define _EBI_GENERIC_CS1PEN_SHIFT _EBI_ROUTE_CS1PEN_SHIFT
AnnaBridge 179:b0033dcd6934 64 #define _EBI_GENERIC_CS2PEN_SHIFT _EBI_ROUTE_CS2PEN_SHIFT
AnnaBridge 179:b0033dcd6934 65 #define _EBI_GENERIC_CS3PEN_SHIFT _EBI_ROUTE_CS3PEN_SHIFT
AnnaBridge 179:b0033dcd6934 66 #define _EBI_GENERIC_RESETVALUE _EBI_ROUTE_RESETVALUE
AnnaBridge 179:b0033dcd6934 67 #define EBI_GENERIC_ROUTE_REG EBI->ROUTE
AnnaBridge 179:b0033dcd6934 68 #define _EBI_GENERIC_ALB_MASK _EBI_ROUTE_ALB_MASK
AnnaBridge 179:b0033dcd6934 69 #define _EBI_GENERIC_APEN_MASK _EBI_ROUTE_APEN_MASK
AnnaBridge 179:b0033dcd6934 70 #define EBI_GENERIC_TFTPEN EBI_ROUTE_TFTPEN
AnnaBridge 179:b0033dcd6934 71 #else
AnnaBridge 179:b0033dcd6934 72 #define _EBI_GENERIC_ALEPEN_SHIFT _EBI_ROUTEPEN_ALEPEN_SHIFT
AnnaBridge 179:b0033dcd6934 73 #define _EBI_GENERIC_BLPEN_SHIFT _EBI_ROUTEPEN_BLPEN_SHIFT
AnnaBridge 179:b0033dcd6934 74 #define _EBI_GENERIC_EBIPEN_SHIFT _EBI_ROUTEPEN_EBIPEN_SHIFT
AnnaBridge 179:b0033dcd6934 75 #define _EBI_GENERIC_CS0PEN_SHIFT _EBI_ROUTEPEN_CS0PEN_SHIFT
AnnaBridge 179:b0033dcd6934 76 #define _EBI_GENERIC_CS1PEN_SHIFT _EBI_ROUTEPEN_CS1PEN_SHIFT
AnnaBridge 179:b0033dcd6934 77 #define _EBI_GENERIC_CS2PEN_SHIFT _EBI_ROUTEPEN_CS2PEN_SHIFT
AnnaBridge 179:b0033dcd6934 78 #define _EBI_GENERIC_CS3PEN_SHIFT _EBI_ROUTEPEN_CS3PEN_SHIFT
AnnaBridge 179:b0033dcd6934 79 #define _EBI_GENERIC_RESETVALUE _EBI_ROUTEPEN_RESETVALUE
AnnaBridge 179:b0033dcd6934 80 #define EBI_GENERIC_ROUTE_REG EBI->ROUTEPEN
AnnaBridge 179:b0033dcd6934 81 #define _EBI_GENERIC_ALB_MASK _EBI_ROUTEPEN_ALB_MASK
AnnaBridge 179:b0033dcd6934 82 #define _EBI_GENERIC_APEN_MASK _EBI_ROUTEPEN_APEN_MASK
AnnaBridge 179:b0033dcd6934 83 #define EBI_GENERIC_TFTPEN EBI_ROUTEPEN_TFTPEN
AnnaBridge 179:b0033dcd6934 84 #endif
AnnaBridge 179:b0033dcd6934 85
AnnaBridge 179:b0033dcd6934 86 /***************************************************************************//**
AnnaBridge 179:b0033dcd6934 87 * @brief
AnnaBridge 179:b0033dcd6934 88 * Perform a single-bit write operation on a EBI route register
AnnaBridge 179:b0033dcd6934 89 *
AnnaBridge 179:b0033dcd6934 90 * @param[in] bit
AnnaBridge 179:b0033dcd6934 91 * bit Bit position to write, 0-31
AnnaBridge 179:b0033dcd6934 92 *
AnnaBridge 179:b0033dcd6934 93 * @param[in] val
AnnaBridge 179:b0033dcd6934 94 * 0 to clear bit and 1 to set bit
AnnaBridge 179:b0033dcd6934 95 ******************************************************************************/
AnnaBridge 179:b0033dcd6934 96 __STATIC_INLINE void EBI_RouteBitWrite(uint32_t bit, uint32_t val)
AnnaBridge 179:b0033dcd6934 97 {
AnnaBridge 179:b0033dcd6934 98 BUS_RegBitWrite(&(EBI_GENERIC_ROUTE_REG), bit, val);
AnnaBridge 179:b0033dcd6934 99 }
AnnaBridge 179:b0033dcd6934 100 /** @endcond */
AnnaBridge 179:b0033dcd6934 101
<> 144:ef7eb2e8f9f7 102 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 103 * @brief
<> 144:ef7eb2e8f9f7 104 * Configure and enable External Bus Interface
<> 144:ef7eb2e8f9f7 105 *
<> 144:ef7eb2e8f9f7 106 * @param[in] ebiInit
<> 144:ef7eb2e8f9f7 107 * EBI configuration structure
<> 144:ef7eb2e8f9f7 108 *
<> 144:ef7eb2e8f9f7 109 * @note
<> 144:ef7eb2e8f9f7 110 * GPIO lines must be configured as PUSH_PULL for correct operation
<> 144:ef7eb2e8f9f7 111 * GPIO and EBI clocks must be enabled in the CMU
<> 144:ef7eb2e8f9f7 112 ******************************************************************************/
<> 144:ef7eb2e8f9f7 113 void EBI_Init(const EBI_Init_TypeDef *ebiInit)
<> 144:ef7eb2e8f9f7 114 {
<> 144:ef7eb2e8f9f7 115 uint32_t ctrl = EBI->CTRL;
<> 144:ef7eb2e8f9f7 116
AnnaBridge 179:b0033dcd6934 117 #if defined(_EFM32_GECKO_FAMILY)
AnnaBridge 179:b0033dcd6934 118 /* Set polarity of address ready */
AnnaBridge 179:b0033dcd6934 119 EBI_PolaritySet(ebiLineARDY, ebiInit->ardyPolarity);
AnnaBridge 179:b0033dcd6934 120 /* Set polarity of address latch enable */
AnnaBridge 179:b0033dcd6934 121 EBI_PolaritySet(ebiLineALE, ebiInit->alePolarity);
AnnaBridge 179:b0033dcd6934 122 /* Set polarity of write enable */
AnnaBridge 179:b0033dcd6934 123 EBI_PolaritySet(ebiLineWE, ebiInit->wePolarity);
AnnaBridge 179:b0033dcd6934 124 /* Set polarity of read enable */
AnnaBridge 179:b0033dcd6934 125 EBI_PolaritySet(ebiLineRE, ebiInit->rePolarity);
AnnaBridge 179:b0033dcd6934 126 /* Set polarity of chip select lines */
AnnaBridge 179:b0033dcd6934 127 EBI_PolaritySet(ebiLineCS, ebiInit->csPolarity);
AnnaBridge 179:b0033dcd6934 128 #else
<> 144:ef7eb2e8f9f7 129 /* Enable Independent Timing for devices that supports it */
<> 144:ef7eb2e8f9f7 130 ctrl |= EBI_CTRL_ITS;
<> 144:ef7eb2e8f9f7 131
<> 144:ef7eb2e8f9f7 132 /* Set polarity of address ready */
<> 144:ef7eb2e8f9f7 133 EBI_BankPolaritySet(ebiInit->banks, ebiLineARDY, ebiInit->ardyPolarity);
<> 144:ef7eb2e8f9f7 134 /* Set polarity of address latch enable */
<> 144:ef7eb2e8f9f7 135 EBI_BankPolaritySet(ebiInit->banks, ebiLineALE, ebiInit->alePolarity);
<> 144:ef7eb2e8f9f7 136 /* Set polarity of write enable */
<> 144:ef7eb2e8f9f7 137 EBI_BankPolaritySet(ebiInit->banks, ebiLineWE, ebiInit->wePolarity);
<> 144:ef7eb2e8f9f7 138 /* Set polarity of read enable */
<> 144:ef7eb2e8f9f7 139 EBI_BankPolaritySet(ebiInit->banks, ebiLineRE, ebiInit->rePolarity);
<> 144:ef7eb2e8f9f7 140 /* Set polarity of chip select lines */
<> 144:ef7eb2e8f9f7 141 EBI_BankPolaritySet(ebiInit->banks, ebiLineCS, ebiInit->csPolarity);
<> 144:ef7eb2e8f9f7 142 /* Set polarity of byte lane line */
<> 144:ef7eb2e8f9f7 143 EBI_BankPolaritySet(ebiInit->banks, ebiLineBL, ebiInit->blPolarity);
<> 144:ef7eb2e8f9f7 144 #endif
<> 144:ef7eb2e8f9f7 145
<> 144:ef7eb2e8f9f7 146 /* Configure EBI mode and control settings */
AnnaBridge 179:b0033dcd6934 147 #if defined(_EFM32_GECKO_FAMILY)
AnnaBridge 179:b0033dcd6934 148 ctrl &= ~(_EBI_CTRL_MODE_MASK
AnnaBridge 179:b0033dcd6934 149 | _EBI_CTRL_ARDYEN_MASK
AnnaBridge 179:b0033dcd6934 150 | _EBI_CTRL_ARDYTODIS_MASK
AnnaBridge 179:b0033dcd6934 151 | _EBI_CTRL_BANK0EN_MASK
AnnaBridge 179:b0033dcd6934 152 | _EBI_CTRL_BANK1EN_MASK
AnnaBridge 179:b0033dcd6934 153 | _EBI_CTRL_BANK2EN_MASK
AnnaBridge 179:b0033dcd6934 154 | _EBI_CTRL_BANK3EN_MASK);
AnnaBridge 179:b0033dcd6934 155 if ( ebiInit->enable) {
AnnaBridge 179:b0033dcd6934 156 if ( ebiInit->banks & EBI_BANK0 ) {
AnnaBridge 179:b0033dcd6934 157 ctrl |= EBI_CTRL_BANK0EN;
AnnaBridge 179:b0033dcd6934 158 }
AnnaBridge 179:b0033dcd6934 159 if ( ebiInit->banks & EBI_BANK1 ) {
AnnaBridge 179:b0033dcd6934 160 ctrl |= EBI_CTRL_BANK1EN;
AnnaBridge 179:b0033dcd6934 161 }
AnnaBridge 179:b0033dcd6934 162 if ( ebiInit->banks & EBI_BANK2 ) {
AnnaBridge 179:b0033dcd6934 163 ctrl |= EBI_CTRL_BANK2EN;
AnnaBridge 179:b0033dcd6934 164 }
AnnaBridge 179:b0033dcd6934 165 if ( ebiInit->banks & EBI_BANK3 ) {
AnnaBridge 179:b0033dcd6934 166 ctrl |= EBI_CTRL_BANK3EN;
AnnaBridge 179:b0033dcd6934 167 }
AnnaBridge 179:b0033dcd6934 168 }
AnnaBridge 179:b0033dcd6934 169 ctrl |= ebiInit->mode;
AnnaBridge 179:b0033dcd6934 170 ctrl |= (ebiInit->ardyEnable << _EBI_CTRL_ARDYEN_SHIFT);
AnnaBridge 179:b0033dcd6934 171 ctrl |= (ebiInit->ardyDisableTimeout << _EBI_CTRL_ARDYTODIS_SHIFT);
AnnaBridge 179:b0033dcd6934 172 #else
AnnaBridge 179:b0033dcd6934 173 if (ebiInit->banks & EBI_BANK0) {
<> 144:ef7eb2e8f9f7 174 ctrl &= ~(_EBI_CTRL_MODE_MASK
<> 144:ef7eb2e8f9f7 175 | _EBI_CTRL_ARDYEN_MASK
<> 144:ef7eb2e8f9f7 176 | _EBI_CTRL_ARDYTODIS_MASK
<> 144:ef7eb2e8f9f7 177 | _EBI_CTRL_BL_MASK
<> 144:ef7eb2e8f9f7 178 | _EBI_CTRL_NOIDLE_MASK
<> 144:ef7eb2e8f9f7 179 | _EBI_CTRL_BANK0EN_MASK);
<> 144:ef7eb2e8f9f7 180 ctrl |= (ebiInit->mode << _EBI_CTRL_MODE_SHIFT);
<> 144:ef7eb2e8f9f7 181 ctrl |= (ebiInit->ardyEnable << _EBI_CTRL_ARDYEN_SHIFT);
<> 144:ef7eb2e8f9f7 182 ctrl |= (ebiInit->ardyDisableTimeout << _EBI_CTRL_ARDYTODIS_SHIFT);
<> 144:ef7eb2e8f9f7 183 ctrl |= (ebiInit->blEnable << _EBI_CTRL_BL_SHIFT);
<> 144:ef7eb2e8f9f7 184 ctrl |= (ebiInit->noIdle << _EBI_CTRL_NOIDLE_SHIFT);
AnnaBridge 179:b0033dcd6934 185 if ( ebiInit->enable) {
<> 144:ef7eb2e8f9f7 186 ctrl |= EBI_CTRL_BANK0EN;
<> 144:ef7eb2e8f9f7 187 }
<> 144:ef7eb2e8f9f7 188 }
AnnaBridge 179:b0033dcd6934 189 if (ebiInit->banks & EBI_BANK1) {
<> 144:ef7eb2e8f9f7 190 ctrl &= ~(_EBI_CTRL_BL1_MASK
<> 144:ef7eb2e8f9f7 191 | _EBI_CTRL_MODE1_MASK
<> 144:ef7eb2e8f9f7 192 | _EBI_CTRL_ARDY1EN_MASK
<> 144:ef7eb2e8f9f7 193 | _EBI_CTRL_ARDYTO1DIS_MASK
<> 144:ef7eb2e8f9f7 194 | _EBI_CTRL_NOIDLE1_MASK
<> 144:ef7eb2e8f9f7 195 | _EBI_CTRL_BANK1EN_MASK);
<> 144:ef7eb2e8f9f7 196 ctrl |= (ebiInit->mode << _EBI_CTRL_MODE1_SHIFT);
<> 144:ef7eb2e8f9f7 197 ctrl |= (ebiInit->ardyEnable << _EBI_CTRL_ARDY1EN_SHIFT);
<> 144:ef7eb2e8f9f7 198 ctrl |= (ebiInit->ardyDisableTimeout << _EBI_CTRL_ARDYTO1DIS_SHIFT);
<> 144:ef7eb2e8f9f7 199 ctrl |= (ebiInit->blEnable << _EBI_CTRL_BL1_SHIFT);
<> 144:ef7eb2e8f9f7 200 ctrl |= (ebiInit->noIdle << _EBI_CTRL_NOIDLE1_SHIFT);
AnnaBridge 179:b0033dcd6934 201 if ( ebiInit->enable) {
<> 144:ef7eb2e8f9f7 202 ctrl |= EBI_CTRL_BANK1EN;
<> 144:ef7eb2e8f9f7 203 }
<> 144:ef7eb2e8f9f7 204 }
AnnaBridge 179:b0033dcd6934 205 if (ebiInit->banks & EBI_BANK2) {
<> 144:ef7eb2e8f9f7 206 ctrl &= ~(_EBI_CTRL_BL2_MASK
<> 144:ef7eb2e8f9f7 207 | _EBI_CTRL_MODE2_MASK
<> 144:ef7eb2e8f9f7 208 | _EBI_CTRL_ARDY2EN_MASK
<> 144:ef7eb2e8f9f7 209 | _EBI_CTRL_ARDYTO2DIS_MASK
<> 144:ef7eb2e8f9f7 210 | _EBI_CTRL_NOIDLE2_MASK
<> 144:ef7eb2e8f9f7 211 | _EBI_CTRL_BANK2EN_MASK);
<> 144:ef7eb2e8f9f7 212 ctrl |= (ebiInit->mode << _EBI_CTRL_MODE2_SHIFT);
<> 144:ef7eb2e8f9f7 213 ctrl |= (ebiInit->ardyEnable << _EBI_CTRL_ARDY2EN_SHIFT);
<> 144:ef7eb2e8f9f7 214 ctrl |= (ebiInit->ardyDisableTimeout << _EBI_CTRL_ARDYTO2DIS_SHIFT);
<> 144:ef7eb2e8f9f7 215 ctrl |= (ebiInit->blEnable << _EBI_CTRL_BL2_SHIFT);
<> 144:ef7eb2e8f9f7 216 ctrl |= (ebiInit->noIdle << _EBI_CTRL_NOIDLE2_SHIFT);
AnnaBridge 179:b0033dcd6934 217 if ( ebiInit->enable) {
<> 144:ef7eb2e8f9f7 218 ctrl |= EBI_CTRL_BANK2EN;
<> 144:ef7eb2e8f9f7 219 }
<> 144:ef7eb2e8f9f7 220 }
AnnaBridge 179:b0033dcd6934 221 if (ebiInit->banks & EBI_BANK3) {
<> 144:ef7eb2e8f9f7 222 ctrl &= ~(_EBI_CTRL_BL3_MASK
<> 144:ef7eb2e8f9f7 223 | _EBI_CTRL_MODE3_MASK
<> 144:ef7eb2e8f9f7 224 | _EBI_CTRL_ARDY3EN_MASK
<> 144:ef7eb2e8f9f7 225 | _EBI_CTRL_ARDYTO3DIS_MASK
<> 144:ef7eb2e8f9f7 226 | _EBI_CTRL_NOIDLE3_MASK
<> 144:ef7eb2e8f9f7 227 | _EBI_CTRL_BANK3EN_MASK);
<> 144:ef7eb2e8f9f7 228 ctrl |= (ebiInit->mode << _EBI_CTRL_MODE3_SHIFT);
<> 144:ef7eb2e8f9f7 229 ctrl |= (ebiInit->ardyEnable << _EBI_CTRL_ARDY3EN_SHIFT);
<> 144:ef7eb2e8f9f7 230 ctrl |= (ebiInit->ardyDisableTimeout << _EBI_CTRL_ARDYTO3DIS_SHIFT);
<> 144:ef7eb2e8f9f7 231 ctrl |= (ebiInit->blEnable << _EBI_CTRL_BL3_SHIFT);
<> 144:ef7eb2e8f9f7 232 ctrl |= (ebiInit->noIdle << _EBI_CTRL_NOIDLE3_SHIFT);
AnnaBridge 179:b0033dcd6934 233 if ( ebiInit->enable) {
<> 144:ef7eb2e8f9f7 234 ctrl |= EBI_CTRL_BANK3EN;
<> 144:ef7eb2e8f9f7 235 }
<> 144:ef7eb2e8f9f7 236 }
<> 144:ef7eb2e8f9f7 237 #endif
<> 144:ef7eb2e8f9f7 238
<> 144:ef7eb2e8f9f7 239 /* Configure timing */
AnnaBridge 179:b0033dcd6934 240 #if defined(_EFM32_GECKO_FAMILY)
AnnaBridge 179:b0033dcd6934 241 EBI_ReadTimingSet(ebiInit->readSetupCycles,
AnnaBridge 179:b0033dcd6934 242 ebiInit->readStrobeCycles,
AnnaBridge 179:b0033dcd6934 243 ebiInit->readHoldCycles);
AnnaBridge 179:b0033dcd6934 244 EBI_WriteTimingSet(ebiInit->writeSetupCycles,
AnnaBridge 179:b0033dcd6934 245 ebiInit->writeStrobeCycles,
AnnaBridge 179:b0033dcd6934 246 ebiInit->writeHoldCycles);
AnnaBridge 179:b0033dcd6934 247 EBI_AddressTimingSet(ebiInit->addrSetupCycles,
AnnaBridge 179:b0033dcd6934 248 ebiInit->addrHoldCycles);
AnnaBridge 179:b0033dcd6934 249 #else
<> 144:ef7eb2e8f9f7 250 EBI_BankReadTimingSet(ebiInit->banks,
<> 144:ef7eb2e8f9f7 251 ebiInit->readSetupCycles,
<> 144:ef7eb2e8f9f7 252 ebiInit->readStrobeCycles,
<> 144:ef7eb2e8f9f7 253 ebiInit->readHoldCycles);
<> 144:ef7eb2e8f9f7 254 EBI_BankReadTimingConfig(ebiInit->banks,
<> 144:ef7eb2e8f9f7 255 ebiInit->readPageMode,
<> 144:ef7eb2e8f9f7 256 ebiInit->readPrefetch,
<> 144:ef7eb2e8f9f7 257 ebiInit->readHalfRE);
<> 144:ef7eb2e8f9f7 258 EBI_BankWriteTimingSet(ebiInit->banks,
<> 144:ef7eb2e8f9f7 259 ebiInit->writeSetupCycles,
<> 144:ef7eb2e8f9f7 260 ebiInit->writeStrobeCycles,
<> 144:ef7eb2e8f9f7 261 ebiInit->writeHoldCycles);
<> 144:ef7eb2e8f9f7 262 EBI_BankWriteTimingConfig(ebiInit->banks,
<> 144:ef7eb2e8f9f7 263 ebiInit->writeBufferDisable,
<> 144:ef7eb2e8f9f7 264 ebiInit->writeHalfWE);
<> 144:ef7eb2e8f9f7 265 EBI_BankAddressTimingSet(ebiInit->banks,
<> 144:ef7eb2e8f9f7 266 ebiInit->addrSetupCycles,
<> 144:ef7eb2e8f9f7 267 ebiInit->addrHoldCycles);
<> 144:ef7eb2e8f9f7 268 EBI_BankAddressTimingConfig(ebiInit->banks,
<> 144:ef7eb2e8f9f7 269 ebiInit->addrHalfALE);
<> 144:ef7eb2e8f9f7 270 #endif
<> 144:ef7eb2e8f9f7 271
<> 144:ef7eb2e8f9f7 272 /* Activate new configuration */
<> 144:ef7eb2e8f9f7 273 EBI->CTRL = ctrl;
<> 144:ef7eb2e8f9f7 274
<> 144:ef7eb2e8f9f7 275 /* Configure Adress Latch Enable */
AnnaBridge 179:b0033dcd6934 276 switch (ebiInit->mode) {
<> 144:ef7eb2e8f9f7 277 case ebiModeD16A16ALE:
<> 144:ef7eb2e8f9f7 278 case ebiModeD8A24ALE:
<> 144:ef7eb2e8f9f7 279 /* Address Latch Enable */
AnnaBridge 179:b0033dcd6934 280 EBI_RouteBitWrite(_EBI_GENERIC_ALEPEN_SHIFT, 1);
<> 144:ef7eb2e8f9f7 281 break;
AnnaBridge 179:b0033dcd6934 282 #if defined(EBI_CTRL_MODE_D16)
<> 144:ef7eb2e8f9f7 283 case ebiModeD16:
<> 144:ef7eb2e8f9f7 284 #endif
<> 144:ef7eb2e8f9f7 285 case ebiModeD8A8:
<> 144:ef7eb2e8f9f7 286 /* Make sure Address Latch is disabled */
AnnaBridge 179:b0033dcd6934 287 EBI_RouteBitWrite(_EBI_GENERIC_ALEPEN_SHIFT, 0);
<> 144:ef7eb2e8f9f7 288 break;
<> 144:ef7eb2e8f9f7 289 }
AnnaBridge 179:b0033dcd6934 290
AnnaBridge 179:b0033dcd6934 291 #if !defined(_EFM32_GECKO_FAMILY)
<> 144:ef7eb2e8f9f7 292 /* Limit pin enable */
AnnaBridge 179:b0033dcd6934 293 EBI_GENERIC_ROUTE_REG = (EBI_GENERIC_ROUTE_REG & ~_EBI_GENERIC_ALB_MASK) | ebiInit->aLow;
AnnaBridge 179:b0033dcd6934 294 EBI_GENERIC_ROUTE_REG = (EBI_GENERIC_ROUTE_REG & ~_EBI_GENERIC_APEN_MASK) | ebiInit->aHigh;
AnnaBridge 179:b0033dcd6934 295 #if defined(_EBI_ROUTE_LOCATION_MASK)
<> 144:ef7eb2e8f9f7 296 /* Location */
<> 144:ef7eb2e8f9f7 297 EBI->ROUTE = (EBI->ROUTE & ~_EBI_ROUTE_LOCATION_MASK) | ebiInit->location;
AnnaBridge 179:b0033dcd6934 298 #endif
<> 144:ef7eb2e8f9f7 299
<> 144:ef7eb2e8f9f7 300 /* Enable EBI BL pin if necessary */
AnnaBridge 179:b0033dcd6934 301 if (ctrl & (_EBI_CTRL_BL_MASK | _EBI_CTRL_BL1_MASK | _EBI_CTRL_BL2_MASK | _EBI_CTRL_BL3_MASK)) {
AnnaBridge 179:b0033dcd6934 302 EBI_RouteBitWrite(_EBI_GENERIC_BLPEN_SHIFT, ebiInit->blEnable);
<> 144:ef7eb2e8f9f7 303 }
<> 144:ef7eb2e8f9f7 304 #endif
AnnaBridge 179:b0033dcd6934 305
<> 144:ef7eb2e8f9f7 306 /* Enable EBI pins EBI_WEn and EBI_REn */
AnnaBridge 179:b0033dcd6934 307 EBI_RouteBitWrite(_EBI_GENERIC_EBIPEN_SHIFT, 1);
<> 144:ef7eb2e8f9f7 308
<> 144:ef7eb2e8f9f7 309 /* Enable chip select lines */
<> 144:ef7eb2e8f9f7 310 EBI_ChipSelectEnable(ebiInit->csLines, true);
<> 144:ef7eb2e8f9f7 311 }
<> 144:ef7eb2e8f9f7 312
<> 144:ef7eb2e8f9f7 313 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 314 * @brief
<> 144:ef7eb2e8f9f7 315 * Disable External Bus Interface
<> 144:ef7eb2e8f9f7 316 ******************************************************************************/
<> 144:ef7eb2e8f9f7 317 void EBI_Disable(void)
<> 144:ef7eb2e8f9f7 318 {
<> 144:ef7eb2e8f9f7 319 /* Disable pins */
AnnaBridge 179:b0033dcd6934 320 EBI_GENERIC_ROUTE_REG = _EBI_GENERIC_RESETVALUE;
<> 144:ef7eb2e8f9f7 321 /* Disable banks */
<> 144:ef7eb2e8f9f7 322 EBI->CTRL = _EBI_CTRL_RESETVALUE;
<> 144:ef7eb2e8f9f7 323 }
<> 144:ef7eb2e8f9f7 324
<> 144:ef7eb2e8f9f7 325 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 326 * @brief
<> 144:ef7eb2e8f9f7 327 * Enable or disable EBI Bank
<> 144:ef7eb2e8f9f7 328 *
<> 144:ef7eb2e8f9f7 329 * @param[in] banks
<> 144:ef7eb2e8f9f7 330 * Banks to reconfigure, mask of EBI_BANK<n> flags
<> 144:ef7eb2e8f9f7 331 *
<> 144:ef7eb2e8f9f7 332 * @param[in] enable
<> 144:ef7eb2e8f9f7 333 * True to enable, false to disable
<> 144:ef7eb2e8f9f7 334 ******************************************************************************/
<> 144:ef7eb2e8f9f7 335 void EBI_BankEnable(uint32_t banks, bool enable)
<> 144:ef7eb2e8f9f7 336 {
AnnaBridge 179:b0033dcd6934 337 if (banks & EBI_BANK0) {
<> 144:ef7eb2e8f9f7 338 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BANK0EN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 339 }
AnnaBridge 179:b0033dcd6934 340 if (banks & EBI_BANK1) {
<> 144:ef7eb2e8f9f7 341 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BANK1EN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 342 }
AnnaBridge 179:b0033dcd6934 343 if (banks & EBI_BANK2) {
<> 144:ef7eb2e8f9f7 344 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BANK2EN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 345 }
AnnaBridge 179:b0033dcd6934 346 if (banks & EBI_BANK3) {
<> 144:ef7eb2e8f9f7 347 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BANK3EN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 348 }
<> 144:ef7eb2e8f9f7 349 }
<> 144:ef7eb2e8f9f7 350
<> 144:ef7eb2e8f9f7 351 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 352 * @brief
<> 144:ef7eb2e8f9f7 353 * Return base address of EBI bank
<> 144:ef7eb2e8f9f7 354 *
<> 144:ef7eb2e8f9f7 355 * @param[in] bank
<> 144:ef7eb2e8f9f7 356 * Bank to return start address for
<> 144:ef7eb2e8f9f7 357 *
<> 144:ef7eb2e8f9f7 358 * @return
<> 144:ef7eb2e8f9f7 359 * Absolute address of bank
<> 144:ef7eb2e8f9f7 360 ******************************************************************************/
<> 144:ef7eb2e8f9f7 361 uint32_t EBI_BankAddress(uint32_t bank)
<> 144:ef7eb2e8f9f7 362 {
AnnaBridge 179:b0033dcd6934 363 #if defined (EBI_CTRL_ALTMAP)
AnnaBridge 179:b0033dcd6934 364 if (EBI->CTRL & EBI_CTRL_ALTMAP) {
AnnaBridge 179:b0033dcd6934 365 switch (bank) {
<> 144:ef7eb2e8f9f7 366 case EBI_BANK0:
AnnaBridge 179:b0033dcd6934 367 return EBI_MEM_BASE;
<> 144:ef7eb2e8f9f7 368
<> 144:ef7eb2e8f9f7 369 case EBI_BANK1:
AnnaBridge 179:b0033dcd6934 370 return EBI_MEM_BASE + 0x10000000UL;
<> 144:ef7eb2e8f9f7 371
<> 144:ef7eb2e8f9f7 372 case EBI_BANK2:
AnnaBridge 179:b0033dcd6934 373 return EBI_MEM_BASE + 0x20000000UL;
<> 144:ef7eb2e8f9f7 374
<> 144:ef7eb2e8f9f7 375 case EBI_BANK3:
AnnaBridge 179:b0033dcd6934 376 return EBI_MEM_BASE + 0x30000000UL;
<> 144:ef7eb2e8f9f7 377
<> 144:ef7eb2e8f9f7 378 default:
<> 144:ef7eb2e8f9f7 379 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 380 break;
<> 144:ef7eb2e8f9f7 381 }
<> 144:ef7eb2e8f9f7 382 }
<> 144:ef7eb2e8f9f7 383 #endif
AnnaBridge 179:b0033dcd6934 384 switch (bank) {
<> 144:ef7eb2e8f9f7 385 case EBI_BANK0:
AnnaBridge 179:b0033dcd6934 386 return EBI_MEM_BASE;
<> 144:ef7eb2e8f9f7 387
<> 144:ef7eb2e8f9f7 388 case EBI_BANK1:
AnnaBridge 179:b0033dcd6934 389 return EBI_MEM_BASE + 0x04000000UL;
<> 144:ef7eb2e8f9f7 390
<> 144:ef7eb2e8f9f7 391 case EBI_BANK2:
AnnaBridge 179:b0033dcd6934 392 return EBI_MEM_BASE + 0x08000000UL;
<> 144:ef7eb2e8f9f7 393
<> 144:ef7eb2e8f9f7 394 case EBI_BANK3:
AnnaBridge 179:b0033dcd6934 395 return EBI_MEM_BASE + 0x0C000000UL;
<> 144:ef7eb2e8f9f7 396
<> 144:ef7eb2e8f9f7 397 default:
<> 144:ef7eb2e8f9f7 398 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 399 break;
<> 144:ef7eb2e8f9f7 400 }
<> 144:ef7eb2e8f9f7 401 return 0;
<> 144:ef7eb2e8f9f7 402 }
<> 144:ef7eb2e8f9f7 403
<> 144:ef7eb2e8f9f7 404 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 405 * @brief
<> 144:ef7eb2e8f9f7 406 * Enable or disable EBI Chip Select
<> 144:ef7eb2e8f9f7 407 *
<> 144:ef7eb2e8f9f7 408 * @param[in] cs
<> 144:ef7eb2e8f9f7 409 * ChipSelect lines to reconfigure, mask of EBI_CS<n> flags
<> 144:ef7eb2e8f9f7 410 *
<> 144:ef7eb2e8f9f7 411 * @param[in] enable
<> 144:ef7eb2e8f9f7 412 * True to enable, false to disable
<> 144:ef7eb2e8f9f7 413 ******************************************************************************/
<> 144:ef7eb2e8f9f7 414 void EBI_ChipSelectEnable(uint32_t cs, bool enable)
<> 144:ef7eb2e8f9f7 415 {
AnnaBridge 179:b0033dcd6934 416 if (cs & EBI_CS0) {
AnnaBridge 179:b0033dcd6934 417 EBI_RouteBitWrite(_EBI_GENERIC_CS0PEN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 418 }
AnnaBridge 179:b0033dcd6934 419 if (cs & EBI_CS1) {
AnnaBridge 179:b0033dcd6934 420 EBI_RouteBitWrite(_EBI_GENERIC_CS1PEN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 421 }
AnnaBridge 179:b0033dcd6934 422 if (cs & EBI_CS2) {
AnnaBridge 179:b0033dcd6934 423 EBI_RouteBitWrite(_EBI_GENERIC_CS2PEN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 424 }
AnnaBridge 179:b0033dcd6934 425 if (cs & EBI_CS3) {
AnnaBridge 179:b0033dcd6934 426 EBI_RouteBitWrite(_EBI_GENERIC_CS3PEN_SHIFT, enable);
<> 144:ef7eb2e8f9f7 427 }
<> 144:ef7eb2e8f9f7 428 }
<> 144:ef7eb2e8f9f7 429
<> 144:ef7eb2e8f9f7 430 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 431 * @brief
<> 144:ef7eb2e8f9f7 432 * Configure EBI pin polarity
<> 144:ef7eb2e8f9f7 433 *
<> 144:ef7eb2e8f9f7 434 * @param[in] line
<> 144:ef7eb2e8f9f7 435 * Which pin/line to configure
<> 144:ef7eb2e8f9f7 436 *
<> 144:ef7eb2e8f9f7 437 * @param[in] polarity
<> 144:ef7eb2e8f9f7 438 * Active high, or active low
<> 144:ef7eb2e8f9f7 439 ******************************************************************************/
<> 144:ef7eb2e8f9f7 440 void EBI_PolaritySet(EBI_Line_TypeDef line, EBI_Polarity_TypeDef polarity)
<> 144:ef7eb2e8f9f7 441 {
AnnaBridge 179:b0033dcd6934 442 switch (line) {
<> 144:ef7eb2e8f9f7 443 case ebiLineARDY:
AnnaBridge 179:b0033dcd6934 444 BUS_RegBitWrite(&EBI->POLARITY, _EBI_POLARITY_ARDYPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 445 break;
<> 144:ef7eb2e8f9f7 446 case ebiLineALE:
AnnaBridge 179:b0033dcd6934 447 BUS_RegBitWrite(&EBI->POLARITY, _EBI_POLARITY_ALEPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 448 break;
<> 144:ef7eb2e8f9f7 449 case ebiLineWE:
AnnaBridge 179:b0033dcd6934 450 BUS_RegBitWrite(&EBI->POLARITY, _EBI_POLARITY_WEPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 451 break;
<> 144:ef7eb2e8f9f7 452 case ebiLineRE:
AnnaBridge 179:b0033dcd6934 453 BUS_RegBitWrite(&EBI->POLARITY, _EBI_POLARITY_REPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 454 break;
<> 144:ef7eb2e8f9f7 455 case ebiLineCS:
AnnaBridge 179:b0033dcd6934 456 BUS_RegBitWrite(&EBI->POLARITY, _EBI_POLARITY_CSPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 457 break;
AnnaBridge 179:b0033dcd6934 458 #if defined(_EBI_POLARITY_BLPOL_MASK)
<> 144:ef7eb2e8f9f7 459 case ebiLineBL:
AnnaBridge 179:b0033dcd6934 460 BUS_RegBitWrite(&EBI->POLARITY, _EBI_POLARITY_BLPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 461 break;
AnnaBridge 179:b0033dcd6934 462 #endif
AnnaBridge 179:b0033dcd6934 463 #if defined (_EBI_TFTPOLARITY_MASK)
<> 144:ef7eb2e8f9f7 464 case ebiLineTFTVSync:
AnnaBridge 179:b0033dcd6934 465 BUS_RegBitWrite(&EBI->TFTPOLARITY, _EBI_TFTPOLARITY_VSYNCPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 466 break;
<> 144:ef7eb2e8f9f7 467 case ebiLineTFTHSync:
AnnaBridge 179:b0033dcd6934 468 BUS_RegBitWrite(&EBI->TFTPOLARITY, _EBI_TFTPOLARITY_HSYNCPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 469 break;
<> 144:ef7eb2e8f9f7 470 case ebiLineTFTDataEn:
AnnaBridge 179:b0033dcd6934 471 BUS_RegBitWrite(&EBI->TFTPOLARITY, _EBI_TFTPOLARITY_DATAENPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 472 break;
<> 144:ef7eb2e8f9f7 473 case ebiLineTFTDClk:
AnnaBridge 179:b0033dcd6934 474 BUS_RegBitWrite(&EBI->TFTPOLARITY, _EBI_TFTPOLARITY_DCLKPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 475 break;
<> 144:ef7eb2e8f9f7 476 case ebiLineTFTCS:
AnnaBridge 179:b0033dcd6934 477 BUS_RegBitWrite(&EBI->TFTPOLARITY, _EBI_TFTPOLARITY_CSPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 478 break;
<> 144:ef7eb2e8f9f7 479 #endif
<> 144:ef7eb2e8f9f7 480 default:
<> 144:ef7eb2e8f9f7 481 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 482 break;
<> 144:ef7eb2e8f9f7 483 }
<> 144:ef7eb2e8f9f7 484 }
<> 144:ef7eb2e8f9f7 485
<> 144:ef7eb2e8f9f7 486 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 487 * @brief
<> 144:ef7eb2e8f9f7 488 * Configure timing values of read bus accesses
<> 144:ef7eb2e8f9f7 489 *
<> 144:ef7eb2e8f9f7 490 * @param[in] setupCycles
<> 144:ef7eb2e8f9f7 491 * Number of clock cycles for address setup before REn is asserted
<> 144:ef7eb2e8f9f7 492 *
<> 144:ef7eb2e8f9f7 493 * @param[in] strobeCycles
<> 144:ef7eb2e8f9f7 494 * The number of cycles the REn is held active. After the specified number of
<> 144:ef7eb2e8f9f7 495 * cycles, data is read. If set to 0, 1 cycle is inserted by HW
<> 144:ef7eb2e8f9f7 496 *
<> 144:ef7eb2e8f9f7 497 * @param[in] holdCycles
<> 144:ef7eb2e8f9f7 498 * The number of cycles CSn is held active after the REn is dessarted
<> 144:ef7eb2e8f9f7 499 ******************************************************************************/
<> 144:ef7eb2e8f9f7 500 void EBI_ReadTimingSet(int setupCycles, int strobeCycles, int holdCycles)
<> 144:ef7eb2e8f9f7 501 {
<> 144:ef7eb2e8f9f7 502 uint32_t readTiming;
<> 144:ef7eb2e8f9f7 503
<> 144:ef7eb2e8f9f7 504 /* Check that timings are within limits */
<> 144:ef7eb2e8f9f7 505 EFM_ASSERT(setupCycles < 4);
<> 144:ef7eb2e8f9f7 506 EFM_ASSERT(strobeCycles < 16);
<> 144:ef7eb2e8f9f7 507 EFM_ASSERT(holdCycles < 4);
<> 144:ef7eb2e8f9f7 508
<> 144:ef7eb2e8f9f7 509 /* Configure timing values */
<> 144:ef7eb2e8f9f7 510 readTiming = (setupCycles << _EBI_RDTIMING_RDSETUP_SHIFT)
<> 144:ef7eb2e8f9f7 511 | (strobeCycles << _EBI_RDTIMING_RDSTRB_SHIFT)
<> 144:ef7eb2e8f9f7 512 | (holdCycles << _EBI_RDTIMING_RDHOLD_SHIFT);
<> 144:ef7eb2e8f9f7 513
<> 144:ef7eb2e8f9f7 514 EBI->RDTIMING = (EBI->RDTIMING
<> 144:ef7eb2e8f9f7 515 & ~(_EBI_RDTIMING_RDSETUP_MASK
<> 144:ef7eb2e8f9f7 516 | _EBI_RDTIMING_RDSTRB_MASK
<> 144:ef7eb2e8f9f7 517 | _EBI_RDTIMING_RDHOLD_MASK))
<> 144:ef7eb2e8f9f7 518 | readTiming;
<> 144:ef7eb2e8f9f7 519 }
<> 144:ef7eb2e8f9f7 520
<> 144:ef7eb2e8f9f7 521 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 522 * @brief
<> 144:ef7eb2e8f9f7 523 * Configure timing values of write bus accesses
<> 144:ef7eb2e8f9f7 524 *
<> 144:ef7eb2e8f9f7 525 * @param[in] setupCycles
<> 144:ef7eb2e8f9f7 526 * Number of clock cycles for address setup before WEn is asserted
<> 144:ef7eb2e8f9f7 527 *
<> 144:ef7eb2e8f9f7 528 * @param[in] strobeCycles
<> 144:ef7eb2e8f9f7 529 * Number of cycles WEn is held active. If set to 0, 1 cycle is inserted by HW
<> 144:ef7eb2e8f9f7 530 *
<> 144:ef7eb2e8f9f7 531 * @param[in] holdCycles
<> 144:ef7eb2e8f9f7 532 * Number of cycles CSn is held active after the WEn is deasserted
<> 144:ef7eb2e8f9f7 533 ******************************************************************************/
<> 144:ef7eb2e8f9f7 534 void EBI_WriteTimingSet(int setupCycles, int strobeCycles, int holdCycles)
<> 144:ef7eb2e8f9f7 535 {
<> 144:ef7eb2e8f9f7 536 uint32_t writeTiming;
<> 144:ef7eb2e8f9f7 537
<> 144:ef7eb2e8f9f7 538 /* Check that timings are within limits */
<> 144:ef7eb2e8f9f7 539 EFM_ASSERT(setupCycles < 4);
<> 144:ef7eb2e8f9f7 540 EFM_ASSERT(strobeCycles < 16);
<> 144:ef7eb2e8f9f7 541 EFM_ASSERT(holdCycles < 4);
<> 144:ef7eb2e8f9f7 542
<> 144:ef7eb2e8f9f7 543 /* Configure timing values */
<> 144:ef7eb2e8f9f7 544 writeTiming = (setupCycles << _EBI_WRTIMING_WRSETUP_SHIFT)
<> 144:ef7eb2e8f9f7 545 | (strobeCycles << _EBI_WRTIMING_WRSTRB_SHIFT)
<> 144:ef7eb2e8f9f7 546 | (holdCycles << _EBI_WRTIMING_WRHOLD_SHIFT);
<> 144:ef7eb2e8f9f7 547
<> 144:ef7eb2e8f9f7 548 EBI->WRTIMING = (EBI->WRTIMING
<> 144:ef7eb2e8f9f7 549 & ~(_EBI_WRTIMING_WRSETUP_MASK
<> 144:ef7eb2e8f9f7 550 | _EBI_WRTIMING_WRSTRB_MASK
<> 144:ef7eb2e8f9f7 551 | _EBI_WRTIMING_WRHOLD_MASK))
<> 144:ef7eb2e8f9f7 552 | writeTiming;
<> 144:ef7eb2e8f9f7 553 }
<> 144:ef7eb2e8f9f7 554
<> 144:ef7eb2e8f9f7 555 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 556 * @brief
<> 144:ef7eb2e8f9f7 557 * Configure timing values of address latch bus accesses
<> 144:ef7eb2e8f9f7 558 *
<> 144:ef7eb2e8f9f7 559 * @param[in] setupCycles
<> 144:ef7eb2e8f9f7 560 * Sets the number of cycles the address is held after ALE is asserted
<> 144:ef7eb2e8f9f7 561 *
<> 144:ef7eb2e8f9f7 562 * @param[in] holdCycles
<> 144:ef7eb2e8f9f7 563 * Sets the number of cycles the address is driven onto the ADDRDAT bus before
<> 144:ef7eb2e8f9f7 564 * ALE is asserted. If set 0, 1 cycle is inserted by HW
<> 144:ef7eb2e8f9f7 565 ******************************************************************************/
<> 144:ef7eb2e8f9f7 566 void EBI_AddressTimingSet(int setupCycles, int holdCycles)
<> 144:ef7eb2e8f9f7 567 {
<> 144:ef7eb2e8f9f7 568 uint32_t addressLatchTiming;
<> 144:ef7eb2e8f9f7 569
<> 144:ef7eb2e8f9f7 570 /* Check that timing values are within limits */
<> 144:ef7eb2e8f9f7 571 EFM_ASSERT(setupCycles < 4);
<> 144:ef7eb2e8f9f7 572 EFM_ASSERT(holdCycles < 4);
<> 144:ef7eb2e8f9f7 573
<> 144:ef7eb2e8f9f7 574 /* Configure address latch timing values */
<> 144:ef7eb2e8f9f7 575 addressLatchTiming = (setupCycles << _EBI_ADDRTIMING_ADDRSETUP_SHIFT)
<> 144:ef7eb2e8f9f7 576 | (holdCycles << _EBI_ADDRTIMING_ADDRHOLD_SHIFT);
<> 144:ef7eb2e8f9f7 577
<> 144:ef7eb2e8f9f7 578 EBI->ADDRTIMING = (EBI->ADDRTIMING
<> 144:ef7eb2e8f9f7 579 & ~(_EBI_ADDRTIMING_ADDRSETUP_MASK
<> 144:ef7eb2e8f9f7 580 | _EBI_ADDRTIMING_ADDRHOLD_MASK))
<> 144:ef7eb2e8f9f7 581 | addressLatchTiming;
<> 144:ef7eb2e8f9f7 582 }
<> 144:ef7eb2e8f9f7 583
AnnaBridge 179:b0033dcd6934 584 #if defined(_EBI_TFTCTRL_MASK)
<> 144:ef7eb2e8f9f7 585 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 586 * @brief
<> 144:ef7eb2e8f9f7 587 * Configure and initialize TFT Direct Drive
<> 144:ef7eb2e8f9f7 588 *
<> 144:ef7eb2e8f9f7 589 * @param[in] ebiTFTInit
<> 144:ef7eb2e8f9f7 590 * TFT Initialization structure
<> 144:ef7eb2e8f9f7 591 ******************************************************************************/
<> 144:ef7eb2e8f9f7 592 void EBI_TFTInit(const EBI_TFTInit_TypeDef *ebiTFTInit)
<> 144:ef7eb2e8f9f7 593 {
<> 144:ef7eb2e8f9f7 594 uint32_t ctrl;
<> 144:ef7eb2e8f9f7 595
<> 144:ef7eb2e8f9f7 596 /* Configure base address for frame buffer offset to EBI bank */
<> 144:ef7eb2e8f9f7 597 EBI_TFTFrameBaseSet(ebiTFTInit->addressOffset);
<> 144:ef7eb2e8f9f7 598
<> 144:ef7eb2e8f9f7 599 /* Configure display size and porch areas */
<> 144:ef7eb2e8f9f7 600 EBI_TFTSizeSet(ebiTFTInit->hsize,
<> 144:ef7eb2e8f9f7 601 ebiTFTInit->vsize);
<> 144:ef7eb2e8f9f7 602 EBI_TFTHPorchSet(ebiTFTInit->hPorchFront,
<> 144:ef7eb2e8f9f7 603 ebiTFTInit->hPorchBack,
<> 144:ef7eb2e8f9f7 604 ebiTFTInit->hPulseWidth);
<> 144:ef7eb2e8f9f7 605 EBI_TFTVPorchSet(ebiTFTInit->vPorchFront,
<> 144:ef7eb2e8f9f7 606 ebiTFTInit->vPorchBack,
<> 144:ef7eb2e8f9f7 607 ebiTFTInit->vPulseWidth);
<> 144:ef7eb2e8f9f7 608
<> 144:ef7eb2e8f9f7 609 /* Configure timing settings */
<> 144:ef7eb2e8f9f7 610 EBI_TFTTimingSet(ebiTFTInit->dclkPeriod,
<> 144:ef7eb2e8f9f7 611 ebiTFTInit->startPosition,
<> 144:ef7eb2e8f9f7 612 ebiTFTInit->setupCycles,
<> 144:ef7eb2e8f9f7 613 ebiTFTInit->holdCycles);
<> 144:ef7eb2e8f9f7 614
<> 144:ef7eb2e8f9f7 615 /* Configure line polarity settings */
<> 144:ef7eb2e8f9f7 616 EBI_PolaritySet(ebiLineTFTCS, ebiTFTInit->csPolarity);
<> 144:ef7eb2e8f9f7 617 EBI_PolaritySet(ebiLineTFTDClk, ebiTFTInit->dclkPolarity);
<> 144:ef7eb2e8f9f7 618 EBI_PolaritySet(ebiLineTFTDataEn, ebiTFTInit->dataenPolarity);
<> 144:ef7eb2e8f9f7 619 EBI_PolaritySet(ebiLineTFTVSync, ebiTFTInit->vsyncPolarity);
<> 144:ef7eb2e8f9f7 620 EBI_PolaritySet(ebiLineTFTHSync, ebiTFTInit->hsyncPolarity);
<> 144:ef7eb2e8f9f7 621
<> 144:ef7eb2e8f9f7 622 /* Main control, EBI bank select, mask and blending configuration */
<> 144:ef7eb2e8f9f7 623 ctrl = (uint32_t)ebiTFTInit->bank
<> 144:ef7eb2e8f9f7 624 | (uint32_t)ebiTFTInit->width
<> 144:ef7eb2e8f9f7 625 | (uint32_t)ebiTFTInit->colSrc
<> 144:ef7eb2e8f9f7 626 | (uint32_t)ebiTFTInit->interleave
<> 144:ef7eb2e8f9f7 627 | (uint32_t)ebiTFTInit->fbTrigger
<> 144:ef7eb2e8f9f7 628 | (uint32_t)(ebiTFTInit->shiftDClk == true
<> 144:ef7eb2e8f9f7 629 ? (1 << _EBI_TFTCTRL_SHIFTDCLKEN_SHIFT) : 0)
<> 144:ef7eb2e8f9f7 630 | (uint32_t)ebiTFTInit->maskBlend
<> 144:ef7eb2e8f9f7 631 | (uint32_t)ebiTFTInit->driveMode;
<> 144:ef7eb2e8f9f7 632
<> 144:ef7eb2e8f9f7 633 EBI->TFTCTRL = ctrl;
<> 144:ef7eb2e8f9f7 634
<> 144:ef7eb2e8f9f7 635 /* Enable TFT pins */
AnnaBridge 179:b0033dcd6934 636 if (ebiTFTInit->driveMode != ebiTFTDDModeDisabled) {
AnnaBridge 179:b0033dcd6934 637 EBI_GENERIC_ROUTE_REG |= EBI_GENERIC_TFTPEN;
<> 144:ef7eb2e8f9f7 638 }
<> 144:ef7eb2e8f9f7 639 }
<> 144:ef7eb2e8f9f7 640
<> 144:ef7eb2e8f9f7 641 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 642 * @brief
<> 144:ef7eb2e8f9f7 643 * Configure and initialize TFT size settings
<> 144:ef7eb2e8f9f7 644 *
<> 144:ef7eb2e8f9f7 645 * @param[in] horizontal
<> 144:ef7eb2e8f9f7 646 * TFT display horizontal size in pixels
<> 144:ef7eb2e8f9f7 647 * @param[in] vertical
<> 144:ef7eb2e8f9f7 648 * TFT display vertical size in pixels
<> 144:ef7eb2e8f9f7 649 ******************************************************************************/
<> 144:ef7eb2e8f9f7 650 void EBI_TFTSizeSet(uint32_t horizontal, uint32_t vertical)
<> 144:ef7eb2e8f9f7 651 {
AnnaBridge 179:b0033dcd6934 652 EFM_ASSERT((horizontal - 1) < 1024);
AnnaBridge 179:b0033dcd6934 653 EFM_ASSERT((vertical - 1) < 1024);
<> 144:ef7eb2e8f9f7 654
AnnaBridge 179:b0033dcd6934 655 EBI->TFTSIZE = ((horizontal - 1) << _EBI_TFTSIZE_HSZ_SHIFT)
AnnaBridge 179:b0033dcd6934 656 | ((vertical - 1) << _EBI_TFTSIZE_VSZ_SHIFT);
<> 144:ef7eb2e8f9f7 657 }
<> 144:ef7eb2e8f9f7 658
<> 144:ef7eb2e8f9f7 659 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 660 * @brief
<> 144:ef7eb2e8f9f7 661 * Configure and initialize Horizontal Porch Settings
<> 144:ef7eb2e8f9f7 662 *
<> 144:ef7eb2e8f9f7 663 * @param[in] front
<> 144:ef7eb2e8f9f7 664 * Horizontal front porch size in pixels
<> 144:ef7eb2e8f9f7 665 * @param[in] back
<> 144:ef7eb2e8f9f7 666 * Horizontal back porch size in pixels
<> 144:ef7eb2e8f9f7 667 * @param[in] pulseWidth
<> 144:ef7eb2e8f9f7 668 * Horizontal synchronization pulse width. Set to required -1.
<> 144:ef7eb2e8f9f7 669 ******************************************************************************/
<> 144:ef7eb2e8f9f7 670 void EBI_TFTHPorchSet(int front, int back, int pulseWidth)
<> 144:ef7eb2e8f9f7 671 {
<> 144:ef7eb2e8f9f7 672 EFM_ASSERT(front < 256);
<> 144:ef7eb2e8f9f7 673 EFM_ASSERT(back < 256);
AnnaBridge 179:b0033dcd6934 674 EFM_ASSERT((pulseWidth - 1) < 128);
<> 144:ef7eb2e8f9f7 675
<> 144:ef7eb2e8f9f7 676 EBI->TFTHPORCH = (front << _EBI_TFTHPORCH_HFPORCH_SHIFT)
<> 144:ef7eb2e8f9f7 677 | (back << _EBI_TFTHPORCH_HBPORCH_SHIFT)
AnnaBridge 179:b0033dcd6934 678 | ((pulseWidth - 1) << _EBI_TFTHPORCH_HSYNC_SHIFT);
<> 144:ef7eb2e8f9f7 679 }
<> 144:ef7eb2e8f9f7 680
<> 144:ef7eb2e8f9f7 681 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 682 * @brief
<> 144:ef7eb2e8f9f7 683 * Configure Vertical Porch Settings
<> 144:ef7eb2e8f9f7 684 *
<> 144:ef7eb2e8f9f7 685 * @param[in] front
<> 144:ef7eb2e8f9f7 686 * Vertical front porch size in pixels
<> 144:ef7eb2e8f9f7 687 * @param[in] back
<> 144:ef7eb2e8f9f7 688 * Vertical back porch size in pixels
<> 144:ef7eb2e8f9f7 689 * @param[in] pulseWidth
<> 144:ef7eb2e8f9f7 690 * Vertical synchronization pulse width. Set to required -1.
<> 144:ef7eb2e8f9f7 691 ******************************************************************************/
<> 144:ef7eb2e8f9f7 692 void EBI_TFTVPorchSet(int front, int back, int pulseWidth)
<> 144:ef7eb2e8f9f7 693 {
<> 144:ef7eb2e8f9f7 694 EFM_ASSERT(front < 256);
<> 144:ef7eb2e8f9f7 695 EFM_ASSERT(back < 256);
AnnaBridge 179:b0033dcd6934 696 EFM_ASSERT((pulseWidth - 1) < 128);
<> 144:ef7eb2e8f9f7 697
<> 144:ef7eb2e8f9f7 698 EBI->TFTVPORCH = (front << _EBI_TFTVPORCH_VFPORCH_SHIFT)
<> 144:ef7eb2e8f9f7 699 | (back << _EBI_TFTVPORCH_VBPORCH_SHIFT)
AnnaBridge 179:b0033dcd6934 700 | ((pulseWidth - 1) << _EBI_TFTVPORCH_VSYNC_SHIFT);
<> 144:ef7eb2e8f9f7 701 }
<> 144:ef7eb2e8f9f7 702
<> 144:ef7eb2e8f9f7 703 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 704 * @brief
<> 144:ef7eb2e8f9f7 705 * Configure TFT Direct Drive Timing Settings
<> 144:ef7eb2e8f9f7 706 *
<> 144:ef7eb2e8f9f7 707 * @param[in] dclkPeriod
<> 144:ef7eb2e8f9f7 708 * DCLK period in internal cycles
<> 144:ef7eb2e8f9f7 709 *
<> 144:ef7eb2e8f9f7 710 * @param[in] start
<> 144:ef7eb2e8f9f7 711 * Starting position of external direct drive, relative to DCLK inactive edge
<> 144:ef7eb2e8f9f7 712 *
<> 144:ef7eb2e8f9f7 713 * @param[in] setup
<> 144:ef7eb2e8f9f7 714 * Number of cycles RGB data is driven before active edge of DCLK
<> 144:ef7eb2e8f9f7 715 *
<> 144:ef7eb2e8f9f7 716 * @param[in] hold
<> 144:ef7eb2e8f9f7 717 * Number of cycles RGB data is held after active edge of DCLK
<> 144:ef7eb2e8f9f7 718 ******************************************************************************/
<> 144:ef7eb2e8f9f7 719 void EBI_TFTTimingSet(int dclkPeriod, int start, int setup, int hold)
<> 144:ef7eb2e8f9f7 720 {
<> 144:ef7eb2e8f9f7 721 EFM_ASSERT(dclkPeriod < 2048);
<> 144:ef7eb2e8f9f7 722 EFM_ASSERT(start < 2048);
<> 144:ef7eb2e8f9f7 723 EFM_ASSERT(setup < 4);
<> 144:ef7eb2e8f9f7 724 EFM_ASSERT(hold < 4);
<> 144:ef7eb2e8f9f7 725
<> 144:ef7eb2e8f9f7 726 EBI->TFTTIMING = (dclkPeriod << _EBI_TFTTIMING_DCLKPERIOD_SHIFT)
<> 144:ef7eb2e8f9f7 727 | (start << _EBI_TFTTIMING_TFTSTART_SHIFT)
<> 144:ef7eb2e8f9f7 728 | (setup << _EBI_TFTTIMING_TFTSETUP_SHIFT)
<> 144:ef7eb2e8f9f7 729 | (hold << _EBI_TFTTIMING_TFTHOLD_SHIFT);
<> 144:ef7eb2e8f9f7 730 }
<> 144:ef7eb2e8f9f7 731 #endif
<> 144:ef7eb2e8f9f7 732
AnnaBridge 179:b0033dcd6934 733 #if !defined(_EFM32_GECKO_FAMILY)
<> 144:ef7eb2e8f9f7 734 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 735 * @brief
<> 144:ef7eb2e8f9f7 736 * Configure read operation parameters for selected bank
<> 144:ef7eb2e8f9f7 737 *
<> 144:ef7eb2e8f9f7 738 * @param[in] banks
<> 144:ef7eb2e8f9f7 739 * Mask of memory bank(s) to configure write timing for
<> 144:ef7eb2e8f9f7 740 *
<> 144:ef7eb2e8f9f7 741 * @param[in] pageMode
<> 144:ef7eb2e8f9f7 742 * Enables or disables half cycle WE strobe in last strobe cycle
<> 144:ef7eb2e8f9f7 743 *
<> 144:ef7eb2e8f9f7 744 * @param[in] prefetch
<> 144:ef7eb2e8f9f7 745 * Enables or disables half cycle WE strobe in last strobe cycle
<> 144:ef7eb2e8f9f7 746 *
<> 144:ef7eb2e8f9f7 747 * @param[in] halfRE
<> 144:ef7eb2e8f9f7 748 * Enables or disables half cycle WE strobe in last strobe cycle
<> 144:ef7eb2e8f9f7 749 ******************************************************************************/
<> 144:ef7eb2e8f9f7 750 void EBI_BankReadTimingConfig(uint32_t banks, bool pageMode, bool prefetch, bool halfRE)
<> 144:ef7eb2e8f9f7 751 {
AnnaBridge 179:b0033dcd6934 752 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 753 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 754
<> 144:ef7eb2e8f9f7 755 /* Configure read operation parameters */
AnnaBridge 179:b0033dcd6934 756 if ( banks & EBI_BANK0 ) {
<> 144:ef7eb2e8f9f7 757 BUS_RegBitWrite(&EBI->RDTIMING, _EBI_RDTIMING_PAGEMODE_SHIFT, pageMode);
<> 144:ef7eb2e8f9f7 758 BUS_RegBitWrite(&EBI->RDTIMING, _EBI_RDTIMING_PREFETCH_SHIFT, prefetch);
<> 144:ef7eb2e8f9f7 759 BUS_RegBitWrite(&EBI->RDTIMING, _EBI_RDTIMING_HALFRE_SHIFT, halfRE);
<> 144:ef7eb2e8f9f7 760 }
AnnaBridge 179:b0033dcd6934 761 if ( banks & EBI_BANK1 ) {
<> 144:ef7eb2e8f9f7 762 BUS_RegBitWrite(&EBI->RDTIMING1, _EBI_RDTIMING_PAGEMODE_SHIFT, pageMode);
<> 144:ef7eb2e8f9f7 763 BUS_RegBitWrite(&EBI->RDTIMING1, _EBI_RDTIMING_PREFETCH_SHIFT, prefetch);
<> 144:ef7eb2e8f9f7 764 BUS_RegBitWrite(&EBI->RDTIMING1, _EBI_RDTIMING_HALFRE_SHIFT, halfRE);
<> 144:ef7eb2e8f9f7 765 }
AnnaBridge 179:b0033dcd6934 766 if ( banks & EBI_BANK2 ) {
<> 144:ef7eb2e8f9f7 767 BUS_RegBitWrite(&EBI->RDTIMING2, _EBI_RDTIMING_PAGEMODE_SHIFT, pageMode);
<> 144:ef7eb2e8f9f7 768 BUS_RegBitWrite(&EBI->RDTIMING2, _EBI_RDTIMING_PREFETCH_SHIFT, prefetch);
<> 144:ef7eb2e8f9f7 769 BUS_RegBitWrite(&EBI->RDTIMING2, _EBI_RDTIMING_HALFRE_SHIFT, halfRE);
<> 144:ef7eb2e8f9f7 770 }
AnnaBridge 179:b0033dcd6934 771 if ( banks & EBI_BANK3 ) {
<> 144:ef7eb2e8f9f7 772 BUS_RegBitWrite(&EBI->RDTIMING3, _EBI_RDTIMING_PAGEMODE_SHIFT, pageMode);
<> 144:ef7eb2e8f9f7 773 BUS_RegBitWrite(&EBI->RDTIMING3, _EBI_RDTIMING_PREFETCH_SHIFT, prefetch);
<> 144:ef7eb2e8f9f7 774 BUS_RegBitWrite(&EBI->RDTIMING3, _EBI_RDTIMING_HALFRE_SHIFT, halfRE);
<> 144:ef7eb2e8f9f7 775 }
<> 144:ef7eb2e8f9f7 776 }
<> 144:ef7eb2e8f9f7 777
<> 144:ef7eb2e8f9f7 778 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 779 * @brief
<> 144:ef7eb2e8f9f7 780 * Configure timing values of read bus accesses
<> 144:ef7eb2e8f9f7 781 *
<> 144:ef7eb2e8f9f7 782 * @param[in] banks
<> 144:ef7eb2e8f9f7 783 * Mask of memory bank(s) to configure timing for
<> 144:ef7eb2e8f9f7 784 *
<> 144:ef7eb2e8f9f7 785 * @param[in] setupCycles
<> 144:ef7eb2e8f9f7 786 * Number of clock cycles for address setup before REn is asserted
<> 144:ef7eb2e8f9f7 787 *
<> 144:ef7eb2e8f9f7 788 * @param[in] strobeCycles
<> 144:ef7eb2e8f9f7 789 * The number of cycles the REn is held active. After the specified number of
<> 144:ef7eb2e8f9f7 790 * cycles, data is read. If set to 0, 1 cycle is inserted by HW
<> 144:ef7eb2e8f9f7 791 *
<> 144:ef7eb2e8f9f7 792 * @param[in] holdCycles
<> 144:ef7eb2e8f9f7 793 * The number of cycles CSn is held active after the REn is dessarted
<> 144:ef7eb2e8f9f7 794 ******************************************************************************/
<> 144:ef7eb2e8f9f7 795 void EBI_BankReadTimingSet(uint32_t banks, int setupCycles, int strobeCycles, int holdCycles)
<> 144:ef7eb2e8f9f7 796 {
<> 144:ef7eb2e8f9f7 797 uint32_t readTiming;
<> 144:ef7eb2e8f9f7 798
<> 144:ef7eb2e8f9f7 799 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 800 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 801
<> 144:ef7eb2e8f9f7 802 /* Check that timings are within limits */
<> 144:ef7eb2e8f9f7 803 EFM_ASSERT(setupCycles < 4);
<> 144:ef7eb2e8f9f7 804 EFM_ASSERT(strobeCycles < 64);
<> 144:ef7eb2e8f9f7 805 EFM_ASSERT(holdCycles < 4);
<> 144:ef7eb2e8f9f7 806
<> 144:ef7eb2e8f9f7 807 /* Configure timing values */
<> 144:ef7eb2e8f9f7 808 readTiming = (setupCycles << _EBI_RDTIMING_RDSETUP_SHIFT)
<> 144:ef7eb2e8f9f7 809 | (strobeCycles << _EBI_RDTIMING_RDSTRB_SHIFT)
<> 144:ef7eb2e8f9f7 810 | (holdCycles << _EBI_RDTIMING_RDHOLD_SHIFT);
<> 144:ef7eb2e8f9f7 811
AnnaBridge 179:b0033dcd6934 812 if (banks & EBI_BANK0) {
<> 144:ef7eb2e8f9f7 813 EBI->RDTIMING = (EBI->RDTIMING
<> 144:ef7eb2e8f9f7 814 & ~(_EBI_RDTIMING_RDSETUP_MASK
<> 144:ef7eb2e8f9f7 815 | _EBI_RDTIMING_RDSTRB_MASK
<> 144:ef7eb2e8f9f7 816 | _EBI_RDTIMING_RDHOLD_MASK))
<> 144:ef7eb2e8f9f7 817 | readTiming;
<> 144:ef7eb2e8f9f7 818 }
AnnaBridge 179:b0033dcd6934 819 if (banks & EBI_BANK1) {
<> 144:ef7eb2e8f9f7 820 EBI->RDTIMING1 = (EBI->RDTIMING1
<> 144:ef7eb2e8f9f7 821 & ~(_EBI_RDTIMING1_RDSETUP_MASK
AnnaBridge 179:b0033dcd6934 822 | _EBI_RDTIMING1_RDSTRB_MASK
AnnaBridge 179:b0033dcd6934 823 | _EBI_RDTIMING1_RDHOLD_MASK))
<> 144:ef7eb2e8f9f7 824 | readTiming;
<> 144:ef7eb2e8f9f7 825 }
AnnaBridge 179:b0033dcd6934 826 if (banks & EBI_BANK2) {
<> 144:ef7eb2e8f9f7 827 EBI->RDTIMING2 = (EBI->RDTIMING2
<> 144:ef7eb2e8f9f7 828 & ~(_EBI_RDTIMING2_RDSETUP_MASK
<> 144:ef7eb2e8f9f7 829 | _EBI_RDTIMING2_RDSTRB_MASK
<> 144:ef7eb2e8f9f7 830 | _EBI_RDTIMING2_RDHOLD_MASK))
<> 144:ef7eb2e8f9f7 831 | readTiming;
<> 144:ef7eb2e8f9f7 832 }
AnnaBridge 179:b0033dcd6934 833 if (banks & EBI_BANK3) {
<> 144:ef7eb2e8f9f7 834 EBI->RDTIMING3 = (EBI->RDTIMING3
<> 144:ef7eb2e8f9f7 835 & ~(_EBI_RDTIMING3_RDSETUP_MASK
<> 144:ef7eb2e8f9f7 836 | _EBI_RDTIMING3_RDSTRB_MASK
<> 144:ef7eb2e8f9f7 837 | _EBI_RDTIMING3_RDHOLD_MASK))
<> 144:ef7eb2e8f9f7 838 | readTiming;
<> 144:ef7eb2e8f9f7 839 }
<> 144:ef7eb2e8f9f7 840 }
<> 144:ef7eb2e8f9f7 841
<> 144:ef7eb2e8f9f7 842 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 843 * @brief
<> 144:ef7eb2e8f9f7 844 * Configure write operation parameters for selected bank
<> 144:ef7eb2e8f9f7 845 *
<> 144:ef7eb2e8f9f7 846 * @param[in] banks
<> 144:ef7eb2e8f9f7 847 * Mask of memory bank(s) to configure write timing for
<> 144:ef7eb2e8f9f7 848 *
<> 144:ef7eb2e8f9f7 849 * @param[in] writeBufDisable
<> 144:ef7eb2e8f9f7 850 * If true, disable the write buffer
<> 144:ef7eb2e8f9f7 851 *
<> 144:ef7eb2e8f9f7 852 * @param[in] halfWE
<> 144:ef7eb2e8f9f7 853 * Enables or disables half cycle WE strobe in last strobe cycle
<> 144:ef7eb2e8f9f7 854 ******************************************************************************/
<> 144:ef7eb2e8f9f7 855 void EBI_BankWriteTimingConfig(uint32_t banks, bool writeBufDisable, bool halfWE)
<> 144:ef7eb2e8f9f7 856 {
<> 144:ef7eb2e8f9f7 857 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 858 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 859
<> 144:ef7eb2e8f9f7 860 /* Configure write operation parameters */
AnnaBridge 179:b0033dcd6934 861 if ( banks & EBI_BANK0 ) {
<> 144:ef7eb2e8f9f7 862 BUS_RegBitWrite(&EBI->WRTIMING, _EBI_WRTIMING_WBUFDIS_SHIFT, writeBufDisable);
<> 144:ef7eb2e8f9f7 863 BUS_RegBitWrite(&EBI->WRTIMING, _EBI_WRTIMING_HALFWE_SHIFT, halfWE);
<> 144:ef7eb2e8f9f7 864 }
AnnaBridge 179:b0033dcd6934 865 if ( banks & EBI_BANK1 ) {
<> 144:ef7eb2e8f9f7 866 BUS_RegBitWrite(&EBI->WRTIMING1, _EBI_WRTIMING_WBUFDIS_SHIFT, writeBufDisable);
<> 144:ef7eb2e8f9f7 867 BUS_RegBitWrite(&EBI->WRTIMING1, _EBI_WRTIMING_HALFWE_SHIFT, halfWE);
<> 144:ef7eb2e8f9f7 868 }
AnnaBridge 179:b0033dcd6934 869 if ( banks & EBI_BANK2 ) {
<> 144:ef7eb2e8f9f7 870 BUS_RegBitWrite(&EBI->WRTIMING2, _EBI_WRTIMING_WBUFDIS_SHIFT, writeBufDisable);
<> 144:ef7eb2e8f9f7 871 BUS_RegBitWrite(&EBI->WRTIMING2, _EBI_WRTIMING_HALFWE_SHIFT, halfWE);
<> 144:ef7eb2e8f9f7 872 }
AnnaBridge 179:b0033dcd6934 873 if ( banks & EBI_BANK3 ) {
<> 144:ef7eb2e8f9f7 874 BUS_RegBitWrite(&EBI->WRTIMING3, _EBI_WRTIMING_WBUFDIS_SHIFT, writeBufDisable);
<> 144:ef7eb2e8f9f7 875 BUS_RegBitWrite(&EBI->WRTIMING3, _EBI_WRTIMING_HALFWE_SHIFT, halfWE);
<> 144:ef7eb2e8f9f7 876 }
<> 144:ef7eb2e8f9f7 877 }
<> 144:ef7eb2e8f9f7 878
<> 144:ef7eb2e8f9f7 879 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 880 * @brief
<> 144:ef7eb2e8f9f7 881 * Configure timing values of write bus accesses
<> 144:ef7eb2e8f9f7 882 *
<> 144:ef7eb2e8f9f7 883 * @param[in] banks
<> 144:ef7eb2e8f9f7 884 * Mask of memory bank(s) to configure write timing for
<> 144:ef7eb2e8f9f7 885 *
<> 144:ef7eb2e8f9f7 886 * @param[in] setupCycles
<> 144:ef7eb2e8f9f7 887 * Number of clock cycles for address setup before WEn is asserted
<> 144:ef7eb2e8f9f7 888 *
<> 144:ef7eb2e8f9f7 889 * @param[in] strobeCycles
<> 144:ef7eb2e8f9f7 890 * Number of cycles WEn is held active. If set to 0, 1 cycle is inserted by HW
<> 144:ef7eb2e8f9f7 891 *
<> 144:ef7eb2e8f9f7 892 * @param[in] holdCycles
<> 144:ef7eb2e8f9f7 893 * Number of cycles CSn is held active after the WEn is deasserted
<> 144:ef7eb2e8f9f7 894 ******************************************************************************/
<> 144:ef7eb2e8f9f7 895 void EBI_BankWriteTimingSet(uint32_t banks, int setupCycles, int strobeCycles, int holdCycles)
<> 144:ef7eb2e8f9f7 896 {
<> 144:ef7eb2e8f9f7 897 uint32_t writeTiming;
<> 144:ef7eb2e8f9f7 898
<> 144:ef7eb2e8f9f7 899 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 900 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 901
<> 144:ef7eb2e8f9f7 902 /* Check that timings are within limits */
<> 144:ef7eb2e8f9f7 903 EFM_ASSERT(setupCycles < 4);
<> 144:ef7eb2e8f9f7 904 EFM_ASSERT(strobeCycles < 64);
<> 144:ef7eb2e8f9f7 905 EFM_ASSERT(holdCycles < 4);
<> 144:ef7eb2e8f9f7 906
<> 144:ef7eb2e8f9f7 907 /* Configure timing values */
<> 144:ef7eb2e8f9f7 908 writeTiming = (setupCycles << _EBI_WRTIMING_WRSETUP_SHIFT)
<> 144:ef7eb2e8f9f7 909 | (strobeCycles << _EBI_WRTIMING_WRSTRB_SHIFT)
<> 144:ef7eb2e8f9f7 910 | (holdCycles << _EBI_WRTIMING_WRHOLD_SHIFT);
<> 144:ef7eb2e8f9f7 911
AnnaBridge 179:b0033dcd6934 912 if (banks & EBI_BANK0) {
<> 144:ef7eb2e8f9f7 913 EBI->WRTIMING = (EBI->WRTIMING
<> 144:ef7eb2e8f9f7 914 & ~(_EBI_WRTIMING_WRSETUP_MASK
<> 144:ef7eb2e8f9f7 915 | _EBI_WRTIMING_WRSTRB_MASK
<> 144:ef7eb2e8f9f7 916 | _EBI_WRTIMING_WRHOLD_MASK))
<> 144:ef7eb2e8f9f7 917 | writeTiming;
<> 144:ef7eb2e8f9f7 918 }
AnnaBridge 179:b0033dcd6934 919 if (banks & EBI_BANK1) {
<> 144:ef7eb2e8f9f7 920 EBI->WRTIMING1 = (EBI->WRTIMING1
<> 144:ef7eb2e8f9f7 921 & ~(_EBI_WRTIMING1_WRSETUP_MASK
<> 144:ef7eb2e8f9f7 922 | _EBI_WRTIMING1_WRSTRB_MASK
<> 144:ef7eb2e8f9f7 923 | _EBI_WRTIMING1_WRHOLD_MASK))
<> 144:ef7eb2e8f9f7 924 | writeTiming;
<> 144:ef7eb2e8f9f7 925 }
AnnaBridge 179:b0033dcd6934 926 if (banks & EBI_BANK2) {
<> 144:ef7eb2e8f9f7 927 EBI->WRTIMING2 = (EBI->WRTIMING2
<> 144:ef7eb2e8f9f7 928 & ~(_EBI_WRTIMING2_WRSETUP_MASK
<> 144:ef7eb2e8f9f7 929 | _EBI_WRTIMING2_WRSTRB_MASK
<> 144:ef7eb2e8f9f7 930 | _EBI_WRTIMING2_WRHOLD_MASK))
<> 144:ef7eb2e8f9f7 931 | writeTiming;
<> 144:ef7eb2e8f9f7 932 }
AnnaBridge 179:b0033dcd6934 933 if (banks & EBI_BANK3) {
<> 144:ef7eb2e8f9f7 934 EBI->WRTIMING3 = (EBI->WRTIMING3
<> 144:ef7eb2e8f9f7 935 & ~(_EBI_WRTIMING3_WRSETUP_MASK
<> 144:ef7eb2e8f9f7 936 | _EBI_WRTIMING3_WRSTRB_MASK
<> 144:ef7eb2e8f9f7 937 | _EBI_WRTIMING3_WRHOLD_MASK))
<> 144:ef7eb2e8f9f7 938 | writeTiming;
<> 144:ef7eb2e8f9f7 939 }
<> 144:ef7eb2e8f9f7 940 }
<> 144:ef7eb2e8f9f7 941
<> 144:ef7eb2e8f9f7 942 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 943 * @brief
<> 144:ef7eb2e8f9f7 944 * Configure address operation parameters for selected bank
<> 144:ef7eb2e8f9f7 945 *
<> 144:ef7eb2e8f9f7 946 * @param[in] banks
<> 144:ef7eb2e8f9f7 947 * Mask of memory bank(s) to configure write timing for
<> 144:ef7eb2e8f9f7 948 *
<> 144:ef7eb2e8f9f7 949 * @param[in] halfALE
<> 144:ef7eb2e8f9f7 950 * Enables or disables half cycle ALE strobe in last strobe cycle
<> 144:ef7eb2e8f9f7 951 ******************************************************************************/
<> 144:ef7eb2e8f9f7 952 void EBI_BankAddressTimingConfig(uint32_t banks, bool halfALE)
<> 144:ef7eb2e8f9f7 953 {
<> 144:ef7eb2e8f9f7 954 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 955 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 956
AnnaBridge 179:b0033dcd6934 957 if ( banks & EBI_BANK0 ) {
<> 144:ef7eb2e8f9f7 958 BUS_RegBitWrite(&EBI->ADDRTIMING, _EBI_ADDRTIMING_HALFALE_SHIFT, halfALE);
<> 144:ef7eb2e8f9f7 959 }
AnnaBridge 179:b0033dcd6934 960 if ( banks & EBI_BANK1 ) {
<> 144:ef7eb2e8f9f7 961 BUS_RegBitWrite(&EBI->ADDRTIMING1, _EBI_ADDRTIMING_HALFALE_SHIFT, halfALE);
<> 144:ef7eb2e8f9f7 962 }
AnnaBridge 179:b0033dcd6934 963 if ( banks & EBI_BANK2 ) {
<> 144:ef7eb2e8f9f7 964 BUS_RegBitWrite(&EBI->ADDRTIMING2, _EBI_ADDRTIMING_HALFALE_SHIFT, halfALE);
<> 144:ef7eb2e8f9f7 965 }
AnnaBridge 179:b0033dcd6934 966 if ( banks & EBI_BANK3 ) {
<> 144:ef7eb2e8f9f7 967 BUS_RegBitWrite(&EBI->ADDRTIMING3, _EBI_ADDRTIMING_HALFALE_SHIFT, halfALE);
<> 144:ef7eb2e8f9f7 968 }
<> 144:ef7eb2e8f9f7 969 }
<> 144:ef7eb2e8f9f7 970
<> 144:ef7eb2e8f9f7 971 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 972 * @brief
<> 144:ef7eb2e8f9f7 973 * Configure timing values of address latch bus accesses
<> 144:ef7eb2e8f9f7 974 *
<> 144:ef7eb2e8f9f7 975 * @param[in] banks
<> 144:ef7eb2e8f9f7 976 * Mask of memory bank(s) to configure address timing for
<> 144:ef7eb2e8f9f7 977 *
<> 144:ef7eb2e8f9f7 978 * @param[in] setupCycles
<> 144:ef7eb2e8f9f7 979 * Sets the number of cycles the address is held after ALE is asserted
<> 144:ef7eb2e8f9f7 980 *
<> 144:ef7eb2e8f9f7 981 * @param[in] holdCycles
<> 144:ef7eb2e8f9f7 982 * Sets the number of cycles the address is driven onto the ADDRDAT bus before
<> 144:ef7eb2e8f9f7 983 * ALE is asserted. If set 0, 1 cycle is inserted by HW
<> 144:ef7eb2e8f9f7 984 ******************************************************************************/
<> 144:ef7eb2e8f9f7 985 void EBI_BankAddressTimingSet(uint32_t banks, int setupCycles, int holdCycles)
<> 144:ef7eb2e8f9f7 986 {
<> 144:ef7eb2e8f9f7 987 uint32_t addressLatchTiming;
<> 144:ef7eb2e8f9f7 988
<> 144:ef7eb2e8f9f7 989 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 990 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 991
<> 144:ef7eb2e8f9f7 992 /* Check that timing values are within limits */
<> 144:ef7eb2e8f9f7 993 EFM_ASSERT(setupCycles < 4);
<> 144:ef7eb2e8f9f7 994 EFM_ASSERT(holdCycles < 4);
<> 144:ef7eb2e8f9f7 995
<> 144:ef7eb2e8f9f7 996 /* Configure address latch timing values */
<> 144:ef7eb2e8f9f7 997 addressLatchTiming = (setupCycles << _EBI_ADDRTIMING_ADDRSETUP_SHIFT)
<> 144:ef7eb2e8f9f7 998 | (holdCycles << _EBI_ADDRTIMING_ADDRHOLD_SHIFT);
<> 144:ef7eb2e8f9f7 999
AnnaBridge 179:b0033dcd6934 1000 if (banks & EBI_BANK0) {
<> 144:ef7eb2e8f9f7 1001 EBI->ADDRTIMING = (EBI->ADDRTIMING
<> 144:ef7eb2e8f9f7 1002 & ~(_EBI_ADDRTIMING_ADDRSETUP_MASK
<> 144:ef7eb2e8f9f7 1003 | _EBI_ADDRTIMING_ADDRHOLD_MASK))
<> 144:ef7eb2e8f9f7 1004 | addressLatchTiming;
<> 144:ef7eb2e8f9f7 1005 }
AnnaBridge 179:b0033dcd6934 1006 if (banks & EBI_BANK1) {
<> 144:ef7eb2e8f9f7 1007 EBI->ADDRTIMING1 = (EBI->ADDRTIMING1
<> 144:ef7eb2e8f9f7 1008 & ~(_EBI_ADDRTIMING1_ADDRSETUP_MASK
<> 144:ef7eb2e8f9f7 1009 | _EBI_ADDRTIMING1_ADDRHOLD_MASK))
<> 144:ef7eb2e8f9f7 1010 | addressLatchTiming;
<> 144:ef7eb2e8f9f7 1011 }
AnnaBridge 179:b0033dcd6934 1012 if (banks & EBI_BANK2) {
<> 144:ef7eb2e8f9f7 1013 EBI->ADDRTIMING2 = (EBI->ADDRTIMING2
<> 144:ef7eb2e8f9f7 1014 & ~(_EBI_ADDRTIMING2_ADDRSETUP_MASK
<> 144:ef7eb2e8f9f7 1015 | _EBI_ADDRTIMING2_ADDRHOLD_MASK))
<> 144:ef7eb2e8f9f7 1016 | addressLatchTiming;
<> 144:ef7eb2e8f9f7 1017 }
AnnaBridge 179:b0033dcd6934 1018 if (banks & EBI_BANK3) {
<> 144:ef7eb2e8f9f7 1019 EBI->ADDRTIMING3 = (EBI->ADDRTIMING3
<> 144:ef7eb2e8f9f7 1020 & ~(_EBI_ADDRTIMING3_ADDRSETUP_MASK
<> 144:ef7eb2e8f9f7 1021 | _EBI_ADDRTIMING3_ADDRHOLD_MASK))
<> 144:ef7eb2e8f9f7 1022 | addressLatchTiming;
<> 144:ef7eb2e8f9f7 1023 }
<> 144:ef7eb2e8f9f7 1024 }
<> 144:ef7eb2e8f9f7 1025
<> 144:ef7eb2e8f9f7 1026 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 1027 * @brief
<> 144:ef7eb2e8f9f7 1028 * Configure EBI pin polarity for selected bank(s) for devices with individual
<> 144:ef7eb2e8f9f7 1029 * timing support
<> 144:ef7eb2e8f9f7 1030 *
<> 144:ef7eb2e8f9f7 1031 * @param[in] banks
<> 144:ef7eb2e8f9f7 1032 * Mask of memory bank(s) to configure polarity for
<> 144:ef7eb2e8f9f7 1033 *
<> 144:ef7eb2e8f9f7 1034 * @param[in] line
<> 144:ef7eb2e8f9f7 1035 * Which pin/line to configure
<> 144:ef7eb2e8f9f7 1036 *
<> 144:ef7eb2e8f9f7 1037 * @param[in] polarity
<> 144:ef7eb2e8f9f7 1038 * Active high, or active low
<> 144:ef7eb2e8f9f7 1039 ******************************************************************************/
<> 144:ef7eb2e8f9f7 1040 void EBI_BankPolaritySet(uint32_t banks, EBI_Line_TypeDef line, EBI_Polarity_TypeDef polarity)
<> 144:ef7eb2e8f9f7 1041 {
<> 144:ef7eb2e8f9f7 1042 uint32_t bankSet = 0;
<> 144:ef7eb2e8f9f7 1043 volatile uint32_t *polRegister = 0;
<> 144:ef7eb2e8f9f7 1044
<> 144:ef7eb2e8f9f7 1045 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 1046 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 1047
AnnaBridge 179:b0033dcd6934 1048 while (banks) {
AnnaBridge 179:b0033dcd6934 1049 if (banks & EBI_BANK0) {
<> 144:ef7eb2e8f9f7 1050 polRegister = &EBI->POLARITY;
<> 144:ef7eb2e8f9f7 1051 bankSet = EBI_BANK0;
<> 144:ef7eb2e8f9f7 1052 }
AnnaBridge 179:b0033dcd6934 1053 if (banks & EBI_BANK1) {
<> 144:ef7eb2e8f9f7 1054 polRegister = &EBI->POLARITY1;
<> 144:ef7eb2e8f9f7 1055 bankSet = EBI_BANK1;
<> 144:ef7eb2e8f9f7 1056 }
AnnaBridge 179:b0033dcd6934 1057 if (banks & EBI_BANK2) {
<> 144:ef7eb2e8f9f7 1058 polRegister = &EBI->POLARITY2;
<> 144:ef7eb2e8f9f7 1059 bankSet = EBI_BANK2;
<> 144:ef7eb2e8f9f7 1060 }
AnnaBridge 179:b0033dcd6934 1061 if (banks & EBI_BANK3) {
<> 144:ef7eb2e8f9f7 1062 polRegister = &EBI->POLARITY3;
<> 144:ef7eb2e8f9f7 1063 bankSet = EBI_BANK3;
<> 144:ef7eb2e8f9f7 1064 }
<> 144:ef7eb2e8f9f7 1065
<> 144:ef7eb2e8f9f7 1066 /* What line to configure */
AnnaBridge 179:b0033dcd6934 1067 switch (line) {
<> 144:ef7eb2e8f9f7 1068 case ebiLineARDY:
<> 144:ef7eb2e8f9f7 1069 BUS_RegBitWrite(polRegister, _EBI_POLARITY_ARDYPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1070 break;
<> 144:ef7eb2e8f9f7 1071 case ebiLineALE:
<> 144:ef7eb2e8f9f7 1072 BUS_RegBitWrite(polRegister, _EBI_POLARITY_ALEPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1073 break;
<> 144:ef7eb2e8f9f7 1074 case ebiLineWE:
<> 144:ef7eb2e8f9f7 1075 BUS_RegBitWrite(polRegister, _EBI_POLARITY_WEPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1076 break;
<> 144:ef7eb2e8f9f7 1077 case ebiLineRE:
<> 144:ef7eb2e8f9f7 1078 BUS_RegBitWrite(polRegister, _EBI_POLARITY_REPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1079 break;
<> 144:ef7eb2e8f9f7 1080 case ebiLineCS:
<> 144:ef7eb2e8f9f7 1081 BUS_RegBitWrite(polRegister, _EBI_POLARITY_CSPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1082 break;
<> 144:ef7eb2e8f9f7 1083 case ebiLineBL:
<> 144:ef7eb2e8f9f7 1084 BUS_RegBitWrite(polRegister, _EBI_POLARITY_BLPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1085 break;
<> 144:ef7eb2e8f9f7 1086 case ebiLineTFTVSync:
<> 144:ef7eb2e8f9f7 1087 BUS_RegBitWrite(&(EBI->TFTPOLARITY), _EBI_TFTPOLARITY_VSYNCPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1088 break;
<> 144:ef7eb2e8f9f7 1089 case ebiLineTFTHSync:
<> 144:ef7eb2e8f9f7 1090 BUS_RegBitWrite(&(EBI->TFTPOLARITY), _EBI_TFTPOLARITY_HSYNCPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1091 break;
<> 144:ef7eb2e8f9f7 1092 case ebiLineTFTDataEn:
<> 144:ef7eb2e8f9f7 1093 BUS_RegBitWrite(&(EBI->TFTPOLARITY), _EBI_TFTPOLARITY_DATAENPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1094 break;
<> 144:ef7eb2e8f9f7 1095 case ebiLineTFTDClk:
<> 144:ef7eb2e8f9f7 1096 BUS_RegBitWrite(&(EBI->TFTPOLARITY), _EBI_TFTPOLARITY_DCLKPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1097 break;
<> 144:ef7eb2e8f9f7 1098 case ebiLineTFTCS:
<> 144:ef7eb2e8f9f7 1099 BUS_RegBitWrite(&(EBI->TFTPOLARITY), _EBI_TFTPOLARITY_CSPOL_SHIFT, polarity);
<> 144:ef7eb2e8f9f7 1100 break;
<> 144:ef7eb2e8f9f7 1101 default:
<> 144:ef7eb2e8f9f7 1102 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 1103 break;
<> 144:ef7eb2e8f9f7 1104 }
<> 144:ef7eb2e8f9f7 1105 banks = banks & ~bankSet;
<> 144:ef7eb2e8f9f7 1106 }
<> 144:ef7eb2e8f9f7 1107 }
<> 144:ef7eb2e8f9f7 1108
<> 144:ef7eb2e8f9f7 1109 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 1110 * @brief
<> 144:ef7eb2e8f9f7 1111 * Configure Byte Lane Enable for select banks
<> 144:ef7eb2e8f9f7 1112 * timing support
<> 144:ef7eb2e8f9f7 1113 *
<> 144:ef7eb2e8f9f7 1114 * @param[in] banks
<> 144:ef7eb2e8f9f7 1115 * Mask of memory bank(s) to configure polarity for
<> 144:ef7eb2e8f9f7 1116 *
<> 144:ef7eb2e8f9f7 1117 * @param[in] enable
<> 144:ef7eb2e8f9f7 1118 * Flag
<> 144:ef7eb2e8f9f7 1119 ******************************************************************************/
<> 144:ef7eb2e8f9f7 1120 void EBI_BankByteLaneEnable(uint32_t banks, bool enable)
<> 144:ef7eb2e8f9f7 1121 {
<> 144:ef7eb2e8f9f7 1122 /* Verify only valid banks are used */
<> 144:ef7eb2e8f9f7 1123 EFM_ASSERT((banks & ~(EBI_BANK0 | EBI_BANK1 | EBI_BANK2 | EBI_BANK3)) == 0);
<> 144:ef7eb2e8f9f7 1124
<> 144:ef7eb2e8f9f7 1125 /* Configure byte lane support for each selected bank */
AnnaBridge 179:b0033dcd6934 1126 if (banks & EBI_BANK0) {
<> 144:ef7eb2e8f9f7 1127 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BL_SHIFT, enable);
<> 144:ef7eb2e8f9f7 1128 }
AnnaBridge 179:b0033dcd6934 1129 if (banks & EBI_BANK1) {
<> 144:ef7eb2e8f9f7 1130 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BL1_SHIFT, enable);
<> 144:ef7eb2e8f9f7 1131 }
AnnaBridge 179:b0033dcd6934 1132 if (banks & EBI_BANK2) {
<> 144:ef7eb2e8f9f7 1133 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BL2_SHIFT, enable);
<> 144:ef7eb2e8f9f7 1134 }
AnnaBridge 179:b0033dcd6934 1135 if (banks & EBI_BANK3) {
<> 144:ef7eb2e8f9f7 1136 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_BL3_SHIFT, enable);
<> 144:ef7eb2e8f9f7 1137 }
<> 144:ef7eb2e8f9f7 1138 }
<> 144:ef7eb2e8f9f7 1139
<> 144:ef7eb2e8f9f7 1140 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 1141 * @brief
<> 144:ef7eb2e8f9f7 1142 * Configure Alternate Address Map support
<> 144:ef7eb2e8f9f7 1143 * Enables or disables 256MB address range for all banks
<> 144:ef7eb2e8f9f7 1144 *
<> 144:ef7eb2e8f9f7 1145 * @param[in] enable
<> 144:ef7eb2e8f9f7 1146 * Set or clear address map extension
<> 144:ef7eb2e8f9f7 1147 ******************************************************************************/
<> 144:ef7eb2e8f9f7 1148 void EBI_AltMapEnable(bool enable)
<> 144:ef7eb2e8f9f7 1149 {
<> 144:ef7eb2e8f9f7 1150 BUS_RegBitWrite(&(EBI->CTRL), _EBI_CTRL_ALTMAP_SHIFT, enable);
<> 144:ef7eb2e8f9f7 1151 }
<> 144:ef7eb2e8f9f7 1152
<> 144:ef7eb2e8f9f7 1153 #endif
<> 144:ef7eb2e8f9f7 1154
<> 144:ef7eb2e8f9f7 1155 /** @} (end addtogroup EBI) */
<> 150:02e0a0aed4ec 1156 /** @} (end addtogroup emlib) */
<> 144:ef7eb2e8f9f7 1157
<> 144:ef7eb2e8f9f7 1158 #endif /* defined(EBI_COUNT) && (EBI_COUNT > 0) */