AM64x MCU+ SDK  08.02.00
icss_timeSync.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Texas Instruments Incorporated
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef ICSS_TIMESYNC_H_
34 #define ICSS_TIMESYNC_H_
35 
36 /* ========================================================================== */
37 /* Include Files */
38 /* ========================================================================== */
39 #include <stdlib.h>
40 #include <math.h>
42 #include "icss_timeSyncApi.h"
43 
44 /* ========================================================================== */
45 /* Error Codes */
46 /* ========================================================================== */
50 #define TIME_SYNC_OK (1)
51 
54 #define TIME_SYNC_UNABLE_TO_CREATE_TASK (-1)
55 
58 #define TIME_SYNC_UNABLE_TO_CREATE_SEMAPHORE (-2)
59 
62 #define TIME_SYNC_UNABLE_TO_CREATE_INTERRUPT (-3)
63 
66 #define TIME_SYNC_UNABLE_TO_ALLOC_MEM (-4)
67 
70 #define TIME_SYNC_UNABLE_TO_CREATE_CLOCK (-5)
71 
74 #define TIME_SYNC_UNABLE_TO_CREATE_MAILBOX (-6)
75 
78 #define TIME_SYNC_UNABLE_TO_CREATE_EVENT (-7)
79 
82 #define TIME_SYNC_UNSUPPORTED_FORMAT (-8)
83 
86 #define TIME_SYNC_EDMA_INIT_FAILED (-9)
87 
90 #define TIME_SYNC_FEATURE_NOT_ENABLED (-10)
91 
94 #define TIME_SYNC_HANDLE_NOT_INITIALIZED (-11)
95 
96 
97 /* ========================================================================== */
98 /* Macros & Typedefs */
99 /* ========================================================================== */
104 #define DEFAULT_PDELAY_REQ_LOG_INTERVAL 3
105 
109 #define DEFAULT_SYNC_SEND_LOG_INTERVAL 0
110 
114 #define DEFAULT_ANNOUNCE_SEND_LOG_INTERVAL 1
115 
119 #define DEFAULT_ANNOUNCE_TIMEOUT_LOG_INTERVAL 3
120 
125 #define TIMESYNC_SYNC_ISR_MASK_P1 0x400000
126 
131 #define TIMESYNC_SYNC_ISR_MASK_P2 0x2000000
132 
133 /*
134  * \def TIMESYNC_TX_TS_ISR_MASK_P1
135  * Interrupt mask for PRU event 23
136  */
137 #define TIMESYNC_TX_TS_ISR_MASK_P1 0x800000
138 
142 #define TIMESYNC_TX_TS_ISR_MASK_P2 0x1000000
143 
148 #define PTP_SYNC_MSG_ID 0x00
149 
153 #define PTP_DLY_REQ_MSG_ID 0x01
154 
158 #define PTP_PDLY_REQ_MSG_ID 0x02
159 
163 #define PTP_PDLY_RSP_MSG_ID 0x03
164 
168 #define PTP_FOLLOW_UP_MSG_ID 0x08
169 
173 #define PTP_DLY_RESP_MSG_ID 0x09
174 
178 #define PTP_PDLY_RESP_FLW_UP_MSG_ID 0x0A
179 
183 #define PTP_ANNOUNCE_MSG_ID 0x0B
184 
188 #define PTP_MGMT_MSG_ID 0x0D
189 
194 #define PTP_FLW_UP_CTRL_MSG_ID 0x02
195 
200 #define SEC_TO_NS 1000000000
201 
206 #define FILTER_ALPHA_COEFF 0.85
207 
212 #define PTP_SYNC0_PERIOD_DIVIDER 4
213 
219 #define OFFSET_THRESHOLD_FOR_RESET 10000
220 
226 #define STABLE_FILTER_THRESHOLD 100
227 
237 #define TIMESYNC_PEER_DELAY_ERROR_THRESHOLD 10000
238 
244 #define NUM_SYNC_MISSED_THRESHOLD 3
245 
250 #define AVG_NUM_DELAY_MEASUREMENTS 3
251 
252 /*Hex Offsets for different fields in PTP Delay Req/Res Packet. Annex E*/
253 /*To get Annex F offsets subtract ANNEX_D_ANNEX_F_DIFF from it*/
254 
259 #define SRC_MAC_OFFSET 6
260 
264 #define IP_DSCP_OFFSET 15
265 
269 #define SRC_IP_OFFSET 26
270 
274 #define DST_IP_OFFSET 30
275 
279 #define IP_CHKSUM_OFFSET 40
280 
284 #define PTP_MSG_ID_OFFSET 42
285 
289 #define PTP_DOMAIN_NUM_OFFSET 46
290 
294 #define PTP_FLAG_OFFSET 48
295 
299 #define PTP_CORRECTION_OFFSET 50
300 
304 #define PTP_SRC_CLK_IDENTITY 62
305 
309 #define PTP_SRC_PORT_ID_OFFSET 70
310 
314 #define PTP_SEQ_ID_OFFSET 72
315 
320 #define PTP_CONTROL_MSG_ID_OFFSET 74
321 
325 #define PTP_LOG_MSG_PERIOD 75
326 
330 #define PTP_REQ_RCPT_TS_SEC_OFFSET 76
331 
335 #define PTP_REQ_RCPT_TS_NSEC_OFFSET 82
336 
340 #define PTP_REQ_SRC_PORT_IDENTITY 86
341 
345 #define PTP_REQ_SRC_PORT_ID 94
346 
351 #define PTP_UTC_OFFSET 86
352 
357 #define PTP_PRIORITY1_OFFSET 89
358 
363 #define PTP_GM_CLK_CLASS_OFFSET 90
364 
369 #define PTP_GM_CLK_ACCU_OFFSET 91
370 
375 #define PTP_GM_CLK_VARIANCE_OFFSET 92
376 
381 #define PTP_PRIORITY2_OFFSET 94
382 
387 #define PTP_GM_CLK_IDENTITY_OFFSET 95
388 
393 #define PTP_STEPS_REMOVED_OFFSET 103
394 
399 #define PTP_TIME_SRC_OFFSET 105
400 
405 #define PTP_E2E_BUFFER_OFFSET 42
406 
410 #define PTP_P2P_BUFFER_OFFSET 14
411 
416 #define ANNEX_D_ANNEX_F_DIFF 28
417 
421 #define HSR_CORRECTION 6
422 
427 #define SRC_DST_MAC_SIZE 12
428 
433 #define PTP_LEAP_61_MASK (1<<0)
434 
438 #define PTP_LEAP_59_MASK (1<<1)
439 
443 #define PTP_UTC_REASONABLE_MASK (1<<2)
444 
449 #define PTP_TIMESCALE_MASK (1<<3)
450 
455 #define PTP_TIME_TRACEABLE_MASK (1<<4)
456 
461 #define PTP_FREQ_TRACEABLE_MASK (1<<5)
462 
467 #define PTP_ALTERNATE_MASTER_MASK (1<<8)
468 
474 #define PTP_TWO_STEP_MASK (1<<9)
475 
480 #define PTP_UNICAST_MASK (1<<10)
481 
487 #define PTP_PROFILE_SPECIFIC_1_MASK (1<<13)
488 
494 #define PTP_PROFILE_SPECIFIC_2_MASK (1<<14)
495 
500 #define PTP_SECURITY_MASK (1<<15)
501 
507 #define SYNC_INTERVAL_PERIOD_CHANGE_THRESHOLD 60
508 
513 #define GPTP_NUM_DOMAINS 2
514 
519 #define PTP_FLAG_SIZE (2)
520 
525 #define PTP_SRC_CLK_IDENTITY_SIZE (8)
526 
530 #define PTP_SRC_PORT_ID_SIZE (2)
531 
536 #define PTP_GM_CLK_IDENTITY_SIZE (8)
537 
542 #define PTP_GM_CLK_CLASS_SIZE (1)
543 
548 #define PTP_GM_CLK_ACCU_SIZE (1)
549 
554 #define PTP_GM_CLK_VARIANCE_SIZE (2)
555 
560 #define PTP_UTC_SIZE (2)
561 
566 #define PTP_TIME_SRC_SIZE (1)
567 
572 #define PTP_PRIORITY1_SIZE (1)
573 
578 #define PTP_PRIORITY2_SIZE (1)
579 
584 #define PTP_STEPS_REMOVED_SIZE (2)
585 
586 /* ========================================================================== */
587 /* Function Definitions */
588 /* ========================================================================== */
600  uint8_t portNum);
601 
612 void TimeSync_Port1linkResetCallBack(uint8_t linkStatus, void *arg2);
613 
619 void TimeSync_Port2linkResetCallBack(uint8_t linkStatus, void *arg2);
620 
632 
643  uint8_t *pktBuffer, \
644  uint8_t portNum, uint16_t size, uint8_t isLinkLocal);
645 
651 
658  uint8_t *parentMac);
665  uint8_t *prevMac);
672  int8_t *buff);
680 
691 void TimeSync_getTxTS(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum,
692  ptpFrameTypes_t frameType);
693 
701 
710  uint8_t twoStep, uint8_t portNum);
721  uint8_t *buff, \
722  uint8_t followUp, uint8_t portNum, uint16_t size);
731  uint8_t *buff, \
732  uint8_t portNum);
741  uint8_t *buff, \
742  uint8_t portNum);
752  uint8_t *buff, \
753  uint8_t followUp, uint8_t portNum);
761  uint8_t portNum);
762 
770 
777 void TimeSync_calcNRR(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum);
786  uint8_t portNum);
787 
794 
802  uint8_t portNum);
803 
805  uint8_t *pktBuffer);
806 
807 
808 uint64_t getIEPTimestamp(TimeSync_ParamsHandle_t timeSyncHandle);
809 
810 #endif /* ICSS_TIMESYNC_H_ */
TimeSync_processPdelayRespFrame
void TimeSync_processPdelayRespFrame(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *buff, uint8_t followUp, uint8_t portNum)
size
uint16_t size
Definition: tisci_boardcfg.h:1
TimeSync_forced2StepBDCalc
void TimeSync_forced2StepBDCalc(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum)
TimeSync_Port1linkResetCallBack
void TimeSync_Port1linkResetCallBack(uint8_t linkStatus, void *arg2)
Callback for link status change on Port 1.
TimeSync_getPrevAddress
void TimeSync_getPrevAddress(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *prevMac)
Retuns the previous master's MAC ID.
TimeSync_dummyBMCA
void TimeSync_dummyBMCA(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *pktBuffer)
TimeSync_lineDelayCalc
void TimeSync_lineDelayCalc(TimeSync_ParamsHandle_t timeSyncHandle)
TimeSync_processSyncFrame
void TimeSync_processSyncFrame(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *buff, uint8_t followUp, uint8_t portNum, uint16_t size)
TimeSync_writeTS_SingleStep_Sync
void TimeSync_writeTS_SingleStep_Sync(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum)
icss_emac.h
TimeSync_processPTPFrame
void TimeSync_processPTPFrame(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *pktBuffer, uint8_t portNum, uint16_t size, uint8_t isLinkLocal)
Processes a PTP message and extract fields.
TimeSync_calcRcfAndSyncInterval
void TimeSync_calcRcfAndSyncInterval(TimeSync_ParamsHandle_t timeSyncHandle)
TimeSync_Port2linkResetCallBack
void TimeSync_Port2linkResetCallBack(uint8_t linkStatus, void *arg2)
Callback for link status change on Port 2.
TimeSync_processPdelayReqFrame
void TimeSync_processPdelayReqFrame(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *buff, uint8_t portNum)
TimeSync_resetIEP
void TimeSync_resetIEP(TimeSync_ParamsHandle_t timeSyncHandle)
Resets CMP1 once first adjustment is done, else 1PPS signal doesn't trigger.
TimeSync_updateNRRParams
void TimeSync_updateNRRParams(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum)
getIEPTimestamp
uint64_t getIEPTimestamp(TimeSync_ParamsHandle_t timeSyncHandle)
TimeSync_isEnabled
uint8_t TimeSync_isEnabled(TimeSync_ParamsHandle_t timeSyncHandle)
Return True/False 1/0 if timeSync module is enabled.
TimeSync_updateParentAddress
void TimeSync_updateParentAddress(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *parentMac)
Write the MAC ID of PTP master to Firmware. BMC Algorithm should call this API.
TimeSync_calcNRR
void TimeSync_calcNRR(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum)
TimeSync_doFirstAdjustment
void TimeSync_doFirstAdjustment(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum)
Do initial adjustment for the IEP based on sync timestamp.
TimeSync_peerDelayCalc
void TimeSync_peerDelayCalc(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t twoStep, uint8_t portNum)
TimeSync_synchronizeClock
void TimeSync_synchronizeClock(TimeSync_ParamsHandle_t timeSyncHandle)
TimeSync_processDelayResFrame
void TimeSync_processDelayResFrame(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t *buff, uint8_t portNum)
TimeSync_getTxTS
void TimeSync_getTxTS(TimeSync_ParamsHandle_t timeSyncHandle, uint8_t portNum, ptpFrameTypes_t frameType)
TimeSync_getGeneralMessage
void TimeSync_getGeneralMessage(TimeSync_ParamsHandle_t timeSyncHandle, int8_t *buff)
Copies the PTP announce message data to PTP stack buffer.
icss_timeSyncApi.h
TimeSync_reset
void TimeSync_reset(TimeSync_ParamsHandle_t timeSyncHandle)
Reset the state machine in firmware to restart synchronization (First adjustment happens again)
TimeSync_rxPhyDelayCorrection
void TimeSync_rxPhyDelayCorrection(TimeSync_ParamsHandle_t timeSyncHandle)
Performs PHY delay correction on Rx timestamp Assumption : The function expects the timestamp in rxTi...
TimeSync_ParamsHandle_t
struct TimeSync_ParamsHandle_s * TimeSync_ParamsHandle_t
Definition: icss_timeSyncApi.h:1016
ptpFrameTypes_t
ptpFrameTypes_t
PTP Delay Mechanism Type. From Table 9 of Standard.
Definition: icss_timeSyncApi.h:203