1 /*
2  * Copyright (C) 2017-2019 Alibaba Group Holding Limited
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2020-08-20     zx.chen      source file for the interrupt server route
9  */
10 
11 #include <drv_common.h>
12 #include <csi_config.h>
13 #include "soc.h"
14 
15 #ifndef CONFIG_SYSTICK_HZ
16 #define CONFIG_SYSTICK_HZ 100
17 #endif
18 
19 extern volatile uint32_t rt_thread_switch_interrupt_flag;
20 
21 extern void ck_usart_irqhandler(int32_t idx);
22 extern void dw_timer_irqhandler(int32_t idx);
23 extern void dw_gpio_irqhandler(int32_t idx);
24 extern void systick_handler(void);
25 extern void xPortSysTickHandler(void);
26 extern void OSTimeTick(void);
27 
28 #define  ATTRIBUTE_ISR __attribute__ ((interrupt ("machine")))
29 
30 #define readl(addr) \
31     ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
32 
33 
34 #if(CONFIG_KERNEL_RTTHREAD == 1)
35 #define  CSI_INTRPT_ENTER()  rt_interrupt_enter()
36 #define  CSI_INTRPT_EXIT()   rt_interrupt_leave()
37 #endif
38 
39 
SysTick_Handler(void)40 ATTRIBUTE_ISR void SysTick_Handler(void)
41 {
42 #if(CONFIG_KERNEL_RTTHREAD == 1)
43     CSI_INTRPT_ENTER();
44 #endif
45 
46     csi_coret_config(drv_get_sys_freq() / CONFIG_SYSTICK_HZ, CORET_IRQn);
47 
48 #if defined(CONFIG_KERNEL_RHINO)
49     systick_handler();
50 #elif defined(CONFIG_KERNEL_FREERTOS)
51     xPortSysTickHandler();
52 #elif defined(CONFIG_KERNEL_RTTHREAD)
53     rt_tick_increase();
54 #elif defined(CONFIG_KERNEL_UCOS)
55     OSTimeTick();
56 #endif
57 
58 #if(CONFIG_KERNEL_RTTHREAD == 1)
59     CSI_INTRPT_EXIT();
60 #endif
61 }
62 
USART_IRQHandler(void)63 ATTRIBUTE_ISR void USART_IRQHandler(void)
64 {
65     CSI_INTRPT_ENTER();
66     ck_usart0_irqhandler();
67     CSI_INTRPT_EXIT();
68 }
69 
TIM0_IRQHandler(void)70 ATTRIBUTE_ISR void TIM0_IRQHandler(void)
71 {
72     CSI_INTRPT_ENTER();
73     dw_timer_irqhandler(0);
74     CSI_INTRPT_EXIT();
75 }
76 
TIM1_IRQHandler(void)77 ATTRIBUTE_ISR void TIM1_IRQHandler(void)
78 {
79     CSI_INTRPT_ENTER();
80     dw_timer_irqhandler(1);
81     CSI_INTRPT_EXIT();
82 }
TIM2_IRQHandler(void)83 ATTRIBUTE_ISR void TIM2_IRQHandler(void)
84 {
85     CSI_INTRPT_ENTER();
86     dw_timer_irqhandler(2);
87     CSI_INTRPT_EXIT();
88 }
89 
TIM3_IRQHandler(void)90 ATTRIBUTE_ISR void TIM3_IRQHandler(void)
91 {
92     CSI_INTRPT_ENTER();
93     dw_timer_irqhandler(3);
94     CSI_INTRPT_EXIT();
95 }
96 
TIM4_NMIHandler(void)97 ATTRIBUTE_ISR void TIM4_NMIHandler(void)
98 {
99     dw_timer_irqhandler(4);
100 }
101 
TIM6_IRQHandler(void)102 ATTRIBUTE_ISR void TIM6_IRQHandler(void)
103 {
104     CSI_INTRPT_ENTER();
105     dw_timer_irqhandler(6);
106     CSI_INTRPT_EXIT();
107 }
108 
TIM7_IRQHandler(void)109 ATTRIBUTE_ISR void TIM7_IRQHandler(void)
110 {
111     dw_timer_irqhandler(7);
112 }
113 
TIM8_IRQHandler(void)114 ATTRIBUTE_ISR void TIM8_IRQHandler(void)
115 {
116     CSI_INTRPT_ENTER();
117     dw_timer_irqhandler(8);
118     CSI_INTRPT_EXIT();
119 }
120 
TIM9_IRQHandler(void)121 ATTRIBUTE_ISR void TIM9_IRQHandler(void)
122 {
123     CSI_INTRPT_ENTER();
124     dw_timer_irqhandler(9);
125     CSI_INTRPT_EXIT();
126 }
TIM10_IRQHandler(void)127 ATTRIBUTE_ISR void TIM10_IRQHandler(void)
128 {
129     CSI_INTRPT_ENTER();
130     dw_timer_irqhandler(10);
131     CSI_INTRPT_EXIT();
132 }
133 
TIM11_IRQHandler(void)134 ATTRIBUTE_ISR void TIM11_IRQHandler(void)
135 {
136     CSI_INTRPT_ENTER();
137     dw_timer_irqhandler(11);
138     CSI_INTRPT_EXIT();
139 }
140 
GPIO0_IRQHandler(void)141 ATTRIBUTE_ISR void GPIO0_IRQHandler(void)
142 {
143     CSI_INTRPT_ENTER();
144     dw_gpio_irqhandler(0);
145     CSI_INTRPT_EXIT();
146 }
147 
GPIO1_IRQHandler(void)148 ATTRIBUTE_ISR void GPIO1_IRQHandler(void)
149 {
150     CSI_INTRPT_ENTER();
151     dw_gpio_irqhandler(1);
152     CSI_INTRPT_EXIT();
153 }
154 
GPIO2_IRQHandler(void)155 ATTRIBUTE_ISR void GPIO2_IRQHandler(void)
156 {
157     CSI_INTRPT_ENTER();
158     dw_gpio_irqhandler(2);
159     CSI_INTRPT_EXIT();
160 }
161 
GPIO3_IRQHandler(void)162 ATTRIBUTE_ISR void GPIO3_IRQHandler(void)
163 {
164     CSI_INTRPT_ENTER();
165     dw_gpio_irqhandler(3);
166     CSI_INTRPT_EXIT();
167 }
168 
GPIO4_IRQHandler(void)169 ATTRIBUTE_ISR void GPIO4_IRQHandler(void)
170 {
171     CSI_INTRPT_ENTER();
172     dw_gpio_irqhandler(4);
173     CSI_INTRPT_EXIT();
174 }
175 
GPIO5_IRQHandler(void)176 ATTRIBUTE_ISR void GPIO5_IRQHandler(void)
177 {
178     CSI_INTRPT_ENTER();
179     dw_gpio_irqhandler(5);
180     CSI_INTRPT_EXIT();
181 }
182 
GPIO6_IRQHandler(void)183 ATTRIBUTE_ISR void GPIO6_IRQHandler(void)
184 {
185     CSI_INTRPT_ENTER();
186     dw_gpio_irqhandler(6);
187     CSI_INTRPT_EXIT();
188 }
189 
GPIO7_IRQHandler(void)190 ATTRIBUTE_ISR void GPIO7_IRQHandler(void)
191 {
192     CSI_INTRPT_ENTER();
193     dw_gpio_irqhandler(7);
194     CSI_INTRPT_EXIT();
195 }
196