1 /*
2  * Copyright 2020 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_device_registers.h"
10 #include "fsl_adapter_time_stamp.h"
11 #include "fsl_lpit.h"
12 
13 typedef struct _hal_time_stamp_handle_struct_t
14 {
15     uint32_t timeStampClock_Hz;
16     uint8_t timeStampInstance;
17 } hal_time_stamp_handle_struct_t;
18 
19 /*******************************************************************************
20  * Variables
21  ******************************************************************************/
22 static LPIT_Type *const s_LpitBase[] = LPIT_BASE_PTRS;
23 /************************************************************************************
24 *************************************************************************************
25 * Private prototypes
26 *************************************************************************************
27 ************************************************************************************/
28 
29 /************************************************************************************
30 *************************************************************************************
31 * Private memory declarations
32 *************************************************************************************
33 ************************************************************************************/
34 
35 /************************************************************************************
36 *************************************************************************************
37 * Public functions
38 *************************************************************************************
39 ************************************************************************************/
HAL_HWTimeStampInit(hal_time_stamp_handle_t halTimeStampHandle)40 static void HAL_HWTimeStampInit(hal_time_stamp_handle_t halTimeStampHandle)
41 {
42     lpit_config_t lpitConfig;
43     lpit_chnl_params_t lpitChanneConfig;
44     hal_time_stamp_handle_struct_t *halTimeStampState = halTimeStampHandle;
45     assert(halTimeStampHandle);
46 
47     LPIT_GetDefaultConfig(&lpitConfig);
48     /* Init pit module */
49     LPIT_Init(s_LpitBase[halTimeStampState->timeStampInstance], &lpitConfig);
50 
51     lpitChanneConfig.chainChannel          = false;
52     lpitChanneConfig.enableReloadOnTrigger = false;
53     lpitChanneConfig.enableStartOnTrigger  = false;
54     lpitChanneConfig.enableStopOnTimeout   = false;
55     lpitChanneConfig.timerMode             = kLPIT_PeriodicCounter;
56     lpitChanneConfig.triggerSelect         = kLPIT_Trigger_TimerChn0;
57     lpitChanneConfig.triggerSource         = kLPIT_TriggerSource_External;
58     (void)LPIT_SetupChannel(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_0, &lpitChanneConfig);
59 
60     lpitChanneConfig.chainChannel = true;
61     (void)LPIT_SetupChannel(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_1, &lpitChanneConfig);
62 
63     LPIT_SetTimerPeriod(LPIT0, kLPIT_Chnl_1, 0xFFFFFFFFUL);
64     LPIT_StopTimer(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_1);
65     LPIT_DisableInterrupts(LPIT0, 0xFFFFFFFFUL);
66     LPIT_StartTimer(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_1);
67     LPIT_SetTimerPeriod(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_0, 0xFFFFFFFFUL);
68     LPIT_StartTimer(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_0);
69 }
70 /*!
71  * @brief Initializes the timer Stamp adapter module for a timer basic operation.
72  *
73  * @note This API should be called at the beginning of the application using the timer Stampadapter.
74  * For Initializes timer Stamp adapter,
75  *
76  * @param halTimerHandle     HAL timer adapter handle
77  * @param halTimeStampConfig A pointer to the HAL time stamp configuration structure
78  */
HAL_TimeStampInit(hal_time_stamp_handle_t halTimeStampHandle,hal_time_stamp_config_t * halTimeStampConfig)79 void HAL_TimeStampInit(hal_time_stamp_handle_t halTimeStampHandle, hal_time_stamp_config_t *halTimeStampConfig)
80 {
81     hal_time_stamp_handle_struct_t *halTimeStampState = halTimeStampHandle;
82     assert(halTimeStampHandle);
83 
84     halTimeStampState->timeStampInstance = halTimeStampConfig->instance;
85     halTimeStampState->timeStampClock_Hz = halTimeStampConfig->srcClock_Hz;
86 
87     HAL_HWTimeStampInit(halTimeStampHandle);
88 }
89 
90 /*!
91  * @brief Get the absolute time at the moment of the call.
92  *
93  * @param halTimerHandle     HAL timer adapter handle
94  * @retval the absolute time(microsecond) at the moment of the call
95  */
HAL_GetTimeStamp(hal_time_stamp_handle_t halTimeStampHandle)96 uint64_t HAL_GetTimeStamp(hal_time_stamp_handle_t halTimeStampHandle)
97 {
98     hal_time_stamp_handle_struct_t *halTimeStampState = halTimeStampHandle;
99     assert(halTimeStampHandle);
100     uint64_t count =
101         0xFFFFFFFFFFFFFFFFULL -
102         (((uint64_t)LPIT_GetCurrentTimerCount(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_1) << 32U) +
103          (uint64_t)LPIT_GetCurrentTimerCount(s_LpitBase[halTimeStampState->timeStampInstance], kLPIT_Chnl_0));
104     return COUNT_TO_USEC(count, halTimeStampState->timeStampClock_Hz);
105 }
106 
HAL_TimeStampExitLowpower(hal_time_stamp_handle_t halTimeStampHandle)107 void HAL_TimeStampExitLowpower(hal_time_stamp_handle_t halTimeStampHandle)
108 {
109     assert(halTimeStampHandle);
110     HAL_HWTimeStampInit(halTimeStampHandle);
111 }
112 
HAL_TimeStampEnterLowpower(hal_time_stamp_handle_t halTimeStampHandle)113 void HAL_TimeStampEnterLowpower(hal_time_stamp_handle_t halTimeStampHandle)
114 {
115 }
116