]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/ebi.c
Add Cortex M23 GCC and IAR ports. Add demo projects for Nuvoton NuMaker-PFM-2351.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC / Nuvoton_Code / StdDriver / src / ebi.c
1 /**************************************************************************//**\r
2  * @file     ebi.c\r
3  * @version  V3.00\r
4  * @brief    External Bus Interface(EBI) driver source file\r
5  *\r
6  * @copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.\r
7 *****************************************************************************/\r
8 #include "NuMicro.h"\r
9 \r
10 \r
11 /** @addtogroup Standard_Driver Standard Driver\r
12   @{\r
13 */\r
14 \r
15 /** @addtogroup EBI_Driver EBI Driver\r
16   @{\r
17 */\r
18 \r
19 /** @addtogroup EBI_EXPORTED_FUNCTIONS EBI Exported Functions\r
20   @{\r
21 */\r
22 \r
23 /**\r
24   * @brief      Initialize EBI for specify Bank\r
25   *\r
26   * @param[in]  u32Bank             Bank number for EBI. Valid values are:\r
27   *                                     - \ref EBI_BANK0\r
28   *                                     - \ref EBI_BANK1\r
29   *                                     - \ref EBI_BANK2\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
48   *\r
49   * @return     None\r
50   *\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
54   */\r
55 void EBI_Open(uint32_t u32Bank, uint32_t u32DataWidth, uint32_t u32TimingClass, uint32_t u32BusMode, uint32_t u32CSActiveLevel)\r
56 {\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
61 \r
62     if((__PC()&NS_OFFSET) == NS_OFFSET)\r
63     {\r
64         pu32Index0 = (u32Index0 + NS_OFFSET);\r
65         pu32Index1 = (u32Index1 + NS_OFFSET);\r
66     }\r
67     else\r
68     {\r
69         pu32Index0 = u32Index0;\r
70         pu32Index1 = u32Index1;\r
71     }\r
72 \r
73     pu32EBICTL  = (uint32_t *)(pu32Index0);\r
74     pu32EBITCTL = (uint32_t *)(pu32Index1);\r
75 \r
76     if(u32DataWidth == EBI_BUSWIDTH_8BIT)\r
77     {\r
78         *pu32EBICTL &= ~EBI_CTL_DW16_Msk;\r
79     }\r
80     else\r
81     {\r
82         *pu32EBICTL |= EBI_CTL_DW16_Msk;\r
83     }\r
84 \r
85     *pu32EBICTL |= u32BusMode;\r
86 \r
87     switch(u32TimingClass)\r
88     {\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
94             break;\r
95 \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
102             break;\r
103 \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
109             break;\r
110 \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
117             break;\r
118 \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
125             break;\r
126 \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
133             break;\r
134 \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
141             break;\r
142 \r
143         default:\r
144             *pu32EBICTL &= ~EBI_CTL_EN_Msk;\r
145             break;\r
146     }\r
147 }\r
148 \r
149 /**\r
150   * @brief      Disable EBI on specify Bank\r
151   *\r
152   * @param[in]  u32Bank     Bank number for EBI. Valid values are:\r
153   *                             - \ref EBI_BANK0\r
154   *                             - \ref EBI_BANK1\r
155   *                             - \ref EBI_BANK2\r
156   *\r
157   * @return     None\r
158   *\r
159   * @details    This function is used to close specify EBI function.\r
160   */\r
161 void EBI_Close(uint32_t u32Bank)\r
162 {\r
163     uint32_t u32Index = (uint32_t)&EBI->CTL0 + u32Bank * 0x10U;\r
164     volatile uint32_t *pu32EBICTL;\r
165     uint32_t pu32Index;\r
166 \r
167     if((__PC()&NS_OFFSET) == NS_OFFSET)\r
168     {\r
169         pu32Index = (u32Index + NS_OFFSET);\r
170     }\r
171     else\r
172     {\r
173         pu32Index = u32Index;\r
174     }\r
175 \r
176     pu32EBICTL  = (uint32_t *)(pu32Index);\r
177 \r
178     *pu32EBICTL &= ~EBI_CTL_EN_Msk;\r
179 }\r
180 \r
181 /**\r
182   * @brief      Set EBI Bus Timing for specify Bank\r
183   *\r
184   * @param[in]  u32Bank             Bank number for EBI. Valid values are:\r
185   *                                     - \ref EBI_BANK0\r
186   *                                     - \ref EBI_BANK1\r
187   *                                     - \ref EBI_BANK2\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
198   *\r
199   * @return     None\r
200   *\r
201   * @details    This function is used to configure specify EBI bus timing for access EBI device.\r
202   */\r
203 void EBI_SetBusTiming(uint32_t u32Bank, uint32_t u32TimingConfig, uint32_t u32MclkDiv)\r
204 {\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
209 \r
210     if((__PC()&NS_OFFSET) == NS_OFFSET)\r
211     {\r
212         pu32Index0 = (u32Index0 + NS_OFFSET);\r
213         pu32Index1 = (u32Index1 + NS_OFFSET);\r
214     }\r
215     else\r
216     {\r
217         pu32Index0 = u32Index0;\r
218         pu32Index1 = u32Index1;\r
219     }\r
220 \r
221     pu32EBICTL  = (uint32_t *)(pu32Index0);\r
222     pu32EBITCTL = (uint32_t *)(pu32Index1);\r
223 \r
224     *pu32EBICTL = (*pu32EBICTL & ~EBI_CTL_MCLKDIV_Msk) | (u32MclkDiv << EBI_CTL_MCLKDIV_Pos);\r
225     *pu32EBITCTL = u32TimingConfig;\r
226 }\r
227 \r
228 /*@}*/ /* end of group EBI_EXPORTED_FUNCTIONS */\r
229 \r
230 /*@}*/ /* end of group EBI_Driver */\r
231 \r
232 /*@}*/ /* end of group Standard_Driver */\r
233 \r
234 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/\r