1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*
3  * Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
4  */
5 
6 #include "hal_base.h"
7 
8 #ifdef HAL_NVIC_MODULE_ENABLED
9 
10 /** @addtogroup RK_HAL_Driver
11  *  @{
12  */
13 
14 /** @addtogroup NVIC
15  *  @{
16  */
17 
18 /** @defgroup NVIC_How_To_Use How To Use
19  *  @{
20 
21  The NVIC driver can be used as follows:
22 
23  @} */
24 
25 /** @defgroup NVIC_Private_Definition Private Definition
26  *  @{
27  */
28 /********************* Private MACRO Definition ******************************/
29 
30 /********************* Private Structure Definition **************************/
31 
32 /********************* Private Variable Definition ***************************/
33 
34 /********************* Private Function Definition ***************************/
35 
36 /** @} */
37 /********************* Public Function Definition ****************************/
38 
39 /** @defgroup NVIC_Exported_Functions_Group5 Other Functions
40  *  @{
41  */
42 
43 /**
44  * @brief  Set interrupt handler.
45  * @param  IRQn: interrupt number.
46  * @param  handler: NVIC_IRQHandler.
47  * @return HAL_OK.
48  */
HAL_NVIC_SetIRQHandler(IRQn_Type IRQn,NVIC_IRQHandler handler)49 HAL_Status HAL_NVIC_SetIRQHandler(IRQn_Type IRQn, NVIC_IRQHandler handler)
50 {
51 #if __VTOR_PRESENT
52     uint32_t *vectors = (uint32_t *)SCB->VTOR;
53 #else
54     /* cortex m0 has no vtor, the vector table alway based 0x0*/
55     uint32_t *vectors = (uint32_t *)0x0U;
56 #endif
57 
58     vectors[IRQn + NVIC_PERIPH_IRQ_OFFSET] = (uint32_t)handler;
59 
60     return HAL_OK;
61 }
62 
63 /**
64  * @brief  Get interrupt handler.
65  * @param  IRQn: interrupt number
66  * @return NVIC_IRQHandler.
67  */
HAL_NVIC_GetIRQHandler(IRQn_Type IRQn)68 NVIC_IRQHandler HAL_NVIC_GetIRQHandler(IRQn_Type IRQn)
69 {
70 #if __VTOR_PRESENT
71     uint32_t *vectors = (uint32_t *)SCB->VTOR;
72 #else
73     /* cortex m0 has no vtor, the vector table alway based 0x0*/
74     uint32_t *vectors = (uint32_t *)0x0U;
75 #endif
76 
77     return (NVIC_IRQHandler)(vectors[IRQn + NVIC_PERIPH_IRQ_OFFSET]);
78 }
79 
80 /**
81  * @brief  Set interrupt priority group.
82  * @return priorityGroup: priority group.
83  * @return HAL_OK.
84  */
HAL_NVIC_SetPriorityGrouping(eNVIC_PriorityGroup priorityGroup)85 HAL_Status HAL_NVIC_SetPriorityGrouping(eNVIC_PriorityGroup priorityGroup)
86 {
87     NVIC_SetPriorityGrouping(priorityGroup);
88 
89     return HAL_OK;
90 }
91 
92 /**
93  * @brief  Get interrupt priority group.
94  * @return uint32_t: priority group.
95  */
HAL_NVIC_GetPriorityGrouping(void)96 uint32_t HAL_NVIC_GetPriorityGrouping(void)
97 {
98     return NVIC_GetPriorityGrouping();
99 }
100 
101 /**
102  * @brief  Set interrupt priority.
103  * @param  IRQn: interrupt number.
104  * @param  preemptPriority: preemt priority.
105  * @param  subPriority: sub priority.
106  * @return HAL_OK.
107  */
HAL_NVIC_SetPriority(IRQn_Type IRQn,uint32_t preemptPriority,uint32_t subPriority)108 HAL_Status HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t preemptPriority, uint32_t subPriority)
109 {
110     uint32_t prioritygroup = 0x00U;
111 
112     /* Check the parameters */
113     HAL_ASSERT(IS_NVIC_SUB_PRIORITY(subPriority));
114     HAL_ASSERT(IS_NVIC_PREEMPTION_PRIORITY(preemptPriority));
115 
116     prioritygroup = NVIC_GetPriorityGrouping();
117 
118     NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, preemptPriority, subPriority));
119 
120     return HAL_OK;
121 }
122 
123 /**
124  * @brief  Get interrupt priority.
125  * @param  IRQn: interrupt number
126  * @return HAL_OK.
127  */
HAL_NVIC_GetPriority(IRQn_Type IRQn)128 uint32_t HAL_NVIC_GetPriority(IRQn_Type IRQn)
129 {
130     return NVIC_GetPriority(IRQn);
131 }
132 
133 /**
134  * @brief  Enabled interrupt.
135  * @param  IRQn: interrupt number
136  * @return HAL_OK.
137  */
HAL_NVIC_EnableIRQ(IRQn_Type IRQn)138 HAL_Status HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
139 {
140     NVIC_EnableIRQ(IRQn);
141 
142     return HAL_OK;
143 }
144 
145 /**
146  * @brief  Disable interrupt.
147  * @param  IRQn: interrupt number
148  * @return HAL_OK.
149  */
HAL_NVIC_DisableIRQ(IRQn_Type IRQn)150 HAL_Status HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
151 {
152     NVIC_DisableIRQ(IRQn);
153 
154     return HAL_OK;
155 }
156 
157 /**
158  * @brief  Pending interrupt.
159  * @param  IRQn: interrupt number
160  * @return HAL_OK.
161  */
HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn)162 HAL_Status HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn)
163 {
164     NVIC_SetPendingIRQ(IRQn);
165 
166     return HAL_OK;
167 }
168 
169 /**
170  * @brief  Check whether the interrupt is suspended.
171  * @param  IRQn: interrupt number
172  * @return int: if is pending return 1, or 0.
173  */
HAL_NVIC_IsPendingIRQ(IRQn_Type IRQn)174 HAL_Check HAL_NVIC_IsPendingIRQ(IRQn_Type IRQn)
175 {
176     return (HAL_Check)(NVIC_GetPendingIRQ(IRQn));
177 }
178 
179 /**
180  * @brief  Clear pending interrupt.
181  * @param  IRQn: interrupt number
182  * @return None.
183  */
HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn)184 HAL_Status HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn)
185 {
186     NVIC_ClearPendingIRQ(IRQn);
187 
188     return HAL_OK;
189 }
190 
191 /**
192  * @brief  Register peripheral interrupt handle and priority.
193  * @param  IRQn: interrupt number.
194  * @param  handler: interrupt handle.
195  * @param  preemptPriority: preemt priority.
196  * @param  subPriority: sub priority.
197  * @return None.
198  */
HAL_NVIC_ConfigExtIRQ(IRQn_Type IRQn,NVIC_IRQHandler handler,uint32_t preemptPriority,uint32_t subPriority)199 HAL_Status HAL_NVIC_ConfigExtIRQ(IRQn_Type IRQn, NVIC_IRQHandler handler,
200                                  uint32_t preemptPriority, uint32_t subPriority)
201 {
202     HAL_NVIC_SetIRQHandler(IRQn, handler);
203     HAL_NVIC_SetPriority(IRQn, preemptPriority, subPriority);
204     HAL_NVIC_EnableIRQ(IRQn);
205 
206     return HAL_OK;
207 }
208 
209 /**
210  * @brief  Init NVIC Interrupt Controller.
211  * @return None.
212  */
HAL_NVIC_Init(void)213 HAL_Status HAL_NVIC_Init(void)
214 {
215     /* Use HardFault */
216 
217     return HAL_OK;
218 }
219 
220 /** @} */
221 
222 /** @} */
223 
224 /** @} */
225 
226 #endif /* HAL_NVIC_MODULE_ENABLED */
227