1 /***************************************************************************//**
2  * @file
3  * @brief System Real Time Counter (SYSRTC) Peripheral API
4  *******************************************************************************
5  * # License
6  * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
7  *******************************************************************************
8  *
9  * SPDX-License-Identifier: Zlib
10  *
11  * The licensor of this software is Silicon Laboratories Inc.
12  *
13  * This software is provided 'as-is', without any express or implied
14  * warranty. In no event will the authors be held liable for any damages
15  * arising from the use of this software.
16  *
17  * Permission is granted to anyone to use this software for any purpose,
18  * including commercial applications, and to alter it and redistribute it
19  * freely, subject to the following restrictions:
20  *
21  * 1. The origin of this software must not be misrepresented; you must not
22  *    claim that you wrote the original software. If you use this software
23  *    in a product, an acknowledgment in the product documentation would be
24  *    appreciated but is not required.
25  * 2. Altered source versions must be plainly marked as such, and must not be
26  *    misrepresented as being the original software.
27  * 3. This notice may not be removed or altered from any source distribution.
28  *
29  ******************************************************************************/
30 
31 #include "sl_hal_sysrtc.h"
32 #if defined(SYSRTC_COUNT) && (SYSRTC_COUNT > 0)
33 #include "sl_assert.h"
34 #include "stddef.h"
35 
36 /***************************************************************************//**
37  * @addtogroup sysrtc SYSRTC - System Real Time Counter
38  * @brief System Real Time Counter (SYSRTC) Peripheral API
39  * @details
40  *  This module contains functions to control the SYSRTC peripheral of Silicon
41  *  Labs 32-bit MCUs and SoCs. The SYSRTC ensures timekeeping in low energy modes.
42  * @{
43  ******************************************************************************/
44 
45 /*******************************************************************************
46  **************************   GLOBAL FUNCTIONS   *******************************
47  ******************************************************************************/
48 
49 extern __INLINE void sl_hal_sysrtc_wait_sync(void);
50 extern __INLINE void sl_hal_sysrtc_wait_ready(void);
51 extern __INLINE void sl_hal_sysrtc_start(void);
52 extern __INLINE void sl_hal_sysrtc_stop(void);
53 extern __INLINE uint32_t sl_hal_sysrtc_get_status(void);
54 extern __INLINE void sl_hal_sysrtc_lock(void);
55 extern __INLINE void sl_hal_sysrtc_unlock(void);
56 extern __INLINE uint32_t sl_hal_sysrtc_get_counter(void);
57 extern __INLINE void sl_hal_sysrtc_set_counter(uint32_t value);
58 
59 /***************************************************************************//**
60  * Initializes SYSRTC module.
61  ******************************************************************************/
sl_hal_sysrtc_init(const sl_hal_sysrtc_config_t * p_config)62 void sl_hal_sysrtc_init(const sl_hal_sysrtc_config_t *p_config)
63 {
64   // Wait to be ready
65   sl_hal_sysrtc_wait_ready();
66 
67   if (SYSRTC0->EN == SYSRTC_EN_EN) {
68     // Disable the module
69     sl_hal_sysrtc_disable();
70     // Wait to be ready
71     sl_hal_sysrtc_wait_ready();
72   }
73 
74   // Set configuration
75   SYSRTC0->CFG = (p_config->enable_debug_run ? 1UL : 0UL) << _SYSRTC_CFG_DEBUGRUN_SHIFT;
76 }
77 
78 /***************************************************************************//**
79  * Enables SYSRTC counting.
80  ******************************************************************************/
sl_hal_sysrtc_enable(void)81 void sl_hal_sysrtc_enable(void)
82 {
83   // Wait if disabling
84   sl_hal_sysrtc_wait_ready();
85 
86   // Enable SYSRTC module
87   SYSRTC0->EN_SET = SYSRTC_EN_EN;
88 
89   // Start counter
90   SYSRTC0->CMD = SYSRTC_CMD_START;
91 }
92 
93 /***************************************************************************//**
94  * Disables SYSRTC counting.
95  ******************************************************************************/
sl_hal_sysrtc_disable(void)96 void sl_hal_sysrtc_disable(void)
97 {
98   if (SYSRTC0->EN != SYSRTC_EN_EN) {
99     return;
100   }
101 
102   // Stop counter
103   sl_hal_sysrtc_stop();
104 
105   // Disable module
106   SYSRTC0->EN_CLR = SYSRTC_EN_EN;
107 }
108 
109 /***************************************************************************//**
110  * Restores SYSRTC to its reset state.
111  ******************************************************************************/
sl_hal_sysrtc_reset(void)112 void sl_hal_sysrtc_reset(void)
113 {
114   // Reset timer
115   SYSRTC0->SWRST = SYSRTC_SWRST_SWRST;
116 }
117 
118 /***************************************************************************//**
119  * Initializes the selected SYSRTC group.
120  ******************************************************************************/
sl_hal_sysrtc_init_group(uint8_t group_number,sl_hal_sysrtc_group_config_t const * p_group_config)121 void sl_hal_sysrtc_init_group(uint8_t group_number,
122                               sl_hal_sysrtc_group_config_t const *p_group_config)
123 {
124   uint32_t temp = 0;
125 
126   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
127 
128   switch (group_number) {
129     case 0:
130       temp = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP0_CTRL_CMP0EN_SHIFT);
131       if (p_group_config->p_compare_channel0_config != NULL) {
132         temp |= ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP0_CTRL_CMP0CMOA_SHIFT);
133       }
134 
135 #ifdef SYSRTC_GRP0_CTRL_CMP1EN
136       temp |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP0_CTRL_CMP1EN_SHIFT);
137       if (p_group_config->p_compare_channel1_config != NULL) {
138         temp |= ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP0_CTRL_CMP1CMOA_SHIFT);
139       }
140 #endif
141 #ifdef SYSRTC_GRP0_CTRL_CAP0EN
142       temp |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP0_CTRL_CAP0EN_SHIFT);
143       if (p_group_config->p_capture_channel0_config != NULL) {
144         temp |= ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP0_CTRL_CAP0EDGE_SHIFT);
145       }
146 #endif
147       SYSRTC0->GRP0_CTRL = temp;
148       break;
149 
150 #if SYSRTC_GROUP_NUMBER > 1
151     case 1:
152       temp = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP1_CTRL_CMP0EN_SHIFT);
153       if (p_group_config->p_compare_channel0_config != NULL) {
154         temp |= ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP1_CTRL_CMP0CMOA_SHIFT);
155       }
156 #ifdef SYSRTC_GRP1_CTRL_CMP1EN
157       temp |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP1_CTRL_CMP1EN_SHIFT);
158       if (p_group_config->p_compare_channel1_config != NULL) {
159         temp |= ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP1_CTRL_CMP1CMOA_SHIFT);
160       }
161 #endif
162 #ifdef SYSRTC_GRP1_CTRL_CAP0EN
163       temp |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP1_CTRL_CAP0EN_SHIFT);
164       if (p_group_config->p_capture_channel0_config != NULL) {
165         temp |=  ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP1_CTRL_CAP0EDGE_SHIFT);
166       }
167 #endif
168       SYSRTC0->GRP1_CTRL = temp;
169       break;
170 
171 #if SYSRTC_GROUP_NUMBER > 2
172     case 2:
173 //      SYSRTC0->GRP2_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP2_CTRL_CMP0EN_SHIFT)
174 //                           | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP2_CTRL_CMP0CMOA_SHIFT);
175 #ifdef SYSRTC_GRP2_CTRL_CMP1EN
176       SYSRTC0->GRP2_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP2_CTRL_CMP1EN_SHIFT)
177                             | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP2_CTRL_CMP1CMOA_SHIFT);
178 #endif
179 #ifdef SYSRTC_GRP2_CTRL_CAP0EN
180       SYSRTC0->GRP2_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP2_CTRL_CAP0EN_SHIFT)
181                             | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP2_CTRL_CAP0EDGE_SHIFT);
182 #endif
183       break;
184 
185 #if SYSRTC_GROUP_NUMBER > 3
186     case 3:
187       SYSRTC0->GRP3_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP3_CTRL_CMP0EN_SHIFT)
188                            | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP3_CTRL_CMP0CMOA_SHIFT);
189 #ifdef SYSRTC_GRP3_CTRL_CMP1EN
190       SYSRTC0->GRP3_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP3_CTRL_CMP1EN_SHIFT)
191                             | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP3_CTRL_CMP1CMOA_SHIFT);
192 #endif
193 #ifdef SYSRTC_GRP3_CTRL_CAP0EN
194       SYSRTC0->GRP3_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP3_CTRL_CAP0EN_SHIFT)
195                             | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP3_CTRL_CAP0EDGE_SHIFT);
196 #endif
197       break;
198 
199 #if SYSRTC_GROUP_NUMBER > 4
200     case 4:
201       SYSRTC0->GRP4_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP4_CTRL_CMP0EN_SHIFT)
202                            | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP4_CTRL_CMP0CMOA_SHIFT);
203 #ifdef SYSRTC_GRP4_CTRL_CMP1EN
204       SYSRTC0->GRP4_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP4_CTRL_CMP1EN_SHIFT)
205                             | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP4_CTRL_CMP1CMOA_SHIFT);
206 #endif
207 #ifdef SYSRTC_GRP4_CTRL_CAP0EN
208       SYSRTC0->GRP4_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP4_CTRL_CAP0EN_SHIFT)
209                             | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP4_CTRL_CAP0EDGE_SHIFT);
210 #endif
211       break;
212 
213 #if SYSRTC_GROUP_NUMBER > 5
214     case 5:
215       SYSRTC0->GRP5_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP5_CTRL_CMP0EN_SHIFT)
216                            | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP5_CTRL_CMP0CMOA_SHIFT);
217 #ifdef SYSRTC_GRP5_CTRL_CMP1EN
218       SYSRTC0->GRP5_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP5_CTRL_CMP1EN_SHIFT)
219                             | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP5_CTRL_CMP1CMOA_SHIFT);
220 #endif
221 #ifdef SYSRTC_GRP5_CTRL_CAP0EN
222       SYSRTC0->GRP5_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP5_CTRL_CAP0EN_SHIFT)
223                             | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP5_CTRL_CAP0EDGE_SHIFT);
224 #endif
225       break;
226 
227 #if SYSRTC_GROUP_NUMBER > 6
228     case 6:
229       SYSRTC0->GRP6_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP6_CTRL_CMP0EN_SHIFT)
230                            | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP6_CTRL_CMP0CMOA_SHIFT);
231 #ifdef SYSRTC_GRP6_CTRL_CMP1EN
232       SYSRTC0->GRP6_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP6_CTRL_CMP1EN_SHIFT)
233                             | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP6_CTRL_CMP1CMOA_SHIFT);
234 #endif
235 #ifdef SYSRTC_GRP6_CTRL_CAP0EN
236       SYSRTC0->GRP6_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP6_CTRL_CAP0EN_SHIFT)
237                             | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP6_CTRL_CAP0EDGE_SHIFT);
238 #endif
239       break;
240 
241 #if SYSRTC_GROUP_NUMBER > 7
242     case 7:
243       SYSRTC0->GRP7_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP7_CTRL_CMP0EN_SHIFT)
244                            | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP7_CTRL_CMP0CMOA_SHIFT);
245 #ifdef SYSRTC_GRP7_CTRL_CMP1EN
246       SYSRTC0->GRP7_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP7_CTRL_CMP1EN_SHIFT)
247                             | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP7_CTRL_CMP1CMOA_SHIFT);
248 #endif
249 #ifdef SYSRTC_GRP7_CTRL_CAP0EN
250       SYSRTC0->GRP7_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP7_CTRL_CAP0EN_SHIFT)
251                             | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP7_CTRL_CAP0EDGE_SHIFT);
252 #endif
253       break;
254 #endif
255 #endif
256 #endif
257 #endif
258 #endif
259 #endif
260 #endif
261 
262     default:
263       EFM_ASSERT(1);
264   }
265 }
266 
267 /***************************************************************************//**
268  * Enables one or more SYSRTC interrupts for the given group.
269  ******************************************************************************/
sl_hal_sysrtc_enable_group_interrupts(uint8_t group_number,uint32_t flags)270 void sl_hal_sysrtc_enable_group_interrupts(uint8_t group_number,
271                                            uint32_t flags)
272 {
273   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
274 
275   switch (group_number) {
276     case 0:
277       SYSRTC0->GRP0_IEN_SET = flags;
278       break;
279 
280 #if SYSRTC_GROUP_NUMBER > 1
281     case 1:
282       SYSRTC0->GRP1_IEN_SET = flags;
283       break;
284 
285 #if SYSRTC_GROUP_NUMBER > 2
286     case 2:
287       SYSRTC0->GRP2_IEN_SET = flags;
288       break;
289 
290 #if SYSRTC_GROUP_NUMBER > 3
291     case 3:
292       SYSRTC0->GRP3_IEN_SET = flags;
293       break;
294 
295 #if SYSRTC_GROUP_NUMBER > 4
296     case 4:
297       SYSRTC0->GRP4_IEN_SET = flags;
298       break;
299 
300 #if SYSRTC_GROUP_NUMBER > 5
301     case 5:
302       SYSRTC0->GRP5_IEN_SET = flags;
303       break;
304 
305 #if SYSRTC_GROUP_NUMBER > 6
306     case 6:
307       SYSRTC0->GRP6_IEN_SET = flags;
308       break;
309 
310 #if SYSRTC_GROUP_NUMBER > 7
311     case 7:
312       SYSRTC0->GRP7_IEN_SET = flags;
313       break;
314 #endif
315 #endif
316 #endif
317 #endif
318 #endif
319 #endif
320 #endif
321 
322     default:
323       EFM_ASSERT(1);
324   }
325 }
326 
327 /***************************************************************************//**
328  * Disables one or more SYSRTC interrupts for the given group.
329  ******************************************************************************/
sl_hal_sysrtc_disable_group_interrupts(uint8_t group_number,uint32_t flags)330 void sl_hal_sysrtc_disable_group_interrupts(uint8_t group_number,
331                                             uint32_t flags)
332 {
333   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
334 
335   switch (group_number) {
336     case 0:
337       SYSRTC0->GRP0_IEN_CLR = flags;
338       break;
339 
340 #if SYSRTC_GROUP_NUMBER > 1
341     case 1:
342       SYSRTC0->GRP1_IEN_CLR = flags;
343       break;
344 
345 #if SYSRTC_GROUP_NUMBER > 2
346     case 2:
347       SYSRTC0->GRP2_IEN_CLR = flags;
348       break;
349 
350 #if SYSRTC_GROUP_NUMBER > 3
351     case 3:
352       SYSRTC0->GRP3_IEN_CLR = flags;
353       break;
354 
355 #if SYSRTC_GROUP_NUMBER > 4
356     case 4:
357       SYSRTC0->GRP4_IEN_CLR = flags;
358       break;
359 
360 #if SYSRTC_GROUP_NUMBER > 5
361     case 5:
362       SYSRTC0->GRP5_IEN_CLR = flags;
363       break;
364 
365 #if SYSRTC_GROUP_NUMBER > 6
366     case 6:
367       SYSRTC0->GRP6_IEN_CLR = flags;
368       break;
369 
370 #if SYSRTC_GROUP_NUMBER > 7
371     case 7:
372       SYSRTC0->GRP7_IEN_CLR = flags;
373       break;
374 #endif
375 #endif
376 #endif
377 #endif
378 #endif
379 #endif
380 #endif
381 
382     default:
383       EFM_ASSERT(1);
384   }
385 }
386 
387 /***************************************************************************//**
388  * Clears one or more pending SYSRTC interrupts for the given group.
389  ******************************************************************************/
sl_hal_sysrtc_clear_group_interrupts(uint8_t group_number,uint32_t flags)390 void sl_hal_sysrtc_clear_group_interrupts(uint8_t group_number,
391                                           uint32_t flags)
392 {
393   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
394 
395   switch (group_number) {
396     case 0:
397       SYSRTC0->GRP0_IF_CLR = flags;
398       break;
399 
400 #if SYSRTC_GROUP_NUMBER > 1
401     case 1:
402       SYSRTC0->GRP1_IF_CLR = flags;
403       break;
404 
405 #if SYSRTC_GROUP_NUMBER > 2
406     case 2:
407       SYSRTC0->GRP2_IF_CLR = flags;
408       break;
409 
410 #if SYSRTC_GROUP_NUMBER > 3
411     case 3:
412       SYSRTC0->GRP3_IF_CLR = flags;
413       break;
414 
415 #if SYSRTC_GROUP_NUMBER > 4
416     case 4:
417       SYSRTC0->GRP4_IF_CLR = flags;
418       break;
419 
420 #if SYSRTC_GROUP_NUMBER > 5
421     case 5:
422       SYSRTC0->GRP5_IF_CLR = flags;
423       break;
424 
425 #if SYSRTC_GROUP_NUMBER > 6
426     case 6:
427       SYSRTC0->GRP6_IF_CLR = flags;
428       break;
429 
430 #if SYSRTC_GROUP_NUMBER > 7
431     case 7:
432       SYSRTC0->GRP7_IF_CLR = flags;
433       break;
434 #endif
435 #endif
436 #endif
437 #endif
438 #endif
439 #endif
440 #endif
441 
442     default:
443       EFM_ASSERT(1);
444   }
445 }
446 
447 /***************************************************************************//**
448  * Gets pending SYSRTC interrupt flags for the given group.
449  ******************************************************************************/
sl_hal_sysrtc_get_group_interrupts(uint8_t group_number)450 uint32_t sl_hal_sysrtc_get_group_interrupts(uint8_t group_number)
451 {
452   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
453 
454   switch (group_number) {
455     case 0:
456       return SYSRTC0->GRP0_IF;
457 
458 #if SYSRTC_GROUP_NUMBER > 1
459     case 1:
460       return SYSRTC0->GRP1_IF;
461 
462 #if SYSRTC_GROUP_NUMBER > 2
463     case 2:
464       return SYSRTC0->GRP2_IF;
465 
466 #if SYSRTC_GROUP_NUMBER > 3
467     case 3:
468       return SYSRTC0->GRP3_IF;
469 
470 #if SYSRTC_GROUP_NUMBER > 4
471     case 4:
472       return SYSRTC0->GRP4_IF;
473 
474 #if SYSRTC_GROUP_NUMBER > 5
475     case 5:
476       return SYSRTC0->GRP5_IF;
477 
478 #if SYSRTC_GROUP_NUMBER > 6
479     case 6:
480       return SYSRTC0->GRP6_IF;
481 
482 #if SYSRTC_GROUP_NUMBER > 7
483     case 7:
484       return SYSRTC0->GRP7_IF;
485 #endif
486 #endif
487 #endif
488 #endif
489 #endif
490 #endif
491 #endif
492 
493     default:
494       EFM_ASSERT(1);
495       return 0;
496   }
497 }
498 
499 /***************************************************************************//**
500  * Gets enabled and pending SYSRTC interrupt flags.
501  ******************************************************************************/
sl_hal_sysrtc_get_group_enabled_interrupts(uint8_t group_number)502 uint32_t sl_hal_sysrtc_get_group_enabled_interrupts(uint8_t group_number)
503 {
504   uint32_t ien = 0;
505 
506   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
507 
508   switch (group_number) {
509     case 0:
510       ien = SYSRTC0->GRP0_IEN;
511       return SYSRTC0->GRP0_IF & ien;
512 
513 #if SYSRTC_GROUP_NUMBER > 1
514     case 1:
515       ien = SYSRTC0->GRP1_IEN;
516       return SYSRTC0->GRP1_IF & ien;
517 
518 #if SYSRTC_GROUP_NUMBER > 2
519     case 2:
520       ien = SYSRTC0->GRP2_IEN;
521       return SYSRTC0->GRP2_IF & ien;
522 
523 #if SYSRTC_GROUP_NUMBER > 3
524     case 3:
525       ien = SYSRTC0->GRP3_IEN;
526       return SYSRTC0->GRP3_IF & ien;
527 
528 #if SYSRTC_GROUP_NUMBER > 4
529     case 4:
530       ien = SYSRTC0->GRP4_IEN;
531       return SYSRTC0->GRP4_IF & ien;
532 
533 #if SYSRTC_GROUP_NUMBER > 5
534     case 5:
535       ien = SYSRTC0->GRP5_IEN;
536       return SYSRTC0->GRP5_IF & ien;
537 
538 #if SYSRTC_GROUP_NUMBER > 6
539     case 6:
540       ien = SYSRTC0->GRP6_IEN;
541       return SYSRTC0->GRP6_IF & ien;
542 
543 #if SYSRTC_GROUP_NUMBER > 7
544     case 7:
545       ien = SYSRTC0->GRP7_IEN;
546       return SYSRTC0->GRP7_IF & ien;
547 #endif
548 #endif
549 #endif
550 #endif
551 #endif
552 #endif
553 #endif
554 
555     default:
556       EFM_ASSERT(1);
557       return 0;
558   }
559 }
560 
561 /***************************************************************************//**
562  * Sets one or more pending SYSRTC interrupts for the given group from Software.
563  ******************************************************************************/
sl_hal_sysrtc_set_group_interrupts(uint8_t group_number,uint32_t flags)564 void sl_hal_sysrtc_set_group_interrupts(uint8_t group_number,
565                                         uint32_t flags)
566 {
567   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
568 
569   switch (group_number) {
570     case 0:
571       SYSRTC0->GRP0_IF_SET = flags;
572       break;
573 
574 #if SYSRTC_GROUP_NUMBER > 1
575     case 1:
576       SYSRTC0->GRP1_IF_SET = flags;
577       break;
578 
579 #if SYSRTC_GROUP_NUMBER > 2
580     case 2:
581       SYSRTC0->GRP2_IF_SET = flags;
582       break;
583 
584 #if SYSRTC_GROUP_NUMBER > 3
585     case 3:
586       SYSRTC0->GRP3_IF_SET = flags;
587       break;
588 
589 #if SYSRTC_GROUP_NUMBER > 4
590     case 4:
591       SYSRTC0->GRP4_IF_SET = flags;
592       break;
593 
594 #if SYSRTC_GROUP_NUMBER > 5
595     case 5:
596       SYSRTC0->GRP5_IF_SET = flags;
597       break;
598 
599 #if SYSRTC_GROUP_NUMBER > 6
600     case 6:
601       SYSRTC0->GRP6_IF_SET = flags;
602       break;
603 
604 #if SYSRTC_GROUP_NUMBER > 7
605     case 7:
606       SYSRTC0->GRP7_IF_SET = flags;
607       break;
608 #endif
609 #endif
610 #endif
611 #endif
612 #endif
613 #endif
614 #endif
615 
616     default:
617       EFM_ASSERT(1);
618   }
619 }
620 
621 /***************************************************************************//**
622  * Gets SYSRTC compare register value for selected channel of given group.
623  ******************************************************************************/
sl_hal_sysrtc_get_group_compare_channel_value(uint8_t group_number,uint8_t channel)624 uint32_t sl_hal_sysrtc_get_group_compare_channel_value(uint8_t group_number,
625                                                        uint8_t channel)
626 {
627   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
628 
629   switch (group_number) {
630     case 0:
631       switch (channel) {
632         case 0:
633           return SYSRTC0->GRP0_CMP0VALUE;
634 
635 #ifdef SYSRTC_GRP0_CTRL_CMP1EN
636         case 1:
637           return SYSRTC0->GRP0_CMP1VALUE;
638 #endif
639 
640         default:
641           EFM_ASSERT(1);
642           return 0;
643       }
644       break;
645 
646 #if SYSRTC_GROUP_NUMBER > 1
647     case 1:
648       switch (channel) {
649         case 0:
650           return SYSRTC0->GRP1_CMP0VALUE;
651 
652 #ifdef SYSRTC_GRP1_CTRL_CMP1EN
653         case 1:
654           return SYSRTC0->GRP1_CMP1VALUE;
655 #endif
656 
657         default:
658           EFM_ASSERT(1);
659           return 0;
660       }
661       break;
662 
663 #if SYSRTC_GROUP_NUMBER > 2
664     case 2:
665       switch (channel) {
666         case 0:
667           return SYSRTC0->GRP2_CMP0VALUE;
668 
669 #ifdef SYSRTC_GRP2_CTRL_CMP1EN
670         case 1:
671           return SYSRTC0->GRP2_CMP1VALUE;
672 #endif
673 
674         default:
675           EFM_ASSERT(1);
676           return 0;
677       }
678       break;
679 
680 #if SYSRTC_GROUP_NUMBER > 3
681     case 3:
682       switch (channel) {
683         case 0:
684           return SYSRTC0->GRP3_CMP0VALUE;
685 
686 #ifdef SYSRTC_GRP3_CTRL_CMP1EN
687         case 1:
688           return SYSRTC0->GRP3_CMP1VALUE;
689 #endif
690 
691         default:
692           EFM_ASSERT(1);
693           return 0;
694       }
695       break;
696 
697 #if SYSRTC_GROUP_NUMBER > 4
698     case 4:
699       switch (channel) {
700         case 0:
701           return SYSRTC0->GRP4_CMP0VALUE;
702 
703 #ifdef SYSRTC_GRP4_CTRL_CMP1EN
704         case 1:
705           return SYSRTC0->GRP4_CMP1VALUE;
706 #endif
707 
708         default:
709           EFM_ASSERT(1);
710           return 0;
711       }
712       break;
713 
714 #if SYSRTC_GROUP_NUMBER > 5
715     case 5:
716       switch (channel) {
717         case 0:
718           return SYSRTC0->GRP5_CMP0VALUE;
719 
720 #ifdef SYSRTC_GRP5_CTRL_CMP1EN
721         case 1:
722           return SYSRTC0->GRP5_CMP1VALUE;
723 #endif
724 
725         default:
726           EFM_ASSERT(1);
727           return 0;
728       }
729       break;
730 
731 #if SYSRTC_GROUP_NUMBER > 6
732     case 6:
733       switch (channel) {
734         case 0:
735           return SYSRTC0->GRP6_CMP0VALUE;
736 
737 #ifdef SYSRTC_GRP6_CTRL_CMP1EN
738         case 1:
739           return SYSRTC0->GRP6_CMP1VALUE;
740 #endif
741 
742         default:
743           EFM_ASSERT(1);
744           return 0;
745       }
746       break;
747 
748 #if SYSRTC_GROUP_NUMBER > 7
749     case 7:
750       switch (channel) {
751         case 0:
752           return SYSRTC0->GRP7_CMP0VALUE;
753 
754 #ifdef SYSRTC_GRP7_CTRL_CMP1EN
755         case 1:
756           return SYSRTC0->GRP7_CMP1VALUE;
757 #endif
758 
759         default:
760           EFM_ASSERT(1);
761           return 0;
762       }
763       break;
764 #endif
765 #endif
766 #endif
767 #endif
768 #endif
769 #endif
770 #endif
771 
772     default:
773       EFM_ASSERT(1);
774       return 0;
775   }
776 }
777 
778 /***************************************************************************//**
779  * Sets SYSRTC compare register value for selected channel of given group.
780  ******************************************************************************/
sl_hal_sysrtc_set_group_compare_channel_value(uint8_t group_number,uint8_t channel,uint32_t value)781 void sl_hal_sysrtc_set_group_compare_channel_value(uint8_t group_number,
782                                                    uint8_t channel,
783                                                    uint32_t value)
784 {
785   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
786 
787   switch (group_number) {
788     case 0:
789       switch (channel) {
790         case 0:
791           SYSRTC0->GRP0_CMP0VALUE = value;
792           break;
793 
794 #ifdef SYSRTC_GRP0_CTRL_CMP1EN
795         case 1:
796           SYSRTC0->GRP0_CMP1VALUE = value;
797           break;
798 #endif
799 
800         default:
801           EFM_ASSERT(1);
802       }
803       break;
804 
805 #if SYSRTC_GROUP_NUMBER > 1
806     case 1:
807       switch (channel) {
808         case 0:
809           SYSRTC0->GRP1_CMP0VALUE = value;
810           break;
811 
812 #ifdef SYSRTC_GRP1_CTRL_CMP1EN
813         case 1:
814           SYSRTC0->GRP1_CMP1VALUE = value;
815           break;
816 #endif
817 
818         default:
819           EFM_ASSERT(1);
820       }
821       break;
822 
823 #if SYSRTC_GROUP_NUMBER > 2
824     case 2:
825       switch (channel) {
826         case 0:
827           SYSRTC0->GRP2_CMP0VALUE = value;
828           break;
829 
830 #ifdef SYSRTC_GRP2_CTRL_CMP1EN
831         case 1:
832           SYSRTC0->GRP2_CMP1VALUE = value;
833           break;
834 #endif
835 
836         default:
837           EFM_ASSERT(1);
838       }
839       break;
840 
841 #if SYSRTC_GROUP_NUMBER > 3
842     case 3:
843       switch (channel) {
844         case 0:
845           SYSRTC0->GRP3_CMP0VALUE = value;
846           break;
847 
848 #ifdef SYSRTC_GRP3_CTRL_CMP1EN
849         case 1:
850           SYSRTC0->GRP3_CMP1VALUE = value;
851           break;
852 #endif
853 
854         default:
855           EFM_ASSERT(1);
856       }
857       break;
858 
859 #if SYSRTC_GROUP_NUMBER > 4
860     case 4:
861       switch (channel) {
862         case 0:
863           SYSRTC0->GRP4_CMP0VALUE = value;
864           break;
865 
866 #ifdef SYSRTC_GRP4_CTRL_CMP1EN
867         case 1:
868           SYSRTC0->GRP4_CMP1VALUE = value;
869           break;
870 #endif
871 
872         default:
873           EFM_ASSERT(1);
874       }
875       break;
876 
877 #if SYSRTC_GROUP_NUMBER > 5
878     case 5:
879       switch (channel) {
880         case 0:
881           SYSRTC0->GRP5_CMP0VALUE = value;
882           break;
883 
884 #ifdef SYSRTC_GRP5_CTRL_CMP1EN
885         case 1:
886           SYSRTC0->GRP5_CMP1VALUE = value;
887           break;
888 #endif
889 
890         default:
891           EFM_ASSERT(1);
892       }
893       break;
894 
895 #if SYSRTC_GROUP_NUMBER > 6
896     case 6:
897       switch (channel) {
898         case 0:
899           SYSRTC0->GRP6_CMP0VALUE = value;
900           break;
901 
902 #ifdef SYSRTC_GRP6_CTRL_CMP1EN
903         case 1:
904           SYSRTC0->GRP6_CMP1VALUE = value;
905           break;
906 #endif
907 
908         default:
909           EFM_ASSERT(1);
910       }
911       break;
912 
913 #if SYSRTC_GROUP_NUMBER > 7
914     case 7:
915       switch (channel) {
916         case 0:
917           SYSRTC0->GRP7_CMP0VALUE = value;
918           break;
919 
920 #ifdef SYSRTC_GRP7_CTRL_CMP1EN
921         case 1:
922           SYSRTC0->GRP7_CMP1VALUE = value;
923           break;
924 #endif
925 
926         default:
927           EFM_ASSERT(1);
928       }
929       break;
930 #endif
931 #endif
932 #endif
933 #endif
934 #endif
935 #endif
936 #endif
937 
938     default:
939       EFM_ASSERT(1);
940   }
941 }
942 
943 /***************************************************************************//**
944  * Gets SYSRTC input capture register value for selected channel of given group.
945  ******************************************************************************/
sl_hal_sysrtc_get_group_capture_channel_value(uint8_t group_number)946 uint32_t sl_hal_sysrtc_get_group_capture_channel_value(uint8_t group_number)
947 {
948   EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
949 
950   switch (group_number) {
951 #ifdef SYSRTC_GRP0_CTRL_CAP0EN
952     case 0:
953       return SYSRTC0->GRP0_CAP0VALUE;
954 #endif
955 
956 #if SYSRTC_GROUP_NUMBER > 1
957 #ifdef SYSRTC_GRP1_CTRL_CAP0EN
958     case 1:
959       return SYSRTC0->GRP1_CAP0VALUE;
960 #endif
961 
962 #if SYSRTC_GROUP_NUMBER > 2
963 #ifdef SYSRTC_GRP2_CTRL_CAP0EN
964     case 2:
965       return SYSRTC0->GRP2_CAP0VALUE;
966 #endif
967 
968 #if SYSRTC_GROUP_NUMBER > 3
969 #ifdef SYSRTC_GRP3_CTRL_CAP0EN
970     case 3:
971       return SYSRTC0->GRP3_CAP0VALUE;
972 #endif
973 
974 #if SYSRTC_GROUP_NUMBER > 4
975 #ifdef SYSRTC_GRP4_CTRL_CAP0EN
976     case 4:
977       return SYSRTC0->GRP4_CAP0VALUE;
978 #endif
979 
980 #if SYSRTC_GROUP_NUMBER > 5
981 #ifdef SYSRTC_GRP5_CTRL_CAP0EN
982     case 5:
983       return SYSRTC0->GRP5_CAP0VALUE;
984 #endif
985 
986 #if SYSRTC_GROUP_NUMBER > 6
987 #ifdef SYSRTC_GRP6_CTRL_CAP0EN
988     case 6:
989       return SYSRTC0->GRP6_CAP0VALUE;
990 #endif
991 
992 #if SYSRTC_GROUP_NUMBER > 7
993 #ifdef SYSRTC_GRP7_CTRL_CAP0EN
994     case 7:
995       return SYSRTC0->GRP7_CAP0VALUE;
996 #endif
997 #endif
998 #endif
999 #endif
1000 #endif
1001 #endif
1002 #endif
1003 #endif
1004 
1005     default:
1006       EFM_ASSERT(1);
1007       return 0;
1008   }
1009 }
1010 
1011 /** @} (end addtogroup sysrtc) */
1012 #endif /* defined(SYSRTC_COUNT) && (SYSRTC_COUNT > 0) */
1013