1 /*
2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
3 * Copyright 2016-2017 NXP
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #include "fsl_llwu.h"
10
11 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN)
LLWU_SetExternalWakeupPinMode(LLWU_Type * base,uint32_t pinIndex,llwu_external_pin_mode_t pinMode)12 void LLWU_SetExternalWakeupPinMode(LLWU_Type *base, uint32_t pinIndex, llwu_external_pin_mode_t pinMode)
13 {
14 #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32))
15 volatile uint32_t *regBase;
16 uint32_t regOffset;
17 uint32_t reg;
18
19 switch (pinIndex >> 4U)
20 {
21 case 0U:
22 regBase = &base->PE1;
23 break;
24 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16))
25 case 1U:
26 regBase = &base->PE2;
27 break;
28 #endif
29 default:
30 regBase = NULL;
31 break;
32 }
33 #else
34 volatile uint8_t *regBase;
35 uint8_t regOffset;
36 uint8_t reg;
37 switch (pinIndex >> 2U)
38 {
39 case 0U:
40 regBase = &base->PE1;
41 break;
42 case 1U:
43 regBase = &base->PE2;
44 break;
45 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8))
46 case 2U:
47 regBase = &base->PE3;
48 break;
49 #endif
50 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 12))
51 case 3U:
52 regBase = &base->PE4;
53 break;
54 #endif
55 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16))
56 case 4U:
57 regBase = &base->PE5;
58 break;
59 #endif
60 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 20))
61 case 5U:
62 regBase = &base->PE6;
63 break;
64 #endif
65 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24))
66 case 6U:
67 regBase = &base->PE7;
68 break;
69 #endif
70 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 28))
71 case 7U:
72 regBase = &base->PE8;
73 break;
74 #endif
75 default:
76 regBase = NULL;
77 break;
78 }
79 #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH == 32 */
80
81 if (regBase)
82 {
83 reg = *regBase;
84 #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32))
85 regOffset = ((pinIndex & 0x0FU) << 1U);
86 #else
87 regOffset = ((pinIndex & 0x03U) << 1U);
88 #endif
89 reg &= ~(0x3U << regOffset);
90 reg |= ((uint32_t)pinMode << regOffset);
91 *regBase = reg;
92 }
93 }
94
LLWU_GetExternalWakeupPinFlag(LLWU_Type * base,uint32_t pinIndex)95 bool LLWU_GetExternalWakeupPinFlag(LLWU_Type *base, uint32_t pinIndex)
96 {
97 #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32))
98 return (bool)(base->PF & (1U << pinIndex));
99 #else
100 volatile uint8_t *regBase;
101
102 switch (pinIndex >> 3U)
103 {
104 #if (defined(FSL_FEATURE_LLWU_HAS_PF) && FSL_FEATURE_LLWU_HAS_PF)
105 case 0U:
106 regBase = &base->PF1;
107 break;
108 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8))
109 case 1U:
110 regBase = &base->PF2;
111 break;
112 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
113 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16))
114 case 2U:
115 regBase = &base->PF3;
116 break;
117 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
118 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24))
119 case 3U:
120 regBase = &base->PF4;
121 break;
122 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
123 #else
124 case 0U:
125 regBase = &base->F1;
126 break;
127 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8))
128 case 1U:
129 regBase = &base->F2;
130 break;
131 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
132 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16))
133 case 2U:
134 regBase = &base->F3;
135 break;
136 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
137 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24))
138 case 3U:
139 regBase = &base->F4;
140 break;
141 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
142 #endif /* FSL_FEATURE_LLWU_HAS_PF */
143 default:
144 regBase = NULL;
145 break;
146 }
147
148 if (regBase)
149 {
150 return (bool)(*regBase & (1U << pinIndex % 8));
151 }
152 else
153 {
154 return false;
155 }
156 #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */
157 }
158
LLWU_ClearExternalWakeupPinFlag(LLWU_Type * base,uint32_t pinIndex)159 void LLWU_ClearExternalWakeupPinFlag(LLWU_Type *base, uint32_t pinIndex)
160 {
161 #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32))
162 base->PF = (1U << pinIndex);
163 #else
164 volatile uint8_t *regBase;
165 switch (pinIndex >> 3U)
166 {
167 #if (defined(FSL_FEATURE_LLWU_HAS_PF) && FSL_FEATURE_LLWU_HAS_PF)
168 case 0U:
169 regBase = &base->PF1;
170 break;
171 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8))
172 case 1U:
173 regBase = &base->PF2;
174 break;
175 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
176 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16))
177 case 2U:
178 regBase = &base->PF3;
179 break;
180 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
181 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24))
182 case 3U:
183 regBase = &base->PF4;
184 break;
185 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
186 #else
187 case 0U:
188 regBase = &base->F1;
189 break;
190 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8))
191 case 1U:
192 regBase = &base->F2;
193 break;
194 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
195 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16))
196 case 2U:
197 regBase = &base->F3;
198 break;
199 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
200 #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24))
201 case 3U:
202 regBase = &base->F4;
203 break;
204 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
205 #endif /* FSL_FEATURE_LLWU_HAS_PF */
206 default:
207 regBase = NULL;
208 break;
209 }
210 if (regBase)
211 {
212 *regBase = (1U << pinIndex % 8U);
213 }
214 #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */
215 }
216 #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */
217
218 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && FSL_FEATURE_LLWU_HAS_PIN_FILTER)
LLWU_SetPinFilterMode(LLWU_Type * base,uint32_t filterIndex,llwu_external_pin_filter_mode_t filterMode)219 void LLWU_SetPinFilterMode(LLWU_Type *base, uint32_t filterIndex, llwu_external_pin_filter_mode_t filterMode)
220 {
221 #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32))
222 base->FILT = ((base->FILT) & ~((LLWU_FILT_FILTSEL1_MASK | LLWU_FILT_FILTE1_MASK) << ((filterIndex - 1U) * 8U))) |
223 ((LLWU_FILT_FILTSEL1(filterMode.pinIndex) | LLWU_FILT_FILTE1(filterMode.filterMode))
224 << ((filterIndex - 1U) * 8U)) |
225 LLWU_FILT_FILTF1_MASK /* W1C to clear the FILTF flag bit. */
226 ;
227 #else
228 volatile uint8_t *regBase;
229
230 switch (filterIndex)
231 {
232 case 1U:
233 regBase = &base->FILT1;
234 break;
235 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1))
236 case 2U:
237 regBase = &base->FILT2;
238 break;
239 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
240 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2))
241 case 3U:
242 regBase = &base->FILT3;
243 break;
244 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
245 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3))
246 case 4U:
247 regBase = &base->FILT4;
248 break;
249 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
250 default:
251 regBase = NULL;
252 break;
253 }
254
255 if (NULL != regBase)
256 {
257 *regBase = (*regBase & ~(LLWU_FILT1_FILTSEL_MASK | LLWU_FILT1_FILTE_MASK)) |
258 LLWU_FILT1_FILTSEL(filterMode.pinIndex) | LLWU_FILT1_FILTE(filterMode.filterMode) |
259 LLWU_FILT1_FILTF_MASK /* W1C to clear the FILTF flag bit. */
260 ;
261 }
262 #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */
263 }
264
LLWU_GetPinFilterFlag(LLWU_Type * base,uint32_t filterIndex)265 bool LLWU_GetPinFilterFlag(LLWU_Type *base, uint32_t filterIndex)
266 {
267 #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32))
268 return (bool)(base->FILT & (1U << (filterIndex * 8U - 1)));
269 #else
270 bool status = false;
271
272 switch (filterIndex)
273 {
274 case 1:
275 status = (base->FILT1 & LLWU_FILT1_FILTF_MASK);
276 break;
277 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1))
278 case 2:
279 status = (base->FILT2 & LLWU_FILT2_FILTF_MASK);
280 break;
281 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
282 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2))
283 case 3:
284 status = (base->FILT3 & LLWU_FILT3_FILTF_MASK);
285 break;
286 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
287 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3))
288 case 4:
289 status = (base->FILT4 & LLWU_FILT4_FILTF_MASK);
290 break;
291 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
292 default:
293 break;
294 }
295
296 return status;
297 #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */
298 }
299
LLWU_ClearPinFilterFlag(LLWU_Type * base,uint32_t filterIndex)300 void LLWU_ClearPinFilterFlag(LLWU_Type *base, uint32_t filterIndex)
301 {
302 #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32))
303 uint32_t reg;
304
305 reg = base->FILT;
306 switch (filterIndex)
307 {
308 case 1:
309 reg |= LLWU_FILT_FILTF1_MASK;
310 break;
311 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1))
312 case 2:
313 reg |= LLWU_FILT_FILTF2_MASK;
314 break;
315 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1 */
316 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2))
317 case 3:
318 reg |= LLWU_FILT_FILTF3_MASK;
319 break;
320 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2 */
321 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3))
322 case 4:
323 reg |= LLWU_FILT_FILTF4_MASK;
324 break;
325 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3 */
326 default:
327 break;
328 }
329 base->FILT = reg;
330 #else
331 volatile uint8_t *regBase;
332 uint8_t reg;
333
334 switch (filterIndex)
335 {
336 case 1:
337 regBase = &base->FILT1;
338 break;
339 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1))
340 case 2:
341 regBase = &base->FILT2;
342 break;
343 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
344 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2))
345 case 3:
346 regBase = &base->FILT3;
347 break;
348 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
349 #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3))
350 case 4:
351 regBase = &base->FILT4;
352 break;
353 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
354 default:
355 regBase = NULL;
356 break;
357 }
358
359 if (regBase)
360 {
361 reg = *regBase;
362 reg |= LLWU_FILT1_FILTF_MASK;
363 *regBase = reg;
364 }
365 #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */
366 }
367 #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */
368
369 #if (defined(FSL_FEATURE_LLWU_HAS_RESET_ENABLE) && FSL_FEATURE_LLWU_HAS_RESET_ENABLE)
LLWU_SetResetPinMode(LLWU_Type * base,bool pinEnable,bool enableInLowLeakageMode)370 void LLWU_SetResetPinMode(LLWU_Type *base, bool pinEnable, bool enableInLowLeakageMode)
371 {
372 uint8_t reg;
373
374 reg = base->RST;
375 reg &= ~(LLWU_RST_LLRSTE_MASK | LLWU_RST_RSTFILT_MASK);
376 reg |=
377 (((uint32_t)pinEnable << LLWU_RST_LLRSTE_SHIFT) | ((uint32_t)enableInLowLeakageMode << LLWU_RST_RSTFILT_SHIFT));
378 base->RST = reg;
379 }
380 #endif /* FSL_FEATURE_LLWU_HAS_RESET_ENABLE */
381