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