1 /*
2 * Copyright 2018-2019, 2023 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #include "fsl_common.h"
10 #include "fsl_device_registers.h"
11 #include "fsl_adapter_timer.h"
12 #include "fsl_mrt.h"
13
14 typedef struct _hal_timer_handle_struct_t
15 {
16 uint32_t timeout;
17 uint32_t timerClock_Hz;
18 hal_timer_callback_t callback;
19 void *callbackParam;
20 uint8_t instance;
21 } hal_timer_handle_struct_t;
22
23 /*******************************************************************************
24 * Variables
25 ******************************************************************************/
26
27 static MRT_Type *const s_MrtBase[] = MRT_BASE_PTRS;
28
29 static hal_timer_handle_t s_timerHandle[sizeof(s_MrtBase) / sizeof(MRT_Type *)];
30 /************************************************************************************
31 *************************************************************************************
32 * Private prototypes
33 *************************************************************************************
34 ************************************************************************************/
35
36 /************************************************************************************
37 *************************************************************************************
38 * Private memory declarations
39 *************************************************************************************
40 ************************************************************************************/
HAL_TimerInterruptHandle(uint8_t instance)41 static void HAL_TimerInterruptHandle(uint8_t instance)
42 {
43 hal_timer_handle_struct_t *halTimerState = (hal_timer_handle_struct_t *)s_timerHandle[instance];
44 /* Clear interrupt flag.*/
45 MRT_ClearStatusFlags(s_MrtBase[halTimerState->instance], kMRT_Channel_0, (uint32_t)kMRT_TimerInterruptFlag);
46
47 if (halTimerState->callback != NULL)
48 {
49 halTimerState->callback(halTimerState->callbackParam);
50 }
51 }
52
53 void MRT0_IRQHandler(void);
MRT0_IRQHandler(void)54 void MRT0_IRQHandler(void)
55 {
56 HAL_TimerInterruptHandle(0);
57 SDK_ISR_EXIT_BARRIER;
58 }
59 /************************************************************************************
60 *************************************************************************************
61 * Public functions
62 *************************************************************************************
63 ************************************************************************************/
HAL_TimerInit(hal_timer_handle_t halTimerHandle,hal_timer_config_t * halTimerConfig)64 hal_timer_status_t HAL_TimerInit(hal_timer_handle_t halTimerHandle, hal_timer_config_t *halTimerConfig)
65 {
66 IRQn_Type instanceIrq[] = MRT_IRQS;
67 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
68 /* Structure of initialize MRT */
69 mrt_config_t mrtConfig;
70
71 assert(sizeof(hal_timer_handle_struct_t) == HAL_TIMER_HANDLE_SIZE);
72 assert(halTimerConfig);
73 assert(halTimerHandle);
74 assert(halTimerConfig->instance < (sizeof(s_MrtBase) / sizeof(MRT_Type *)));
75
76 halTimerState->timeout = halTimerConfig->timeout;
77 halTimerState->instance = halTimerConfig->instance;
78
79 /* mrtConfig.enableMultiTask = false; */
80 MRT_GetDefaultConfig(&mrtConfig);
81
82 /* Init mrt module */
83 MRT_Init(s_MrtBase[halTimerState->instance], &mrtConfig);
84
85 /* Setup Channel 0 to be repeated */
86 MRT_SetupChannelMode(s_MrtBase[halTimerState->instance], kMRT_Channel_0, kMRT_RepeatMode);
87
88 /* Enable timer interrupts for channel 0 */
89 MRT_EnableInterrupts(s_MrtBase[halTimerState->instance], kMRT_Channel_0, (uint32_t)kMRT_TimerInterruptEnable);
90
91 halTimerState->timerClock_Hz = halTimerConfig->srcClock_Hz;
92 s_timerHandle[halTimerState->instance] = halTimerHandle;
93 /* Enable at the irq */
94 NVIC_SetPriority((IRQn_Type)instanceIrq[halTimerState->instance], HAL_TIMER_ISR_PRIORITY);
95 (void)EnableIRQ(instanceIrq[halTimerState->instance]);
96 return kStatus_HAL_TimerSuccess;
97 }
98
HAL_TimerDeinit(hal_timer_handle_t halTimerHandle)99 void HAL_TimerDeinit(hal_timer_handle_t halTimerHandle)
100 {
101 assert(halTimerHandle);
102 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
103 s_timerHandle[halTimerState->instance] = NULL;
104 MRT_Deinit(s_MrtBase[halTimerState->instance]);
105 }
106 /*************************************************************************************/
HAL_TimerEnable(hal_timer_handle_t halTimerHandle)107 void HAL_TimerEnable(hal_timer_handle_t halTimerHandle)
108 {
109 assert(halTimerHandle);
110 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
111 MRT_StartTimer(s_MrtBase[halTimerState->instance], kMRT_Channel_0,
112 (uint32_t)USEC_TO_COUNT(halTimerState->timeout, halTimerState->timerClock_Hz));
113 }
114
115 /*************************************************************************************/
HAL_TimerDisable(hal_timer_handle_t halTimerHandle)116 void HAL_TimerDisable(hal_timer_handle_t halTimerHandle)
117 {
118 assert(halTimerHandle);
119 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
120 /* Stop channel 0 */
121 MRT_StopTimer(s_MrtBase[halTimerState->instance], kMRT_Channel_0);
122 /* Clear interrupt flag.*/
123 MRT_ClearStatusFlags(s_MrtBase[halTimerState->instance], kMRT_Channel_0, (uint32_t)kMRT_TimerInterruptFlag);
124 }
125
126 /*************************************************************************************/
HAL_TimerInstallCallback(hal_timer_handle_t halTimerHandle,hal_timer_callback_t callback,void * callbackParam)127 void HAL_TimerInstallCallback(hal_timer_handle_t halTimerHandle, hal_timer_callback_t callback, void *callbackParam)
128 {
129 assert(halTimerHandle);
130 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
131 halTimerState->callback = callback;
132 halTimerState->callbackParam = callbackParam;
133 }
134
HAL_TimerGetMaxTimeout(hal_timer_handle_t halTimerHandle)135 uint32_t HAL_TimerGetMaxTimeout(hal_timer_handle_t halTimerHandle)
136 {
137 uint32_t reserveCount;
138 uint64_t retValue;
139 uint32_t reserveMs = 4U;
140 assert(halTimerHandle);
141 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
142 reserveCount = (uint32_t)MSEC_TO_COUNT((reserveMs), (halTimerState->timerClock_Hz));
143
144 retValue = COUNT_TO_USEC(((uint64_t)0xFFFFFFFF - (uint64_t)reserveCount), (uint64_t)halTimerState->timerClock_Hz);
145 return (uint32_t)((retValue > 0xFFFFFFFFU) ? (0xFFFFFFFFU - reserveMs * 1000U) : (uint32_t)retValue);
146 }
147 /* return micro us */
HAL_TimerGetCurrentTimerCount(hal_timer_handle_t halTimerHandle)148 uint32_t HAL_TimerGetCurrentTimerCount(hal_timer_handle_t halTimerHandle)
149 {
150 assert(halTimerHandle);
151 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
152 return (uint32_t)COUNT_TO_USEC(
153 (uint64_t)MRT_GetCurrentTimerCount(s_MrtBase[halTimerState->instance], kMRT_Channel_0),
154 halTimerState->timerClock_Hz);
155 }
156
HAL_TimerUpdateTimeout(hal_timer_handle_t halTimerHandle,uint32_t timeout)157 hal_timer_status_t HAL_TimerUpdateTimeout(hal_timer_handle_t halTimerHandle, uint32_t timeout)
158 {
159 uint32_t tickCount;
160 assert(halTimerHandle);
161 hal_timer_handle_struct_t *halTimerState = halTimerHandle;
162 halTimerState->timeout = timeout;
163 tickCount = (uint32_t)USEC_TO_COUNT(halTimerState->timeout, halTimerState->timerClock_Hz);
164 if ((tickCount < 1U) || (tickCount > (MRT_CHANNEL_INTVAL_IVALUE_MASK - 0x10U)))
165 {
166 return kStatus_HAL_TimerOutOfRanger;
167 }
168 MRT_StopTimer(s_MrtBase[halTimerState->instance], kMRT_Channel_0);
169 return kStatus_HAL_TimerSuccess;
170 }
171
HAL_TimerExitLowpower(hal_timer_handle_t halTimerHandle)172 void HAL_TimerExitLowpower(hal_timer_handle_t halTimerHandle)
173 {
174 assert(halTimerHandle);
175 }
176
HAL_TimerEnterLowpower(hal_timer_handle_t halTimerHandle)177 void HAL_TimerEnterLowpower(hal_timer_handle_t halTimerHandle)
178 {
179 assert(halTimerHandle);
180 }
181