⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ixtimesyncacccodelet.c

📁 有关ARM开发板上的IXP400网络驱动程序的源码以。
💻 C
📖 第 1 页 / 共 4 页
字号:
/** * @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 + -