📄 ixtimesyncacccodelet.c
字号:
* @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 + -