1 /**************************************************************************//**
2 * @file ebi.c
3 * @version V3.00
4 * @brief M2L31 series External Bus Interface(EBI) driver source file
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 * @copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
8 *****************************************************************************/
9 #include "NuMicro.h"
10
11 /** @addtogroup Standard_Driver Standard Driver
12 @{
13 */
14
15 /** @addtogroup EBI_Driver EBI Driver
16 @{
17 */
18
19 /** @addtogroup EBI_EXPORTED_FUNCTIONS EBI Exported Functions
20 @{
21 */
22
23 /**
24 * @brief Initialize EBI for specify Bank
25 *
26 * @param[in] u32Bank Bank number for EBI. Valid values are:
27 * - \ref EBI_BANK0
28 * - \ref EBI_BANK1
29 * - \ref EBI_BANK2
30 * @param[in] u32DataWidth Data bus width. Valid values are:
31 * - \ref EBI_BUSWIDTH_8BIT
32 * - \ref EBI_BUSWIDTH_16BIT
33 * @param[in] u32TimingClass Default timing configuration. Valid values are:
34 * - \ref EBI_TIMING_FASTEST
35 * - \ref EBI_TIMING_VERYFAST
36 * - \ref EBI_TIMING_FAST
37 * - \ref EBI_TIMING_NORMAL
38 * - \ref EBI_TIMING_SLOW
39 * - \ref EBI_TIMING_VERYSLOW
40 * - \ref EBI_TIMING_SLOWEST
41 * @param[in] u32BusMode Set EBI bus operate mode. Valid values are:
42 * - \ref EBI_OPMODE_NORMAL
43 * - \ref EBI_OPMODE_CACCESS
44 * - \ref EBI_OPMODE_ADSEPARATE
45 * @param[in] u32CSActiveLevel CS is active High/Low. Valid values are:
46 * - \ref EBI_CS_ACTIVE_HIGH
47 * - \ref EBI_CS_ACTIVE_LOW
48 *
49 * @return None
50 *
51 * @details This function is used to open specify EBI bank with different bus width, timing setting and \n
52 * active level of CS pin to access EBI device.
53 * @note Write Buffer Enable(WBUFEN) and Extend Time Of ALE(TALE) are only available in EBI bank0 control register.
54 */
EBI_Open(uint32_t u32Bank,uint32_t u32DataWidth,uint32_t u32TimingClass,uint32_t u32BusMode,uint32_t u32CSActiveLevel)55 void EBI_Open(uint32_t u32Bank, uint32_t u32DataWidth, uint32_t u32TimingClass, uint32_t u32BusMode, uint32_t u32CSActiveLevel)
56 {
57 uint32_t u32Index0 = (uint32_t)&EBI->CTL0 + (uint32_t)u32Bank * 0x10U;
58 uint32_t u32Index1 = (uint32_t)&EBI->TCTL0 + (uint32_t)u32Bank * 0x10U;
59 volatile uint32_t *pu32EBICTL = (uint32_t *)( u32Index0 );
60 volatile uint32_t *pu32EBITCTL = (uint32_t *)( u32Index1 );
61
62 if(u32DataWidth == EBI_BUSWIDTH_8BIT)
63 {
64 *pu32EBICTL &= ~EBI_CTL_DW16_Msk;
65 }
66 else
67 {
68 *pu32EBICTL |= EBI_CTL_DW16_Msk;
69 }
70
71 *pu32EBICTL |= u32BusMode;
72
73 switch(u32TimingClass)
74 {
75 case EBI_TIMING_FASTEST:
76 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
77 (EBI_MCLKDIV_1 << EBI_CTL_MCLKDIV_Pos) |
78 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk;
79 *pu32EBITCTL = 0x0U;
80 break;
81
82 case EBI_TIMING_VERYFAST:
83 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
84 (EBI_MCLKDIV_1 << EBI_CTL_MCLKDIV_Pos) |
85 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
86 (0x3U << EBI_CTL_TALE_Pos) ;
87 *pu32EBITCTL = 0x03003318U;
88 break;
89
90 case EBI_TIMING_FAST:
91 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
92 (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) |
93 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk;
94 *pu32EBITCTL = 0x0U;
95 break;
96
97 case EBI_TIMING_NORMAL:
98 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
99 (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) |
100 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
101 (0x3U << EBI_CTL_TALE_Pos) ;
102 *pu32EBITCTL = 0x03003318U;
103 break;
104
105 case EBI_TIMING_SLOW:
106 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
107 (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) |
108 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
109 (0x7U << EBI_CTL_TALE_Pos) ;
110 *pu32EBITCTL = 0x07007738U;
111 break;
112
113 case EBI_TIMING_VERYSLOW:
114 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
115 (EBI_MCLKDIV_4 << EBI_CTL_MCLKDIV_Pos) |
116 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
117 (0x7U << EBI_CTL_TALE_Pos) ;
118 *pu32EBITCTL = 0x07007738U;
119 break;
120
121 case EBI_TIMING_SLOWEST:
122 *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) |
123 (EBI_MCLKDIV_8 << EBI_CTL_MCLKDIV_Pos) |
124 (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk |
125 (0x7U << EBI_CTL_TALE_Pos) ;
126 *pu32EBITCTL = 0x07007738U;
127 break;
128
129 default:
130 *pu32EBICTL &= ~EBI_CTL_EN_Msk;
131 break;
132 }
133 }
134
135 /**
136 * @brief Disable EBI on specify Bank
137 *
138 * @param[in] u32Bank Bank number for EBI. Valid values are:
139 * - \ref EBI_BANK0
140 * - \ref EBI_BANK1
141 * - \ref EBI_BANK2
142 *
143 * @return None
144 *
145 * @details This function is used to close specify EBI function.
146 */
EBI_Close(uint32_t u32Bank)147 void EBI_Close(uint32_t u32Bank)
148 {
149 uint32_t u32Index = (uint32_t)&EBI->CTL0 + u32Bank * 0x10U;
150 volatile uint32_t *pu32EBICTL = (uint32_t *)( u32Index );
151
152 *pu32EBICTL &= ~EBI_CTL_EN_Msk;
153 }
154
155 /**
156 * @brief Set EBI Bus Timing for specify Bank
157 *
158 * @param[in] u32Bank Bank number for EBI. Valid values are:
159 * - \ref EBI_BANK0
160 * - \ref EBI_BANK1
161 * - \ref EBI_BANK2
162 * @param[in] u32TimingConfig Configure EBI timing settings, includes TACC, TAHD, W2X and R2R setting.
163 * @param[in] u32MclkDiv Divider for MCLK. Valid values are:
164 * - \ref EBI_MCLKDIV_1
165 * - \ref EBI_MCLKDIV_2
166 * - \ref EBI_MCLKDIV_4
167 * - \ref EBI_MCLKDIV_8
168 * - \ref EBI_MCLKDIV_16
169 * - \ref EBI_MCLKDIV_32
170 * - \ref EBI_MCLKDIV_64
171 * - \ref EBI_MCLKDIV_128
172 *
173 * @return None
174 *
175 * @details This function is used to configure specify EBI bus timing for access EBI device.
176 */
EBI_SetBusTiming(uint32_t u32Bank,uint32_t u32TimingConfig,uint32_t u32MclkDiv)177 void EBI_SetBusTiming(uint32_t u32Bank, uint32_t u32TimingConfig, uint32_t u32MclkDiv)
178 {
179 uint32_t u32Index0 = (uint32_t)&EBI->CTL0 + (uint32_t)u32Bank * 0x10U;
180 uint32_t u32Index1 = (uint32_t)&EBI->TCTL0 + (uint32_t)u32Bank * 0x10U;
181 volatile uint32_t *pu32EBICTL = (uint32_t *)( u32Index0 );
182 volatile uint32_t *pu32EBITCTL = (uint32_t *)( u32Index1 );
183
184 *pu32EBICTL = (*pu32EBICTL & ~EBI_CTL_MCLKDIV_Msk) | (u32MclkDiv << EBI_CTL_MCLKDIV_Pos);
185 *pu32EBITCTL = u32TimingConfig;
186 }
187
188 /*@}*/ /* end of group EBI_EXPORTED_FUNCTIONS */
189
190 /*@}*/ /* end of group EBI_Driver */
191
192 /*@}*/ /* end of group Standard_Driver */
193
194 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
195