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