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_pit.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 PIT_Type *const s_PitBase[] = PIT_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     pit_config_t pitConfig;
43     hal_time_stamp_handle_struct_t *halTimeStampState = halTimeStampHandle;
44     assert(halTimeStampHandle);
45     PIT_GetDefaultConfig(&pitConfig);
46     /* Init pit module */
47     PIT_Init(s_PitBase[halTimeStampState->timeStampInstance], &pitConfig);
48 #if (defined(FSL_FEATURE_PIT_HAS_CHAIN_MODE) && (FSL_FEATURE_PIT_HAS_CHAIN_MODE > 0))
49     PIT_SetTimerPeriod(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_1, 0xFFFFFFFFUL);
50     PIT_StopTimer(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_1);
51     PIT_DisableInterrupts(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_1, 0xFFFFFFFFUL);
52     PIT_SetTimerChainMode(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_1, true);
53     PIT_StartTimer(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_1);
54 #endif
55     PIT_SetTimerPeriod(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_0, 0xFFFFFFFFUL);
56     PIT_StartTimer(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_0);
57 }
58 /*!
59  * @brief Initializes the timer Stamp adapter module for a timer basic operation.
60  *
61  * @note This API should be called at the beginning of the application using the timer Stampadapter.
62  * For Initializes timer Stamp adapter,
63  *
64  * @param halTimerHandle     HAL timer adapter handle
65  * @param halTimeStampConfig A pointer to the HAL time stamp configuration structure
66  */
HAL_TimeStampInit(hal_time_stamp_handle_t halTimeStampHandle,hal_time_stamp_config_t * halTimeStampConfig)67 void HAL_TimeStampInit(hal_time_stamp_handle_t halTimeStampHandle, hal_time_stamp_config_t *halTimeStampConfig)
68 {
69     hal_time_stamp_handle_struct_t *halTimeStampState = halTimeStampHandle;
70     assert(halTimeStampHandle);
71 
72     halTimeStampState->timeStampInstance = halTimeStampConfig->instance;
73     halTimeStampState->timeStampClock_Hz = halTimeStampConfig->srcClock_Hz;
74 
75     HAL_HWTimeStampInit(halTimeStampHandle);
76 }
77 
78 /*!
79  * @brief Get the absolute time at the moment of the call.
80  *
81  * @param halTimerHandle     HAL timer adapter handle
82  * @retval the absolute time(microsecond) at the moment of the call
83  */
HAL_GetTimeStamp(hal_time_stamp_handle_t halTimeStampHandle)84 uint64_t HAL_GetTimeStamp(hal_time_stamp_handle_t halTimeStampHandle)
85 {
86     hal_time_stamp_handle_struct_t *halTimeStampState = halTimeStampHandle;
87     assert(halTimeStampHandle);
88 #if (defined(FSL_FEATURE_PIT_HAS_CHAIN_MODE) && (FSL_FEATURE_PIT_HAS_CHAIN_MODE > 0))
89 #if (defined(FSL_FEATURE_PIT_HAS_LIFETIME_TIMER) && (FSL_FEATURE_PIT_HAS_LIFETIME_TIMER > 0))
90     uint64_t count = 0xFFFFFFFFFFFFFFFFULL - PIT_GetLifetimeTimerCount(s_PitBase[halTimeStampState->timeStampInstance]);
91 #else
92     uint64_t count =
93         0xFFFFFFFFFFFFFFFFULL -
94         (((uint64_t)PIT_GetCurrentTimerCount(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_1) << 32U) +
95          (uint64_t)PIT_GetCurrentTimerCount(s_PitBase[halTimeStampState->timeStampInstance], kPIT_Chnl_0));
96 #endif
97 #else
98     uint64_t count = 0xFFFFFFFFUL - PIT_GetCurrentTimerCount(s_PitBase[halTimeStampState->timeStampInstance]);
99 #endif
100 
101     return COUNT_TO_USEC(count, halTimeStampState->timeStampClock_Hz);
102 }
103 
HAL_TimeStampExitLowpower(hal_time_stamp_handle_t halTimeStampHandle)104 void HAL_TimeStampExitLowpower(hal_time_stamp_handle_t halTimeStampHandle)
105 {
106     assert(halTimeStampHandle);
107     HAL_HWTimeStampInit(halTimeStampHandle);
108 }
109 
HAL_TimeStampEnterLowpower(hal_time_stamp_handle_t halTimeStampHandle)110 void HAL_TimeStampEnterLowpower(hal_time_stamp_handle_t halTimeStampHandle)
111 {
112 }
113