611 lines
21 KiB
C
611 lines
21 KiB
C
![]() |
/******************************************************************************
|
||
|
*
|
||
|
* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved.
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
* of this software and associated documentation files (the "Software"), to deal
|
||
|
* in the Software without restriction, including without limitation the rights
|
||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
* copies of the Software, and to permit persons to whom the Software is
|
||
|
* furnished to do so, subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be included in
|
||
|
* all copies or substantial portions of the Software.
|
||
|
*
|
||
|
* Use of the Software is limited solely to applications:
|
||
|
* (a) running on a Xilinx device, or
|
||
|
* (b) that interact with a Xilinx device through a bus or interconnect.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
* XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||
|
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||
|
* SOFTWARE.
|
||
|
*
|
||
|
* Except as contained in this notice, the name of the Xilinx shall not be used
|
||
|
* in advertising or otherwise to promote the sale, use or other dealings in
|
||
|
* this Software without prior written authorization from Xilinx.
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
/**
|
||
|
*
|
||
|
* @file xemacps_ieee1588.h
|
||
|
*
|
||
|
* Defines hash defines, common data types and prototypes to be used with the
|
||
|
* PTP standalone example source code residing in this directory.
|
||
|
*
|
||
|
* The PTP standalone example files implement the basic PTPv2 protocol as an
|
||
|
* example application. However the accuracy of clock offset adjustment is
|
||
|
* not guaranted as of now. Also the clock rate adjustment and signalling
|
||
|
* frames are not implemented. Also it may not be implementing all aspects of
|
||
|
* PTPv2 strictly as per specs. Since it is based on AVB driver (which is
|
||
|
* 802.1as based), some aspects of 802.1as which are not there in IEEE1588
|
||
|
* may be there in the protocol implementation inadvertently. The sync frame
|
||
|
* interval, announce frame interval and PDelayReq frame intervals are
|
||
|
* hard-coded.
|
||
|
*
|
||
|
* <pre>
|
||
|
* MODIFICATION HISTORY:
|
||
|
*
|
||
|
* Ver Who Date Changes
|
||
|
* ----- ---- -------- -----------------------------------------------
|
||
|
* 1.00a asa 09/16/11 First release based on AVB driver
|
||
|
* 1.01a asa 03/03/12 New hashdefines are added and new function prototypes
|
||
|
* are added.
|
||
|
*
|
||
|
* </pre>
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
#ifndef XEMACPS_IEEE1588_H
|
||
|
#define XEMACPS_IEEE1588_H
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/***************************** Include Files *********************************/
|
||
|
|
||
|
/************************** Constant Definitions *****************************/
|
||
|
|
||
|
#define DEBUG_XEMACPS_LEVEL1 /*
|
||
|
* Error messages which should be printed on
|
||
|
* console. It does not include error messages
|
||
|
* from interrupt service routines.
|
||
|
*/
|
||
|
#undef DEBUG_LEVEL_TWO /*
|
||
|
* Other debug messages, e.g. function names being
|
||
|
* executed, PTP protocl messages etc.
|
||
|
*/
|
||
|
|
||
|
/* PTP Packet Message Type Definitions */
|
||
|
#define XEMACPS_PTP_TYPE_SYNC 0x0
|
||
|
#define XEMACPS_PTP_TYPE_FOLLOW_UP 0x8
|
||
|
#define XEMACPS_PTP_TYPE_PDELAYREQ 0x2
|
||
|
#define XEMACPS_PTP_TYPE_PDELAYRESP 0x3
|
||
|
#define XEMACPS_PTP_TYPE_PDELAYRESP_FOLLOW_UP 0xA
|
||
|
#define XEMACPS_PTP_TYPE_ANNOUNCE 0xB
|
||
|
#define XEMACPS_PTP_TYPE_SIGNALING 0xC
|
||
|
|
||
|
|
||
|
#define XEMACPS_PKT_TYPE_DISABLED 0xffff
|
||
|
#define XEMACPS_PKT_MAX_BUF_LEN 128
|
||
|
|
||
|
|
||
|
/*
|
||
|
* XEMACPS_ANNOUNCE_RECEIPT_TIMEOUT is the number of announce
|
||
|
* intervals without the receipt of an Announce message from
|
||
|
* the GM that are allowed before the GM is assumed to be no
|
||
|
* longer present and BMCA should be run again
|
||
|
*/
|
||
|
#define XEMACPS_ANNOUNCE_RECEIPT_TIMEOUT 5
|
||
|
|
||
|
/*
|
||
|
* XEMACPS_SYNC_RECEIPT_TIMEOUT is the number of sync intervals
|
||
|
* without the receipt of an Sync message from the GM that are
|
||
|
* allowed before the GM is assumed to be no longer present and
|
||
|
* BMCA should be run again
|
||
|
*/
|
||
|
#define XEMACPS_SYNC_RECEIPT_TIMEOUT 5
|
||
|
|
||
|
/*
|
||
|
* XEMACPS_NEIGHBOR_PROP_DELAY_THRESH is the maximum allowed delay
|
||
|
* (in nanosecs) across a full duplex link for which the PTP protocol is
|
||
|
* allowed to function. Although this parameter is defined in the
|
||
|
* IEEE spec, no default is defined.
|
||
|
*/
|
||
|
#define XEMACPS_NEIGHBOR_PROP_DELAY_THRESH 5000
|
||
|
|
||
|
/*
|
||
|
* XEMACPS_ALLOWED_LOST_RESPONSES is the number of Pdelay_Req messages for
|
||
|
* which a valid response is not received, above which the Peer should no
|
||
|
* longer be considered PTPv2 capable.
|
||
|
*/
|
||
|
#define XEMACPS_ALLOWED_LOST_RESPONSES 3
|
||
|
|
||
|
#ifdef PEEP
|
||
|
/*
|
||
|
* Currently the PEEP/GEM is drivern by 50 MHz clock. Which means each
|
||
|
* clock cycle corresponds to 20 nano seconds. Hence the increment
|
||
|
* register should contain a value of 20 (0x14).
|
||
|
*/
|
||
|
#define XEMACPS_1588_INC_VAL 0x00000014
|
||
|
#endif
|
||
|
|
||
|
/* Standard PTP Frame Field Definitions (from IEEE1588 specification) */
|
||
|
#define XEMACPS_PTP_ETHERTYPE 0x88F7
|
||
|
#define XEMACPS_PTP_VERSION_PTP 2
|
||
|
|
||
|
|
||
|
/* Real Time Clock Definitions.*/
|
||
|
#define XEMACPS_ONE_SECOND 1000000000 /* In ns */
|
||
|
|
||
|
/*
|
||
|
* Define how often to re-calculate the RTC Increment This value indicates how
|
||
|
* many good Sync/FollowUp message pairs are received before the
|
||
|
* re-calculation is performed.
|
||
|
*/
|
||
|
#define XEMACPS_NUM_SYNC_FU_PAIR_CALC_RTC_INCREMENT 2
|
||
|
|
||
|
/* PHY register number and register content mask used for PHY detection.*/
|
||
|
#define PHY_DETECT_REG 1
|
||
|
#define PHY_DETECT_MASK 0x1808
|
||
|
|
||
|
/* PHY register 0 and Register 16 masks*/
|
||
|
#define PHY_R0_RESET 0x8000
|
||
|
#define PHY_R0_LOOPBACK 0x4000
|
||
|
#define PHY_R0_AUTONEG_EN 0x1000
|
||
|
#define PHY_R0_AUTONEG_START 0x0200
|
||
|
#define PHY_R0_10 0x0100
|
||
|
#define PHY_R0_100 0x2100
|
||
|
#define PHY_R0_1000 0x0140
|
||
|
#define PHY_R16_FIFO_DEPTH 0xF078
|
||
|
|
||
|
/* Maximum buffer length used to store the PTP pakcets */
|
||
|
#define XEMACPS_PACKET_LEN 1538
|
||
|
|
||
|
/* BD alignment used to allocate the BDs */
|
||
|
#define XEMACPS_IEEE1588_BD_ALIGNMENT 4
|
||
|
|
||
|
/* Number of BDs used in the Tx and Rx paths */
|
||
|
#define XEMACPS_IEEE1588_NO_OF_RX_DESCS 32
|
||
|
#define XEMACPS_IEEE1588_NO_OF_TX_DESCS 32
|
||
|
|
||
|
/* Various offsets in the PTP Ethernet packet and masks to extract contents */
|
||
|
#define XEMACPS_MSGTYP_OFFSET 14
|
||
|
#define XEMACPS_MSGTYP_MASK 0x0F
|
||
|
#define XEMACPS_VERSPTP_OFFSET 15
|
||
|
#define XEMACPS_MSGLENGTH_OFFSET 16
|
||
|
#define XEMACPS_FLAGS_OFFSET 20
|
||
|
#define XEMACPS_CORRFIELD_OFFSET 22
|
||
|
#define XEMACPS_PORTIDENTITY_OFFSET 34
|
||
|
#define XEMACPS_SEQID_OFFSET 44
|
||
|
#define XEMACPS_CONTROL_OFFSET 46
|
||
|
#define XEMACPS_LOGMSG_INTERVAL_OFFSET 47
|
||
|
#define XEMACPS_PRECISE_TS_OFFSET 48
|
||
|
#define XEMACPS_CURRUTCOFFSET_OFFSET 58
|
||
|
#define XEMACPS_GMPRI_ONE_OFFSET 61
|
||
|
#define XEMACPS_GM_CLK_QUALITY_OFFSET 62
|
||
|
#define XEMACPS_GMPRI_TWO_OFFSET 66
|
||
|
#define XEMACPS_GM_IDENTITY_OFFSET 67
|
||
|
#define XEMACPS_STEPS_REMOVED_OFFSET 75
|
||
|
#define XEMACPS_TIMESOURCE_OFFSET 77
|
||
|
#define XEMACPS_TLVTYPE_OFFSET 78
|
||
|
#define XEMACPS_LENGTHFIELD_OFFSET 80
|
||
|
#define XEMACPS_PATHSEQ_OFFSET 82
|
||
|
#define XEMACPS_REQPORTID_OFFSET 58
|
||
|
|
||
|
/*
|
||
|
* The PTP message type, length value, flags value that are
|
||
|
* populated in different PTP frames
|
||
|
*/
|
||
|
#define XEMACPS_SYNCFRM_MSG_TYPE 0x10
|
||
|
#define XEMACPS_SYNCFRM_LENGTH 0x002C
|
||
|
#define XEMACPS_SYNCFRM_FLAGS_VAL 0x0200
|
||
|
#define XEMACPS_FOLLOWUPFRM_MSG_TYPE 0x18
|
||
|
#define XEMACPS_FOLLOWUPFRM_LENGTH 0x004C
|
||
|
#define XEMACPS_PDELAYREQFRM_LENGTH 54
|
||
|
#define XEMACPS_PDELAYREQFRM_FLAGS_VAL 0x0200
|
||
|
#define XEMACPS_PDELAYREQFRM_MSG_TYPE 0x02
|
||
|
#define XEMACPS_PDELAYRESPFRM_MSG_TYPE 0x03
|
||
|
#define XEMACPS_PDELAYRESPFRM_LENGTH 54
|
||
|
#define XEMACPS_PDELAYRESPFOLLOWUPFRM_MSG_TYPE 0x0A
|
||
|
#define XEMACPS_PDELAYRESPFOLLOWUP_LENGTH 54
|
||
|
#define XEMACPS_ANNOUNCEFRM_MSG_TYPE 0x1B
|
||
|
#define XEMACPS_ANNOUNCEFRM_LENGTH 0x0040
|
||
|
#define XEMACPS_ANNOUNCEFRM_FLAGS_VAL 0x0008
|
||
|
|
||
|
/* The total length of various PTP packets */
|
||
|
#define XEMACPS_ANNOUNCEMSG_TOT_LEN 90
|
||
|
#define XEMACPS_SYNCMSG_TOT_LEN 58
|
||
|
#define XEMACPS_FOLLOWUPMSG_TOT_LEN 90
|
||
|
#define XEMACPS_PDELAYREQMSG_TOT_LEN 68
|
||
|
#define XEMACPS_PDELAYRESPMSG_TOT_LEN 68
|
||
|
#define XEMACPS_PDELAYRESPFOLLOWUP_TOT_LEN 68
|
||
|
|
||
|
/*
|
||
|
* The bit field information for different PTP packets in the variable
|
||
|
* PTPSendPacket. This variable controls the sending of PTP packets.
|
||
|
*/
|
||
|
#define SEND_PDELAY_RESP 0x00000001
|
||
|
#define SEND_PDELAY_RESP_FOLLOWUP 0x00000002
|
||
|
#define SEND_PDELAY_REQ 0x00000004
|
||
|
#define SEND_SYNC 0x00000008
|
||
|
#define SEND_FOLLOW_UP 0x00000010
|
||
|
|
||
|
#define NS_PER_SEC 1000000000ULL /* Nanoseconds per second */
|
||
|
#define FP_MULT 1000ULL
|
||
|
|
||
|
/* Advertisement control register. */
|
||
|
#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */
|
||
|
#define ADVERTISE_1000XFULL 0x0020 /* Try for 1000BASE-X full-duplex */
|
||
|
#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */
|
||
|
#define ADVERTISE_1000XHALF 0x0040 /* Try for 1000BASE-X half-duplex */
|
||
|
#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */
|
||
|
#define ADVERTISE_1000XPAUSE 0x0080 /* Try for 1000BASE-X pause */
|
||
|
#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */
|
||
|
#define ADVERTISE_1000XPSE_ASYM 0x0100 /* Try for 1000BASE-X asym pause */
|
||
|
#define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */
|
||
|
|
||
|
|
||
|
#define ADVERTISE_100_AND_10 (ADVERTISE_10FULL | ADVERTISE_100FULL | \
|
||
|
ADVERTISE_10HALF | ADVERTISE_100HALF)
|
||
|
#define ADVERTISE_100 (ADVERTISE_100FULL | ADVERTISE_100HALF)
|
||
|
#define ADVERTISE_10 (ADVERTISE_10FULL | ADVERTISE_10HALF)
|
||
|
|
||
|
#define ADVERTISE_1000 0x0300
|
||
|
|
||
|
|
||
|
#define IEEE_CONTROL_REG_OFFSET 0
|
||
|
#define IEEE_STATUS_REG_OFFSET 1
|
||
|
#define IEEE_AUTONEGO_ADVERTISE_REG 4
|
||
|
#define IEEE_PARTNER_ABILITIES_1_REG_OFFSET 5
|
||
|
#define IEEE_PARTNER_ABILITIES_2_REG_OFFSET 8
|
||
|
#define IEEE_PARTNER_ABILITIES_3_REG_OFFSET 10
|
||
|
#define IEEE_1000_ADVERTISE_REG_OFFSET 9
|
||
|
#define IEEE_SPECIFIC_STATUS_REG 17
|
||
|
#define IEEE_CTRL_1GBPS_LINKSPEED_MASK 0x2040
|
||
|
#define IEEE_CTRL_LINKSPEED_MASK 0x0040
|
||
|
#define IEEE_CTRL_LINKSPEED_1000M 0x0040
|
||
|
#define IEEE_CTRL_LINKSPEED_100M 0x2000
|
||
|
#define IEEE_CTRL_LINKSPEED_10M 0x0000
|
||
|
#define IEEE_CTRL_RESET_MASK 0x8000
|
||
|
#define IEEE_CTRL_AUTONEGOTIATE_ENABLE 0x1000
|
||
|
#define IEEE_STAT_AUTONEGOTIATE_CAPABLE 0x0008
|
||
|
#define IEEE_STAT_AUTONEGOTIATE_COMPLETE 0x0020
|
||
|
#define IEEE_STAT_AUTONEGOTIATE_RESTART 0x0200
|
||
|
#define IEEE_STAT_1GBPS_EXTENSIONS 0x0100
|
||
|
#define IEEE_AN1_ABILITY_MASK 0x1FE0
|
||
|
#define IEEE_AN3_ABILITY_MASK_1GBPS 0x0C00
|
||
|
#define IEEE_AN1_ABILITY_MASK_100MBPS 0x0380
|
||
|
#define IEEE_AN1_ABILITY_MASK_10MBPS 0x0060
|
||
|
|
||
|
#define PHY_REG0_RESET 0x8000
|
||
|
#define PHY_REG0_LOOPBACK 0x4000
|
||
|
#define PHY_REG0_10 0x0100
|
||
|
#define PHY_REG0_100 0x2100
|
||
|
#define PHY_REG0_1000 0x0140
|
||
|
#define PHY_REG21_10 0x0030
|
||
|
#define PHY_REG21_100 0x2030
|
||
|
#define PHY_REG21_1000 0x0070
|
||
|
|
||
|
/* Frequency setting */
|
||
|
#define SLCR_LOCK_ADDR (XPS_SYS_CTRL_BASEADDR + 0x4)
|
||
|
#define SLCR_UNLOCK_ADDR (XPS_SYS_CTRL_BASEADDR + 0x8)
|
||
|
#define SLCR_GEM0_CLK_CTRL_ADDR (XPS_SYS_CTRL_BASEADDR + 0x140)
|
||
|
#define SLCR_GEM1_CLK_CTRL_ADDR (XPS_SYS_CTRL_BASEADDR + 0x144)
|
||
|
#ifdef PEEP
|
||
|
#define SLCR_GEM_10M_CLK_CTRL_VALUE 0x00103031
|
||
|
#define SLCR_GEM_100M_CLK_CTRL_VALUE 0x00103001
|
||
|
#define SLCR_GEM_1G_CLK_CTRL_VALUE 0x00103011
|
||
|
#endif
|
||
|
#define SLCR_LOCK_KEY_VALUE 0x767B
|
||
|
#define SLCR_UNLOCK_KEY_VALUE 0xDF0D
|
||
|
#define SLCR_ADDR_GEM_RST_CTRL (XPS_SYS_CTRL_BASEADDR + 0x214)
|
||
|
#define EMACPS_SLCR_DIV_MASK 0xFC0FC0FF
|
||
|
|
||
|
/**************************** Type Definitions *******************************/
|
||
|
/*
|
||
|
* This typedef defines the format for a data structure which stores the Port
|
||
|
* Identity information specified in IEEE1588.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u8 ClockIdentity[8];
|
||
|
u16 PortNumber;
|
||
|
} XEmacPs_PortIdentity;
|
||
|
|
||
|
/*
|
||
|
* This typedef defines the format for a data structure which stores the Clock
|
||
|
* Identity information specified in IEEE1588.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u8 ClockIdentity[8];
|
||
|
} XEmacPs_ClockIdentity;
|
||
|
|
||
|
/*
|
||
|
* This typedef defines the quality of a clock
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u8 clockClass;
|
||
|
u8 clockAccuracy;
|
||
|
u16 offsetScaledLogVariance;
|
||
|
} XEmacPs_ClockQuality;
|
||
|
|
||
|
/*
|
||
|
* This typedef defines the format for a data structure which stores the
|
||
|
* relevant fields which are captured from Announce Packets.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
XEmacPs_PortIdentity SourcePortIdentity;
|
||
|
XEmacPs_ClockIdentity GrandmasterIdentity;
|
||
|
u16 StepsRemoved;
|
||
|
XEmacPs_ClockQuality ClockQuality;
|
||
|
u8 GrandmasterPriority1;
|
||
|
u8 GrandmasterPriority2;
|
||
|
u8 IAmTheRtcMaster;
|
||
|
u16 TlvLengthField;
|
||
|
char LogMessageInterval;
|
||
|
u16 AnnounceIntervalDuration;
|
||
|
} XEmacPs_BmcData;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* This typedef defines the format for a data structure which stores
|
||
|
* information relating to the 1588 based PTP timing calculations.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u32 Nanosec; /* ns value for sync frame tx request */
|
||
|
u32 SlaveSyncTimestampSec;
|
||
|
u32 SlaveSyncTimestampNSec;
|
||
|
u32 MasterCorrectionField;/* Correction Field from rx'd follow-up */
|
||
|
u32 PDelayTimestampT1; /* T1 :PDelayReq Frame transmission */
|
||
|
u32 PDelayTimestampT2; /* T2 :PDelayReq rx'd at link partner */
|
||
|
u32 PDelayTimestampT3; /* T3 :PDelayResp Frame reception */
|
||
|
u32 PDelayTimestampT4; /* T4 :PDelayResp tx'd by link partner */
|
||
|
u32 LinkDelay; /* Last calculated value of Link Delay */
|
||
|
u32 NewSlaveTime; /* RTC ns at slave for last rx'd sync */
|
||
|
u32 NewMasterTime; /* RTC ns at master for last tx'd sync */
|
||
|
u32 OldSlaveTime; /* Stored RTC slave ns for past sync rx */
|
||
|
u32 OldMasterTime; /* Stored RTC master ns for past sync tx*/
|
||
|
u32 PDelayReqRecdTSNs;
|
||
|
u32 PDelayReqRecdTSSec;
|
||
|
u32 PDelayRespTxedTSNs;
|
||
|
u32 PDelayRespTxedTSSec;
|
||
|
} XEmacPs_PtpStruct;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* This typedef defines the format for a data structure which stores the last
|
||
|
* used sequence ID for all of the PTP timing frames.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u16 SyncSequenceId;
|
||
|
u16 FollowUpSequenceId;
|
||
|
u16 PDelayReqSequenceId;
|
||
|
u16 PDelayRespSequenceId;
|
||
|
u16 PDelayFollowUpSequenceId;
|
||
|
u16 OldSyncSequenceId;
|
||
|
u16 NewSyncSequenceId;
|
||
|
} XEmacPs_SequenceIdStruct;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* The Signalling frame defines the delays to be used between Sync Frames, Link
|
||
|
* Delay measurements and Announce Frame events
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u16 SyncIntervalDuration;
|
||
|
u16 LinkDelayIntervalDuration;
|
||
|
u16 AnnounceIntervalDuration;
|
||
|
} XEmacPs_SignallingFrameData;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* This typedef defines the various counters which have to maintained for the
|
||
|
* PTP operation.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u16 CounterSyncInterval;
|
||
|
u16 CounterLinkDelayInterval;
|
||
|
u16 CounterAnnounceInterval;
|
||
|
u8 CounterSyncEvents;
|
||
|
} XEmacPs_Counters;
|
||
|
|
||
|
/*
|
||
|
* Keep track of state machine data to make sure we're fully compliant
|
||
|
* with the spec
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u8 LostResponses; /* Keep track of the state machine errors */
|
||
|
u8 RcvdPDelayResp; /*
|
||
|
* Received a valid PDelayResp packet since
|
||
|
* PDelayReq was sent
|
||
|
*/
|
||
|
u8 RcvdPDelayRespFollowUp;/*
|
||
|
* Received a valid PDelayFollowUp packet
|
||
|
* since PDelayResp was received
|
||
|
*/
|
||
|
XEmacPs_PortIdentity RespPortIdentity;/*
|
||
|
* SourcePortIdentity of the last
|
||
|
* PDelayResp packet received
|
||
|
*/
|
||
|
XEmacPs_PortIdentity RespReqPortIdentity;/*
|
||
|
* RequestingPortIdentity of
|
||
|
* the last PDelayResp packet
|
||
|
received */
|
||
|
} XEmacPs_StateMachineData;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* This struct captures information from RX'd Sync/FollowUp message pairs in a
|
||
|
* format similiar to the MDSyncReceive structure described in the IEEE1588
|
||
|
* specification.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
u8 LogMessageInterval;
|
||
|
u16 SyncIntervalDuration;
|
||
|
|
||
|
} XEmacPs_MDSyncReceive;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
u32 Seconds;
|
||
|
u32 NanoSeconds;
|
||
|
} XEmacPs_RtcFormat;
|
||
|
|
||
|
/*
|
||
|
* The XEmacPs_Ieee1588 driver instance data. The user is required to allocate
|
||
|
* a variable of this type for every PTP device in the system. A pointer
|
||
|
* to a variable of this type is then passed to the driver API functions.
|
||
|
*/
|
||
|
typedef struct {
|
||
|
/* The Emac Pss instance to be used for accessing the hardware */
|
||
|
XEmacPs *EmacPsInstance;
|
||
|
|
||
|
/* The current port protocol state */
|
||
|
u32 PtpProtocolState;
|
||
|
|
||
|
u32 PtpNewPktRecd;
|
||
|
|
||
|
/* The PTP algorithm can be started and stopped as requested */
|
||
|
u32 PtpIsRunning;
|
||
|
|
||
|
/* The peer must be AS capable before we start full blown PTP */
|
||
|
u32 PeerIeee1588v2Capable;
|
||
|
|
||
|
u32 PTPLocked;
|
||
|
|
||
|
/* Store the info from the latest RX'd Sync/Follow message pair */
|
||
|
XEmacPs_MDSyncReceive LatestMDSyncReceive;
|
||
|
|
||
|
/* Contains the local port Identity information */
|
||
|
XEmacPs_PortIdentity PortIdLocal;
|
||
|
|
||
|
/* Create a data structure for the Best Master Clock Algorithm (BMCA)*/
|
||
|
XEmacPs_BmcData CurrentBmc;
|
||
|
|
||
|
/* Create a data structure for the Precise Timing Protocol (PTP) */
|
||
|
XEmacPs_PtpStruct PtpRecords;
|
||
|
|
||
|
/* Create data structure to record the PTP frames Sequence ID values*/
|
||
|
XEmacPs_SequenceIdStruct SequenceIdRecords;
|
||
|
|
||
|
/* Create a data structure to store the Signalling frame information*/
|
||
|
XEmacPs_SignallingFrameData SignallingFrameData;
|
||
|
|
||
|
/* Create a data structure to store various PTP counters/timers */
|
||
|
XEmacPs_Counters PtpCounters;
|
||
|
|
||
|
/* Create a data structure to store state machine flags */
|
||
|
XEmacPs_StateMachineData StateMachineData;
|
||
|
|
||
|
/* Buffers to store the last recd PTP packet */
|
||
|
u8 LastRecdSyncFrm[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 LastRecdFollowUpFrm[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 LastRecdPDelayReqFrm[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 LastRecdPDelayRespFrm[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 LastRecdPDelayRespFollowUpFrm[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 LastRecdSignallingFrm[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 LastRecdAnnounceFrm[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
|
||
|
/* Buffers to store the PTP packet to be Txed */
|
||
|
u8 SyncFrmToTx[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 FollowUpFrmToTx[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 PDelayReqFrmToTx[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 PDelayRespFrmToTx[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 PDelayRespFollowUpFrmToTx[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 SignallingFrmToTx[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
u8 AnnounceFrmToTx[XEMACPS_PKT_MAX_BUF_LEN];
|
||
|
|
||
|
} XEmacPs_Ieee1588;
|
||
|
|
||
|
|
||
|
/***************** Macros (Inline Functions) Definitions *********************/
|
||
|
|
||
|
/************************** Function Prototypes ******************************/
|
||
|
|
||
|
void XEmacPs_PtpTimerInterruptHandler(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_PtpRxInterruptHandler(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
int XEmacPs_PtpTxPacket(XEmacPs_Ieee1588 *InstancePtr, u8 *PacketBuf,
|
||
|
int PacketLen);
|
||
|
u32 XEmacPs_ComparePortIdentity(
|
||
|
XEmacPs_PortIdentity Identity1,
|
||
|
XEmacPs_PortIdentity Identity2);
|
||
|
u32 XEmacPs_CompareClockIdentity(
|
||
|
XEmacPs_ClockIdentity Identity1,
|
||
|
XEmacPs_ClockIdentity Identity2);
|
||
|
|
||
|
void XEmacPs_MasterSendAnnounce(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_MasterSendSync(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_MasterSendFollowUp(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_SendPDelayReq(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_SendPDelayResp(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_SendPDelayRespFollowUp(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
u32 XEmacPs_IsRxFramePTP(u8 *PacketBuf);
|
||
|
void XEmacPs_DecodeRxSync(XEmacPs_Ieee1588 *InstancePtr,u8 *PacketBuf);
|
||
|
void XEmacPs_DecodeRxFollowUp(XEmacPs_Ieee1588 *InstancePtr, u8 *PacketBuf);
|
||
|
void XEmacPs_DecodeRxPDelayResp(XEmacPs_Ieee1588 *InstancePtr, u8 *PacketBuf);
|
||
|
void XEmacPs_DecodeRxPDelayRespFollowUp(XEmacPs_Ieee1588 *InstancePtr,
|
||
|
u8 *PacketBuf);
|
||
|
void XEmacPs_DecodeRxSignaling(XEmacPs_Ieee1588 *InstancePtr, u8 *PacketBuf);
|
||
|
u16 XEmacPs_UpdateIntervalDuration(u16 currentIntervalDuration,
|
||
|
signed char logMeanVal);
|
||
|
|
||
|
u16 XEmacPs_ConvertLogMeanToDuration(signed char logMeanVal);
|
||
|
|
||
|
signed char XEmacPs_ConvertDurationToLogMean(u16 fractionalVal);
|
||
|
void XEmacPs_UpdateLogMeanMessageInterval(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_SetupSourcePortIdentity(XEmacPs_Ieee1588 *InstancePtr,
|
||
|
XEmacPs_PortIdentity systemIdentity);
|
||
|
|
||
|
void XEmacPs_DecodeTxAnnounceFrame(XEmacPs_Ieee1588 *InstancePtr,
|
||
|
u8 *PacketBuf);
|
||
|
void XEmacPs_DecodeRxAnnounceFrame(XEmacPs_Ieee1588 *InstancePtr,
|
||
|
u8 *PacketBuf);
|
||
|
void XEmacPs_ReadAnnounceFrame(u8 *PacketBuf, XEmacPs_BmcData *AnnounceFrame);
|
||
|
void XEmacPs_UpdateBmcRecords(XEmacPs_BmcData *NewMaster,
|
||
|
XEmacPs_BmcData *CurrentBmc);
|
||
|
u32 XEmacPs_BestMasterClockAlgorithm(XEmacPs_BmcData *AnnounceFrame,
|
||
|
XEmacPs_BmcData *CurrentBmc);
|
||
|
void XEmacPs_BecomeRtcMaster(XEmacPs_Ieee1588 *InstancePtr,
|
||
|
u8 txAnnounceHasWon);
|
||
|
void XEmacPs_BecomeRtcSlave(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_ChangePTPLockStatus(XEmacPs_Ieee1588 *InstancePtr, u8 locked);
|
||
|
void XEmacPs_ChangePeerIeee1588v2Capability(XEmacPs_Ieee1588 *InstancePtr,
|
||
|
u8 capable);
|
||
|
void XEmacPs_CalcDelay(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_CalcRtcOffset(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
void XEmacPs_UpdateRtcIncrement(XEmacPs_Ieee1588 *InstancePtr);
|
||
|
u32 XEmacPs_htonll (unsigned long long int n);
|
||
|
u32 XEmacPs_ntohll (long long int n);
|
||
|
u8 XEmacPs_GetMsgType (u8 *PacketBuf);
|
||
|
void XEmacPs_GetPortIdentity(u8 *PacketBuf, XEmacPs_PortIdentity *portID);
|
||
|
u16 XEmacPs_GetSequenceId(u8 *PacketBuf);
|
||
|
u16 XEmacPs_IncSequenceId(u8 *PacketBuf);
|
||
|
void XEmacPs_SetMdioDivisor(XEmacPs *InstancePtr, XEmacPs_MdcDiv Divisor);
|
||
|
unsigned int XEmacPs_TsuCalcClk(u32 Freq);
|
||
|
extern volatile u8 PDelayRespSent;
|
||
|
extern volatile u32 PTPSendPacket;
|
||
|
extern volatile u8 SyncSent;
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* end of protection macro */
|