1 /*
2  * Copyright (C) 2017-2019 Alibaba Group Holding Limited
3  */
4 
5 
6 /******************************************************************************
7  * @file     isr.c
8  * @brief    source file for the interrupt server route
9  * @version  V1.0
10  * @date     02. June 2017
11  ******************************************************************************/
12 #include <drv_common.h>
13 #include <csi_config.h>
14 #include "soc.h"
15 #ifndef CONFIG_KERNEL_NONE
16 #include <csi_kernel.h>
17 #endif
18 
19 #if defined(CONFIG_KERNEL_RHINO)
20 #undef CONFIG_SYSTICK_HZ
21 #define CONFIG_SYSTICK_HZ RHINO_CONFIG_TICKS_PER_SECOND
22 #endif
23 
24 #ifndef CONFIG_SYSTICK_HZ
25 #define CONFIG_SYSTICK_HZ 100
26 #endif
27 
28 extern void ck_usart_irqhandler(int32_t idx);
29 extern void dw_timer_irqhandler(int32_t idx);
30 extern void dw_gpio_irqhandler(int32_t idx);
31 extern void systick_handler(void);
32 extern void xPortSysTickHandler(void);
33 extern void OSTimeTick(void);
34 
35 #define  ATTRIBUTE_ISR
36 
37 #define readl(addr) \
38     ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
39 
40 #ifndef CONFIG_KERNEL_NONE
41 #define  CSI_INTRPT_ENTER() csi_kernel_intrpt_enter()
42 #define  CSI_INTRPT_EXIT()  csi_kernel_intrpt_exit()
43 #else
44 #define  CSI_INTRPT_ENTER()
45 #define  CSI_INTRPT_EXIT()
46 #endif
47 
CORET_IRQHandler(void)48 ATTRIBUTE_ISR void CORET_IRQHandler(void)
49 {
50 #ifndef CONFIG_KERNEL_FREERTOS
51     CSI_INTRPT_ENTER();
52 #endif
53 
54     csi_coret_config(drv_get_sys_freq() / CONFIG_SYSTICK_HZ, 0x0);
55 
56 #if defined(CONFIG_KERNEL_RHINO)
57     systick_handler();
58 #elif defined(CONFIG_KERNEL_FREERTOS)
59     xPortSysTickHandler();
60 #elif defined(CONFIG_KERNEL_UCOS)
61     OSTimeTick();
62 #endif
63 
64 #ifndef CONFIG_KERNEL_FREERTOS
65     CSI_INTRPT_EXIT();
66 #endif
67 }
68 
USART_IRQHandler(void)69 ATTRIBUTE_ISR void USART_IRQHandler(void)
70 {
71     CSI_INTRPT_ENTER();
72     ck_usart_irqhandler(0);
73     CSI_INTRPT_EXIT();
74 }
75 
TIM0_IRQHandler(void)76 ATTRIBUTE_ISR void TIM0_IRQHandler(void)
77 {
78     CSI_INTRPT_ENTER();
79     dw_timer_irqhandler(0);
80     CSI_INTRPT_EXIT();
81 }
82 
TIM1_IRQHandler(void)83 ATTRIBUTE_ISR void TIM1_IRQHandler(void)
84 {
85     CSI_INTRPT_ENTER();
86     dw_timer_irqhandler(1);
87     CSI_INTRPT_EXIT();
88 }
TIM2_IRQHandler(void)89 ATTRIBUTE_ISR void TIM2_IRQHandler(void)
90 {
91     CSI_INTRPT_ENTER();
92     dw_timer_irqhandler(2);
93     CSI_INTRPT_EXIT();
94 }
95 
TIM3_IRQHandler(void)96 ATTRIBUTE_ISR void TIM3_IRQHandler(void)
97 {
98     CSI_INTRPT_ENTER();
99     dw_timer_irqhandler(3);
100     CSI_INTRPT_EXIT();
101 }
102 
GPIO0_IRQHandler(void)103 ATTRIBUTE_ISR void GPIO0_IRQHandler(void)
104 {
105     CSI_INTRPT_ENTER();
106     dw_gpio_irqhandler(0);
107     CSI_INTRPT_EXIT();
108 }
109 
GPIO1_IRQHandler(void)110 ATTRIBUTE_ISR void GPIO1_IRQHandler(void)
111 {
112     CSI_INTRPT_ENTER();
113     dw_gpio_irqhandler(1);
114     CSI_INTRPT_EXIT();
115 }
116 
GPIO2_IRQHandler(void)117 ATTRIBUTE_ISR void GPIO2_IRQHandler(void)
118 {
119     CSI_INTRPT_ENTER();
120     dw_gpio_irqhandler(2);
121     CSI_INTRPT_EXIT();
122 }
123 
GPIO3_IRQHandler(void)124 ATTRIBUTE_ISR void GPIO3_IRQHandler(void)
125 {
126     CSI_INTRPT_ENTER();
127     dw_gpio_irqhandler(3);
128     CSI_INTRPT_EXIT();
129 }
130 
GPIO4_IRQHandler(void)131 ATTRIBUTE_ISR void GPIO4_IRQHandler(void)
132 {
133     CSI_INTRPT_ENTER();
134     dw_gpio_irqhandler(4);
135     CSI_INTRPT_EXIT();
136 }
137 
GPIO5_IRQHandler(void)138 ATTRIBUTE_ISR void GPIO5_IRQHandler(void)
139 {
140     CSI_INTRPT_ENTER();
141     dw_gpio_irqhandler(5);
142     CSI_INTRPT_EXIT();
143 }
144 
GPIO6_IRQHandler(void)145 ATTRIBUTE_ISR void GPIO6_IRQHandler(void)
146 {
147     CSI_INTRPT_ENTER();
148     dw_gpio_irqhandler(6);
149     CSI_INTRPT_EXIT();
150 }
151 
GPIO7_IRQHandler(void)152 ATTRIBUTE_ISR void GPIO7_IRQHandler(void)
153 {
154     CSI_INTRPT_ENTER();
155     dw_gpio_irqhandler(7);
156     CSI_INTRPT_EXIT();
157 }
158