📄 ixtimesyncacccodelet.c
字号:
/** * @file IxTimeSyncAccCodelet.c * * @author Intel Corporation * * @date 21 December 2004 * * @brief Codelet for IXP46x Time Sync Access Component. * * @par * IXP400 SW Release version 2.1 * * -- Copyright Notice -- * * @par * Copyright (c) 2001-2005, Intel Corporation. * All rights reserved. * * @par * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * * @par * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * * @par * -- End of Copyright Notice -- */#ifdef __ixp46X/********************************************************************* * user include file *********************************************************************/#include "IxTimeSyncAccCodelet.h" /********************************************************************* * PRIVATE function prototype *********************************************************************/PRIVATE IX_STATUS ixTimeSyncAccCodeletEthInit (void);PRIVATE void ixTimeSyncAccCodeletPortDisable (void);PRIVATE IX_OSAL_MBUF *ixTimeSyncAccCodeletMbufAllocate (void); PRIVATE void ixTimeSyncAccCodeletMbufsFree (void);PRIVATE IX_STATUS ixTimeSyncAccCodeletDispatcherStart (void);PRIVATE void ixTimeSyncAccCodeletDispatcherStop (void);PRIVATE void ixTimeSyncAccCodeletDummyCB ( UINT32 cbTag, IX_OSAL_MBUF* mBufPtr, UINT32 reserved);PRIVATE void ixTimeSyncAccCodeletTxDoneCB ( UINT32 cbTag, IX_OSAL_MBUF* mBufPtr);PRIVATE IX_STATUS ixTimeSyncAccCodeletPortConfigure (IxEthAccPortId portId);PRIVATE IX_STATUS ixTimeSyncAccCodeletNewThreadCreate ( IxOsalVoidFnPtr func, char *label);PRIVATE void ixTimeSyncAccCodeletPTPMsgBuild (UINT8 control);PRIVATE void ixTimeSyncAccCodeletPTPMsgTransmit (void);PRIVATE void ixTimeSyncAccCodeletPTPMsgTransmitStop (void);PRIVATE void ixTimeSyncAccCodeletPTPMsgShow ( BOOL receive, IxTimeSyncAcc1588PTPPort channel, IxTimeSyncAccPtpMsgData *ptpMsgData );PUBLIC IX_STATUS ixTimeSyncAccCodeletPTPMsgCheck (void);PRIVATE void ixTimeSyncAccCodeletTargetTimeHitCallback (void);PRIVATE IX_STATUS ixTimeSyncAccCodeletTargetTimeSet (void);PRIVATE IX_STATUS ixTimeSyncAccCodeletSystemTimeClear (void);PRIVATE void ixTimeSyncAccCodeletTargetTimeClear (void);/********************************************************************* * PRIVATE variables *********************************************************************/PRIVATE IxOsalSemaphore ixTimeSyncAccCodeletSemId;PRIVATE char *ixTimeSyncAccCodeletTSChannelLabel[] ={ "NPE-A", /* channel 0 */ "NPE-B", /* channel 1 */ "NPE-C", /* channel 2 */ "INVALID" /* invalid channel */};PRIVATE char *ixTimeSyncAccCodeletTSChannelModeLabel[] ={ "MASTER", /* master mode */ "SLAVE", /* slave mode */ "ANY MODE", /* any mode */ "INVALID" /* invalid mode */};PRIVATE char *ixTimeSyncAccCodeletPTPMessageLabel[] ={ "SYNC", /* PTP Sync message */ "DELAY_REQ", /* PTP Delay_Req message */ "UNKNOWN" /* unknown message */};/* * PTP message type list. * Note: The entry of this array is accessed by using Time Sync Channel mode * as entry index. * e.g. Master mode -> value = 0 -> message type for index 0 -> Sync * Slave mode -> value = 1 -> message type for index 1 -> Delay_Req */PRIVATE IxTimeSyncAcc1588PTPMsgType ixTimeSyncAccCodeletPTPMsgTypeList[] ={ IX_TIMESYNCACC_1588PTP_MSGTYPE_SYNC, /* PTP Sync message */ IX_TIMESYNCACC_1588PTP_MSGTYPE_DELAYREQ /* PTP Delay_Req message */};/* port ID list */PRIVATE IxEthAccPortId ixTimeSyncAccCodeletPortIdList[] ={ IX_ETH_PORT_3, /* NPE A's port ID (channel 0) */ IX_ETH_PORT_1, /* NPE B's port ID (channel 1) */ IX_ETH_PORT_2 /* NPE C's port ID (channel 2) */ };/* pre-defined configuration table */ PRIVATE IxTimeSyncAccCodeletTSChannelConfig ixTimeSyncAccCodeletConfigList[IX_TIMESYNCACC_CODELET_MAX_CONFIGURATIONS] = { /* configuration 0: NPE A - Master, NPE B - Master, NPE C - Slave */ { {IX_TIMESYNCACC_1588PTP_PORT_SLAVE, /* NPE A */ IX_TIMESYNCACC_1588PTP_PORT_SLAVE, /* NPE B */ IX_TIMESYNCACC_1588PTP_PORT_MASTER} /* NPE C */ }, /* configuration 1: NPE A - Master, NPE B - Slave, NPE C - Master */ { {IX_TIMESYNCACC_1588PTP_PORT_SLAVE, /* NPE A */ IX_TIMESYNCACC_1588PTP_PORT_MASTER, /* NPE B */ IX_TIMESYNCACC_1588PTP_PORT_SLAVE} /* NPE C */ }, /* configuration 2 : NPE A - Slave, NPE B - Master, NPE C - Master */ { {IX_TIMESYNCACC_1588PTP_PORT_MASTER, /* NPE A */ IX_TIMESYNCACC_1588PTP_PORT_SLAVE, /* NPE B */ IX_TIMESYNCACC_1588PTP_PORT_SLAVE} /* NPE C */ }};/* global configuration pointer */PRIVATE IxTimeSyncAccCodeletTSChannelConfig *ixTimeSyncAccCodeletConfigPtr;/* array of mBuf pointers, index of array represents ethernet port number */PRIVATE IX_OSAL_MBUF *ixTimeSyncAccCodeletGlobalMBuf[IX_TIMESYNCACC_CODELET_MAX_TS_CHANNELS];/* buffer for PTP message */PRIVATE UINT8 ixTimeSyncAccCodeletPtpMsgData[IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN];/* function pointer for Q MGR dispatcher */PRIVATE IxQMgrDispatcherFuncPtr ixTimeSyncAccCodeletDispatcherFunc;/* function map for each module's unload function */PRIVATE IxTimeSyncAccCodeletUninitFuncMap ixTimeSyncAccCodeletUninitFuncMap[] ={ {(IxOsalVoidFnPtr)ixTimeSyncAccCodeletMbufsFree, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}, {(IxOsalVoidFnPtr)ixQMgrUnload, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}, {(IxOsalVoidFnPtr)ixTimeSyncAccCodeletDispatcherStop, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}, {(IxOsalVoidFnPtr)ixNpeMhUnload, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}, {(IxOsalVoidFnPtr)ixNpeDlUnload, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}, {(IxOsalVoidFnPtr)ixNpeDlNpeStopAndReset, IX_NPEDL_NPEID_NPEC, FALSE}, {(IxOsalVoidFnPtr)ixNpeDlNpeStopAndReset, IX_NPEDL_NPEID_NPEB, FALSE}, {(IxOsalVoidFnPtr)ixNpeDlNpeStopAndReset, IX_NPEDL_NPEID_NPEA, FALSE}, {(IxOsalVoidFnPtr)ixEthAccUnload, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}, {(IxOsalVoidFnPtr)ixTimeSyncAccCodeletPortDisable, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}, {(IxOsalVoidFnPtr)ixTimeSyncAccCodeletPTPMsgTransmitStop, IX_TIMESYNCACC_CODELET_INVALID_PARAM, FALSE}};/* MAC addresses for each NPE */PRIVATE IxEthAccMacAddr ixTimeSyncAccCodeletNpeMacAddr[] = { {{0x2, 0x0, 0xa, 0xb, 0xc, 0xd}}, {{0x2, 0x0, 0xe, 0xf, 0xa, 0xb}}, {{0x2, 0x0, 0x6, 0x7, 0x8, 0x9}}};/* default PTP domain IP address */PRIVATE UINT8 ixTimeSyncAccCodeletPTPMulticastAddress[] = {224, 0, 1, 129};/* codelet termination flag */PRIVATE BOOL ixTimeSyncAccCodeletTerminate;/* PTP message transmission halt flag */PRIVATE BOOL ixTimeSyncAccCodeletTxHalt;/********************************************************************* * PUBLIC functions *********************************************************************/PUBLIC IX_STATUSixTimeSyncAccCodeletMain (UINT32 configIndex){ IxTimeSyncAccStatus tsStatus; IxTimeSyncAcc1588PTPPort tsChannel; IxTimeSyncAcc1588PTPPortMode tsChannelMode; /* check the validity of configuration */ if (IX_TIMESYNCACC_CODELET_MAX_CONFIGURATIONS <= configIndex) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMain: invalid configuration\n", 0, 0, 0, 0, 0, 0); ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletMain: Usage :\n", 0, 0, 0, 0, 0, 0); ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletMain:\t-> ixTimeSyncAccCodeletMain <x>\n\n", 0, 0, 0, 0, 0, 0); ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletMain:\twhere <x> =\n", 0, 0, 0, 0, 0, 0); ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletMain:\t0 -> NPE A - Slave, NPE B - Slave, NPE C - Master (default)\n", 0, 0, 0, 0, 0, 0); ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletMain:\t1 -> NPE A - Slave, NPE B - Master, NPE C - Slave\n", 0, 0, 0, 0, 0, 0); ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletMain:\t2 -> NPE A - Master, NPE B - Slave, NPE C - Slave\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } /* Disable UTOPIA to enable Ethernet on Npe-A */
ixFeatureCtrlWrite (ixFeatureCtrlRead() | ((UINT32)1<<IX_FEATURECTRL_UTOPIA)); /* set termination flag to false */ ixTimeSyncAccCodeletTerminate = FALSE; /* save global configuration pointer */ ixTimeSyncAccCodeletConfigPtr = &ixTimeSyncAccCodeletConfigList[configIndex]; /* write default frequency scale value to Addend Register */ tsStatus = ixTimeSyncAccTickRateSet (IX_TIMESYNCACC_CODELET_FSV_DEFAULT); if (IX_TIMESYNCACC_SUCCESS != tsStatus) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMain: failed to set frequency scale value, error code %d\n", tsStatus, 0, 0, 0, 0, 0); return IX_FAIL; } /* configure all Time Sync channels */ for (tsChannel = IX_TIMESYNCACC_NPE_A_1588PTP_PORT; tsChannel < IX_TIMESYNCACC_CODELET_MAX_TS_CHANNELS; tsChannel++) { /* get channel operating mode from the configuration table */ tsChannelMode = ixTimeSyncAccCodeletConfigPtr->tsChannelMode[tsChannel]; tsStatus = ixTimeSyncAccPTPPortConfigSet(tsChannel, tsChannelMode); if (IX_TIMESYNCACC_SUCCESS != tsStatus) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMain: failed to configure %s channel to %s mode, error code %d\n", (UINT32)(ixTimeSyncAccCodeletTSChannelLabel[tsChannel]), (UINT32)(ixTimeSyncAccCodeletTSChannelModeLabel[tsChannelMode]), tsStatus, 0, 0, 0); return IX_FAIL; } } ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "\nixTimeSyncAccCodeletMain: TS channel configuration: NPE A - %s, NPE B - %s, NPE C - %s\n\n", (UINT32)(ixTimeSyncAccCodeletTSChannelModeLabel[ixTimeSyncAccCodeletConfigPtr->tsChannelMode[0]]), (UINT32)(ixTimeSyncAccCodeletTSChannelModeLabel[ixTimeSyncAccCodeletConfigPtr->tsChannelMode[1]]), (UINT32)(ixTimeSyncAccCodeletTSChannelModeLabel[ixTimeSyncAccCodeletConfigPtr->tsChannelMode[2]]), 0, 0, 0); /* set target time using default interval */ if (IX_SUCCESS != ixTimeSyncAccCodeletTargetTimeSet ()) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMain: failed to set target time\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } /* initialize ethernet components to transmit PTP messages */ if (IX_SUCCESS != ixTimeSyncAccCodeletEthInit ()) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMain: failed to initialize ethernet components\n", 0, 0, 0, 0, 0, 0); ixTimeSyncAccCodeletQuit (); return IX_FAIL; } return IX_SUCCESS;} /* end of ixTimeSyncAccCodeletMain function */PUBLIC void ixTimeSyncAccCodeletQuit (void){ int moduleId; IxOsalVoidFnPtr func; IxTimeSyncAccCodeletUninitFuncPtr func1; if (TRUE == ixTimeSyncAccCodeletTerminate) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletQuit: timeSyncAcc codelet was not loaded\n", 0, 0, 0, 0, 0, 0); return; } /* unload every supporting modules and free all resources */ for (moduleId = IX_TIMESYNCACC_CODELET_TX_PTP; moduleId >= IX_TIMESYNCACC_CODELET_MBUF_ALLOC; moduleId--) { if (TRUE == ixTimeSyncAccCodeletUninitFuncMap[moduleId].initialized) { if (IX_TIMESYNCACC_CODELET_INVALID_PARAM == ixTimeSyncAccCodeletUninitFuncMap[moduleId].funcParameter) { func = (IxOsalVoidFnPtr)ixTimeSyncAccCodeletUninitFuncMap[moduleId].funcPtr; (*func)(); } else { func1 = (IxTimeSyncAccCodeletUninitFuncPtr)ixTimeSyncAccCodeletUninitFuncMap[moduleId].funcPtr; (*func1)(ixTimeSyncAccCodeletUninitFuncMap[moduleId].funcParameter); } ixTimeSyncAccCodeletUninitFuncMap[moduleId].initialized = FALSE; } } /* unload ethDB */ if (IX_ETH_DB_SUCCESS != ixEthDBUnload ()) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletQuit: failed to unload ethDB\n", 0, 0, 0, 0, 0, 0); } /* set termination flag */ ixTimeSyncAccCodeletTerminate = TRUE; /* wait for a while for the codelet to disable target time */ ixOsalSleep (IX_TIMESYNCACC_CODELET_TARGET_TIME_HIT_INTERVAL); ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletQuit: timeSyncAcc codelet execution was terminated\n", 0, 0, 0, 0, 0, 0);} /* end of ixTimeSyncAccCodeletQuit function *//********************************************************************* * PRIVATE functions *********************************************************************//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletEthInit () * * @brief This function allocates resources and initializes every relevant * component that is needed for PTP message transmission from * each NPE. * * @return void */PRIVATE IX_STATUSixTimeSyncAccCodeletEthInit (){ UINT32 channel, count; IxEthAccPortId portId; IxFeatureCtrlComponentType npe; IX_OSAL_MBUF *mBufPtr; /* check if the device is IXP46X */ if (IX_FEATURE_CTRL_DEVICE_TYPE_IXP46X != ixFeatureCtrlDeviceRead ())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -