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