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

📄 ixtimesyncacccodelet.c

📁 有关ARM开发板上的IXP400网络驱动程序的源码以。
💻 C
📖 第 1 页 / 共 4 页
字号:
 * @brief Setup Tx and Rx callbacks and MAC address  * * @param  * portId IxEthAccPortId [in] - port ID  * * @return  IX_STATUS *          @li IX_SUCCESS - all function operations complete successfully  *          @li IX_FAIL    - any operation fails */PRIVATE IX_STATUSixTimeSyncAccCodeletPortConfigure (IxEthAccPortId portId){	IxEthAccMacAddr npeMacAddr;	if (IX_ETH_PORT_3 < portId)	{		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPortConfigure: invalid port Id %d\n",				portId, 0, 0, 0, 0, 0);		return IX_FAIL;	}	/* setup TX callback */	if (IX_ETH_ACC_SUCCESS != 		ixEthAccPortTxDoneCallbackRegister (portId, ixTimeSyncAccCodeletTxDoneCB, portId))	{		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPortConfigure: Failed to register Tx callback for port %d\n",				portId, 0, 0, 0, 0, 0);		return IX_FAIL;	}	/* setup RX callback */	if (IX_ETH_ACC_SUCCESS != 		ixEthAccPortRxCallbackRegister (portId, ixTimeSyncAccCodeletDummyCB, portId))	{	    	ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPortConfigure: Failed to register Rx callback for port %d\n",				portId, 0, 0, 0, 0, 0);		return IX_FAIL;	}	/* setup MAC address */	memcpy (npeMacAddr.macAddress, 		&ixTimeSyncAccCodeletNpeMacAddr[portId], 		IX_IEEE803_MAC_ADDRESS_SIZE);  	if (IX_ETH_ACC_SUCCESS != ixEthAccPortUnicastMacAddressSet(portId, &npeMacAddr))	{		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPortConfigure: failed to set the Unicast MAC Address of port %d\n", 			portId, 0, 0, 0, 0, 0);		return IX_FAIL;	}	return IX_SUCCESS;} /* end of ixTimeSyncAccCodeletPortConfigure function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletNewThreadCreate ( 	IxOsalVoidFnPtr func, 	char *label) * * @brief Spawn a thread to execute given function * * @param  * func IxOsalVoidFnPtr [in] - pointer to the function that will be *			       executed after the thread is spawned.  * @param  * label char* [in] - pointer to the Thread name's buffer   * * @return IX_STATUS  *          @li IX_SUCCESS - create and start Thread successfully  *          @li IX_FAIL    - fail */PRIVATE IX_STATUS ixTimeSyncAccCodeletNewThreadCreate (	IxOsalVoidFnPtr func, 	char *label){	IxOsalThread threadId;	IxOsalThreadAttr threadAttr;	/* check the validity of function pointer */	if (NULL == func)	{		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletNewThreadCreate: NULL function pointer\n", 			0, 0, 0, 0, 0, 0);		return IX_FAIL;	}	/* check the validity of Thread name's buffer pointer */	if (NULL == label) 	{		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletNewThreadCreate: NULL Thread name's pointer\n", 			0, 0, 0, 0, 0, 0);		return IX_FAIL;	}		/* zero out the thread attribute buffer */	memset ((void *)&threadAttr, 0, sizeof (IxOsalThreadAttr));	/* setup thread attribute */	threadAttr.name = label;	threadAttr.priority = IX_OSAL_DEFAULT_THREAD_PRIORITY;		if (IX_SUCCESS != ixOsalThreadCreate (&threadId, 				&threadAttr,				(IxOsalVoidFnVoidPtr)func,				NULL))	{ 		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletNewThreadCreate: Failed to spawn %s thread\n", 			(UINT32) label, 0, 0, 0, 0, 0);		return IX_FAIL;	}  		if (IX_SUCCESS != ixOsalThreadStart (&threadId))	{		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletNewThreadCreate: Failed to start %s thread\n", 			(UINT32) label, 0, 0, 0, 0, 0);						return IX_FAIL;	} 	return IX_SUCCESS;} /* end of ixTimeSyncAccCodeletNewThreadCreate function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletPTPMsgBuild (	UINT8 control) * * @brief Build PTP message using UDP protocol. * * UDP headers for all PTP messages * *	 N	Byte Count	Field Name * *	 0	6		destination MAC address * 	 6	6		source MAC address *	 12	2		type (0x0800 = IP datagram) *	 14	1		version IPV4, IP header length *	 15	1		type of service *	 16	2		IP datagram length *	 18	2		datagram sequence number *	 20	2		flags/fragments *	 22	1		time to live (TTL) *	 23	1		Protocol: UDP *	 24	2		IP header checksum *	 26	4		source IP address *	 30	4		destination IP address *	 34	2		source port number *	 36	2		destination port number *	 38	2		UDP length *	 40	2		UDP checksum * * PTP Sync and Delay_Req message specification (UDP user payload portion) * *	 42	2		version PTP *	 44	2		version network *	 46	16		subdomain *	 62	1		message type *	 63	1		source communication technology *	 64	6		source UUID *	 70	2		source port ID *	 72	2		sequence ID	 *	 74	1		control *	 75	1		reserved *	 76	2		flags *	 78	4		reserved *	 82	4		origin timestamp (seconds) *	 86	4		origin timestamp (nanoseconds) *	 90	2		epoch number *	 92	2		current UTC offset *	 94	1		reserved *	 95	1		grandmaster communication technology *	 96	6		grandmaster clock UUID *	 102	2		grandmaster port ID *	 104	2		grandmaster sequence ID *	 106	3		reserved *	 109	1		grandmaster clock stratum *	 110	4		grandmaster clock identifier *	 114	2		reserved *	 116	2		grandmaster clock variance *	 118	1		reserved *	 119	1		grandmaster preferred *	 120	1		reserved *	 121	1		grandmaster's boundary clock *	 122	3		reserved *	 125	1		sync interval *	 126	2		reserved *	 128	2		local clock variance *	 130	2		reserved *	 132	2		local steps removed *	 134	3		reserved *	 137	1		local clock stratum *	 138	4		local clock identifier *	 142	1		reserved *	 143	1		parent comminucation technology *	 144	6		parent UUID *	 150	2		reserved *	 152	2		parent port field *	 154	2		reserved *	 156	2		estimate master variance *	 158	4		estimate master drift *	 162	3		reserved *	 165	1		utc reasonable * * This function only fills the relevant fields that the Time Sync * hardware reads to recognize the frame as PTP message.  *  * @param  * control UINT8 [in] - control field of PTP message *	- 0 : Sync Message *	- 1 : Delay_Req Message  * * @return void  */PRIVATE void ixTimeSyncAccCodeletPTPMsgBuild (UINT8 control){			UINT8 *compPtr;								compPtr = ixTimeSyncAccCodeletPtpMsgData;	memset (compPtr, 0, IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN); 	compPtr[12] = IX_TIMESYNCACC_CODELET_MSB_VALUE(IX_TIMESYNCACC_CODELET_IP_DATAGRAM);	compPtr[13] = IX_TIMESYNCACC_CODELET_LSB_VALUE(IX_TIMESYNCACC_CODELET_IP_DATAGRAM);	 	compPtr[14] = IX_TIMESYNCACC_CODELET_IP_HEADER_LEN;	compPtr[16] = IX_TIMESYNCACC_CODELET_MSB_VALUE(IX_TIMESYNCACC_CODELET_IP_DATAGRAM_LEN);	compPtr[17] = IX_TIMESYNCACC_CODELET_LSB_VALUE(IX_TIMESYNCACC_CODELET_IP_DATAGRAM_LEN);	compPtr[22] = IX_TIMESYNCACC_CODELET_TIME_TO_LIVE;	compPtr[23] = IX_TIMESYNCACC_CODELET_UDP_PROTOCOL;	compPtr[30] = ixTimeSyncAccCodeletPTPMulticastAddress[0];	compPtr[31] = ixTimeSyncAccCodeletPTPMulticastAddress[1];	compPtr[32] = ixTimeSyncAccCodeletPTPMulticastAddress[2];	compPtr[33] = ixTimeSyncAccCodeletPTPMulticastAddress[3];	compPtr[36] = IX_TIMESYNCACC_CODELET_MSB_VALUE(IX_TIMESYNCACC_CODELET_PTP_EVENT_PORT); 	compPtr[37] = IX_TIMESYNCACC_CODELET_LSB_VALUE(IX_TIMESYNCACC_CODELET_PTP_EVENT_PORT);	compPtr[39] = IX_TIMESYNCACC_CODELET_UDP_PAYLOAD_LEN;	compPtr[62] = IX_TIMESYNCACC_CODELET_PTP_MESSAGE_TYPE;	compPtr[74] = control;} /* end of ixTimeSyncAccCodeletPTPMsgBuild function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletPTPMsgTransmit () * * @brief  Transmit Sync message from master port and Delay_Req message *	   from slave port every 2 seconds.   * * @return void */PRIVATE voidixTimeSyncAccCodeletPTPMsgTransmit (){	IX_OSAL_MBUF *mBufPtr;	IxEthAccPortId portId = 0; 	IxTimeSyncAcc1588PTPPort tsChannel;	IxTimeSyncAcc1588PTPMsgType txMsgType;	IxTimeSyncAcc1588PTPPortMode tsChannelMode;	/* clear PTP message transmission halt flag */	ixTimeSyncAccCodeletTxHalt = FALSE;	for (tsChannel = IX_TIMESYNCACC_NPE_A_1588PTP_PORT; 	     tsChannel < IX_TIMESYNCACC_CODELET_MAX_TS_CHANNELS; 	     tsChannel++)	{				portId = ixTimeSyncAccCodeletPortIdList[tsChannel];		tsChannelMode = ixTimeSyncAccCodeletConfigPtr->tsChannelMode[tsChannel];		txMsgType = ixTimeSyncAccCodeletPTPMsgTypeList[tsChannelMode]; 			/* build PTP message */		ixTimeSyncAccCodeletPTPMsgBuild (txMsgType);		if (IX_SUCCESS != ixTimeSyncAccCodeletPortConfigure (portId))		{			ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPTPMsgTransmit: failed to configure port %d\n", 				portId, 0, 0, 0, 0, 0);			/* terminate time sync codelet execution */			ixTimeSyncAccCodeletQuit ();			return;		}   		if (IX_ETH_ACC_SUCCESS != ixEthAccPortEnable (portId))		{			ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPTPMsgTransmit: failed to enable port %d\n", 				portId, 0, 0, 0, 0, 0);						/* terminate time sync codelet execution */			ixTimeSyncAccCodeletQuit ();			return;		} 		mBufPtr = ixTimeSyncAccCodeletGlobalMBuf[portId];		if (NULL == mBufPtr)		{	  		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPTPMsgTransmit: NULL mBuf pointer, port Id %d\n", 				portId, 0, 0, 0, 0, 0);			/* terminate time sync codelet execution */			ixTimeSyncAccCodeletQuit ();			return;		}				/* copy PTP message data to mBuf's data buffer */			memcpy (IX_OSAL_MBUF_MDATA(mBufPtr), 			ixTimeSyncAccCodeletPtpMsgData, 			IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN);	} /* end of for loop */	if (IX_SUCCESS != ixOsalSemaphoreInit (&ixTimeSyncAccCodeletSemId, IX_TIMESYNCACC_CODELET_MAX_TS_CHANNELS))	{		ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPTPMsgTransmit: failed to create semaphore\n",			0, 0, 0, 0, 0, 0);				/* terminate time sync codelet execution */		ixTimeSyncAccCodeletQuit ();		return;	}		do 	{		/* halt PTP message transmission */		if (TRUE == ixTimeSyncAccCodeletTxHalt)		{			ixOsalLog (IX_OSAL_LOG_LVL_USER, IX_OSAL_LOG_DEV_STDOUT, "ixTimeSyncAccCodeletPTPMsgTransmit: PTP message transmission was halted\n",				0, 0, 0, 0, 0, 0);			return;		}		/* sleep and wait for interval time to elapse before transmitting next PTP message */		ixOsalSleep (IX_TIMESYNCACC_CODELET_PTP_MSG_XMIT_INTERVAL);		for (portId = IX_ETH_PORT_1; portId <= IX_ETH_PORT_3; portId++)		{			if (IX_SUCCESS != ixOsalSemaphoreWait (&ixTimeSyncAccCodeletSemId, IX_TIMESYNCACC_CODELET_PTP_MSG_XMIT_INTERVAL))			{				ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPTPMsgTransmit: PTP message transmission error at port %d\n",					portId, 0, 0, 0, 0, 0);								/* terminate time sync codelet execution */				ixTimeSyncAccCodeletQuit ();				return;				}			if (IX_ETH_ACC_SUCCESS != ixEthAccPortTxFrameSubmit (portId, 									ixTimeSyncAccCodeletGlobalMBuf[portId], 									IX_ETH_ACC_TX_DEFAULT_PRIORITY))			{				ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPTPMsgTransmit: failed to transmit PTP message from port %d\n", 					portId, 0, 0, 0, 0, 0);								/* terminate time sync codelet execution */				ixTimeSyncAccCodeletQuit ();				return;			}		} /* end of for loop */					} while (TRUE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -