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