1 #include "GigaDevice/ioGD32VF103.h"
2 #include "intrinsics.h"
3 #include "csr.h"
4 #include "stdlib.h"
5 #include "stdint.h"
6
7 #pragma language=extended
8
9
10 extern __weak void eclic_msip_handler(void);
11 extern __weak void eclic_mtip_handler(void);
12 extern __weak void eclic_bwei_handler(void);
13 extern __weak void eclic_pmovi_handler(void);
14 extern __weak void WWDGT_IRQHandler(void);
15 extern __weak void LVD_IRQHandler(void);
16 extern __weak void TAMPER_IRQHandler(void);
17 extern __weak void RTC_IRQHandler(void);
18 extern __weak void FMC_IRQHandler(void);
19 extern __weak void RCU_IRQHandler(void);
20 extern __weak void EXTI0_IRQHandler(void);
21 extern __weak void EXTI1_IRQHandler(void);
22 extern __weak void EXTI2_IRQHandler(void);
23 extern __weak void EXTI3_IRQHandler(void);
24 extern __weak void EXTI4_IRQHandler(void);
25 extern __weak void DMA0_Channel0_IRQHandler(void);
26 extern __weak void DMA0_Channel1_IRQHandler(void);
27 extern __weak void DMA0_Channel2_IRQHandler(void);
28 extern __weak void DMA0_Channel3_IRQHandler(void);
29 extern __weak void DMA0_Channel4_IRQHandler(void);
30 extern __weak void DMA0_Channel5_IRQHandler(void);
31 extern __weak void DMA0_Channel6_IRQHandler(void);
32 extern __weak void ADC0_1_IRQHandler(void);
33 extern __weak void CAN0_TX_IRQHandler(void);
34 extern __weak void CAN0_RX0_IRQHandler(void);
35 extern __weak void CAN0_RX1_IRQHandler(void);
36 extern __weak void CAN0_EWMC_IRQHandler(void);
37 extern __weak void EXTI5_9_IRQHandler(void);
38 extern __weak void TIMER0_BRK_IRQHandler(void);
39 extern __weak void TIMER0_UP_IRQHandler(void);
40 extern __weak void TIMER0_TRG_CMT_IRQHandler(void);
41 extern __weak void TIMER0_Channel_IRQHandler(void);
42 extern __weak void TIMER1_IRQHandler(void);
43 extern __weak void TIMER2_IRQHandler(void);
44 extern __weak void TIMER3_IRQHandler(void);
45 extern __weak void I2C0_EV_IRQHandler(void);
46 extern __weak void I2C0_ER_IRQHandler(void);
47 extern __weak void I2C1_EV_IRQHandler(void);
48 extern __weak void I2C1_ER_IRQHandler(void);
49 extern __weak void SPI0_IRQHandler(void);
50 extern __weak void SPI1_IRQHandler(void);
51 extern __weak void USART0_IRQHandler(void);
52 extern __weak void USART1_IRQHandler(void);
53 extern __weak void USART2_IRQHandler(void);
54 extern __weak void EXTI10_15_IRQHandler(void);
55 extern __weak void RTC_Alarm_IRQHandler(void);
56 extern __weak void USBFS_WKUP_IRQHandler(void);
57 extern __weak void EXMC_IRQHandler(void);
58 extern __weak void TIMER4_IRQHandler(void);
59 extern __weak void SPI2_IRQHandler(void);
60 extern __weak void UART3_IRQHandler(void);
61 extern __weak void UART4_IRQHandler(void);
62 extern __weak void TIMER5_IRQHandler(void);
63 extern __weak void TIMER6_IRQHandler(void);
64 extern __weak void DMA1_Channel0_IRQHandler(void);
65 extern __weak void DMA1_Channel1_IRQHandler(void);
66 extern __weak void DMA1_Channel2_IRQHandler(void);
67 extern __weak void DMA1_Channel3_IRQHandler(void);
68 extern __weak void DMA1_Channel4_IRQHandler(void);
69 extern __weak void CAN1_TX_IRQHandler(void);
70 extern __weak void CAN1_RX0_IRQHandler(void);
71 extern __weak void CAN1_RX1_IRQHandler(void);
72 extern __weak void CAN1_EWMC_IRQHandler(void);
73 extern __weak void USBFS_IRQHandler(void);
74
75 typedef void(*__fp)(void);
76 const __fp gd_vector_base[96] =
77 {
78 0,
79 0,
80 0,
81 eclic_msip_handler,
82 0,
83 0,
84 0,
85 eclic_mtip_handler,
86 0,
87 0,
88 0,
89 0,
90 0,
91 0,
92 0,
93 0,
94 0,
95 eclic_bwei_handler,
96 eclic_pmovi_handler,
97 WWDGT_IRQHandler,
98 LVD_IRQHandler,
99 TAMPER_IRQHandler,
100 RTC_IRQHandler,
101 FMC_IRQHandler,
102 RCU_IRQHandler,
103 EXTI0_IRQHandler,
104 EXTI1_IRQHandler,
105 EXTI2_IRQHandler,
106 EXTI3_IRQHandler,
107 EXTI4_IRQHandler,
108 DMA0_Channel0_IRQHandler,
109 DMA0_Channel1_IRQHandler,
110 DMA0_Channel2_IRQHandler,
111 DMA0_Channel3_IRQHandler,
112 DMA0_Channel4_IRQHandler,
113 DMA0_Channel5_IRQHandler,
114 DMA0_Channel6_IRQHandler,
115 ADC0_1_IRQHandler,
116 CAN0_TX_IRQHandler,
117 CAN0_RX0_IRQHandler,
118 CAN0_RX1_IRQHandler,
119 CAN0_EWMC_IRQHandler,
120 EXTI5_9_IRQHandler,
121 TIMER0_BRK_IRQHandler,
122 TIMER0_UP_IRQHandler,
123 TIMER0_TRG_CMT_IRQHandler,
124 TIMER0_Channel_IRQHandler,
125 TIMER1_IRQHandler,
126 TIMER2_IRQHandler,
127 TIMER3_IRQHandler,
128 I2C0_EV_IRQHandler,
129 I2C0_ER_IRQHandler,
130 I2C1_EV_IRQHandler,
131 I2C1_ER_IRQHandler,
132 SPI0_IRQHandler,
133 SPI1_IRQHandler,
134 USART0_IRQHandler,
135 USART1_IRQHandler,
136 USART2_IRQHandler,
137 EXTI10_15_IRQHandler,
138 RTC_Alarm_IRQHandler,
139 USBFS_WKUP_IRQHandler,
140 0,
141 0,
142 0,
143 0,
144 0,
145 EXMC_IRQHandler,
146 0,
147 TIMER4_IRQHandler,
148 SPI2_IRQHandler,
149 UART3_IRQHandler,
150 UART4_IRQHandler,
151 TIMER5_IRQHandler,
152 TIMER6_IRQHandler,
153 DMA1_Channel0_IRQHandler,
154 DMA1_Channel1_IRQHandler,
155 DMA1_Channel2_IRQHandler,
156 DMA1_Channel3_IRQHandler,
157 DMA1_Channel4_IRQHandler,
158 0,
159 0,
160 CAN1_TX_IRQHandler,
161 CAN1_RX0_IRQHandler,
162 CAN1_RX1_IRQHandler,
163 CAN1_EWMC_IRQHandler,
164 USBFS_IRQHandler
165
166 };
167
168 extern unsigned int __minterrupt_clic_base;
169 extern __interrupt __machine void __minterrupt_single(void);
170
171 __interrupt __machine void __default_minterrupt_handler(void);
172
__default_minterrupt_handler(void)173 __interrupt __machine void __default_minterrupt_handler(void)
174 {
175 abort();
176 }
177
178 extern uintptr_t handle_trap(uintptr_t mcause, uintptr_t sp);
179
handle_trap(uintptr_t mcause,uintptr_t sp)180 uintptr_t handle_trap(uintptr_t mcause, uintptr_t sp)
181 {
182 __fp fp;
183 mcause &= 0xFFF;
184 fp = gd_vector_base[mcause];
185 if (fp)
186 fp();
187 return 0;
188 }
189
trap_entry()190 __interrupt void trap_entry()
191 {
192 uintptr_t mcause = __read_csr(_CSR_MCAUSE);
193 handle_trap(mcause, 0);
194 }
195
irq_entry()196 __interrupt void irq_entry()
197 {
198 uintptr_t mcause = __read_csr(_CSR_MCAUSE);
199 uintptr_t mepc = __read_csr(_CSR_MEPC);
200 uintptr_t msubm = __read_csr(0x7C4);
201 __enable_interrupt();
202 handle_trap(mcause, 0);
203 //asm("csrrw ra,0x7ED, ra");
204 __disable_interrupt();
205 __write_csr(_CSR_MCAUSE, mcause);
206 __write_csr(_CSR_MEPC, mepc);
207 __write_csr(0x7C4, msubm);
208 }
209
__low_level_init()210 int __low_level_init()
211 {
212 __disable_interrupt();
213 /* Set the the NMI base to share with mtvec by setting CSR_MMISC_CTL */
214 /* li t0, 0x200 */
215 /* csrs CSR_MMISC_CTL, t0 */
216 __set_bits_csr(/*CSR_MMISC_CTL*/ 0x7D0, 0x200);
217
218 /* Initialize the mtvt */
219 /* la t0, vector_base */
220 /* csrw CSR_MTVT, t0 */
221 __write_csr(_CSR_MTVT, ((unsigned int)&gd_vector_base));
222 /* Initialize the mtvt2 and enable it */
223 /* la t0, irq_entry
224 csrw CSR_MTVT2, t0
225 csrs CSR_MTVT2, 0x1
226 */
227 __write_csr(/*_CSR_MTVT2*/ 0x7EC, 0x1 | ((unsigned int)&irq_entry));
228
229 /* Initialize the CSR MTVEC for the Trap ane NMI base addr*/
230 /* la t0, trap_entry
231 csrw CSR_MTVEC, t0
232 */
233 __write_csr(_CSR_MTVEC, 0x03 | ((unsigned int)&trap_entry));
234
235 /* Enable mycycle_minstret */
236 __clear_bits_csr(/*CSR_MCOUNTINHIBIT*/ 0x320, 0x5);
237 return 1;
238 }