1 /**************************************************************************//**
2  * @file     ebi.h
3  * @version  V3.00
4  * $Revision: 2 $
5  * $Date: 19/04/01 4:48p $
6  * @brief    M2L31 series External Bus Interface(EBI) driver header file
7  *
8  * @note
9  * Copyright (C) 2017 Nuvoton Technology Corp. All rights reserved.
10  *****************************************************************************/
11 #ifndef __EBI_H__
12 #define __EBI_H__
13 
14 #ifdef __cplusplus
15 extern "C"
16 {
17 #endif
18 
19 
20 /** @addtogroup Standard_Driver Standard Driver
21   @{
22 */
23 
24 /** @addtogroup EBI_Driver EBI Driver
25   @{
26 */
27 
28 /** @addtogroup EBI_EXPORTED_CONSTANTS EBI Exported Constants
29   @{
30 */
31 /*---------------------------------------------------------------------------------------------------------*/
32 /*  Miscellaneous Constant Definitions                                                                     */
33 /*---------------------------------------------------------------------------------------------------------*/
34 #define EBI_BANK0_BASE_ADDR     0x60000000UL /*!< EBI bank0 base address */
35 #define EBI_BANK1_BASE_ADDR     0x60100000UL /*!< EBI bank1 base address */
36 #define EBI_BANK2_BASE_ADDR     0x60200000UL /*!< EBI bank1 base address */
37 #define EBI_MAX_SIZE            0x00100000UL /*!< Maximum EBI size for each bank is 1 MB */
38 
39 /*---------------------------------------------------------------------------------------------------------*/
40 /*  Constants for EBI bank number                                                                          */
41 /*---------------------------------------------------------------------------------------------------------*/
42 #define EBI_BANK0               0   /*!< EBI bank 0 */
43 #define EBI_BANK1               1   /*!< EBI bank 1 */
44 #define EBI_BANK2               2   /*!< EBI bank 2 */
45 
46 /*---------------------------------------------------------------------------------------------------------*/
47 /*  Constants for EBI data bus width                                                                       */
48 /*---------------------------------------------------------------------------------------------------------*/
49 #define EBI_BUSWIDTH_8BIT       8   /*!< EBI bus width is 8-bit */
50 #define EBI_BUSWIDTH_16BIT      16  /*!< EBI bus width is 16-bit */
51 
52 /*---------------------------------------------------------------------------------------------------------*/
53 /*  Constants for EBI CS Active Level                                                                      */
54 /*---------------------------------------------------------------------------------------------------------*/
55 #define EBI_CS_ACTIVE_LOW       0   /*!< EBI CS active level is low */
56 #define EBI_CS_ACTIVE_HIGH      1   /*!< EBI CS active level is high */
57 
58 /*---------------------------------------------------------------------------------------------------------*/
59 /*  Constants for EBI MCLK divider and Timing                                                              */
60 /*---------------------------------------------------------------------------------------------------------*/
61 #define EBI_MCLKDIV_1           0x0UL /*!< EBI output clock(MCLK) is HCLK/1 */
62 #define EBI_MCLKDIV_2           0x1UL /*!< EBI output clock(MCLK) is HCLK/2 */
63 #define EBI_MCLKDIV_4           0x2UL /*!< EBI output clock(MCLK) is HCLK/4 */
64 #define EBI_MCLKDIV_8           0x3UL /*!< EBI output clock(MCLK) is HCLK/8 */
65 #define EBI_MCLKDIV_16          0x4UL /*!< EBI output clock(MCLK) is HCLK/16 */
66 #define EBI_MCLKDIV_32          0x5UL /*!< EBI output clock(MCLK) is HCLK/32 */
67 #define EBI_MCLKDIV_64          0x6UL /*!< EBI output clock(MCLK) is HCLK/64 \hideinitializer */
68 #define EBI_MCLKDIV_128         0x7UL /*!< EBI output clock(MCLK) is HCLK/128 */
69 
70 #define EBI_TIMING_FASTEST      0x0UL /*!< EBI timing is the fastest */
71 #define EBI_TIMING_VERYFAST     0x1UL /*!< EBI timing is very fast */
72 #define EBI_TIMING_FAST         0x2UL /*!< EBI timing is fast */
73 #define EBI_TIMING_NORMAL       0x3UL /*!< EBI timing is normal  */
74 #define EBI_TIMING_SLOW         0x4UL /*!< EBI timing is slow */
75 #define EBI_TIMING_VERYSLOW     0x5UL /*!< EBI timing is very slow */
76 #define EBI_TIMING_SLOWEST      0x6UL /*!< EBI timing is the slowest */
77 
78 #define EBI_OPMODE_NORMAL       0x0UL                 /*!< EBI bus operate in normal mode */
79 #define EBI_OPMODE_CACCESS      (EBI_CTL_CACCESS_Msk) /*!< EBI bus operate in Continuous Data Access mode */
80 #define EBI_OPMODE_ADSEPARATE   (EBI_CTL_ADSEPEN_Msk) /*!< EBI bus operate in AD Separate mode \hideinitializer */
81 
82 /*@}*/ /* end of group EBI_EXPORTED_CONSTANTS */
83 
84 
85 /** @addtogroup EBI_EXPORTED_FUNCTIONS EBI Exported Functions
86   @{
87 */
88 
89 /**
90   * @brief      Read 8-bit data on EBI bank0
91   *
92   * @param[in]  u32Addr     The data address on EBI bank0.
93   *
94   * @return     8-bit Data
95   *
96   * @details    This macro is used to read 8-bit data from specify address on EBI bank0.
97   */
98 #define EBI0_READ_DATA8(u32Addr)            (*((volatile unsigned char *)(EBI_BANK0_BASE_ADDR+(u32Addr))))
99 
100 /**
101   * @brief      Write 8-bit data to EBI bank0
102   *
103   * @param[in]  u32Addr     The data address on EBI bank0.
104   * @param[in]  u32Data     Specify data to be written.
105   *
106   * @return     None
107   *
108   * @details    This macro is used to write 8-bit data to specify address on EBI bank0.
109   */
110 #define EBI0_WRITE_DATA8(u32Addr, u32Data)  (*((volatile unsigned char *)(EBI_BANK0_BASE_ADDR+(u32Addr))) = (u32Data))
111 
112 /**
113   * @brief      Read 16-bit data on EBI bank0
114   *
115   * @param[in]  u32Addr     The data address on EBI bank0.
116   *
117   * @return     16-bit Data
118   *
119   * @details    This macro is used to read 16-bit data from specify address on EBI bank0.
120   */
121 #define EBI0_READ_DATA16(u32Addr)           (*((volatile unsigned short *)(EBI_BANK0_BASE_ADDR+(u32Addr))))
122 
123 /**
124   * @brief      Write 16-bit data to EBI bank0
125   *
126   * @param[in]  u32Addr     The data address on EBI bank0.
127   * @param[in]  u32Data     Specify data to be written.
128   *
129   * @return     None
130   *
131   * @details    This macro is used to write 16-bit data to specify address on EBI bank0.
132   */
133 #define EBI0_WRITE_DATA16(u32Addr, u32Data) (*((volatile unsigned short *)(EBI_BANK0_BASE_ADDR+(u32Addr))) = (u32Data))
134 
135 /**
136   * @brief      Read 32-bit data on EBI bank0
137   *
138   * @param[in]  u32Addr     The data address on EBI bank0.
139   *
140   * @return     32-bit Data
141   *
142   * @details    This macro is used to read 32-bit data from specify address on EBI bank0.
143   */
144 #define EBI0_READ_DATA32(u32Addr)           (*((volatile unsigned int *)(EBI_BANK0_BASE_ADDR+(u32Addr))))
145 
146 /**
147   * @brief      Write 32-bit data to EBI bank0
148   *
149   * @param[in]  u32Addr     The data address on EBI bank0.
150   * @param[in]  u32Data     Specify data to be written.
151   *
152   * @return     None
153   *
154   * @details    This macro is used to write 32-bit data to specify address on EBI bank0.
155   */
156 #define EBI0_WRITE_DATA32(u32Addr, u32Data) (*((volatile unsigned int *)(EBI_BANK0_BASE_ADDR+(u32Addr))) = (u32Data))
157 
158 /**
159   * @brief      Read 8-bit data on EBI bank1
160   *
161   * @param[in]  u32Addr     The data address on EBI bank1.
162   *
163   * @return     8-bit Data
164   *
165   * @details    This macro is used to read 8-bit data from specify address on EBI bank1.
166   */
167 #define EBI1_READ_DATA8(u32Addr)            (*((volatile unsigned char *)(EBI_BANK1_BASE_ADDR+(u32Addr))))
168 
169 /**
170   * @brief      Write 8-bit data to EBI bank1
171   *
172   * @param[in]  u32Addr     The data address on EBI bank1.
173   * @param[in]  u32Data     Specify data to be written.
174   *
175   * @return     None
176   *
177   * @details    This macro is used to write 8-bit data to specify address on EBI bank1.
178   */
179 #define EBI1_WRITE_DATA8(u32Addr, u32Data)  (*((volatile unsigned char *)(EBI_BANK1_BASE_ADDR+(u32Addr))) = (u32Data))
180 
181 /**
182   * @brief      Read 16-bit data on EBI bank1
183   *
184   * @param[in]  u32Addr     The data address on EBI bank1.
185   *
186   * @return     16-bit Data
187   *
188   * @details    This macro is used to read 16-bit data from specify address on EBI bank1.
189   */
190 #define EBI1_READ_DATA16(u32Addr)           (*((volatile unsigned short *)(EBI_BANK1_BASE_ADDR+(u32Addr))))
191 
192 /**
193   * @brief      Write 16-bit data to EBI bank1
194   *
195   * @param[in]  u32Addr     The data address on EBI bank1.
196   * @param[in]  u32Data     Specify data to be written.
197   *
198   * @return     None
199   *
200   * @details    This macro is used to write 16-bit data to specify address on EBI bank1.
201   */
202 #define EBI1_WRITE_DATA16(u32Addr, u32Data) (*((volatile unsigned short *)(EBI_BANK1_BASE_ADDR+(u32Addr))) = (u32Data))
203 
204 /**
205   * @brief      Read 32-bit data on EBI bank1
206   *
207   * @param[in]  u32Addr     The data address on EBI bank1.
208   *
209   * @return     32-bit Data
210   *
211   * @details    This macro is used to read 32-bit data from specify address on EBI bank1.
212   */
213 #define EBI1_READ_DATA32(u32Addr)           (*((volatile unsigned int *)(EBI_BANK1_BASE_ADDR+(u32Addr))))
214 
215 /**
216   * @brief      Write 32-bit data to EBI bank1
217   *
218   * @param[in]  u32Addr     The data address on EBI bank1.
219   * @param[in]  u32Data     Specify data to be written.
220   *
221   * @return     None
222   *
223   * @details    This macro is used to write 32-bit data to specify address on EBI bank1.
224   */
225 #define EBI1_WRITE_DATA32(u32Addr, u32Data) (*((volatile unsigned int *)(EBI_BANK1_BASE_ADDR+(u32Addr))) = (u32Data))
226 /**
227   * @brief      Read 8-bit data on EBI bank2
228   *
229   * @param[in]  u32Addr     The data address on EBI bank2.
230   *
231   * @return     8-bit Data
232   *
233   * @details    This macro is used to read 8-bit data from specify address on EBI bank2.
234   * \hideinitializer
235   */
236 #define EBI2_READ_DATA8(u32Addr)            (*((volatile unsigned char *)(EBI_BANK2_BASE_ADDR+(u32Addr))))
237 
238 /**
239   * @brief      Write 8-bit data to EBI bank2
240   *
241   * @param[in]  u32Addr     The data address on EBI bank2.
242   * @param[in]  u32Data     Specify data to be written.
243   *
244   * @return     None
245   *
246   * @details    This macro is used to write 8-bit data to specify address on EBI bank2.
247   * \hideinitializer
248   */
249 #define EBI2_WRITE_DATA8(u32Addr, u32Data)  (*((volatile unsigned char *)(EBI_BANK2_BASE_ADDR+(u32Addr))) = (u32Data))
250 
251 /**
252   * @brief      Read 16-bit data on EBI bank2
253   *
254   * @param[in]  u32Addr     The data address on EBI bank2.
255   *
256   * @return     16-bit Data
257   *
258   * @details    This macro is used to read 16-bit data from specify address on EBI bank2.
259   * \hideinitializer
260   */
261 #define EBI2_READ_DATA16(u32Addr)           (*((volatile unsigned short *)(EBI_BANK2_BASE_ADDR+(u32Addr))))
262 
263 /**
264   * @brief      Write 16-bit data to EBI bank2
265   *
266   * @param[in]  u32Addr     The data address on EBI bank2.
267   * @param[in]  u32Data     Specify data to be written.
268   *
269   * @return     None
270   *
271   * @details    This macro is used to write 16-bit data to specify address on EBI bank2.
272   * \hideinitializer
273   */
274 #define EBI2_WRITE_DATA16(u32Addr, u32Data) (*((volatile unsigned short *)(EBI_BANK2_BASE_ADDR+(u32Addr))) = (u32Data))
275 
276 /**
277   * @brief      Read 32-bit data on EBI bank2
278   *
279   * @param[in]  u32Addr     The data address on EBI bank2.
280   *
281   * @return     32-bit Data
282   *
283   * @details    This macro is used to read 32-bit data from specify address on EBI bank2.
284   * \hideinitializer
285   */
286 #define EBI2_READ_DATA32(u32Addr)           (*((volatile unsigned int *)(EBI_BANK2_BASE_ADDR+(u32Addr))))
287 
288 /**
289   * @brief      Write 32-bit data to EBI bank2
290   *
291   * @param[in]  u32Addr     The data address on EBI bank2.
292   * @param[in]  u32Data     Specify data to be written.
293   *
294   * @return     None
295   *
296   * @details    This macro is used to write 32-bit data to specify address on EBI bank2.
297   * \hideinitializer
298   */
299 #define EBI2_WRITE_DATA32(u32Addr, u32Data) (*((volatile unsigned int *)(EBI_BANK2_BASE_ADDR+(u32Addr))) = (u32Data))
300 
301 
302 /**
303  * @brief       Enable EBI Write Buffer
304  *
305  * @param       None
306  *
307  * @return      None
308  *
309  * @details     This macro is used to improve EBI write operation for EBI bank0 and bank1.
310  */
311 #define EBI_ENABLE_WRITE_BUFFER()           (EBI->CTL0 |= EBI_CTL_WBUFEN_Msk);
312 
313 /**
314  * @brief       Disable EBI Write Buffer
315  *
316  * @param       None
317  *
318  * @return      None
319  *
320  * @details     This macro is used to disable EBI write buffer function.
321  */
322 #define EBI_DISABLE_WRITE_BUFFER()          (EBI->CTL0 &= ~EBI_CTL_WBUFEN_Msk);
323 
324 void EBI_Open(uint32_t u32Bank, uint32_t u32DataWidth, uint32_t u32TimingClass, uint32_t u32BusMode, uint32_t u32CSActiveLevel);
325 void EBI_Close(uint32_t u32Bank);
326 void EBI_SetBusTiming(uint32_t u32Bank, uint32_t u32TimingConfig, uint32_t u32MclkDiv);
327 
328 /*@}*/ /* end of group EBI_EXPORTED_FUNCTIONS */
329 
330 /*@}*/ /* end of group EBI_Driver */
331 
332 /*@}*/ /* end of group Standard_Driver */
333 
334 #ifdef __cplusplus
335 }
336 #endif
337 
338 #endif //__EBI_H__
339 
340 /*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/
341