1 /**************************************************************************//**
\r
4 * @brief External Bus Interface(EBI) driver source file
\r
6 * @copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
\r
7 *****************************************************************************/
\r
11 /** @addtogroup Standard_Driver Standard Driver
\r
15 /** @addtogroup EBI_Driver EBI Driver
\r
19 /** @addtogroup EBI_EXPORTED_FUNCTIONS EBI Exported Functions
\r
24 * @brief Initialize EBI for specify Bank
\r
26 * @param[in] u32Bank Bank number for EBI. Valid values are:
\r
30 * @param[in] u32DataWidth Data bus width. Valid values are:
\r
31 * - \ref EBI_BUSWIDTH_8BIT
\r
32 * - \ref EBI_BUSWIDTH_16BIT
\r
33 * @param[in] u32TimingClass Default timing configuration. Valid values are:
\r
34 * - \ref EBI_TIMING_FASTEST
\r
35 * - \ref EBI_TIMING_VERYFAST
\r
36 * - \ref EBI_TIMING_FAST
\r
37 * - \ref EBI_TIMING_NORMAL
\r
38 * - \ref EBI_TIMING_SLOW
\r
39 * - \ref EBI_TIMING_VERYSLOW
\r
40 * - \ref EBI_TIMING_SLOWEST
\r
41 * @param[in] u32BusMode Set EBI bus operate mode. Valid values are:
\r
42 * - \ref EBI_OPMODE_NORMAL
\r
43 * - \ref EBI_OPMODE_CACCESS
\r
44 * - \ref EBI_OPMODE_ADSEPARATE
\r
45 * @param[in] u32CSActiveLevel CS is active High/Low. Valid values are:
\r
46 * - \ref EBI_CS_ACTIVE_HIGH
\r
47 * - \ref EBI_CS_ACTIVE_LOW
\r
51 * @details This function is used to open specify EBI bank with different bus width, timing setting and \n
\r
52 * active level of CS pin to access EBI device.
\r
53 * @note Write Buffer Enable(WBUFEN) and Extend Time Of ALE(TALE) are only available in EBI bank0 control register.
\r
55 void EBI_Open(uint32_t u32Bank, uint32_t u32DataWidth, uint32_t u32TimingClass, uint32_t u32BusMode, uint32_t u32CSActiveLevel)
\r
57 uint32_t u32Index0 = (uint32_t)&EBI->CTL0 + (uint32_t)u32Bank * 0x10U;
\r
58 uint32_t u32Index1 = (uint32_t)&EBI->TCTL0 + (uint32_t)u32Bank * 0x10U;
\r
59 volatile uint32_t *pu32EBICTL, *pu32EBITCTL;
\r
60 uint32_t pu32Index0, pu32Index1;
\r
62 if((__PC()&NS_OFFSET) == NS_OFFSET)
\r
64 pu32Index0 = (u32Index0 + NS_OFFSET);
\r
65 pu32Index1 = (u32Index1 + NS_OFFSET);
\r
69 pu32Index0 = u32Index0;
\r
70 pu32Index1 = u32Index1;
\r
73 pu32EBICTL = (uint32_t *)(pu32Index0);
\r
74 pu32EBITCTL = (uint32_t *)(pu32Index1);
\r
76 if(u32DataWidth == EBI_BUSWIDTH_8BIT)
\r
78 *pu32EBICTL &= ~EBI_CTL_DW16_Msk;
\r
82 *pu32EBICTL |= EBI_CTL_DW16_Msk;
\r
85 *pu32EBICTL |= u32BusMode;
\r
87 switch(u32TimingClass)
\r
89 case EBI_TIMING_FASTEST:
\r
90 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
\r
91 (EBI_MCLKDIV_1 << EBI_CTL_MCLKDIV_Pos) |
\r
92 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk;
\r
93 *pu32EBITCTL = 0x0U;
\r
96 case EBI_TIMING_VERYFAST:
\r
97 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
\r
98 (EBI_MCLKDIV_1 << EBI_CTL_MCLKDIV_Pos) |
\r
99 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
\r
100 (0x3U << EBI_CTL_TALE_Pos) ;
\r
101 *pu32EBITCTL = 0x03003318U;
\r
104 case EBI_TIMING_FAST:
\r
105 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
\r
106 (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) |
\r
107 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk;
\r
108 *pu32EBITCTL = 0x0U;
\r
111 case EBI_TIMING_NORMAL:
\r
112 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
\r
113 (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) |
\r
114 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
\r
115 (0x3U << EBI_CTL_TALE_Pos) ;
\r
116 *pu32EBITCTL = 0x03003318U;
\r
119 case EBI_TIMING_SLOW:
\r
120 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
\r
121 (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) |
\r
122 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
\r
123 (0x7U << EBI_CTL_TALE_Pos) ;
\r
124 *pu32EBITCTL = 0x07007738U;
\r
127 case EBI_TIMING_VERYSLOW:
\r
128 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
\r
129 (EBI_MCLKDIV_4 << EBI_CTL_MCLKDIV_Pos) |
\r
130 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
\r
131 (0x7U << EBI_CTL_TALE_Pos) ;
\r
132 *pu32EBITCTL = 0x07007738U;
\r
135 case EBI_TIMING_SLOWEST:
\r
136 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
\r
137 (EBI_MCLKDIV_8 << EBI_CTL_MCLKDIV_Pos) |
\r
138 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
\r
139 (0x7U << EBI_CTL_TALE_Pos) ;
\r
140 *pu32EBITCTL = 0x07007738U;
\r
144 *pu32EBICTL &= ~EBI_CTL_EN_Msk;
\r
150 * @brief Disable EBI on specify Bank
\r
152 * @param[in] u32Bank Bank number for EBI. Valid values are:
\r
159 * @details This function is used to close specify EBI function.
\r
161 void EBI_Close(uint32_t u32Bank)
\r
163 uint32_t u32Index = (uint32_t)&EBI->CTL0 + u32Bank * 0x10U;
\r
164 volatile uint32_t *pu32EBICTL;
\r
165 uint32_t pu32Index;
\r
167 if((__PC()&NS_OFFSET) == NS_OFFSET)
\r
169 pu32Index = (u32Index + NS_OFFSET);
\r
173 pu32Index = u32Index;
\r
176 pu32EBICTL = (uint32_t *)(pu32Index);
\r
178 *pu32EBICTL &= ~EBI_CTL_EN_Msk;
\r
182 * @brief Set EBI Bus Timing for specify Bank
\r
184 * @param[in] u32Bank Bank number for EBI. Valid values are:
\r
188 * @param[in] u32TimingConfig Configure EBI timing settings, includes TACC, TAHD, W2X and R2R setting.
\r
189 * @param[in] u32MclkDiv Divider for MCLK. Valid values are:
\r
190 * - \ref EBI_MCLKDIV_1
\r
191 * - \ref EBI_MCLKDIV_2
\r
192 * - \ref EBI_MCLKDIV_4
\r
193 * - \ref EBI_MCLKDIV_8
\r
194 * - \ref EBI_MCLKDIV_16
\r
195 * - \ref EBI_MCLKDIV_32
\r
196 * - \ref EBI_MCLKDIV_64
\r
197 * - \ref EBI_MCLKDIV_128
\r
201 * @details This function is used to configure specify EBI bus timing for access EBI device.
\r
203 void EBI_SetBusTiming(uint32_t u32Bank, uint32_t u32TimingConfig, uint32_t u32MclkDiv)
\r
205 uint32_t u32Index0 = (uint32_t)&EBI->CTL0 + (uint32_t)u32Bank * 0x10U;
\r
206 uint32_t u32Index1 = (uint32_t)&EBI->TCTL0 + (uint32_t)u32Bank * 0x10U;
\r
207 volatile uint32_t *pu32EBICTL, *pu32EBITCTL;
\r
208 uint32_t pu32Index0, pu32Index1;
\r
210 if((__PC()&NS_OFFSET) == NS_OFFSET)
\r
212 pu32Index0 = (u32Index0 + NS_OFFSET);
\r
213 pu32Index1 = (u32Index1 + NS_OFFSET);
\r
217 pu32Index0 = u32Index0;
\r
218 pu32Index1 = u32Index1;
\r
221 pu32EBICTL = (uint32_t *)(pu32Index0);
\r
222 pu32EBITCTL = (uint32_t *)(pu32Index1);
\r
224 *pu32EBICTL = (*pu32EBICTL & ~EBI_CTL_MCLKDIV_Msk) | (u32MclkDiv << EBI_CTL_MCLKDIV_Pos);
\r
225 *pu32EBITCTL = u32TimingConfig;
\r
228 /*@}*/ /* end of group EBI_EXPORTED_FUNCTIONS */
\r
230 /*@}*/ /* end of group EBI_Driver */
\r
232 /*@}*/ /* end of group Standard_Driver */
\r
234 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
\r