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