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