aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/epl/EplDllk.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/epl/EplDllk.c')
-rw-r--r--drivers/staging/epl/EplDllk.c5793
1 files changed, 3032 insertions, 2761 deletions
diff --git a/drivers/staging/epl/EplDllk.c b/drivers/staging/epl/EplDllk.c
index dee0d3dc2f3..9e22641055c 100644
--- a/drivers/staging/epl/EplDllk.c
+++ b/drivers/staging/epl/EplDllk.c
@@ -121,19 +121,18 @@
// TracePoint support for realtime-debugging
#ifdef _DBG_TRACE_POINTS_
- void PUBLIC TgtDbgSignalTracePoint (BYTE bTracePointNumber_p);
- void PUBLIC TgtDbgPostTraceValue (DWORD dwTraceValue_p);
- #define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
- #define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
+void PUBLIC TgtDbgSignalTracePoint(BYTE bTracePointNumber_p);
+void PUBLIC TgtDbgPostTraceValue(DWORD dwTraceValue_p);
+#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
+#define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
#else
- #define TGT_DBG_SIGNAL_TRACE_POINT(p)
- #define TGT_DBG_POST_TRACE_VALUE(v)
+#define TGT_DBG_SIGNAL_TRACE_POINT(p)
+#define TGT_DBG_POST_TRACE_VALUE(v)
#endif
#define EPL_DLLK_DBG_POST_TRACE_VALUE(Event_p, uiNodeId_p, wErrorCode_p) \
TGT_DBG_POST_TRACE_VALUE((kEplEventSinkDllk << 28) | (Event_p << 24) \
| (uiNodeId_p << 16) | wErrorCode_p)
-
/***************************************************************************/
/* */
/* */
@@ -147,7 +146,6 @@
//
/***************************************************************************/
-
//=========================================================================//
// //
// P R I V A T E D E F I N I T I O N S //
@@ -159,96 +157,93 @@
//---------------------------------------------------------------------------
// defines for indexes of tEplDllInstance.m_pTxFrameInfo
-#define EPL_DLLK_TXFRAME_IDENTRES 0 // IdentResponse on CN / MN
-#define EPL_DLLK_TXFRAME_STATUSRES 1 // StatusResponse on CN / MN
-#define EPL_DLLK_TXFRAME_NMTREQ 2 // NMT Request from FIFO on CN / MN
-#define EPL_DLLK_TXFRAME_NONEPL 3 // non-EPL frame from FIFO on CN / MN
-#define EPL_DLLK_TXFRAME_PRES 4 // PRes on CN / MN
-#define EPL_DLLK_TXFRAME_SOC 5 // SoC on MN
-#define EPL_DLLK_TXFRAME_SOA 6 // SoA on MN
-#define EPL_DLLK_TXFRAME_PREQ 7 // PReq on MN
+#define EPL_DLLK_TXFRAME_IDENTRES 0 // IdentResponse on CN / MN
+#define EPL_DLLK_TXFRAME_STATUSRES 1 // StatusResponse on CN / MN
+#define EPL_DLLK_TXFRAME_NMTREQ 2 // NMT Request from FIFO on CN / MN
+#define EPL_DLLK_TXFRAME_NONEPL 3 // non-EPL frame from FIFO on CN / MN
+#define EPL_DLLK_TXFRAME_PRES 4 // PRes on CN / MN
+#define EPL_DLLK_TXFRAME_SOC 5 // SoC on MN
+#define EPL_DLLK_TXFRAME_SOA 6 // SoA on MN
+#define EPL_DLLK_TXFRAME_PREQ 7 // PReq on MN
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-#define EPL_DLLK_TXFRAME_COUNT (7 + EPL_D_NMT_MaxCNNumber_U8 + 2) // on MN: 7 + MaxPReq of regular CNs + 1 Diag + 1 Router
+#define EPL_DLLK_TXFRAME_COUNT (7 + EPL_D_NMT_MaxCNNumber_U8 + 2) // on MN: 7 + MaxPReq of regular CNs + 1 Diag + 1 Router
#else
-#define EPL_DLLK_TXFRAME_COUNT 5 // on CN: 5
+#define EPL_DLLK_TXFRAME_COUNT 5 // on CN: 5
#endif
-#define EPL_DLLK_BUFLEN_EMPTY 0 // buffer is empty
-#define EPL_DLLK_BUFLEN_FILLING 1 // just the buffer is being filled
-#define EPL_DLLK_BUFLEN_MIN 60 // minimum ethernet frame length
+#define EPL_DLLK_BUFLEN_EMPTY 0 // buffer is empty
+#define EPL_DLLK_BUFLEN_FILLING 1 // just the buffer is being filled
+#define EPL_DLLK_BUFLEN_MIN 60 // minimum ethernet frame length
//---------------------------------------------------------------------------
// local types
//---------------------------------------------------------------------------
-typedef enum
-{
- kEplDllGsInit = 0x00, // MN/CN: initialisation (< PreOp2)
- kEplDllCsWaitPreq = 0x01, // CN: wait for PReq frame
- kEplDllCsWaitSoc = 0x02, // CN: wait for SoC frame
- kEplDllCsWaitSoa = 0x03, // CN: wait for SoA frame
- kEplDllMsNonCyclic = 0x04, // MN: reduced EPL cycle (PreOp1)
- kEplDllMsWaitSocTrig = 0x05, // MN: wait for SoC trigger (cycle timer)
- kEplDllMsWaitPreqTrig = 0x06, // MN: wait for (first) PReq trigger (WaitSoCPReq_U32)
- kEplDllMsWaitPres = 0x07, // MN: wait for PRes frame from CN
- kEplDllMsWaitSoaTrig = 0x08, // MN: wait for SoA trigger (PRes transmitted)
- kEplDllMsWaitAsndTrig = 0x09, // MN: wait for ASnd trigger (SoA transmitted)
- kEplDllMsWaitAsnd = 0x0A, // MN: wait for ASnd frame if SoA contained invitation
+typedef enum {
+ kEplDllGsInit = 0x00, // MN/CN: initialisation (< PreOp2)
+ kEplDllCsWaitPreq = 0x01, // CN: wait for PReq frame
+ kEplDllCsWaitSoc = 0x02, // CN: wait for SoC frame
+ kEplDllCsWaitSoa = 0x03, // CN: wait for SoA frame
+ kEplDllMsNonCyclic = 0x04, // MN: reduced EPL cycle (PreOp1)
+ kEplDllMsWaitSocTrig = 0x05, // MN: wait for SoC trigger (cycle timer)
+ kEplDllMsWaitPreqTrig = 0x06, // MN: wait for (first) PReq trigger (WaitSoCPReq_U32)
+ kEplDllMsWaitPres = 0x07, // MN: wait for PRes frame from CN
+ kEplDllMsWaitSoaTrig = 0x08, // MN: wait for SoA trigger (PRes transmitted)
+ kEplDllMsWaitAsndTrig = 0x09, // MN: wait for ASnd trigger (SoA transmitted)
+ kEplDllMsWaitAsnd = 0x0A, // MN: wait for ASnd frame if SoA contained invitation
} tEplDllState;
-typedef struct
-{
- BYTE m_be_abSrcMac[6];
- tEdrvTxBuffer* m_pTxBuffer; // Buffers for Tx-Frames
- unsigned int m_uiMaxTxFrames;
- BYTE m_bFlag1; // Flag 1 with EN, EC for PRes, StatusRes
- BYTE m_bMnFlag1; // Flag 1 with EA, ER from PReq, SoA of MN
- BYTE m_bFlag2; // Flag 2 with PR and RS for PRes, StatusRes, IdentRes
- tEplDllConfigParam m_DllConfigParam;
- tEplDllIdentParam m_DllIdentParam;
- tEplDllState m_DllState;
- tEplDllkCbAsync m_pfnCbAsync;
- tEplDllAsndFilter m_aAsndFilter[EPL_DLL_MAX_ASND_SERVICE_ID];
+typedef struct {
+ BYTE m_be_abSrcMac[6];
+ tEdrvTxBuffer *m_pTxBuffer; // Buffers for Tx-Frames
+ unsigned int m_uiMaxTxFrames;
+ BYTE m_bFlag1; // Flag 1 with EN, EC for PRes, StatusRes
+ BYTE m_bMnFlag1; // Flag 1 with EA, ER from PReq, SoA of MN
+ BYTE m_bFlag2; // Flag 2 with PR and RS for PRes, StatusRes, IdentRes
+ tEplDllConfigParam m_DllConfigParam;
+ tEplDllIdentParam m_DllIdentParam;
+ tEplDllState m_DllState;
+ tEplDllkCbAsync m_pfnCbAsync;
+ tEplDllAsndFilter m_aAsndFilter[EPL_DLL_MAX_ASND_SERVICE_ID];
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- tEplDllkNodeInfo* m_pFirstNodeInfo;
- tEplDllkNodeInfo* m_pCurNodeInfo;
- tEplDllkNodeInfo m_aNodeInfo[EPL_NMT_MAX_NODE_ID];
- tEplDllReqServiceId m_LastReqServiceId;
- unsigned int m_uiLastTargetNodeId;
+ tEplDllkNodeInfo *m_pFirstNodeInfo;
+ tEplDllkNodeInfo *m_pCurNodeInfo;
+ tEplDllkNodeInfo m_aNodeInfo[EPL_NMT_MAX_NODE_ID];
+ tEplDllReqServiceId m_LastReqServiceId;
+ unsigned int m_uiLastTargetNodeId;
#endif
#if EPL_TIMER_USE_HIGHRES != FALSE
- tEplTimerHdl m_TimerHdlCycle; // used for EPL cycle monitoring on CN and generation on MN
+ tEplTimerHdl m_TimerHdlCycle; // used for EPL cycle monitoring on CN and generation on MN
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- tEplTimerHdl m_TimerHdlResponse; // used for CN response monitoring
-#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
+ tEplTimerHdl m_TimerHdlResponse; // used for CN response monitoring
+#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
#endif
- unsigned int m_uiCycleCount; // cycle counter (needed for multiplexed cycle support)
- unsigned long long m_ullFrameTimeout; // frame timeout (cycle length + loss of frame tolerance)
+ unsigned int m_uiCycleCount; // cycle counter (needed for multiplexed cycle support)
+ unsigned long long m_ullFrameTimeout; // frame timeout (cycle length + loss of frame tolerance)
} tEplDllkInstance;
-
//---------------------------------------------------------------------------
// local vars
//---------------------------------------------------------------------------
// if no dynamic memory allocation shall be used
// define structures statically
-static tEplDllkInstance EplDllkInstance_g;
-
-static tEdrvTxBuffer aEplDllkTxBuffer_l[EPL_DLLK_TXFRAME_COUNT];
+static tEplDllkInstance EplDllkInstance_g;
+static tEdrvTxBuffer aEplDllkTxBuffer_l[EPL_DLLK_TXFRAME_COUNT];
//---------------------------------------------------------------------------
// local function prototypes
//---------------------------------------------------------------------------
// change DLL state on event
-static tEplKernel EplDllkChangeState(tEplNmtEvent NmtEvent_p, tEplNmtState NmtState_p);
+static tEplKernel EplDllkChangeState(tEplNmtEvent NmtEvent_p,
+ tEplNmtState NmtState_p);
// called from EdrvInterruptHandler()
static void EplDllkCbFrameReceived(tEdrvRxBuffer * pRxBuffer_p);
@@ -257,32 +252,36 @@ static void EplDllkCbFrameReceived(tEdrvRxBuffer * pRxBuffer_p);
static void EplDllkCbFrameTransmitted(tEdrvTxBuffer * pTxBuffer_p);
// check frame and set missing information
-static tEplKernel EplDllkCheckFrame(tEplFrame * pFrame_p, unsigned int uiFrameSize_p);
+static tEplKernel EplDllkCheckFrame(tEplFrame * pFrame_p,
+ unsigned int uiFrameSize_p);
// called by high resolution timer module to monitor EPL cycle as CN
#if EPL_TIMER_USE_HIGHRES != FALSE
-static tEplKernel PUBLIC EplDllkCbCnTimer(tEplTimerEventArg* pEventArg_p);
+static tEplKernel PUBLIC EplDllkCbCnTimer(tEplTimerEventArg * pEventArg_p);
#endif
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
// MN: returns internal node info structure
-static tEplDllkNodeInfo* EplDllkGetNodeInfo(unsigned int uiNodeId_p);
+static tEplDllkNodeInfo *EplDllkGetNodeInfo(unsigned int uiNodeId_p);
// transmit SoA
static tEplKernel EplDllkMnSendSoa(tEplNmtState NmtState_p,
- tEplDllState* pDllStateProposed_p,
- BOOL fEnableInvitation_p);
+ tEplDllState * pDllStateProposed_p,
+ BOOL fEnableInvitation_p);
static tEplKernel EplDllkMnSendSoc(void);
static tEplKernel EplDllkMnSendPreq(tEplNmtState NmtState_p,
- tEplDllState* pDllStateProposed_p);
+ tEplDllState * pDllStateProposed_p);
-static tEplKernel EplDllkAsyncFrameNotReceived(tEplDllReqServiceId ReqServiceId_p, unsigned int uiNodeId_p);
+static tEplKernel EplDllkAsyncFrameNotReceived(tEplDllReqServiceId
+ ReqServiceId_p,
+ unsigned int uiNodeId_p);
-static tEplKernel PUBLIC EplDllkCbMnTimerCycle(tEplTimerEventArg* pEventArg_p);
+static tEplKernel PUBLIC EplDllkCbMnTimerCycle(tEplTimerEventArg * pEventArg_p);
-static tEplKernel PUBLIC EplDllkCbMnTimerResponse(tEplTimerEventArg* pEventArg_p);
+static tEplKernel PUBLIC EplDllkCbMnTimerResponse(tEplTimerEventArg *
+ pEventArg_p);
#endif
@@ -309,68 +308,68 @@ static tEplKernel PUBLIC EplDllkCbMnTimerResponse(tEplTimerEventArg* pEventArg_p
tEplKernel EplDllkAddInstance(tEplDllkInitParam * pInitParam_p)
{
-tEplKernel Ret = kEplSuccessful;
-unsigned int uiIndex;
-tEdrvInitParam EdrvInitParam;
+ tEplKernel Ret = kEplSuccessful;
+ unsigned int uiIndex;
+ tEdrvInitParam EdrvInitParam;
- // reset instance structure
- EPL_MEMSET(&EplDllkInstance_g, 0, sizeof (EplDllkInstance_g));
+ // reset instance structure
+ EPL_MEMSET(&EplDllkInstance_g, 0, sizeof(EplDllkInstance_g));
#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskInit();
- if (Ret != kEplSuccessful)
- { // error occured while initializing high resolution timer module
- goto Exit;
- }
+ Ret = EplTimerHighReskInit();
+ if (Ret != kEplSuccessful) { // error occured while initializing high resolution timer module
+ goto Exit;
+ }
#endif
- // if dynamic memory allocation available
- // allocate instance structure
- // allocate TPDO and RPDO table with default size
+ // if dynamic memory allocation available
+ // allocate instance structure
+ // allocate TPDO and RPDO table with default size
- // initialize and link pointers in instance structure to frame tables
- EplDllkInstance_g.m_pTxBuffer = aEplDllkTxBuffer_l;
- EplDllkInstance_g.m_uiMaxTxFrames = sizeof (aEplDllkTxBuffer_l) / sizeof (tEdrvTxBuffer);
+ // initialize and link pointers in instance structure to frame tables
+ EplDllkInstance_g.m_pTxBuffer = aEplDllkTxBuffer_l;
+ EplDllkInstance_g.m_uiMaxTxFrames =
+ sizeof(aEplDllkTxBuffer_l) / sizeof(tEdrvTxBuffer);
- // initialize state
- EplDllkInstance_g.m_DllState = kEplDllGsInit;
+ // initialize state
+ EplDllkInstance_g.m_DllState = kEplDllGsInit;
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // set up node info structure
- for (uiIndex = 0; uiIndex < tabentries (EplDllkInstance_g.m_aNodeInfo); uiIndex++)
- {
- EplDllkInstance_g.m_aNodeInfo[uiIndex].m_uiNodeId = uiIndex + 1;
- EplDllkInstance_g.m_aNodeInfo[uiIndex].m_wPresPayloadLimit = 0xFFFF;
- }
+ // set up node info structure
+ for (uiIndex = 0; uiIndex < tabentries(EplDllkInstance_g.m_aNodeInfo);
+ uiIndex++) {
+ EplDllkInstance_g.m_aNodeInfo[uiIndex].m_uiNodeId = uiIndex + 1;
+ EplDllkInstance_g.m_aNodeInfo[uiIndex].m_wPresPayloadLimit =
+ 0xFFFF;
+ }
#endif
- // initialize Edrv
- EPL_MEMCPY(EdrvInitParam.m_abMyMacAddr, pInitParam_p->m_be_abSrcMac, 6);
- EdrvInitParam.m_pfnRxHandler = EplDllkCbFrameReceived;
- EdrvInitParam.m_pfnTxHandler = EplDllkCbFrameTransmitted;
- Ret = EdrvInit(&EdrvInitParam);
- if (Ret != kEplSuccessful)
- { // error occured while initializing ethernet driver
- goto Exit;
- }
-
- // copy local MAC address from Ethernet driver back to local instance structure
- // because Ethernet driver may have read it from controller EEPROM
- EPL_MEMCPY(EplDllkInstance_g.m_be_abSrcMac, EdrvInitParam.m_abMyMacAddr, 6);
- EPL_MEMCPY(pInitParam_p->m_be_abSrcMac, EdrvInitParam.m_abMyMacAddr, 6);
-
- // initialize TxBuffer array
- for (uiIndex = 0; uiIndex < EplDllkInstance_g.m_uiMaxTxFrames; uiIndex++)
- {
- EplDllkInstance_g.m_pTxBuffer[uiIndex].m_pbBuffer = NULL;
- }
+ // initialize Edrv
+ EPL_MEMCPY(EdrvInitParam.m_abMyMacAddr, pInitParam_p->m_be_abSrcMac, 6);
+ EdrvInitParam.m_pfnRxHandler = EplDllkCbFrameReceived;
+ EdrvInitParam.m_pfnTxHandler = EplDllkCbFrameTransmitted;
+ Ret = EdrvInit(&EdrvInitParam);
+ if (Ret != kEplSuccessful) { // error occured while initializing ethernet driver
+ goto Exit;
+ }
+ // copy local MAC address from Ethernet driver back to local instance structure
+ // because Ethernet driver may have read it from controller EEPROM
+ EPL_MEMCPY(EplDllkInstance_g.m_be_abSrcMac, EdrvInitParam.m_abMyMacAddr,
+ 6);
+ EPL_MEMCPY(pInitParam_p->m_be_abSrcMac, EdrvInitParam.m_abMyMacAddr, 6);
+
+ // initialize TxBuffer array
+ for (uiIndex = 0; uiIndex < EplDllkInstance_g.m_uiMaxTxFrames;
+ uiIndex++) {
+ EplDllkInstance_g.m_pTxBuffer[uiIndex].m_pbBuffer = NULL;
+ }
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
- Ret = VEthAddInstance(pInitParam_p);
+ Ret = VEthAddInstance(pInitParam_p);
#endif
-Exit:
- return Ret;
+ Exit:
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -390,21 +389,21 @@ Exit:
tEplKernel EplDllkDelInstance(void)
{
-tEplKernel Ret = kEplSuccessful;
+ tEplKernel Ret = kEplSuccessful;
- // reset state
- EplDllkInstance_g.m_DllState = kEplDllGsInit;
+ // reset state
+ EplDllkInstance_g.m_DllState = kEplDllGsInit;
#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskDelInstance();
+ Ret = EplTimerHighReskDelInstance();
#endif
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
- Ret = VEthDelInstance();
+ Ret = VEthDelInstance();
#endif
- Ret = EdrvShutdown();
- return Ret;
+ Ret = EdrvShutdown();
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -431,192 +430,182 @@ tEplKernel Ret = kEplSuccessful;
//
//---------------------------------------------------------------------------
-tEplKernel EplDllkCreateTxFrame (unsigned int * puiHandle_p,
- tEplFrame ** ppFrame_p,
- unsigned int * puiFrameSize_p,
- tEplMsgType MsgType_p,
- tEplDllAsndServiceId ServiceId_p)
+tEplKernel EplDllkCreateTxFrame(unsigned int *puiHandle_p,
+ tEplFrame ** ppFrame_p,
+ unsigned int *puiFrameSize_p,
+ tEplMsgType MsgType_p,
+ tEplDllAsndServiceId ServiceId_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplFrame *pTxFrame;
-unsigned int uiHandle = EplDllkInstance_g.m_uiMaxTxFrames;
-tEdrvTxBuffer *pTxBuffer = NULL;
-
- if (MsgType_p == kEplMsgTypeAsnd)
- {
- // search for fixed Tx buffers
- if (ServiceId_p == kEplDllAsndIdentResponse)
- {
- uiHandle = EPL_DLLK_TXFRAME_IDENTRES;
- }
- else if (ServiceId_p == kEplDllAsndStatusResponse)
- {
- uiHandle = EPL_DLLK_TXFRAME_STATUSRES;
- }
- else if ((ServiceId_p == kEplDllAsndNmtRequest) || (ServiceId_p == kEplDllAsndNmtCommand))
- {
- uiHandle = EPL_DLLK_TXFRAME_NMTREQ;
- }
-
- if (uiHandle >= EplDllkInstance_g.m_uiMaxTxFrames)
- { // look for free entry
- uiHandle = EPL_DLLK_TXFRAME_PREQ;
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle];
- for (; uiHandle < EplDllkInstance_g.m_uiMaxTxFrames; uiHandle++, pTxBuffer++)
- {
- if (pTxBuffer->m_pbBuffer == NULL)
- { // free entry found
- break;
- }
- }
- }
- }
- else if (MsgType_p == kEplMsgTypeNonEpl)
- {
- uiHandle = EPL_DLLK_TXFRAME_NONEPL;
- }
- else if (MsgType_p == kEplMsgTypePres)
- {
- uiHandle = EPL_DLLK_TXFRAME_PRES;
- }
- else if (MsgType_p == kEplMsgTypeSoc)
- {
- uiHandle = EPL_DLLK_TXFRAME_SOC;
- }
- else if (MsgType_p == kEplMsgTypeSoa)
- {
- uiHandle = EPL_DLLK_TXFRAME_SOA;
- }
- else
- { // look for free entry
- uiHandle = EPL_DLLK_TXFRAME_PREQ;
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle];
- for (; uiHandle < EplDllkInstance_g.m_uiMaxTxFrames; uiHandle++, pTxBuffer++)
- {
- if (pTxBuffer->m_pbBuffer == NULL)
- { // free entry found
- break;
- }
- }
- if (pTxBuffer->m_pbBuffer != NULL)
- {
- Ret = kEplEdrvNoFreeBufEntry;
- goto Exit;
- }
- }
-
- // test if requested entry is free
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle];
- if (pTxBuffer->m_pbBuffer != NULL)
- { // entry is not free
- Ret = kEplEdrvNoFreeBufEntry;
- goto Exit;
- }
-
- // setup Tx buffer
- pTxBuffer->m_EplMsgType = MsgType_p;
- pTxBuffer->m_uiMaxBufferLen = *puiFrameSize_p;
-
- Ret = EdrvAllocTxMsgBuffer(pTxBuffer);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
-
- // because buffer size may be larger than requested
- // memorize real length of frame
- pTxBuffer->m_uiTxMsgLen = *puiFrameSize_p;
-
- // fill whole frame with 0
- EPL_MEMSET(pTxBuffer->m_pbBuffer, 0, pTxBuffer->m_uiMaxBufferLen);
-
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
-
- if (MsgType_p != kEplMsgTypeNonEpl)
- { // fill out Frame only if it is an EPL frame
- // ethertype
- AmiSetWordToBe(&pTxFrame->m_be_wEtherType, EPL_C_DLL_ETHERTYPE_EPL);
- // source node ID
- AmiSetByteToLe(&pTxFrame->m_le_bSrcNodeId, (BYTE) EplDllkInstance_g.m_DllConfigParam.m_uiNodeId);
- // source MAC address
- EPL_MEMCPY(&pTxFrame->m_be_abSrcMac[0], &EplDllkInstance_g.m_be_abSrcMac[0], 6);
- switch (MsgType_p)
- {
- case kEplMsgTypeAsnd:
- // destination MAC address
- AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0], EPL_C_DLL_MULTICAST_ASND);
- // destination node ID
- switch (ServiceId_p)
- {
- case kEplDllAsndIdentResponse:
- case kEplDllAsndStatusResponse:
- { // IdentResponses and StatusResponses are Broadcast
- AmiSetByteToLe(&pTxFrame->m_le_bDstNodeId, (BYTE) EPL_C_ADR_BROADCAST);
- break;
- }
-
- default:
- break;
- }
- // ASnd Service ID
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_le_bServiceId, ServiceId_p);
- break;
-
- case kEplMsgTypeSoc:
- // destination MAC address
- AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0], EPL_C_DLL_MULTICAST_SOC);
- // destination node ID
- AmiSetByteToLe(&pTxFrame->m_le_bDstNodeId, (BYTE) EPL_C_ADR_BROADCAST);
- // reset Flags
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soc.m_le_bFlag1, (BYTE) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soc.m_le_bFlag2, (BYTE) 0);
- break;
-
- case kEplMsgTypeSoa:
- // destination MAC address
- AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0], EPL_C_DLL_MULTICAST_SOA);
- // destination node ID
- AmiSetByteToLe(&pTxFrame->m_le_bDstNodeId, (BYTE) EPL_C_ADR_BROADCAST);
- // reset Flags
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bFlag1, (BYTE) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bFlag2, (BYTE) 0);
- // EPL profile version
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bEplVersion, (BYTE) EPL_SPEC_VERSION);
- break;
-
- case kEplMsgTypePres:
- // destination MAC address
- AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0], EPL_C_DLL_MULTICAST_PRES);
- // destination node ID
- AmiSetByteToLe(&pTxFrame->m_le_bDstNodeId, (BYTE) EPL_C_ADR_BROADCAST);
- // reset Flags
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1, (BYTE) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag2, (BYTE) 0);
- // PDO size
- //AmiSetWordToLe(&pTxFrame->m_Data.m_Pres.m_le_wSize, 0);
- break;
-
- case kEplMsgTypePreq:
- // reset Flags
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag1, (BYTE) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag2, (BYTE) 0);
- // PDO size
- //AmiSetWordToLe(&pTxFrame->m_Data.m_Preq.m_le_wSize, 0);
- break;
-
- default:
- break;
- }
- // EPL message type
- AmiSetByteToLe(&pTxFrame->m_le_bMessageType, (BYTE) MsgType_p);
- }
-
- *ppFrame_p = pTxFrame;
- *puiFrameSize_p = pTxBuffer->m_uiMaxBufferLen;
- *puiHandle_p = uiHandle;
-
-Exit:
- return Ret;
+ tEplKernel Ret = kEplSuccessful;
+ tEplFrame *pTxFrame;
+ unsigned int uiHandle = EplDllkInstance_g.m_uiMaxTxFrames;
+ tEdrvTxBuffer *pTxBuffer = NULL;
+
+ if (MsgType_p == kEplMsgTypeAsnd) {
+ // search for fixed Tx buffers
+ if (ServiceId_p == kEplDllAsndIdentResponse) {
+ uiHandle = EPL_DLLK_TXFRAME_IDENTRES;
+ } else if (ServiceId_p == kEplDllAsndStatusResponse) {
+ uiHandle = EPL_DLLK_TXFRAME_STATUSRES;
+ } else if ((ServiceId_p == kEplDllAsndNmtRequest)
+ || (ServiceId_p == kEplDllAsndNmtCommand)) {
+ uiHandle = EPL_DLLK_TXFRAME_NMTREQ;
+ }
+
+ if (uiHandle >= EplDllkInstance_g.m_uiMaxTxFrames) { // look for free entry
+ uiHandle = EPL_DLLK_TXFRAME_PREQ;
+ pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle];
+ for (; uiHandle < EplDllkInstance_g.m_uiMaxTxFrames;
+ uiHandle++, pTxBuffer++) {
+ if (pTxBuffer->m_pbBuffer == NULL) { // free entry found
+ break;
+ }
+ }
+ }
+ } else if (MsgType_p == kEplMsgTypeNonEpl) {
+ uiHandle = EPL_DLLK_TXFRAME_NONEPL;
+ } else if (MsgType_p == kEplMsgTypePres) {
+ uiHandle = EPL_DLLK_TXFRAME_PRES;
+ } else if (MsgType_p == kEplMsgTypeSoc) {
+ uiHandle = EPL_DLLK_TXFRAME_SOC;
+ } else if (MsgType_p == kEplMsgTypeSoa) {
+ uiHandle = EPL_DLLK_TXFRAME_SOA;
+ } else { // look for free entry
+ uiHandle = EPL_DLLK_TXFRAME_PREQ;
+ pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle];
+ for (; uiHandle < EplDllkInstance_g.m_uiMaxTxFrames;
+ uiHandle++, pTxBuffer++) {
+ if (pTxBuffer->m_pbBuffer == NULL) { // free entry found
+ break;
+ }
+ }
+ if (pTxBuffer->m_pbBuffer != NULL) {
+ Ret = kEplEdrvNoFreeBufEntry;
+ goto Exit;
+ }
+ }
+
+ // test if requested entry is free
+ pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle];
+ if (pTxBuffer->m_pbBuffer != NULL) { // entry is not free
+ Ret = kEplEdrvNoFreeBufEntry;
+ goto Exit;
+ }
+ // setup Tx buffer
+ pTxBuffer->m_EplMsgType = MsgType_p;
+ pTxBuffer->m_uiMaxBufferLen = *puiFrameSize_p;
+
+ Ret = EdrvAllocTxMsgBuffer(pTxBuffer);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
+ // because buffer size may be larger than requested
+ // memorize real length of frame
+ pTxBuffer->m_uiTxMsgLen = *puiFrameSize_p;
+
+ // fill whole frame with 0
+ EPL_MEMSET(pTxBuffer->m_pbBuffer, 0, pTxBuffer->m_uiMaxBufferLen);
+
+ pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
+
+ if (MsgType_p != kEplMsgTypeNonEpl) { // fill out Frame only if it is an EPL frame
+ // ethertype
+ AmiSetWordToBe(&pTxFrame->m_be_wEtherType,
+ EPL_C_DLL_ETHERTYPE_EPL);
+ // source node ID
+ AmiSetByteToLe(&pTxFrame->m_le_bSrcNodeId,
+ (BYTE) EplDllkInstance_g.m_DllConfigParam.
+ m_uiNodeId);
+ // source MAC address
+ EPL_MEMCPY(&pTxFrame->m_be_abSrcMac[0],
+ &EplDllkInstance_g.m_be_abSrcMac[0], 6);
+ switch (MsgType_p) {
+ case kEplMsgTypeAsnd:
+ // destination MAC address
+ AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0],
+ EPL_C_DLL_MULTICAST_ASND);
+ // destination node ID
+ switch (ServiceId_p) {
+ case kEplDllAsndIdentResponse:
+ case kEplDllAsndStatusResponse:
+ { // IdentResponses and StatusResponses are Broadcast
+ AmiSetByteToLe(&pTxFrame->
+ m_le_bDstNodeId,
+ (BYTE)
+ EPL_C_ADR_BROADCAST);
+ break;
+ }
+
+ default:
+ break;
+ }
+ // ASnd Service ID
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_le_bServiceId,
+ ServiceId_p);
+ break;
+
+ case kEplMsgTypeSoc:
+ // destination MAC address
+ AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0],
+ EPL_C_DLL_MULTICAST_SOC);
+ // destination node ID
+ AmiSetByteToLe(&pTxFrame->m_le_bDstNodeId,
+ (BYTE) EPL_C_ADR_BROADCAST);
+ // reset Flags
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Soc.m_le_bFlag1, (BYTE) 0);
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Soc.m_le_bFlag2, (BYTE) 0);
+ break;
+
+ case kEplMsgTypeSoa:
+ // destination MAC address
+ AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0],
+ EPL_C_DLL_MULTICAST_SOA);
+ // destination node ID
+ AmiSetByteToLe(&pTxFrame->m_le_bDstNodeId,
+ (BYTE) EPL_C_ADR_BROADCAST);
+ // reset Flags
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bFlag1, (BYTE) 0);
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bFlag2, (BYTE) 0);
+ // EPL profile version
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bEplVersion,
+ (BYTE) EPL_SPEC_VERSION);
+ break;
+
+ case kEplMsgTypePres:
+ // destination MAC address
+ AmiSetQword48ToBe(&pTxFrame->m_be_abDstMac[0],
+ EPL_C_DLL_MULTICAST_PRES);
+ // destination node ID
+ AmiSetByteToLe(&pTxFrame->m_le_bDstNodeId,
+ (BYTE) EPL_C_ADR_BROADCAST);
+ // reset Flags
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1, (BYTE) 0);
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag2, (BYTE) 0);
+ // PDO size
+ //AmiSetWordToLe(&pTxFrame->m_Data.m_Pres.m_le_wSize, 0);
+ break;
+
+ case kEplMsgTypePreq:
+ // reset Flags
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag1, (BYTE) 0);
+ //AmiSetByteToLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag2, (BYTE) 0);
+ // PDO size
+ //AmiSetWordToLe(&pTxFrame->m_Data.m_Preq.m_le_wSize, 0);
+ break;
+
+ default:
+ break;
+ }
+ // EPL message type
+ AmiSetByteToLe(&pTxFrame->m_le_bMessageType, (BYTE) MsgType_p);
+ }
+
+ *ppFrame_p = pTxFrame;
+ *puiFrameSize_p = pTxBuffer->m_uiMaxBufferLen;
+ *puiHandle_p = uiHandle;
+
+ Exit:
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -635,33 +624,31 @@ Exit:
//
//---------------------------------------------------------------------------
-tEplKernel EplDllkDeleteTxFrame (unsigned int uiHandle_p)
+tEplKernel EplDllkDeleteTxFrame(unsigned int uiHandle_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEdrvTxBuffer *pTxBuffer = NULL;
+ tEplKernel Ret = kEplSuccessful;
+ tEdrvTxBuffer *pTxBuffer = NULL;
- if (uiHandle_p >= EplDllkInstance_g.m_uiMaxTxFrames)
- { // handle is not valid
- Ret = kEplDllIllegalHdl;
- goto Exit;
- }
+ if (uiHandle_p >= EplDllkInstance_g.m_uiMaxTxFrames) { // handle is not valid
+ Ret = kEplDllIllegalHdl;
+ goto Exit;
+ }
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle_p];
+ pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle_p];
- // mark buffer as free so that frame will not be send in future anymore
- // $$$ d.k. What's up with running transmissions?
- pTxBuffer->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
- pTxBuffer->m_pbBuffer = NULL;
+ // mark buffer as free so that frame will not be send in future anymore
+ // $$$ d.k. What's up with running transmissions?
+ pTxBuffer->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
+ pTxBuffer->m_pbBuffer = NULL;
- // delete Tx buffer
- Ret = EdrvReleaseTxMsgBuffer(pTxBuffer);
- if (Ret != kEplSuccessful)
- { // error occured while releasing Tx frame
- goto Exit;
- }
+ // delete Tx buffer
+ Ret = EdrvReleaseTxMsgBuffer(pTxBuffer);
+ if (Ret != kEplSuccessful) { // error occured while releasing Tx frame
+ goto Exit;
+ }
-Exit:
- return Ret;
+ Exit:
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -681,544 +668,677 @@ Exit:
tEplKernel EplDllkProcess(tEplEvent * pEvent_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplFrame *pTxFrame;
-tEdrvTxBuffer *pTxBuffer;
-unsigned int uiHandle;
-unsigned int uiFrameSize;
-BYTE abMulticastMac[6];
-tEplDllAsyncReqPriority AsyncReqPriority;
-unsigned int uiFrameCount;
-tEplNmtState NmtState;
+ tEplKernel Ret = kEplSuccessful;
+ tEplFrame *pTxFrame;
+ tEdrvTxBuffer *pTxBuffer;
+ unsigned int uiHandle;
+ unsigned int uiFrameSize;
+ BYTE abMulticastMac[6];
+ tEplDllAsyncReqPriority AsyncReqPriority;
+ unsigned int uiFrameCount;
+ tEplNmtState NmtState;
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-tEplFrameInfo FrameInfo;
+ tEplFrameInfo FrameInfo;
#endif
+ switch (pEvent_p->m_EventType) {
+ case kEplEventTypeDllkCreate:
+ {
+ // $$$ reset ethernet driver
- switch (pEvent_p->m_EventType)
- {
- case kEplEventTypeDllkCreate:
- {
- // $$$ reset ethernet driver
-
- NmtState = *((tEplNmtState*)pEvent_p->m_pArg);
+ NmtState = *((tEplNmtState *) pEvent_p->m_pArg);
- // initialize flags for PRes and StatusRes
- EplDllkInstance_g.m_bFlag1 = EPL_FRAME_FLAG1_EC;
- EplDllkInstance_g.m_bMnFlag1 = 0;
- EplDllkInstance_g.m_bFlag2 = 0;
+ // initialize flags for PRes and StatusRes
+ EplDllkInstance_g.m_bFlag1 = EPL_FRAME_FLAG1_EC;
+ EplDllkInstance_g.m_bMnFlag1 = 0;
+ EplDllkInstance_g.m_bFlag2 = 0;
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // initialize linked node list
- EplDllkInstance_g.m_pFirstNodeInfo = NULL;
+ // initialize linked node list
+ EplDllkInstance_g.m_pFirstNodeInfo = NULL;
#endif
- // register TxFrames in Edrv
-
- // IdentResponse
- uiFrameSize = EPL_C_DLL_MINSIZE_IDENTRES;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pTxFrame, &uiFrameSize, kEplMsgTypeAsnd, kEplDllAsndIdentResponse);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
-
- // EPL profile version
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_bEplProfileVersion,
- (BYTE) EPL_SPEC_VERSION);
- // FeatureFlags
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwFeatureFlags,
- EplDllkInstance_g.m_DllConfigParam.m_dwFeatureFlags);
- // MTU
- AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_wMtu,
- (WORD) EplDllkInstance_g.m_DllConfigParam.m_uiAsyncMtu);
- // PollInSize
- AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_wPollInSize,
- (WORD)EplDllkInstance_g.m_DllConfigParam.m_uiPreqActPayloadLimit);
- // PollOutSize
- AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_wPollOutSize,
- (WORD)EplDllkInstance_g.m_DllConfigParam.m_uiPresActPayloadLimit);
- // ResponseTime / PresMaxLatency
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwResponseTime,
- EplDllkInstance_g.m_DllConfigParam.m_dwPresMaxLatency);
- // DeviceType
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwDeviceType,
- EplDllkInstance_g.m_DllIdentParam.m_dwDeviceType);
- // VendorId
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwVendorId,
- EplDllkInstance_g.m_DllIdentParam.m_dwVendorId);
- // ProductCode
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwProductCode,
- EplDllkInstance_g.m_DllIdentParam.m_dwProductCode);
- // RevisionNumber
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwRevisionNumber,
- EplDllkInstance_g.m_DllIdentParam.m_dwRevisionNumber);
- // SerialNumber
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwSerialNumber,
- EplDllkInstance_g.m_DllIdentParam.m_dwSerialNumber);
- // VendorSpecificExt1
- AmiSetQword64ToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_qwVendorSpecificExt1,
- EplDllkInstance_g.m_DllIdentParam.m_qwVendorSpecificExt1);
- // VerifyConfigurationDate
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwVerifyConfigurationDate,
- EplDllkInstance_g.m_DllIdentParam.m_dwVerifyConfigurationDate);
- // VerifyConfigurationTime
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwVerifyConfigurationTime,
- EplDllkInstance_g.m_DllIdentParam.m_dwVerifyConfigurationTime);
- // ApplicationSwDate
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwApplicationSwDate,
- EplDllkInstance_g.m_DllIdentParam.m_dwApplicationSwDate);
- // ApplicationSwTime
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwApplicationSwTime,
- EplDllkInstance_g.m_DllIdentParam.m_dwApplicationSwTime);
- // IPAddress
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwIpAddress,
- EplDllkInstance_g.m_DllIdentParam.m_dwIpAddress);
- // SubnetMask
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwSubnetMask,
- EplDllkInstance_g.m_DllIdentParam.m_dwSubnetMask);
- // DefaultGateway
- AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_dwDefaultGateway,
- EplDllkInstance_g.m_DllIdentParam.m_dwDefaultGateway);
- // HostName
- EPL_MEMCPY(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_sHostname[0],
- &EplDllkInstance_g.m_DllIdentParam.m_sHostname[0],
- sizeof (EplDllkInstance_g.m_DllIdentParam.m_sHostname));
- // VendorSpecificExt2
- EPL_MEMCPY(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_abVendorSpecificExt2[0],
- &EplDllkInstance_g.m_DllIdentParam.m_abVendorSpecificExt2[0],
- sizeof (EplDllkInstance_g.m_DllIdentParam.m_abVendorSpecificExt2));
-
- // StatusResponse
- uiFrameSize = EPL_C_DLL_MINSIZE_STATUSRES;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pTxFrame, &uiFrameSize, kEplMsgTypeAsnd, kEplDllAsndStatusResponse);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
-
- // PRes $$$ maybe move this to PDO module
- if ((EplDllkInstance_g.m_DllConfigParam.m_fAsyncOnly == FALSE)
- && (EplDllkInstance_g.m_DllConfigParam.m_uiPresActPayloadLimit >= 36))
- { // it is not configured as async-only CN,
- // so take part in isochronous phase and register PRes frame
- uiFrameSize = EplDllkInstance_g.m_DllConfigParam.m_uiPresActPayloadLimit + 24;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pTxFrame, &uiFrameSize, kEplMsgTypePres, kEplDllAsndNotDefined);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
-
+ // register TxFrames in Edrv
+
+ // IdentResponse
+ uiFrameSize = EPL_C_DLL_MINSIZE_IDENTRES;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pTxFrame,
+ &uiFrameSize, kEplMsgTypeAsnd,
+ kEplDllAsndIdentResponse);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
+ // EPL profile version
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_bEplProfileVersion,
+ (BYTE) EPL_SPEC_VERSION);
+ // FeatureFlags
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwFeatureFlags,
+ EplDllkInstance_g.m_DllConfigParam.
+ m_dwFeatureFlags);
+ // MTU
+ AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_wMtu,
+ (WORD) EplDllkInstance_g.
+ m_DllConfigParam.m_uiAsyncMtu);
+ // PollInSize
+ AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_wPollInSize,
+ (WORD) EplDllkInstance_g.
+ m_DllConfigParam.
+ m_uiPreqActPayloadLimit);
+ // PollOutSize
+ AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_wPollOutSize,
+ (WORD) EplDllkInstance_g.
+ m_DllConfigParam.
+ m_uiPresActPayloadLimit);
+ // ResponseTime / PresMaxLatency
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwResponseTime,
+ EplDllkInstance_g.m_DllConfigParam.
+ m_dwPresMaxLatency);
+ // DeviceType
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwDeviceType,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwDeviceType);
+ // VendorId
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwVendorId,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwVendorId);
+ // ProductCode
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwProductCode,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwProductCode);
+ // RevisionNumber
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwRevisionNumber,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwRevisionNumber);
+ // SerialNumber
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwSerialNumber,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwSerialNumber);
+ // VendorSpecificExt1
+ AmiSetQword64ToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.
+ m_le_qwVendorSpecificExt1,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_qwVendorSpecificExt1);
+ // VerifyConfigurationDate
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.
+ m_le_dwVerifyConfigurationDate,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwVerifyConfigurationDate);
+ // VerifyConfigurationTime
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.
+ m_le_dwVerifyConfigurationTime,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwVerifyConfigurationTime);
+ // ApplicationSwDate
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.
+ m_le_dwApplicationSwDate,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwApplicationSwDate);
+ // ApplicationSwTime
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.
+ m_le_dwApplicationSwTime,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwApplicationSwTime);
+ // IPAddress
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwIpAddress,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwIpAddress);
+ // SubnetMask
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwSubnetMask,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwSubnetMask);
+ // DefaultGateway
+ AmiSetDwordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_dwDefaultGateway,
+ EplDllkInstance_g.m_DllIdentParam.
+ m_dwDefaultGateway);
+ // HostName
+ EPL_MEMCPY(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_sHostname[0],
+ &EplDllkInstance_g.m_DllIdentParam.
+ m_sHostname[0],
+ sizeof(EplDllkInstance_g.m_DllIdentParam.
+ m_sHostname));
+ // VendorSpecificExt2
+ EPL_MEMCPY(&pTxFrame->m_Data.m_Asnd.m_Payload.
+ m_IdentResponse.m_le_abVendorSpecificExt2[0],
+ &EplDllkInstance_g.m_DllIdentParam.
+ m_abVendorSpecificExt2[0],
+ sizeof(EplDllkInstance_g.m_DllIdentParam.
+ m_abVendorSpecificExt2));
+
+ // StatusResponse
+ uiFrameSize = EPL_C_DLL_MINSIZE_STATUSRES;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pTxFrame,
+ &uiFrameSize, kEplMsgTypeAsnd,
+ kEplDllAsndStatusResponse);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
+ // PRes $$$ maybe move this to PDO module
+ if ((EplDllkInstance_g.m_DllConfigParam.m_fAsyncOnly ==
+ FALSE)
+ && (EplDllkInstance_g.m_DllConfigParam.m_uiPresActPayloadLimit >= 36)) { // it is not configured as async-only CN,
+ // so take part in isochronous phase and register PRes frame
+ uiFrameSize =
+ EplDllkInstance_g.m_DllConfigParam.
+ m_uiPresActPayloadLimit + 24;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pTxFrame,
+ &uiFrameSize,
+ kEplMsgTypePres,
+ kEplDllAsndNotDefined);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- // initially encode TPDO -> inform PDO module
- FrameInfo.m_pFrame = pTxFrame;
- FrameInfo.m_uiFrameSize = uiFrameSize;
- Ret = EplPdokCbPdoTransmitted(&FrameInfo);
+ // initially encode TPDO -> inform PDO module
+ FrameInfo.m_pFrame = pTxFrame;
+ FrameInfo.m_uiFrameSize = uiFrameSize;
+ Ret = EplPdokCbPdoTransmitted(&FrameInfo);
#endif
- // reset cycle counter
- EplDllkInstance_g.m_uiCycleCount = 0;
- }
- else
- { // it is an async-only CN
- // fool EplDllkChangeState() to think that PRes was not expected
- EplDllkInstance_g.m_uiCycleCount = 1;
- }
-
- // NMT request
- uiFrameSize = EPL_C_IP_MAX_MTU;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pTxFrame, &uiFrameSize, kEplMsgTypeAsnd, kEplDllAsndNmtRequest);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
- // mark Tx buffer as empty
- EplDllkInstance_g.m_pTxBuffer[uiHandle].m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
-
- // non-EPL frame
- uiFrameSize = EPL_C_IP_MAX_MTU;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pTxFrame, &uiFrameSize, kEplMsgTypeNonEpl, kEplDllAsndNotDefined);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
- // mark Tx buffer as empty
- EplDllkInstance_g.m_pTxBuffer[uiHandle].m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
-
- // register multicast MACs in ethernet driver
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_SOC);
- Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_SOA);
- Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_PRES);
- Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_ASND);
- Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
+ // reset cycle counter
+ EplDllkInstance_g.m_uiCycleCount = 0;
+ } else { // it is an async-only CN
+ // fool EplDllkChangeState() to think that PRes was not expected
+ EplDllkInstance_g.m_uiCycleCount = 1;
+ }
+
+ // NMT request
+ uiFrameSize = EPL_C_IP_MAX_MTU;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pTxFrame,
+ &uiFrameSize, kEplMsgTypeAsnd,
+ kEplDllAsndNmtRequest);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
+ // mark Tx buffer as empty
+ EplDllkInstance_g.m_pTxBuffer[uiHandle].m_uiTxMsgLen =
+ EPL_DLLK_BUFLEN_EMPTY;
+
+ // non-EPL frame
+ uiFrameSize = EPL_C_IP_MAX_MTU;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pTxFrame,
+ &uiFrameSize,
+ kEplMsgTypeNonEpl,
+ kEplDllAsndNotDefined);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
+ // mark Tx buffer as empty
+ EplDllkInstance_g.m_pTxBuffer[uiHandle].m_uiTxMsgLen =
+ EPL_DLLK_BUFLEN_EMPTY;
+
+ // register multicast MACs in ethernet driver
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_SOC);
+ Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_SOA);
+ Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_PRES);
+ Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_ASND);
+ Ret = EdrvDefineRxMacAddrEntry(abMulticastMac);
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if (NmtState >= kEplNmtMsNotActive)
- { // local node is MN
- unsigned int uiIndex;
-
- // SoC
- uiFrameSize = EPL_C_DLL_MINSIZE_SOC;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pTxFrame, &uiFrameSize, kEplMsgTypeSoc, kEplDllAsndNotDefined);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
-
- // SoA
- uiFrameSize = EPL_C_DLL_MINSIZE_SOA;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pTxFrame, &uiFrameSize, kEplMsgTypeSoa, kEplDllAsndNotDefined);
- if (Ret != kEplSuccessful)
- { // error occured while registering Tx frame
- goto Exit;
- }
-
- for (uiIndex = 0; uiIndex < tabentries (EplDllkInstance_g.m_aNodeInfo); uiIndex++)
- {
+ if (NmtState >= kEplNmtMsNotActive) { // local node is MN
+ unsigned int uiIndex;
+
+ // SoC
+ uiFrameSize = EPL_C_DLL_MINSIZE_SOC;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pTxFrame,
+ &uiFrameSize,
+ kEplMsgTypeSoc,
+ kEplDllAsndNotDefined);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
+ // SoA
+ uiFrameSize = EPL_C_DLL_MINSIZE_SOA;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pTxFrame,
+ &uiFrameSize,
+ kEplMsgTypeSoa,
+ kEplDllAsndNotDefined);
+ if (Ret != kEplSuccessful) { // error occured while registering Tx frame
+ goto Exit;
+ }
+
+ for (uiIndex = 0;
+ uiIndex <
+ tabentries(EplDllkInstance_g.m_aNodeInfo);
+ uiIndex++) {
// EplDllkInstance_g.m_aNodeInfo[uiIndex].m_uiNodeId = uiIndex + 1;
- EplDllkInstance_g.m_aNodeInfo[uiIndex].m_wPresPayloadLimit = (WORD) EplDllkInstance_g.m_DllConfigParam.m_uiIsochrRxMaxPayload;
- }
-
- // calculate cycle length
- EplDllkInstance_g.m_ullFrameTimeout = 1000LL
- * ((unsigned long long) EplDllkInstance_g.m_DllConfigParam.m_dwCycleLen);
- }
+ EplDllkInstance_g.m_aNodeInfo[uiIndex].
+ m_wPresPayloadLimit =
+ (WORD) EplDllkInstance_g.
+ m_DllConfigParam.
+ m_uiIsochrRxMaxPayload;
+ }
+
+ // calculate cycle length
+ EplDllkInstance_g.m_ullFrameTimeout = 1000LL
+ *
+ ((unsigned long long)EplDllkInstance_g.
+ m_DllConfigParam.m_dwCycleLen);
+ }
#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- Ret = EplDllkCalAsyncClearBuffer();
+ Ret = EplDllkCalAsyncClearBuffer();
- break;
- }
+ break;
+ }
- case kEplEventTypeDllkDestroy:
- {
- // destroy all data structures
-
- NmtState = *((tEplNmtState*)pEvent_p->m_pArg);
-
- // delete Tx frames
- Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_IDENTRES);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
-
- Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_STATUSRES);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
-
- Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_PRES);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
-
- Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_NMTREQ);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
-
- Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_NONEPL);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
+ case kEplEventTypeDllkDestroy:
+ {
+ // destroy all data structures
+
+ NmtState = *((tEplNmtState *) pEvent_p->m_pArg);
+
+ // delete Tx frames
+ Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_IDENTRES);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
+ Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_STATUSRES);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
+
+ Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_PRES);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
+
+ Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_NMTREQ);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
+
+ Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_NONEPL);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if (NmtState >= kEplNmtMsNotActive)
- { // local node was MN
- unsigned int uiIndex;
-
- Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_SOC);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
-
- Ret = EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_SOA);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
-
- for (uiIndex = 0; uiIndex < tabentries (EplDllkInstance_g.m_aNodeInfo); uiIndex++)
- {
- if (EplDllkInstance_g.m_aNodeInfo[uiIndex].m_pPreqTxBuffer != NULL)
- {
- uiHandle = EplDllkInstance_g.m_aNodeInfo[uiIndex].m_pPreqTxBuffer - EplDllkInstance_g.m_pTxBuffer;
- EplDllkInstance_g.m_aNodeInfo[uiIndex].m_pPreqTxBuffer = NULL;
- Ret = EplDllkDeleteTxFrame(uiHandle);
- if (Ret != kEplSuccessful)
- { // error occured while deregistering Tx frame
- goto Exit;
- }
-
- }
- EplDllkInstance_g.m_aNodeInfo[uiIndex].m_wPresPayloadLimit = 0xFFFF;
- }
- }
+ if (NmtState >= kEplNmtMsNotActive) { // local node was MN
+ unsigned int uiIndex;
+
+ Ret =
+ EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_SOC);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
+
+ Ret =
+ EplDllkDeleteTxFrame(EPL_DLLK_TXFRAME_SOA);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
+
+ for (uiIndex = 0;
+ uiIndex <
+ tabentries(EplDllkInstance_g.m_aNodeInfo);
+ uiIndex++) {
+ if (EplDllkInstance_g.
+ m_aNodeInfo[uiIndex].
+ m_pPreqTxBuffer != NULL) {
+ uiHandle =
+ EplDllkInstance_g.
+ m_aNodeInfo[uiIndex].
+ m_pPreqTxBuffer -
+ EplDllkInstance_g.
+ m_pTxBuffer;
+ EplDllkInstance_g.
+ m_aNodeInfo[uiIndex].
+ m_pPreqTxBuffer = NULL;
+ Ret =
+ EplDllkDeleteTxFrame
+ (uiHandle);
+ if (Ret != kEplSuccessful) { // error occured while deregistering Tx frame
+ goto Exit;
+ }
+
+ }
+ EplDllkInstance_g.m_aNodeInfo[uiIndex].
+ m_wPresPayloadLimit = 0xFFFF;
+ }
+ }
#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // deregister multicast MACs in ethernet driver
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_SOC);
- Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_SOA);
- Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_PRES);
- Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
- AmiSetQword48ToBe(&abMulticastMac[0], EPL_C_DLL_MULTICAST_ASND);
- Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
-
- // delete timer
+ // deregister multicast MACs in ethernet driver
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_SOC);
+ Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_SOA);
+ Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_PRES);
+ Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
+ AmiSetQword48ToBe(&abMulticastMac[0],
+ EPL_C_DLL_MULTICAST_ASND);
+ Ret = EdrvUndefineRxMacAddrEntry(abMulticastMac);
+
+ // delete timer
#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskDeleteTimer(&EplDllkInstance_g.m_TimerHdlCycle);
+ Ret =
+ EplTimerHighReskDeleteTimer(&EplDllkInstance_g.
+ m_TimerHdlCycle);
#endif
- break;
- }
-
- case kEplEventTypeDllkFillTx:
- {
- // fill TxBuffer of specified priority with new frame if empty
-
- pTxFrame = NULL;
- AsyncReqPriority = *((tEplDllAsyncReqPriority *) pEvent_p->m_pArg);
- switch (AsyncReqPriority)
- {
- case kEplDllAsyncReqPrioNmt: // NMT request priority
- {
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ];
- if (pTxBuffer->m_pbBuffer != NULL)
- { // NmtRequest does exist
- // check if frame is empty and not being filled
- if (pTxBuffer->m_uiTxMsgLen == EPL_DLLK_BUFLEN_EMPTY)
- {
- // mark Tx buffer as filling is in process
- pTxBuffer->m_uiTxMsgLen = EPL_DLLK_BUFLEN_FILLING;
- // set max buffer size as input parameter
- uiFrameSize = pTxBuffer->m_uiMaxBufferLen;
- // copy frame from shared loop buffer to Tx buffer
- Ret = EplDllkCalAsyncGetTxFrame(
- pTxBuffer->m_pbBuffer, &uiFrameSize, AsyncReqPriority);
- if (Ret == kEplSuccessful)
- {
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
- Ret = EplDllkCheckFrame(pTxFrame, uiFrameSize);
-
- // set buffer valid
- pTxBuffer->m_uiTxMsgLen = uiFrameSize;
- }
- else if (Ret == kEplDllAsyncTxBufferEmpty)
- { // empty Tx buffer is not a real problem
- // so just ignore it
- Ret = kEplSuccessful;
- // mark Tx buffer as empty
- pTxBuffer->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
- }
- }
- }
- break;
- }
-
- default: // generic priority
- {
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL];
- if (pTxBuffer->m_pbBuffer != NULL)
- { // non-EPL frame does exist
- // check if frame is empty and not being filled
- if (pTxBuffer->m_uiTxMsgLen == EPL_DLLK_BUFLEN_EMPTY)
- {
- // mark Tx buffer as filling is in process
- pTxBuffer->m_uiTxMsgLen = EPL_DLLK_BUFLEN_FILLING;
- // set max buffer size as input parameter
- uiFrameSize = pTxBuffer->m_uiMaxBufferLen;
- // copy frame from shared loop buffer to Tx buffer
- Ret = EplDllkCalAsyncGetTxFrame(
- pTxBuffer->m_pbBuffer, &uiFrameSize, AsyncReqPriority);
- if (Ret == kEplSuccessful)
- {
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
- Ret = EplDllkCheckFrame(pTxFrame, uiFrameSize);
-
- // set buffer valid
- pTxBuffer->m_uiTxMsgLen = uiFrameSize;
- }
- else if (Ret == kEplDllAsyncTxBufferEmpty)
- { // empty Tx buffer is not a real problem
- // so just ignore it
- Ret = kEplSuccessful;
- // mark Tx buffer as empty
- pTxBuffer->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
- }
- }
- }
- break;
- }
- }
-
- NmtState = EplNmtkGetNmtState();
-
- if ((NmtState == kEplNmtCsBasicEthernet) || (NmtState == kEplNmtMsBasicEthernet))
- { // send frame immediately
- if (pTxFrame != NULL)
- { // frame is present
- // padding is done by Edrv or ethernet controller
- Ret = EdrvSendTxMsg(pTxBuffer);
- }
- else
- { // no frame moved to TxBuffer
- // check if TxBuffers contain unsent frames
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY)
- { // NMT request Tx buffer contains a frame
- Ret = EdrvSendTxMsg(
- &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ]);
- }
- else if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY)
- { // non-EPL Tx buffer contains a frame
- Ret = EdrvSendTxMsg(
- &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL]);
- }
- if (Ret == kEplInvalidOperation)
- { // ignore error if caused by already active transmission
- Ret = kEplSuccessful;
- }
- }
- // reset PRes flag 2
- EplDllkInstance_g.m_bFlag2 = 0;
- }
- else
- {
- // update Flag 2 (PR, RS)
- Ret = EplDllkCalAsyncGetTxCount(&AsyncReqPriority, &uiFrameCount);
- if (AsyncReqPriority == kEplDllAsyncReqPrioNmt)
- { // non-empty FIFO with hightest priority is for NMT requests
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY)
- { // NMT request Tx buffer contains a frame
- // add one more frame
- uiFrameCount++;
- }
- }
- else
- { // non-empty FIFO with highest priority is for generic frames
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY)
- { // NMT request Tx buffer contains a frame
- // use NMT request FIFO, because of higher priority
- uiFrameCount = 1;
- AsyncReqPriority = kEplDllAsyncReqPrioNmt;
- }
- else if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY)
- { // non-EPL Tx buffer contains a frame
- // use NMT request FIFO, because of higher priority
- // add one more frame
- uiFrameCount++;
- }
- }
-
- if (uiFrameCount > 7)
- { // limit frame request to send counter to 7
- uiFrameCount = 7;
- }
- if (uiFrameCount > 0)
- {
- EplDllkInstance_g.m_bFlag2 =
- (BYTE) (((AsyncReqPriority << EPL_FRAME_FLAG2_PR_SHIFT) & EPL_FRAME_FLAG2_PR)
- | (uiFrameCount & EPL_FRAME_FLAG2_RS));
- }
- else
- {
- EplDllkInstance_g.m_bFlag2 = 0;
- }
- }
-
- break;
- }
+ break;
+ }
+
+ case kEplEventTypeDllkFillTx:
+ {
+ // fill TxBuffer of specified priority with new frame if empty
+
+ pTxFrame = NULL;
+ AsyncReqPriority =
+ *((tEplDllAsyncReqPriority *) pEvent_p->m_pArg);
+ switch (AsyncReqPriority) {
+ case kEplDllAsyncReqPrioNmt: // NMT request priority
+ {
+ pTxBuffer =
+ &EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ];
+ if (pTxBuffer->m_pbBuffer != NULL) { // NmtRequest does exist
+ // check if frame is empty and not being filled
+ if (pTxBuffer->m_uiTxMsgLen ==
+ EPL_DLLK_BUFLEN_EMPTY) {
+ // mark Tx buffer as filling is in process
+ pTxBuffer->
+ m_uiTxMsgLen =
+ EPL_DLLK_BUFLEN_FILLING;
+ // set max buffer size as input parameter
+ uiFrameSize =
+ pTxBuffer->
+ m_uiMaxBufferLen;
+ // copy frame from shared loop buffer to Tx buffer
+ Ret =
+ EplDllkCalAsyncGetTxFrame
+ (pTxBuffer->
+ m_pbBuffer,
+ &uiFrameSize,
+ AsyncReqPriority);
+ if (Ret ==
+ kEplSuccessful) {
+ pTxFrame =
+ (tEplFrame
+ *)
+ pTxBuffer->
+ m_pbBuffer;
+ Ret =
+ EplDllkCheckFrame
+ (pTxFrame,
+ uiFrameSize);
+
+ // set buffer valid
+ pTxBuffer->
+ m_uiTxMsgLen
+ =
+ uiFrameSize;
+ } else if (Ret == kEplDllAsyncTxBufferEmpty) { // empty Tx buffer is not a real problem
+ // so just ignore it
+ Ret =
+ kEplSuccessful;
+ // mark Tx buffer as empty
+ pTxBuffer->
+ m_uiTxMsgLen
+ =
+ EPL_DLLK_BUFLEN_EMPTY;
+ }
+ }
+ }
+ break;
+ }
+
+ default: // generic priority
+ {
+ pTxBuffer =
+ &EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NONEPL];
+ if (pTxBuffer->m_pbBuffer != NULL) { // non-EPL frame does exist
+ // check if frame is empty and not being filled
+ if (pTxBuffer->m_uiTxMsgLen ==
+ EPL_DLLK_BUFLEN_EMPTY) {
+ // mark Tx buffer as filling is in process
+ pTxBuffer->
+ m_uiTxMsgLen =
+ EPL_DLLK_BUFLEN_FILLING;
+ // set max buffer size as input parameter
+ uiFrameSize =
+ pTxBuffer->
+ m_uiMaxBufferLen;
+ // copy frame from shared loop buffer to Tx buffer
+ Ret =
+ EplDllkCalAsyncGetTxFrame
+ (pTxBuffer->
+ m_pbBuffer,
+ &uiFrameSize,
+ AsyncReqPriority);
+ if (Ret ==
+ kEplSuccessful) {
+ pTxFrame =
+ (tEplFrame
+ *)
+ pTxBuffer->
+ m_pbBuffer;
+ Ret =
+ EplDllkCheckFrame
+ (pTxFrame,
+ uiFrameSize);
+
+ // set buffer valid
+ pTxBuffer->
+ m_uiTxMsgLen
+ =
+ uiFrameSize;
+ } else if (Ret == kEplDllAsyncTxBufferEmpty) { // empty Tx buffer is not a real problem
+ // so just ignore it
+ Ret =
+ kEplSuccessful;
+ // mark Tx buffer as empty
+ pTxBuffer->
+ m_uiTxMsgLen
+ =
+ EPL_DLLK_BUFLEN_EMPTY;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ NmtState = EplNmtkGetNmtState();
+
+ if ((NmtState == kEplNmtCsBasicEthernet) || (NmtState == kEplNmtMsBasicEthernet)) { // send frame immediately
+ if (pTxFrame != NULL) { // frame is present
+ // padding is done by Edrv or ethernet controller
+ Ret = EdrvSendTxMsg(pTxBuffer);
+ } else { // no frame moved to TxBuffer
+ // check if TxBuffers contain unsent frames
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY) { // NMT request Tx buffer contains a frame
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ]);
+ } else if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY) { // non-EPL Tx buffer contains a frame
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NONEPL]);
+ }
+ if (Ret == kEplInvalidOperation) { // ignore error if caused by already active transmission
+ Ret = kEplSuccessful;
+ }
+ }
+ // reset PRes flag 2
+ EplDllkInstance_g.m_bFlag2 = 0;
+ } else {
+ // update Flag 2 (PR, RS)
+ Ret =
+ EplDllkCalAsyncGetTxCount(&AsyncReqPriority,
+ &uiFrameCount);
+ if (AsyncReqPriority == kEplDllAsyncReqPrioNmt) { // non-empty FIFO with hightest priority is for NMT requests
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY) { // NMT request Tx buffer contains a frame
+ // add one more frame
+ uiFrameCount++;
+ }
+ } else { // non-empty FIFO with highest priority is for generic frames
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY) { // NMT request Tx buffer contains a frame
+ // use NMT request FIFO, because of higher priority
+ uiFrameCount = 1;
+ AsyncReqPriority =
+ kEplDllAsyncReqPrioNmt;
+ } else if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_uiTxMsgLen > EPL_DLLK_BUFLEN_EMPTY) { // non-EPL Tx buffer contains a frame
+ // use NMT request FIFO, because of higher priority
+ // add one more frame
+ uiFrameCount++;
+ }
+ }
+
+ if (uiFrameCount > 7) { // limit frame request to send counter to 7
+ uiFrameCount = 7;
+ }
+ if (uiFrameCount > 0) {
+ EplDllkInstance_g.m_bFlag2 =
+ (BYTE) (((AsyncReqPriority <<
+ EPL_FRAME_FLAG2_PR_SHIFT)
+ & EPL_FRAME_FLAG2_PR)
+ | (uiFrameCount &
+ EPL_FRAME_FLAG2_RS));
+ } else {
+ EplDllkInstance_g.m_bFlag2 = 0;
+ }
+ }
+
+ break;
+ }
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- case kEplEventTypeDllkStartReducedCycle:
- {
- // start the reduced cycle by programming the cycle timer
- // it is issued by NMT MN module, when PreOp1 is entered
+ case kEplEventTypeDllkStartReducedCycle:
+ {
+ // start the reduced cycle by programming the cycle timer
+ // it is issued by NMT MN module, when PreOp1 is entered
- // clear the asynchronous queues
- Ret = EplDllkCalAsyncClearQueues();
+ // clear the asynchronous queues
+ Ret = EplDllkCalAsyncClearQueues();
- // reset cycle counter (everytime a SoA is triggerd in PreOp1 the counter is incremented
- // and when it reaches EPL_C_DLL_PREOP1_START_CYCLES the SoA may contain invitations)
- EplDllkInstance_g.m_uiCycleCount = 0;
+ // reset cycle counter (everytime a SoA is triggerd in PreOp1 the counter is incremented
+ // and when it reaches EPL_C_DLL_PREOP1_START_CYCLES the SoA may contain invitations)
+ EplDllkInstance_g.m_uiCycleCount = 0;
- // remove any CN from isochronous phase
- while (EplDllkInstance_g.m_pFirstNodeInfo != NULL)
- {
- EplDllkDeleteNode(EplDllkInstance_g.m_pFirstNodeInfo->m_uiNodeId);
- }
+ // remove any CN from isochronous phase
+ while (EplDllkInstance_g.m_pFirstNodeInfo != NULL) {
+ EplDllkDeleteNode(EplDllkInstance_g.
+ m_pFirstNodeInfo->m_uiNodeId);
+ }
- // change state to NonCyclic,
- // hence EplDllkChangeState() will not ignore the next call
- EplDllkInstance_g.m_DllState = kEplDllMsNonCyclic;
+ // change state to NonCyclic,
+ // hence EplDllkChangeState() will not ignore the next call
+ EplDllkInstance_g.m_DllState = kEplDllMsNonCyclic;
#if EPL_TIMER_USE_HIGHRES != FALSE
- if (EplDllkInstance_g.m_DllConfigParam.m_dwAsyncSlotTimeout != 0)
- {
- Ret = EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.m_TimerHdlCycle,
- EplDllkInstance_g.m_DllConfigParam.m_dwAsyncSlotTimeout,
- EplDllkCbMnTimerCycle,
- 0L,
- FALSE);
- }
+ if (EplDllkInstance_g.m_DllConfigParam.
+ m_dwAsyncSlotTimeout != 0) {
+ Ret =
+ EplTimerHighReskModifyTimerNs
+ (&EplDllkInstance_g.m_TimerHdlCycle,
+ EplDllkInstance_g.m_DllConfigParam.
+ m_dwAsyncSlotTimeout,
+ EplDllkCbMnTimerCycle, 0L, FALSE);
+ }
#endif
- break;
- }
+ break;
+ }
#endif
#if EPL_DLL_PRES_READY_AFTER_SOA != FALSE
- case kEplEventTypeDllkPresReady:
- {
- // post PRes to transmit FIFO
-
- NmtState = EplNmtkGetNmtState();
-
- if (NmtState != kEplNmtCsBasicEthernet)
- {
- // Does PRes exist?
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES].m_pbBuffer != NULL)
- { // PRes does exist
- pTxFrame = (tEplFrame *) EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES].m_pbBuffer;
- // update frame (NMT state, RD, RS, PR, MS, EN flags)
- if (NmtState < kEplNmtCsPreOperational2)
- { // NMT state is not PreOp2, ReadyToOp or Op
- // fake NMT state PreOp2, because PRes will be sent only in PreOp2 or greater
- NmtState = kEplNmtCsPreOperational2;
- }
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- if (NmtState != kEplNmtCsOperational)
- { // mark PDO as invalid in NMT state Op
- // $$$ reset only RD flag; set other flags appropriately
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1, 0);
- }
- // $$$ make function that updates Pres, StatusRes
- // mark PRes frame as ready for transmission
- Ret = EdrvTxMsgReady(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES]);
- }
- }
-
- break;
- }
+ case kEplEventTypeDllkPresReady:
+ {
+ // post PRes to transmit FIFO
+
+ NmtState = EplNmtkGetNmtState();
+
+ if (NmtState != kEplNmtCsBasicEthernet) {
+ // Does PRes exist?
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES].m_pbBuffer != NULL) { // PRes does exist
+ pTxFrame =
+ (tEplFrame *) EplDllkInstance_g.
+ m_pTxBuffer[EPL_DLLK_TXFRAME_PRES].
+ m_pbBuffer;
+ // update frame (NMT state, RD, RS, PR, MS, EN flags)
+ if (NmtState < kEplNmtCsPreOperational2) { // NMT state is not PreOp2, ReadyToOp or Op
+ // fake NMT state PreOp2, because PRes will be sent only in PreOp2 or greater
+ NmtState =
+ kEplNmtCsPreOperational2;
+ }
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bFlag2,
+ EplDllkInstance_g.
+ m_bFlag2);
+ if (NmtState != kEplNmtCsOperational) { // mark PDO as invalid in NMT state Op
+ // $$$ reset only RD flag; set other flags appropriately
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Pres.
+ m_le_bFlag1, 0);
+ }
+ // $$$ make function that updates Pres, StatusRes
+ // mark PRes frame as ready for transmission
+ Ret =
+ EdrvTxMsgReady(&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_PRES]);
+ }
+ }
+
+ break;
+ }
#endif
- default:
- {
- ASSERTMSG(FALSE, "EplDllkProcess(): unhandled event type!\n");
- }
- }
-
-Exit:
- return Ret;
+ default:
+ {
+ ASSERTMSG(FALSE,
+ "EplDllkProcess(): unhandled event type!\n");
+ }
+ }
+
+ Exit:
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -1238,7 +1358,7 @@ Exit:
tEplKernel EplDllkConfig(tEplDllConfigParam * pDllConfigParam_p)
{
-tEplKernel Ret = kEplSuccessful;
+ tEplKernel Ret = kEplSuccessful;
// d.k. check of NMT state disabled, because CycleLen is programmed at run time by MN without reset of CN
/*tEplNmtState NmtState;
@@ -1251,30 +1371,32 @@ tEplKernel Ret = kEplSuccessful;
goto Exit;
}
*/
- EPL_MEMCPY (&EplDllkInstance_g.m_DllConfigParam, pDllConfigParam_p,
- (pDllConfigParam_p->m_uiSizeOfStruct < sizeof (tEplDllConfigParam) ?
- pDllConfigParam_p->m_uiSizeOfStruct : sizeof (tEplDllConfigParam)));
-
- if ((EplDllkInstance_g.m_DllConfigParam.m_dwCycleLen != 0)
- && (EplDllkInstance_g.m_DllConfigParam.m_dwLossOfFrameTolerance != 0))
- { // monitor EPL cycle, calculate frame timeout
- EplDllkInstance_g.m_ullFrameTimeout = (1000LL
- * ((unsigned long long) EplDllkInstance_g.m_DllConfigParam.m_dwCycleLen))
- + ((unsigned long long) EplDllkInstance_g.m_DllConfigParam.m_dwLossOfFrameTolerance);
- }
- else
- {
- EplDllkInstance_g.m_ullFrameTimeout = 0LL;
- }
-
- if (EplDllkInstance_g.m_DllConfigParam.m_fAsyncOnly != FALSE)
- { // it is configured as async-only CN
- // disable multiplexed cycle, that m_uiCycleCount will not be incremented spuriously on SoC
- EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt = 0;
- }
-
+ EPL_MEMCPY(&EplDllkInstance_g.m_DllConfigParam, pDllConfigParam_p,
+ (pDllConfigParam_p->m_uiSizeOfStruct <
+ sizeof(tEplDllConfigParam) ? pDllConfigParam_p->
+ m_uiSizeOfStruct : sizeof(tEplDllConfigParam)));
+
+ if ((EplDllkInstance_g.m_DllConfigParam.m_dwCycleLen != 0)
+ && (EplDllkInstance_g.m_DllConfigParam.m_dwLossOfFrameTolerance != 0)) { // monitor EPL cycle, calculate frame timeout
+ EplDllkInstance_g.m_ullFrameTimeout = (1000LL
+ *
+ ((unsigned long long)
+ EplDllkInstance_g.
+ m_DllConfigParam.
+ m_dwCycleLen))
+ +
+ ((unsigned long long)EplDllkInstance_g.m_DllConfigParam.
+ m_dwLossOfFrameTolerance);
+ } else {
+ EplDllkInstance_g.m_ullFrameTimeout = 0LL;
+ }
+
+ if (EplDllkInstance_g.m_DllConfigParam.m_fAsyncOnly != FALSE) { // it is configured as async-only CN
+ // disable multiplexed cycle, that m_uiCycleCount will not be incremented spuriously on SoC
+ EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt = 0;
+ }
//Exit:
- return Ret;
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -1294,18 +1416,18 @@ tEplKernel Ret = kEplSuccessful;
tEplKernel EplDllkSetIdentity(tEplDllIdentParam * pDllIdentParam_p)
{
-tEplKernel Ret = kEplSuccessful;
+ tEplKernel Ret = kEplSuccessful;
- EPL_MEMCPY (&EplDllkInstance_g.m_DllIdentParam, pDllIdentParam_p,
- (pDllIdentParam_p->m_uiSizeOfStruct < sizeof (tEplDllIdentParam) ?
- pDllIdentParam_p->m_uiSizeOfStruct : sizeof (tEplDllIdentParam)));
+ EPL_MEMCPY(&EplDllkInstance_g.m_DllIdentParam, pDllIdentParam_p,
+ (pDllIdentParam_p->m_uiSizeOfStruct <
+ sizeof(tEplDllIdentParam) ? pDllIdentParam_p->
+ m_uiSizeOfStruct : sizeof(tEplDllIdentParam)));
- // $$$ if IdentResponse frame exists update it
+ // $$$ if IdentResponse frame exists update it
- return Ret;
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkRegAsyncHandler
@@ -1323,18 +1445,15 @@ tEplKernel Ret = kEplSuccessful;
tEplKernel EplDllkRegAsyncHandler(tEplDllkCbAsync pfnDllkCbAsync_p)
{
-tEplKernel Ret = kEplSuccessful;
+ tEplKernel Ret = kEplSuccessful;
- if (EplDllkInstance_g.m_pfnCbAsync == NULL)
- { // no handler registered yet
- EplDllkInstance_g.m_pfnCbAsync = pfnDllkCbAsync_p;
- }
- else
- { // handler already registered
- Ret = kEplDllCbAsyncRegistered;
- }
+ if (EplDllkInstance_g.m_pfnCbAsync == NULL) { // no handler registered yet
+ EplDllkInstance_g.m_pfnCbAsync = pfnDllkCbAsync_p;
+ } else { // handler already registered
+ Ret = kEplDllCbAsyncRegistered;
+ }
- return Ret;
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -1354,19 +1473,16 @@ tEplKernel Ret = kEplSuccessful;
tEplKernel EplDllkDeregAsyncHandler(tEplDllkCbAsync pfnDllkCbAsync_p)
{
-tEplKernel Ret = kEplSuccessful;
+ tEplKernel Ret = kEplSuccessful;
- if (EplDllkInstance_g.m_pfnCbAsync == pfnDllkCbAsync_p)
- { // same handler is registered
- // deregister it
- EplDllkInstance_g.m_pfnCbAsync = NULL;
- }
- else
- { // wrong handler or no handler registered
- Ret = kEplDllCbAsyncRegistered;
- }
+ if (EplDllkInstance_g.m_pfnCbAsync == pfnDllkCbAsync_p) { // same handler is registered
+ // deregister it
+ EplDllkInstance_g.m_pfnCbAsync = NULL;
+ } else { // wrong handler or no handler registered
+ Ret = kEplDllCbAsyncRegistered;
+ }
- return Ret;
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -1387,19 +1503,18 @@ tEplKernel Ret = kEplSuccessful;
//
//---------------------------------------------------------------------------
-tEplKernel EplDllkSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p, tEplDllAsndFilter Filter_p)
+tEplKernel EplDllkSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p,
+ tEplDllAsndFilter Filter_p)
{
-tEplKernel Ret = kEplSuccessful;
+ tEplKernel Ret = kEplSuccessful;
- if (ServiceId_p < tabentries (EplDllkInstance_g.m_aAsndFilter))
- {
- EplDllkInstance_g.m_aAsndFilter[ServiceId_p] = Filter_p;
- }
+ if (ServiceId_p < tabentries(EplDllkInstance_g.m_aAsndFilter)) {
+ EplDllkInstance_g.m_aAsndFilter[ServiceId_p] = Filter_p;
+ }
- return Ret;
+ return Ret;
}
-
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
//---------------------------------------------------------------------------
@@ -1420,21 +1535,19 @@ tEplKernel Ret = kEplSuccessful;
tEplKernel EplDllkSetFlag1OfNode(unsigned int uiNodeId_p, BYTE bSoaFlag1_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplDllkNodeInfo* pNodeInfo;
-
- pNodeInfo = EplDllkGetNodeInfo(uiNodeId_p);
- if (pNodeInfo == NULL)
- { // no node info structure available
- Ret = kEplDllNoNodeInfo;
- goto Exit;
- }
-
- // store flag1 in internal node info structure
- pNodeInfo->m_bSoaFlag1 = bSoaFlag1_p;
-
-Exit:
- return Ret;
+ tEplKernel Ret = kEplSuccessful;
+ tEplDllkNodeInfo *pNodeInfo;
+
+ pNodeInfo = EplDllkGetNodeInfo(uiNodeId_p);
+ if (pNodeInfo == NULL) { // no node info structure available
+ Ret = kEplDllNoNodeInfo;
+ goto Exit;
+ }
+ // store flag1 in internal node info structure
+ pNodeInfo->m_bSoaFlag1 = bSoaFlag1_p;
+
+ Exit:
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -1453,16 +1566,15 @@ Exit:
//
//---------------------------------------------------------------------------
-tEplKernel EplDllkGetFirstNodeInfo(tEplDllkNodeInfo** ppNodeInfo_p)
+tEplKernel EplDllkGetFirstNodeInfo(tEplDllkNodeInfo ** ppNodeInfo_p)
{
-tEplKernel Ret = kEplSuccessful;
+ tEplKernel Ret = kEplSuccessful;
- *ppNodeInfo_p = EplDllkInstance_g.m_pFirstNodeInfo;
+ *ppNodeInfo_p = EplDllkInstance_g.m_pFirstNodeInfo;
- return Ret;
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkAddNode()
@@ -1480,108 +1592,104 @@ tEplKernel Ret = kEplSuccessful;
tEplKernel EplDllkAddNode(tEplDllNodeInfo * pNodeInfo_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplDllkNodeInfo* pIntNodeInfo;
-tEplDllkNodeInfo** ppIntNodeInfo;
-unsigned int uiHandle;
-tEplFrame* pFrame;
-unsigned int uiFrameSize;
-
- pIntNodeInfo = EplDllkGetNodeInfo(pNodeInfo_p->m_uiNodeId);
- if (pIntNodeInfo == NULL)
- { // no node info structure available
- Ret = kEplDllNoNodeInfo;
- goto Exit;
- }
-
- EPL_DLLK_DBG_POST_TRACE_VALUE(kEplEventTypeDllkAddNode,
- pNodeInfo_p->m_uiNodeId,
- 0);
+ tEplKernel Ret = kEplSuccessful;
+ tEplDllkNodeInfo *pIntNodeInfo;
+ tEplDllkNodeInfo **ppIntNodeInfo;
+ unsigned int uiHandle;
+ tEplFrame *pFrame;
+ unsigned int uiFrameSize;
+
+ pIntNodeInfo = EplDllkGetNodeInfo(pNodeInfo_p->m_uiNodeId);
+ if (pIntNodeInfo == NULL) { // no node info structure available
+ Ret = kEplDllNoNodeInfo;
+ goto Exit;
+ }
+
+ EPL_DLLK_DBG_POST_TRACE_VALUE(kEplEventTypeDllkAddNode,
+ pNodeInfo_p->m_uiNodeId, 0);
+
+ // copy node configuration
+ pIntNodeInfo->m_dwPresTimeout = pNodeInfo_p->m_dwPresTimeout;
+ pIntNodeInfo->m_wPresPayloadLimit = pNodeInfo_p->m_wPresPayloadLimit;
+
+ // $$$ d.k.: actually add node only if MN. On CN it is sufficient to update the node configuration
+ if (pNodeInfo_p->m_uiNodeId == EplDllkInstance_g.m_DllConfigParam.m_uiNodeId) { // we shall send PRes ourself
+ // insert our node at the end of the list
+ ppIntNodeInfo = &EplDllkInstance_g.m_pFirstNodeInfo;
+ while ((*ppIntNodeInfo != NULL)
+ && ((*ppIntNodeInfo)->m_pNextNodeInfo != NULL)) {
+ ppIntNodeInfo = &(*ppIntNodeInfo)->m_pNextNodeInfo;
+ }
+ if (*ppIntNodeInfo != NULL) {
+ if ((*ppIntNodeInfo)->m_uiNodeId == pNodeInfo_p->m_uiNodeId) { // node was already added to list
+ // $$$ d.k. maybe this should be an error
+ goto Exit;
+ } else { // add our node at the end of the list
+ ppIntNodeInfo =
+ &(*ppIntNodeInfo)->m_pNextNodeInfo;
+ }
+ }
+ // set "PReq"-TxBuffer to PRes-TxBuffer
+ pIntNodeInfo->m_pPreqTxBuffer =
+ &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
+ } else { // normal CN shall be added to isochronous phase
+ // insert node into list in ascending order
+ ppIntNodeInfo = &EplDllkInstance_g.m_pFirstNodeInfo;
+ while ((*ppIntNodeInfo != NULL)
+ && ((*ppIntNodeInfo)->m_uiNodeId <
+ pNodeInfo_p->m_uiNodeId)
+ && ((*ppIntNodeInfo)->m_uiNodeId !=
+ EplDllkInstance_g.m_DllConfigParam.m_uiNodeId)) {
+ ppIntNodeInfo = &(*ppIntNodeInfo)->m_pNextNodeInfo;
+ }
+ if ((*ppIntNodeInfo != NULL) && ((*ppIntNodeInfo)->m_uiNodeId == pNodeInfo_p->m_uiNodeId)) { // node was already added to list
+ // $$$ d.k. maybe this should be an error
+ goto Exit;
+ }
+ }
+
+ // initialize elements of internal node info structure
+ pIntNodeInfo->m_bSoaFlag1 = 0;
+ pIntNodeInfo->m_fSoftDelete = FALSE;
+ pIntNodeInfo->m_NmtState = kEplNmtCsNotActive;
+ if (pIntNodeInfo->m_pPreqTxBuffer == NULL) { // create TxBuffer entry
+ uiFrameSize = pNodeInfo_p->m_wPreqPayloadLimit + 24;
+ Ret =
+ EplDllkCreateTxFrame(&uiHandle, &pFrame, &uiFrameSize,
+ kEplMsgTypePreq,
+ kEplDllAsndNotDefined);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ pIntNodeInfo->m_pPreqTxBuffer =
+ &EplDllkInstance_g.m_pTxBuffer[uiHandle];
+ AmiSetByteToLe(&pFrame->m_le_bDstNodeId,
+ (BYTE) pNodeInfo_p->m_uiNodeId);
+
+ // set up destination MAC address
+ EPL_MEMCPY(pFrame->m_be_abDstMac, pIntNodeInfo->m_be_abMacAddr,
+ 6);
- // copy node configuration
- pIntNodeInfo->m_dwPresTimeout = pNodeInfo_p->m_dwPresTimeout;
- pIntNodeInfo->m_wPresPayloadLimit = pNodeInfo_p->m_wPresPayloadLimit;
-
- // $$$ d.k.: actually add node only if MN. On CN it is sufficient to update the node configuration
- if (pNodeInfo_p->m_uiNodeId == EplDllkInstance_g.m_DllConfigParam.m_uiNodeId)
- { // we shall send PRes ourself
- // insert our node at the end of the list
- ppIntNodeInfo = &EplDllkInstance_g.m_pFirstNodeInfo;
- while ((*ppIntNodeInfo != NULL) && ((*ppIntNodeInfo)->m_pNextNodeInfo != NULL))
- {
- ppIntNodeInfo = &(*ppIntNodeInfo)->m_pNextNodeInfo;
- }
- if (*ppIntNodeInfo != NULL)
- {
- if ((*ppIntNodeInfo)->m_uiNodeId == pNodeInfo_p->m_uiNodeId)
- { // node was already added to list
- // $$$ d.k. maybe this should be an error
- goto Exit;
- }
- else
- { // add our node at the end of the list
- ppIntNodeInfo = &(*ppIntNodeInfo)->m_pNextNodeInfo;
- }
- }
- // set "PReq"-TxBuffer to PRes-TxBuffer
- pIntNodeInfo->m_pPreqTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
- }
- else
- { // normal CN shall be added to isochronous phase
- // insert node into list in ascending order
- ppIntNodeInfo = &EplDllkInstance_g.m_pFirstNodeInfo;
- while ((*ppIntNodeInfo != NULL)
- && ((*ppIntNodeInfo)->m_uiNodeId < pNodeInfo_p->m_uiNodeId)
- && ((*ppIntNodeInfo)->m_uiNodeId != EplDllkInstance_g.m_DllConfigParam.m_uiNodeId))
- {
- ppIntNodeInfo = &(*ppIntNodeInfo)->m_pNextNodeInfo;
- }
- if ((*ppIntNodeInfo != NULL) && ((*ppIntNodeInfo)->m_uiNodeId == pNodeInfo_p->m_uiNodeId))
- { // node was already added to list
- // $$$ d.k. maybe this should be an error
- goto Exit;
- }
- }
-
- // initialize elements of internal node info structure
- pIntNodeInfo->m_bSoaFlag1 = 0;
- pIntNodeInfo->m_fSoftDelete = FALSE;
- pIntNodeInfo->m_NmtState = kEplNmtCsNotActive;
- if (pIntNodeInfo->m_pPreqTxBuffer == NULL)
- { // create TxBuffer entry
- uiFrameSize = pNodeInfo_p->m_wPreqPayloadLimit + 24;
- Ret = EplDllkCreateTxFrame(&uiHandle, &pFrame, &uiFrameSize, kEplMsgTypePreq, kEplDllAsndNotDefined);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- pIntNodeInfo->m_pPreqTxBuffer = &EplDllkInstance_g.m_pTxBuffer[uiHandle];
- AmiSetByteToLe(&pFrame->m_le_bDstNodeId, (BYTE) pNodeInfo_p->m_uiNodeId);
-
- // set up destination MAC address
- EPL_MEMCPY(pFrame->m_be_abDstMac, pIntNodeInfo->m_be_abMacAddr, 6);
-
- #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- {
- tEplFrameInfo FrameInfo;
-
- // initially encode TPDO -> inform PDO module
- FrameInfo.m_pFrame = pFrame;
- FrameInfo.m_uiFrameSize = uiFrameSize;
- Ret = EplPdokCbPdoTransmitted(&FrameInfo);
- }
- #endif
- }
- pIntNodeInfo->m_ulDllErrorEvents = 0L;
- // add node to list
- pIntNodeInfo->m_pNextNodeInfo = *ppIntNodeInfo;
- *ppIntNodeInfo = pIntNodeInfo;
-
-Exit:
- return Ret;
+#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
+ {
+ tEplFrameInfo FrameInfo;
+
+ // initially encode TPDO -> inform PDO module
+ FrameInfo.m_pFrame = pFrame;
+ FrameInfo.m_uiFrameSize = uiFrameSize;
+ Ret = EplPdokCbPdoTransmitted(&FrameInfo);
+ }
+#endif
+ }
+ pIntNodeInfo->m_ulDllErrorEvents = 0L;
+ // add node to list
+ pIntNodeInfo->m_pNextNodeInfo = *ppIntNodeInfo;
+ *ppIntNodeInfo = pIntNodeInfo;
+
+ Exit:
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkDeleteNode()
@@ -1599,54 +1707,49 @@ Exit:
tEplKernel EplDllkDeleteNode(unsigned int uiNodeId_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplDllkNodeInfo* pIntNodeInfo;
-tEplDllkNodeInfo** ppIntNodeInfo;
-unsigned int uiHandle;
-
- pIntNodeInfo = EplDllkGetNodeInfo(uiNodeId_p);
- if (pIntNodeInfo == NULL)
- { // no node info structure available
- Ret = kEplDllNoNodeInfo;
- goto Exit;
- }
-
- EPL_DLLK_DBG_POST_TRACE_VALUE(kEplEventTypeDllkDelNode,
- uiNodeId_p,
- 0);
-
- // search node in whole list
- ppIntNodeInfo = &EplDllkInstance_g.m_pFirstNodeInfo;
- while ((*ppIntNodeInfo != NULL) && ((*ppIntNodeInfo)->m_uiNodeId != uiNodeId_p))
- {
- ppIntNodeInfo = &(*ppIntNodeInfo)->m_pNextNodeInfo;
- }
- if ((*ppIntNodeInfo == NULL) || ((*ppIntNodeInfo)->m_uiNodeId != uiNodeId_p))
- { // node was not found in list
- // $$$ d.k. maybe this should be an error
- goto Exit;
- }
-
- // remove node from list
- *ppIntNodeInfo = pIntNodeInfo->m_pNextNodeInfo;
-
- if ((pIntNodeInfo->m_pPreqTxBuffer != NULL)
- && (pIntNodeInfo->m_pPreqTxBuffer != &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES]))
- { // delete TxBuffer entry
- uiHandle = pIntNodeInfo->m_pPreqTxBuffer - EplDllkInstance_g.m_pTxBuffer;
- pIntNodeInfo->m_pPreqTxBuffer = NULL;
- Ret = EplDllkDeleteTxFrame(uiHandle);
+ tEplKernel Ret = kEplSuccessful;
+ tEplDllkNodeInfo *pIntNodeInfo;
+ tEplDllkNodeInfo **ppIntNodeInfo;
+ unsigned int uiHandle;
+
+ pIntNodeInfo = EplDllkGetNodeInfo(uiNodeId_p);
+ if (pIntNodeInfo == NULL) { // no node info structure available
+ Ret = kEplDllNoNodeInfo;
+ goto Exit;
+ }
+
+ EPL_DLLK_DBG_POST_TRACE_VALUE(kEplEventTypeDllkDelNode, uiNodeId_p, 0);
+
+ // search node in whole list
+ ppIntNodeInfo = &EplDllkInstance_g.m_pFirstNodeInfo;
+ while ((*ppIntNodeInfo != NULL)
+ && ((*ppIntNodeInfo)->m_uiNodeId != uiNodeId_p)) {
+ ppIntNodeInfo = &(*ppIntNodeInfo)->m_pNextNodeInfo;
+ }
+ if ((*ppIntNodeInfo == NULL) || ((*ppIntNodeInfo)->m_uiNodeId != uiNodeId_p)) { // node was not found in list
+ // $$$ d.k. maybe this should be an error
+ goto Exit;
+ }
+ // remove node from list
+ *ppIntNodeInfo = pIntNodeInfo->m_pNextNodeInfo;
+
+ if ((pIntNodeInfo->m_pPreqTxBuffer != NULL)
+ && (pIntNodeInfo->m_pPreqTxBuffer != &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES])) { // delete TxBuffer entry
+ uiHandle =
+ pIntNodeInfo->m_pPreqTxBuffer -
+ EplDllkInstance_g.m_pTxBuffer;
+ pIntNodeInfo->m_pPreqTxBuffer = NULL;
+ Ret = EplDllkDeleteTxFrame(uiHandle);
/* if (Ret != kEplSuccessful)
{
goto Exit;
}*/
- }
+ }
-Exit:
- return Ret;
+ Exit:
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkSoftDeleteNode()
@@ -1666,37 +1769,32 @@ Exit:
tEplKernel EplDllkSoftDeleteNode(unsigned int uiNodeId_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplDllkNodeInfo* pIntNodeInfo;
+ tEplKernel Ret = kEplSuccessful;
+ tEplDllkNodeInfo *pIntNodeInfo;
- pIntNodeInfo = EplDllkGetNodeInfo(uiNodeId_p);
- if (pIntNodeInfo == NULL)
- { // no node info structure available
- Ret = kEplDllNoNodeInfo;
- goto Exit;
- }
+ pIntNodeInfo = EplDllkGetNodeInfo(uiNodeId_p);
+ if (pIntNodeInfo == NULL) { // no node info structure available
+ Ret = kEplDllNoNodeInfo;
+ goto Exit;
+ }
- EPL_DLLK_DBG_POST_TRACE_VALUE(kEplEventTypeDllkSoftDelNode,
- uiNodeId_p,
- 0);
+ EPL_DLLK_DBG_POST_TRACE_VALUE(kEplEventTypeDllkSoftDelNode,
+ uiNodeId_p, 0);
- pIntNodeInfo->m_fSoftDelete = TRUE;
+ pIntNodeInfo->m_fSoftDelete = TRUE;
-Exit:
- return Ret;
+ Exit:
+ return Ret;
}
-
#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
//=========================================================================//
// //
// P R I V A T E F U N C T I O N S //
// //
//=========================================================================//
-
//---------------------------------------------------------------------------
//
// Function: EplDllkChangeState
@@ -1712,556 +1810,596 @@ Exit:
//
//---------------------------------------------------------------------------
-static tEplKernel EplDllkChangeState(tEplNmtEvent NmtEvent_p, tEplNmtState NmtState_p)
+static tEplKernel EplDllkChangeState(tEplNmtEvent NmtEvent_p,
+ tEplNmtState NmtState_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplEvent Event;
-tEplErrorHandlerkEvent DllEvent;
-
- DllEvent.m_ulDllErrorEvents = 0;
- DllEvent.m_uiNodeId = 0;
- DllEvent.m_NmtState = NmtState_p;
-
- switch (NmtState_p)
- {
- case kEplNmtGsOff:
- case kEplNmtGsInitialising:
- case kEplNmtGsResetApplication:
- case kEplNmtGsResetCommunication:
- case kEplNmtGsResetConfiguration:
- case kEplNmtCsBasicEthernet:
- // enter DLL_GS_INIT
- EplDllkInstance_g.m_DllState = kEplDllGsInit;
- break;
-
- case kEplNmtCsNotActive:
- case kEplNmtCsPreOperational1:
- // reduced EPL cycle is active
- if (NmtEvent_p == kEplNmtEventDllCeSoc)
- { // SoC received
- // enter DLL_CS_WAIT_PREQ
- EplDllkInstance_g.m_DllState = kEplDllCsWaitPreq;
- }
- else
- {
- // enter DLL_GS_INIT
- EplDllkInstance_g.m_DllState = kEplDllGsInit;
- }
- break;
-
- case kEplNmtCsPreOperational2:
- case kEplNmtCsReadyToOperate:
- case kEplNmtCsOperational:
- // full EPL cycle is active
-
- switch (EplDllkInstance_g.m_DllState)
- {
- case kEplDllCsWaitPreq:
- switch (NmtEvent_p)
- {
- // DLL_CT2
- case kEplNmtEventDllCePreq:
- // enter DLL_CS_WAIT_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_RECVD_PREQ;
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
- break;
-
- // DLL_CT8
- case kEplNmtEventDllCeFrameTimeout:
- if (NmtState_p == kEplNmtCsPreOperational2)
- { // ignore frame timeout in PreOp2,
- // because the previously configured cycle len
- // may be wrong.
- // 2008/10/15 d.k. If it would not be ignored,
- // we would go cyclically to PreOp1 and on next
- // SoC back to PreOp2.
- break;
- }
-
- // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA | EPL_DLL_ERR_CN_LOSS_SOC;
-
- // enter DLL_CS_WAIT_SOC
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
- break;
-
- case kEplNmtEventDllCeSoa:
- // check if multiplexed and PReq should have been received in this cycle
- // and if >= NMT_CS_READY_TO_OPERATE
- if ((EplDllkInstance_g.m_uiCycleCount == 0)
- && (NmtState_p >= kEplNmtCsReadyToOperate))
- { // report DLL_CEV_LOSS_OF_PREQ
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_PREQ;
- }
-
- // enter DLL_CS_WAIT_SOC
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
- break;
-
- // DLL_CT7
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeAsnd:
- // report DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA;
-
- case kEplNmtEventDllCePres:
- default:
- // remain in this state
- break;
- }
- break;
-
- case kEplDllCsWaitSoc:
- switch (NmtEvent_p)
- {
- // DLL_CT1
- case kEplNmtEventDllCeSoc:
- // start of cycle and isochronous phase
- // enter DLL_CS_WAIT_PREQ
- EplDllkInstance_g.m_DllState = kEplDllCsWaitPreq;
- break;
-
- // DLL_CT4
+ tEplKernel Ret = kEplSuccessful;
+ tEplEvent Event;
+ tEplErrorHandlerkEvent DllEvent;
+
+ DllEvent.m_ulDllErrorEvents = 0;
+ DllEvent.m_uiNodeId = 0;
+ DllEvent.m_NmtState = NmtState_p;
+
+ switch (NmtState_p) {
+ case kEplNmtGsOff:
+ case kEplNmtGsInitialising:
+ case kEplNmtGsResetApplication:
+ case kEplNmtGsResetCommunication:
+ case kEplNmtGsResetConfiguration:
+ case kEplNmtCsBasicEthernet:
+ // enter DLL_GS_INIT
+ EplDllkInstance_g.m_DllState = kEplDllGsInit;
+ break;
+
+ case kEplNmtCsNotActive:
+ case kEplNmtCsPreOperational1:
+ // reduced EPL cycle is active
+ if (NmtEvent_p == kEplNmtEventDllCeSoc) { // SoC received
+ // enter DLL_CS_WAIT_PREQ
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitPreq;
+ } else {
+ // enter DLL_GS_INIT
+ EplDllkInstance_g.m_DllState = kEplDllGsInit;
+ }
+ break;
+
+ case kEplNmtCsPreOperational2:
+ case kEplNmtCsReadyToOperate:
+ case kEplNmtCsOperational:
+ // full EPL cycle is active
+
+ switch (EplDllkInstance_g.m_DllState) {
+ case kEplDllCsWaitPreq:
+ switch (NmtEvent_p) {
+ // DLL_CT2
+ case kEplNmtEventDllCePreq:
+ // enter DLL_CS_WAIT_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_RECVD_PREQ;
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
+ break;
+
+ // DLL_CT8
+ case kEplNmtEventDllCeFrameTimeout:
+ if (NmtState_p == kEplNmtCsPreOperational2) { // ignore frame timeout in PreOp2,
+ // because the previously configured cycle len
+ // may be wrong.
+ // 2008/10/15 d.k. If it would not be ignored,
+ // we would go cyclically to PreOp1 and on next
+ // SoC back to PreOp2.
+ break;
+ }
+ // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA |
+ EPL_DLL_ERR_CN_LOSS_SOC;
+
+ // enter DLL_CS_WAIT_SOC
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
+ break;
+
+ case kEplNmtEventDllCeSoa:
+ // check if multiplexed and PReq should have been received in this cycle
+ // and if >= NMT_CS_READY_TO_OPERATE
+ if ((EplDllkInstance_g.m_uiCycleCount == 0)
+ && (NmtState_p >= kEplNmtCsReadyToOperate)) { // report DLL_CEV_LOSS_OF_PREQ
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_PREQ;
+ }
+ // enter DLL_CS_WAIT_SOC
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
+ break;
+
+ // DLL_CT7
+ case kEplNmtEventDllCeSoc:
+ case kEplNmtEventDllCeAsnd:
+ // report DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA;
+
+ case kEplNmtEventDllCePres:
+ default:
+ // remain in this state
+ break;
+ }
+ break;
+
+ case kEplDllCsWaitSoc:
+ switch (NmtEvent_p) {
+ // DLL_CT1
+ case kEplNmtEventDllCeSoc:
+ // start of cycle and isochronous phase
+ // enter DLL_CS_WAIT_PREQ
+ EplDllkInstance_g.m_DllState =
+ kEplDllCsWaitPreq;
+ break;
+
+ // DLL_CT4
// case kEplNmtEventDllCePres:
- case kEplNmtEventDllCeFrameTimeout:
- if (NmtState_p == kEplNmtCsPreOperational2)
- { // ignore frame timeout in PreOp2,
- // because the previously configured cycle len
- // may be wrong.
- // 2008/10/15 d.k. If it would not be ignored,
- // we would go cyclically to PreOp1 and on next
- // SoC back to PreOp2.
- break;
- }
-
- // fall through
-
- case kEplNmtEventDllCePreq:
- case kEplNmtEventDllCeSoa:
- // report DLL_CEV_LOSS_SOC
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOC;
-
- case kEplNmtEventDllCeAsnd:
- default:
- // remain in this state
- break;
- }
- break;
-
- case kEplDllCsWaitSoa:
- switch (NmtEvent_p)
- {
- case kEplNmtEventDllCeFrameTimeout:
- // DLL_CT3
- if (NmtState_p == kEplNmtCsPreOperational2)
- { // ignore frame timeout in PreOp2,
- // because the previously configured cycle len
- // may be wrong.
- // 2008/10/15 d.k. If it would not be ignored,
- // we would go cyclically to PreOp1 and on next
- // SoC back to PreOp2.
- break;
- }
-
- // fall through
-
- case kEplNmtEventDllCePreq:
- // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA | EPL_DLL_ERR_CN_LOSS_SOC;
-
- case kEplNmtEventDllCeSoa:
- // enter DLL_CS_WAIT_SOC
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
- break;
-
- // DLL_CT9
- case kEplNmtEventDllCeSoc:
- // report DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA;
-
- // enter DLL_CS_WAIT_PREQ
- EplDllkInstance_g.m_DllState = kEplDllCsWaitPreq;
- break;
-
- // DLL_CT10
- case kEplNmtEventDllCeAsnd:
- // report DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA;
-
- case kEplNmtEventDllCePres:
- default:
- // remain in this state
- break;
- }
- break;
-
- case kEplDllGsInit:
- // enter DLL_CS_WAIT_PREQ
- EplDllkInstance_g.m_DllState = kEplDllCsWaitPreq;
- break;
-
- default:
- break;
- }
- break;
-
- case kEplNmtCsStopped:
- // full EPL cycle is active, but without PReq/PRes
-
- switch (EplDllkInstance_g.m_DllState)
- {
- case kEplDllCsWaitPreq:
- switch (NmtEvent_p)
- {
- // DLL_CT2
- case kEplNmtEventDllCePreq:
- // enter DLL_CS_WAIT_SOA
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
- break;
-
- // DLL_CT8
- case kEplNmtEventDllCeFrameTimeout:
- // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA | EPL_DLL_ERR_CN_LOSS_SOC;
-
- case kEplNmtEventDllCeSoa:
- // NMT_CS_STOPPED active
- // it is Ok if no PReq was received
-
- // enter DLL_CS_WAIT_SOC
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
- break;
-
- // DLL_CT7
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeAsnd:
- // report DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA;
-
- case kEplNmtEventDllCePres:
- default:
- // remain in this state
- break;
- }
- break;
-
- case kEplDllCsWaitSoc:
- switch (NmtEvent_p)
- {
- // DLL_CT1
- case kEplNmtEventDllCeSoc:
- // start of cycle and isochronous phase
- // enter DLL_CS_WAIT_SOA
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
- break;
-
- // DLL_CT4
+ case kEplNmtEventDllCeFrameTimeout:
+ if (NmtState_p == kEplNmtCsPreOperational2) { // ignore frame timeout in PreOp2,
+ // because the previously configured cycle len
+ // may be wrong.
+ // 2008/10/15 d.k. If it would not be ignored,
+ // we would go cyclically to PreOp1 and on next
+ // SoC back to PreOp2.
+ break;
+ }
+ // fall through
+
+ case kEplNmtEventDllCePreq:
+ case kEplNmtEventDllCeSoa:
+ // report DLL_CEV_LOSS_SOC
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOC;
+
+ case kEplNmtEventDllCeAsnd:
+ default:
+ // remain in this state
+ break;
+ }
+ break;
+
+ case kEplDllCsWaitSoa:
+ switch (NmtEvent_p) {
+ case kEplNmtEventDllCeFrameTimeout:
+ // DLL_CT3
+ if (NmtState_p == kEplNmtCsPreOperational2) { // ignore frame timeout in PreOp2,
+ // because the previously configured cycle len
+ // may be wrong.
+ // 2008/10/15 d.k. If it would not be ignored,
+ // we would go cyclically to PreOp1 and on next
+ // SoC back to PreOp2.
+ break;
+ }
+ // fall through
+
+ case kEplNmtEventDllCePreq:
+ // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA |
+ EPL_DLL_ERR_CN_LOSS_SOC;
+
+ case kEplNmtEventDllCeSoa:
+ // enter DLL_CS_WAIT_SOC
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
+ break;
+
+ // DLL_CT9
+ case kEplNmtEventDllCeSoc:
+ // report DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA;
+
+ // enter DLL_CS_WAIT_PREQ
+ EplDllkInstance_g.m_DllState =
+ kEplDllCsWaitPreq;
+ break;
+
+ // DLL_CT10
+ case kEplNmtEventDllCeAsnd:
+ // report DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA;
+
+ case kEplNmtEventDllCePres:
+ default:
+ // remain in this state
+ break;
+ }
+ break;
+
+ case kEplDllGsInit:
+ // enter DLL_CS_WAIT_PREQ
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitPreq;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case kEplNmtCsStopped:
+ // full EPL cycle is active, but without PReq/PRes
+
+ switch (EplDllkInstance_g.m_DllState) {
+ case kEplDllCsWaitPreq:
+ switch (NmtEvent_p) {
+ // DLL_CT2
+ case kEplNmtEventDllCePreq:
+ // enter DLL_CS_WAIT_SOA
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
+ break;
+
+ // DLL_CT8
+ case kEplNmtEventDllCeFrameTimeout:
+ // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA |
+ EPL_DLL_ERR_CN_LOSS_SOC;
+
+ case kEplNmtEventDllCeSoa:
+ // NMT_CS_STOPPED active
+ // it is Ok if no PReq was received
+
+ // enter DLL_CS_WAIT_SOC
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
+ break;
+
+ // DLL_CT7
+ case kEplNmtEventDllCeSoc:
+ case kEplNmtEventDllCeAsnd:
+ // report DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA;
+
+ case kEplNmtEventDllCePres:
+ default:
+ // remain in this state
+ break;
+ }
+ break;
+
+ case kEplDllCsWaitSoc:
+ switch (NmtEvent_p) {
+ // DLL_CT1
+ case kEplNmtEventDllCeSoc:
+ // start of cycle and isochronous phase
+ // enter DLL_CS_WAIT_SOA
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
+ break;
+
+ // DLL_CT4
// case kEplNmtEventDllCePres:
- case kEplNmtEventDllCePreq:
- case kEplNmtEventDllCeSoa:
- case kEplNmtEventDllCeFrameTimeout:
- // report DLL_CEV_LOSS_SOC
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOC;
-
- case kEplNmtEventDllCeAsnd:
- default:
- // remain in this state
- break;
- }
- break;
-
- case kEplDllCsWaitSoa:
- switch (NmtEvent_p)
- {
- // DLL_CT3
- case kEplNmtEventDllCeFrameTimeout:
- // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA | EPL_DLL_ERR_CN_LOSS_SOC;
-
- case kEplNmtEventDllCeSoa:
- // enter DLL_CS_WAIT_SOC
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
- break;
-
- // DLL_CT9
- case kEplNmtEventDllCeSoc:
- // report DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA;
- // remain in DLL_CS_WAIT_SOA
- break;
-
- // DLL_CT10
- case kEplNmtEventDllCeAsnd:
- // report DLL_CEV_LOSS_SOA
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_CN_LOSS_SOA;
-
- case kEplNmtEventDllCePreq:
- // NMT_CS_STOPPED active and we do not expect any PReq
- // so just ignore it
- case kEplNmtEventDllCePres:
- default:
- // remain in this state
- break;
- }
- break;
-
- case kEplDllGsInit:
- default:
- // enter DLL_CS_WAIT_PREQ
- EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
- break;
- }
- break;
+ case kEplNmtEventDllCePreq:
+ case kEplNmtEventDllCeSoa:
+ case kEplNmtEventDllCeFrameTimeout:
+ // report DLL_CEV_LOSS_SOC
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOC;
+
+ case kEplNmtEventDllCeAsnd:
+ default:
+ // remain in this state
+ break;
+ }
+ break;
+
+ case kEplDllCsWaitSoa:
+ switch (NmtEvent_p) {
+ // DLL_CT3
+ case kEplNmtEventDllCeFrameTimeout:
+ // report DLL_CEV_LOSS_SOC and DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA |
+ EPL_DLL_ERR_CN_LOSS_SOC;
+
+ case kEplNmtEventDllCeSoa:
+ // enter DLL_CS_WAIT_SOC
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoc;
+ break;
+
+ // DLL_CT9
+ case kEplNmtEventDllCeSoc:
+ // report DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA;
+ // remain in DLL_CS_WAIT_SOA
+ break;
+
+ // DLL_CT10
+ case kEplNmtEventDllCeAsnd:
+ // report DLL_CEV_LOSS_SOA
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_CN_LOSS_SOA;
+
+ case kEplNmtEventDllCePreq:
+ // NMT_CS_STOPPED active and we do not expect any PReq
+ // so just ignore it
+ case kEplNmtEventDllCePres:
+ default:
+ // remain in this state
+ break;
+ }
+ break;
+
+ case kEplDllGsInit:
+ default:
+ // enter DLL_CS_WAIT_PREQ
+ EplDllkInstance_g.m_DllState = kEplDllCsWaitSoa;
+ break;
+ }
+ break;
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- case kEplNmtMsNotActive:
- case kEplNmtMsBasicEthernet:
- break;
-
- case kEplNmtMsPreOperational1:
- // reduced EPL cycle is active
- if (EplDllkInstance_g.m_DllState != kEplDllMsNonCyclic)
- { // stop cycle timer
+ case kEplNmtMsNotActive:
+ case kEplNmtMsBasicEthernet:
+ break;
+
+ case kEplNmtMsPreOperational1:
+ // reduced EPL cycle is active
+ if (EplDllkInstance_g.m_DllState != kEplDllMsNonCyclic) { // stop cycle timer
#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskDeleteTimer(&EplDllkInstance_g.m_TimerHdlCycle);
+ Ret =
+ EplTimerHighReskDeleteTimer(&EplDllkInstance_g.
+ m_TimerHdlCycle);
#endif
- EplDllkInstance_g.m_DllState = kEplDllMsNonCyclic;
-
- // stop further processing,
- // because it will be restarted by NMT MN module
- break;
- }
-
- switch (NmtEvent_p)
- {
- case kEplNmtEventDllMeSocTrig:
- case kEplNmtEventDllCeAsnd:
- { // because of reduced EPL cycle SoA shall be triggered, not SoC
- tEplDllState DummyDllState;
-
- Ret = EplDllkAsyncFrameNotReceived(EplDllkInstance_g.m_LastReqServiceId,
- EplDllkInstance_g.m_uiLastTargetNodeId);
-
- // go ahead and send SoA
- Ret = EplDllkMnSendSoa(NmtState_p,
- &DummyDllState,
- (EplDllkInstance_g.m_uiCycleCount >= EPL_C_DLL_PREOP1_START_CYCLES));
- // increment cycle counter to detect if EPL_C_DLL_PREOP1_START_CYCLES empty cycles are elapsed
- EplDllkInstance_g.m_uiCycleCount++;
-
- // reprogram timer
+ EplDllkInstance_g.m_DllState = kEplDllMsNonCyclic;
+
+ // stop further processing,
+ // because it will be restarted by NMT MN module
+ break;
+ }
+
+ switch (NmtEvent_p) {
+ case kEplNmtEventDllMeSocTrig:
+ case kEplNmtEventDllCeAsnd:
+ { // because of reduced EPL cycle SoA shall be triggered, not SoC
+ tEplDllState DummyDllState;
+
+ Ret =
+ EplDllkAsyncFrameNotReceived
+ (EplDllkInstance_g.m_LastReqServiceId,
+ EplDllkInstance_g.m_uiLastTargetNodeId);
+
+ // go ahead and send SoA
+ Ret = EplDllkMnSendSoa(NmtState_p,
+ &DummyDllState,
+ (EplDllkInstance_g.
+ m_uiCycleCount >=
+ EPL_C_DLL_PREOP1_START_CYCLES));
+ // increment cycle counter to detect if EPL_C_DLL_PREOP1_START_CYCLES empty cycles are elapsed
+ EplDllkInstance_g.m_uiCycleCount++;
+
+ // reprogram timer
#if EPL_TIMER_USE_HIGHRES != FALSE
- if (EplDllkInstance_g.m_DllConfigParam.m_dwAsyncSlotTimeout != 0)
- {
- Ret = EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.m_TimerHdlCycle,
- EplDllkInstance_g.m_DllConfigParam.m_dwAsyncSlotTimeout,
- EplDllkCbMnTimerCycle,
- 0L,
- FALSE);
- }
+ if (EplDllkInstance_g.m_DllConfigParam.
+ m_dwAsyncSlotTimeout != 0) {
+ Ret =
+ EplTimerHighReskModifyTimerNs
+ (&EplDllkInstance_g.m_TimerHdlCycle,
+ EplDllkInstance_g.m_DllConfigParam.
+ m_dwAsyncSlotTimeout,
+ EplDllkCbMnTimerCycle, 0L, FALSE);
+ }
#endif
- break;
- }
-
- default:
- break;
- }
- break;
-
- case kEplNmtMsPreOperational2:
- case kEplNmtMsReadyToOperate:
- case kEplNmtMsOperational:
- // full EPL cycle is active
- switch (NmtEvent_p)
- {
- case kEplNmtEventDllMeSocTrig:
- {
- // update cycle counter
- if (EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt > 0)
- { // multiplexed cycle active
- EplDllkInstance_g.m_uiCycleCount = (EplDllkInstance_g.m_uiCycleCount + 1) % EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt;
- // $$$ check multiplexed cycle restart
- // -> toggle MC flag
- // -> change node linked list
- }
- else
- { // non-multiplexed cycle active
- // start with first node in isochronous phase
- EplDllkInstance_g.m_pCurNodeInfo = NULL;
- }
-
- switch (EplDllkInstance_g.m_DllState)
- {
- case kEplDllMsNonCyclic:
- { // start continuous cycle timer
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+
+ case kEplNmtMsPreOperational2:
+ case kEplNmtMsReadyToOperate:
+ case kEplNmtMsOperational:
+ // full EPL cycle is active
+ switch (NmtEvent_p) {
+ case kEplNmtEventDllMeSocTrig:
+ {
+ // update cycle counter
+ if (EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt > 0) { // multiplexed cycle active
+ EplDllkInstance_g.m_uiCycleCount =
+ (EplDllkInstance_g.m_uiCycleCount +
+ 1) %
+ EplDllkInstance_g.m_DllConfigParam.
+ m_uiMultiplCycleCnt;
+ // $$$ check multiplexed cycle restart
+ // -> toggle MC flag
+ // -> change node linked list
+ } else { // non-multiplexed cycle active
+ // start with first node in isochronous phase
+ EplDllkInstance_g.m_pCurNodeInfo = NULL;
+ }
+
+ switch (EplDllkInstance_g.m_DllState) {
+ case kEplDllMsNonCyclic:
+ { // start continuous cycle timer
#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.m_TimerHdlCycle,
- EplDllkInstance_g.m_ullFrameTimeout,
- EplDllkCbMnTimerCycle,
- 0L,
- TRUE);
+ Ret =
+ EplTimerHighReskModifyTimerNs
+ (&EplDllkInstance_g.
+ m_TimerHdlCycle,
+ EplDllkInstance_g.
+ m_ullFrameTimeout,
+ EplDllkCbMnTimerCycle, 0L,
+ TRUE);
#endif
- // continue with sending SoC
- }
-
- case kEplDllMsWaitAsnd:
- case kEplDllMsWaitSocTrig:
- { // if m_LastReqServiceId is still valid,
- // SoA was not correctly answered
- // and user part has to be informed
- Ret = EplDllkAsyncFrameNotReceived(EplDllkInstance_g.m_LastReqServiceId,
- EplDllkInstance_g.m_uiLastTargetNodeId);
-
- // send SoC
- Ret = EplDllkMnSendSoc();
-
- // new DLL state
- EplDllkInstance_g.m_DllState = kEplDllMsWaitPreqTrig;
-
- // start WaitSoCPReq Timer
+ // continue with sending SoC
+ }
+
+ case kEplDllMsWaitAsnd:
+ case kEplDllMsWaitSocTrig:
+ { // if m_LastReqServiceId is still valid,
+ // SoA was not correctly answered
+ // and user part has to be informed
+ Ret =
+ EplDllkAsyncFrameNotReceived
+ (EplDllkInstance_g.
+ m_LastReqServiceId,
+ EplDllkInstance_g.
+ m_uiLastTargetNodeId);
+
+ // send SoC
+ Ret = EplDllkMnSendSoc();
+
+ // new DLL state
+ EplDllkInstance_g.m_DllState =
+ kEplDllMsWaitPreqTrig;
+
+ // start WaitSoCPReq Timer
#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.m_TimerHdlResponse,
- EplDllkInstance_g.m_DllConfigParam.m_dwWaitSocPreq,
- EplDllkCbMnTimerResponse,
- 0L,
- FALSE);
+ Ret =
+ EplTimerHighReskModifyTimerNs
+ (&EplDllkInstance_g.
+ m_TimerHdlResponse,
+ EplDllkInstance_g.
+ m_DllConfigParam.
+ m_dwWaitSocPreq,
+ EplDllkCbMnTimerResponse,
+ 0L, FALSE);
#endif
- break;
- }
-
- default:
- { // wrong DLL state / cycle time exceeded
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_MN_CYCTIMEEXCEED;
- EplDllkInstance_g.m_DllState = kEplDllMsWaitSocTrig;
- break;
- }
- }
-
- break;
- }
-
- case kEplNmtEventDllMePresTimeout:
- {
-
- switch (EplDllkInstance_g.m_DllState)
- {
- case kEplDllMsWaitPres:
- { // PRes not received
-
- if (EplDllkInstance_g.m_pCurNodeInfo->m_fSoftDelete == FALSE)
- { // normal isochronous CN
- DllEvent.m_ulDllErrorEvents |= EPL_DLL_ERR_MN_CN_LOSS_PRES;
- DllEvent.m_uiNodeId = EplDllkInstance_g.m_pCurNodeInfo->m_uiNodeId;
- }
- else
- { // CN shall be deleted softly
- Event.m_EventSink = kEplEventSinkDllkCal;
- Event.m_EventType = kEplEventTypeDllkSoftDelNode;
- // $$$ d.k. set Event.m_NetTime to current time
- Event.m_uiSize = sizeof (unsigned int);
- Event.m_pArg = &EplDllkInstance_g.m_pCurNodeInfo->m_uiNodeId;
- Ret = EplEventkPost(&Event);
- }
-
- // continue with sending next PReq
- }
-
- case kEplDllMsWaitPreqTrig:
- {
- // send next PReq
- Ret = EplDllkMnSendPreq(NmtState_p, &EplDllkInstance_g.m_DllState);
-
- break;
- }
-
- default:
- { // wrong DLL state
- break;
- }
- }
-
- break;
- }
-
- case kEplNmtEventDllCePres:
- {
-
- switch (EplDllkInstance_g.m_DllState)
- {
- case kEplDllMsWaitPres:
- { // PRes received
- // send next PReq
- Ret = EplDllkMnSendPreq(NmtState_p, &EplDllkInstance_g.m_DllState);
-
- break;
- }
-
- default:
- { // wrong DLL state
- break;
- }
- }
-
- break;
- }
-
- case kEplNmtEventDllMeSoaTrig:
- {
-
- switch (EplDllkInstance_g.m_DllState)
- {
- case kEplDllMsWaitSoaTrig:
- { // MN PRes sent
- // send SoA
- Ret = EplDllkMnSendSoa(NmtState_p, &EplDllkInstance_g.m_DllState, TRUE);
-
- break;
- }
-
- default:
- { // wrong DLL state
- break;
- }
- }
-
- break;
- }
-
- case kEplNmtEventDllCeAsnd:
- { // ASnd has been received, but it may be not the requested one
+ break;
+ }
+
+ default:
+ { // wrong DLL state / cycle time exceeded
+ DllEvent.m_ulDllErrorEvents |=
+ EPL_DLL_ERR_MN_CYCTIMEEXCEED;
+ EplDllkInstance_g.m_DllState =
+ kEplDllMsWaitSocTrig;
+ break;
+ }
+ }
+
+ break;
+ }
+
+ case kEplNmtEventDllMePresTimeout:
+ {
+
+ switch (EplDllkInstance_g.m_DllState) {
+ case kEplDllMsWaitPres:
+ { // PRes not received
+
+ if (EplDllkInstance_g.m_pCurNodeInfo->m_fSoftDelete == FALSE) { // normal isochronous CN
+ DllEvent.
+ m_ulDllErrorEvents
+ |=
+ EPL_DLL_ERR_MN_CN_LOSS_PRES;
+ DllEvent.m_uiNodeId =
+ EplDllkInstance_g.
+ m_pCurNodeInfo->
+ m_uiNodeId;
+ } else { // CN shall be deleted softly
+ Event.m_EventSink =
+ kEplEventSinkDllkCal;
+ Event.m_EventType =
+ kEplEventTypeDllkSoftDelNode;
+ // $$$ d.k. set Event.m_NetTime to current time
+ Event.m_uiSize =
+ sizeof(unsigned
+ int);
+ Event.m_pArg =
+ &EplDllkInstance_g.
+ m_pCurNodeInfo->
+ m_uiNodeId;
+ Ret =
+ EplEventkPost
+ (&Event);
+ }
+
+ // continue with sending next PReq
+ }
+
+ case kEplDllMsWaitPreqTrig:
+ {
+ // send next PReq
+ Ret =
+ EplDllkMnSendPreq
+ (NmtState_p,
+ &EplDllkInstance_g.
+ m_DllState);
+
+ break;
+ }
+
+ default:
+ { // wrong DLL state
+ break;
+ }
+ }
+
+ break;
+ }
+
+ case kEplNmtEventDllCePres:
+ {
+
+ switch (EplDllkInstance_g.m_DllState) {
+ case kEplDllMsWaitPres:
+ { // PRes received
+ // send next PReq
+ Ret =
+ EplDllkMnSendPreq
+ (NmtState_p,
+ &EplDllkInstance_g.
+ m_DllState);
+
+ break;
+ }
+
+ default:
+ { // wrong DLL state
+ break;
+ }
+ }
+
+ break;
+ }
+
+ case kEplNmtEventDllMeSoaTrig:
+ {
+
+ switch (EplDllkInstance_g.m_DllState) {
+ case kEplDllMsWaitSoaTrig:
+ { // MN PRes sent
+ // send SoA
+ Ret =
+ EplDllkMnSendSoa(NmtState_p,
+ &EplDllkInstance_g.
+ m_DllState,
+ TRUE);
+
+ break;
+ }
+
+ default:
+ { // wrong DLL state
+ break;
+ }
+ }
+
+ break;
+ }
+
+ case kEplNmtEventDllCeAsnd:
+ { // ASnd has been received, but it may be not the requested one
/*
// report if SoA was correctly answered
Ret = EplDllkAsyncFrameNotReceived(EplDllkInstance_g.m_LastReqServiceId,
EplDllkInstance_g.m_uiLastTargetNodeId);
*/
- if (EplDllkInstance_g.m_DllState == kEplDllMsWaitAsnd)
- {
- EplDllkInstance_g.m_DllState = kEplDllMsWaitSocTrig;
- }
- break;
- }
-
- default:
- break;
- }
- break;
+ if (EplDllkInstance_g.m_DllState ==
+ kEplDllMsWaitAsnd) {
+ EplDllkInstance_g.m_DllState =
+ kEplDllMsWaitSocTrig;
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- default:
- break;
- }
+ default:
+ break;
+ }
- if (DllEvent.m_ulDllErrorEvents != 0)
- { // error event set -> post it to error handler
- Event.m_EventSink = kEplEventSinkErrk;
- Event.m_EventType = kEplEventTypeDllError;
- // $$$ d.k. set Event.m_NetTime to current time
- Event.m_uiSize = sizeof (DllEvent);
- Event.m_pArg = &DllEvent;
- Ret = EplEventkPost(&Event);
- }
+ if (DllEvent.m_ulDllErrorEvents != 0) { // error event set -> post it to error handler
+ Event.m_EventSink = kEplEventSinkErrk;
+ Event.m_EventType = kEplEventTypeDllError;
+ // $$$ d.k. set Event.m_NetTime to current time
+ Event.m_uiSize = sizeof(DllEvent);
+ Event.m_pArg = &DllEvent;
+ Ret = EplEventkPost(&Event);
+ }
- return Ret;
+ return Ret;
}
//---------------------------------------------------------------------------
@@ -2281,652 +2419,754 @@ tEplErrorHandlerkEvent DllEvent;
static void EplDllkCbFrameReceived(tEdrvRxBuffer * pRxBuffer_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplNmtState NmtState;
-tEplNmtEvent NmtEvent = kEplNmtEventNoEvent;
-tEplEvent Event;
-tEplFrame *pFrame;
-tEplFrame *pTxFrame;
-tEdrvTxBuffer *pTxBuffer = NULL;
-tEplFrameInfo FrameInfo;
-tEplMsgType MsgType;
-tEplDllReqServiceId ReqServiceId;
-unsigned int uiAsndServiceId;
-unsigned int uiNodeId;
-BYTE bFlag1;
-
- BENCHMARK_MOD_02_SET(3);
- NmtState = EplNmtkGetNmtState();
-
- if (NmtState <= kEplNmtGsResetConfiguration)
- {
- goto Exit;
- }
-
- pFrame = (tEplFrame *) pRxBuffer_p->m_pbBuffer;
+ tEplKernel Ret = kEplSuccessful;
+ tEplNmtState NmtState;
+ tEplNmtEvent NmtEvent = kEplNmtEventNoEvent;
+ tEplEvent Event;
+ tEplFrame *pFrame;
+ tEplFrame *pTxFrame;
+ tEdrvTxBuffer *pTxBuffer = NULL;
+ tEplFrameInfo FrameInfo;
+ tEplMsgType MsgType;
+ tEplDllReqServiceId ReqServiceId;
+ unsigned int uiAsndServiceId;
+ unsigned int uiNodeId;
+ BYTE bFlag1;
+
+ BENCHMARK_MOD_02_SET(3);
+ NmtState = EplNmtkGetNmtState();
+
+ if (NmtState <= kEplNmtGsResetConfiguration) {
+ goto Exit;
+ }
+
+ pFrame = (tEplFrame *) pRxBuffer_p->m_pbBuffer;
#if EDRV_EARLY_RX_INT != FALSE
- switch (pRxBuffer_p->m_BufferInFrame)
- {
- case kEdrvBufferFirstInFrame:
- {
- MsgType = (tEplMsgType)AmiGetByteFromLe(&pFrame->m_le_bMessageType);
- if (MsgType == kEplMsgTypePreq)
- {
- if (EplDllkInstance_g.m_DllState == kEplDllCsWaitPreq)
- { // PReq expected and actually received
- // d.k.: The condition above is sufficent, because EPL cycle is active
- // and no non-EPL frame shall be received in isochronous phase.
- // start transmission PRes
- // $$$ What if Tx buffer is invalid?
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
+ switch (pRxBuffer_p->m_BufferInFrame) {
+ case kEdrvBufferFirstInFrame:
+ {
+ MsgType =
+ (tEplMsgType) AmiGetByteFromLe(&pFrame->
+ m_le_bMessageType);
+ if (MsgType == kEplMsgTypePreq) {
+ if (EplDllkInstance_g.m_DllState == kEplDllCsWaitPreq) { // PReq expected and actually received
+ // d.k.: The condition above is sufficent, because EPL cycle is active
+ // and no non-EPL frame shall be received in isochronous phase.
+ // start transmission PRes
+ // $$$ What if Tx buffer is invalid?
+ pTxBuffer =
+ &EplDllkInstance_g.
+ m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
#if (EPL_DLL_PRES_READY_AFTER_SOA != FALSE) || (EPL_DLL_PRES_READY_AFTER_SOC != FALSE)
- Ret = EdrvTxMsgStart(pTxBuffer);
+ Ret = EdrvTxMsgStart(pTxBuffer);
#else
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
- // update frame (NMT state, RD, RS, PR, MS, EN flags)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- if (NmtState != kEplNmtCsOperational)
- { // mark PDO as invalid in NMT state Op
- // $$$ reset only RD flag; set other flags appropriately
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1, 0);
- }
- // $$$ make function that updates Pres, StatusRes
- // send PRes frame
- Ret = EdrvSendTxMsg(pTxBuffer);
+ pTxFrame =
+ (tEplFrame *) pTxBuffer->m_pbBuffer;
+ // update frame (NMT state, RD, RS, PR, MS, EN flags)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bFlag2,
+ EplDllkInstance_g.
+ m_bFlag2);
+ if (NmtState != kEplNmtCsOperational) { // mark PDO as invalid in NMT state Op
+ // $$$ reset only RD flag; set other flags appropriately
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Pres.
+ m_le_bFlag1, 0);
+ }
+ // $$$ make function that updates Pres, StatusRes
+ // send PRes frame
+ Ret = EdrvSendTxMsg(pTxBuffer);
#endif
- }
- }
- goto Exit;
- }
-
- case kEdrvBufferMiddleInFrame:
- {
- goto Exit;
- }
-
- case kEdrvBufferLastInFrame:
- {
- break;
- }
- }
+ }
+ }
+ goto Exit;
+ }
+
+ case kEdrvBufferMiddleInFrame:
+ {
+ goto Exit;
+ }
+
+ case kEdrvBufferLastInFrame:
+ {
+ break;
+ }
+ }
#endif
- FrameInfo.m_pFrame = pFrame;
- FrameInfo.m_uiFrameSize = pRxBuffer_p->m_uiRxMsgLen;
- FrameInfo.m_NetTime.m_dwNanoSec = pRxBuffer_p->m_NetTime.m_dwNanoSec;
- FrameInfo.m_NetTime.m_dwSec = pRxBuffer_p->m_NetTime.m_dwSec;
-
- if (AmiGetWordFromBe(&pFrame->m_be_wEtherType) != EPL_C_DLL_ETHERTYPE_EPL)
- { // non-EPL frame
- //TRACE2("EplDllkCbFrameReceived: pfnCbAsync=0x%p SrcMAC=0x%llx\n", EplDllkInstance_g.m_pfnCbAsync, AmiGetQword48FromBe(pFrame->m_be_abSrcMac));
- if (EplDllkInstance_g.m_pfnCbAsync != NULL)
- { // handler for async frames is registered
- EplDllkInstance_g.m_pfnCbAsync(&FrameInfo);
- }
-
- goto Exit;
- }
-
- MsgType = (tEplMsgType)AmiGetByteFromLe(&pFrame->m_le_bMessageType);
- switch (MsgType)
- {
- case kEplMsgTypePreq:
- {
- // PReq frame
- // d.k.: (we assume that this PReq frame is intended for us and don't check DstNodeId)
- if (AmiGetByteFromLe(&pFrame->m_le_bDstNodeId) != EplDllkInstance_g.m_DllConfigParam.m_uiNodeId)
- { // this PReq is not intended for us
- goto Exit;
- }
- NmtEvent = kEplNmtEventDllCePreq;
-
- if (NmtState >= kEplNmtMsNotActive)
- { // MN is active -> wrong msg type
- break;
- }
-
+ FrameInfo.m_pFrame = pFrame;
+ FrameInfo.m_uiFrameSize = pRxBuffer_p->m_uiRxMsgLen;
+ FrameInfo.m_NetTime.m_dwNanoSec = pRxBuffer_p->m_NetTime.m_dwNanoSec;
+ FrameInfo.m_NetTime.m_dwSec = pRxBuffer_p->m_NetTime.m_dwSec;
+
+ if (AmiGetWordFromBe(&pFrame->m_be_wEtherType) != EPL_C_DLL_ETHERTYPE_EPL) { // non-EPL frame
+ //TRACE2("EplDllkCbFrameReceived: pfnCbAsync=0x%p SrcMAC=0x%llx\n", EplDllkInstance_g.m_pfnCbAsync, AmiGetQword48FromBe(pFrame->m_be_abSrcMac));
+ if (EplDllkInstance_g.m_pfnCbAsync != NULL) { // handler for async frames is registered
+ EplDllkInstance_g.m_pfnCbAsync(&FrameInfo);
+ }
+
+ goto Exit;
+ }
+
+ MsgType = (tEplMsgType) AmiGetByteFromLe(&pFrame->m_le_bMessageType);
+ switch (MsgType) {
+ case kEplMsgTypePreq:
+ {
+ // PReq frame
+ // d.k.: (we assume that this PReq frame is intended for us and don't check DstNodeId)
+ if (AmiGetByteFromLe(&pFrame->m_le_bDstNodeId) != EplDllkInstance_g.m_DllConfigParam.m_uiNodeId) { // this PReq is not intended for us
+ goto Exit;
+ }
+ NmtEvent = kEplNmtEventDllCePreq;
+
+ if (NmtState >= kEplNmtMsNotActive) { // MN is active -> wrong msg type
+ break;
+ }
#if EDRV_EARLY_RX_INT == FALSE
- if (NmtState >= kEplNmtCsPreOperational2)
- { // respond to and process PReq frames only in PreOp2, ReadyToOp and Op
- // Does PRes exist?
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
- if (pTxBuffer->m_pbBuffer != NULL)
- { // PRes does exist
+ if (NmtState >= kEplNmtCsPreOperational2) { // respond to and process PReq frames only in PreOp2, ReadyToOp and Op
+ // Does PRes exist?
+ pTxBuffer =
+ &EplDllkInstance_g.
+ m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
+ if (pTxBuffer->m_pbBuffer != NULL) { // PRes does exist
#if (EPL_DLL_PRES_READY_AFTER_SOA != FALSE) || (EPL_DLL_PRES_READY_AFTER_SOC != FALSE)
- EdrvTxMsgStart(pTxBuffer);
+ EdrvTxMsgStart(pTxBuffer);
#else
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
- // update frame (NMT state, RD, RS, PR, MS, EN flags)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- bFlag1 = AmiGetByteFromLe(&pFrame->m_Data.m_Preq.m_le_bFlag1);
- // save EA flag
- EplDllkInstance_g.m_bMnFlag1 =
- (EplDllkInstance_g.m_bMnFlag1 & ~EPL_FRAME_FLAG1_EA)
- | (bFlag1 & EPL_FRAME_FLAG1_EA);
- // preserve MS flag
- bFlag1 &= EPL_FRAME_FLAG1_MS;
- // add EN flag from Error signaling module
- bFlag1 |= EplDllkInstance_g.m_bFlag1 & EPL_FRAME_FLAG1_EN;
- if (NmtState != kEplNmtCsOperational)
- { // mark PDO as invalid in NMT state Op
- // reset only RD flag
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1, bFlag1);
- }
- else
- { // leave RD flag untouched
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1,
- (AmiGetByteFromLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1) & EPL_FRAME_FLAG1_RD)
- | bFlag1);
- }
- // $$$ update EPL_DLL_PRES_READY_AFTER_* code
- // send PRes frame
- Ret = EdrvSendTxMsg(pTxBuffer);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
+ pTxFrame =
+ (tEplFrame *) pTxBuffer->m_pbBuffer;
+ // update frame (NMT state, RD, RS, PR, MS, EN flags)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bFlag2,
+ EplDllkInstance_g.
+ m_bFlag2);
+ bFlag1 =
+ AmiGetByteFromLe(&pFrame->m_Data.
+ m_Preq.
+ m_le_bFlag1);
+ // save EA flag
+ EplDllkInstance_g.m_bMnFlag1 =
+ (EplDllkInstance_g.
+ m_bMnFlag1 & ~EPL_FRAME_FLAG1_EA)
+ | (bFlag1 & EPL_FRAME_FLAG1_EA);
+ // preserve MS flag
+ bFlag1 &= EPL_FRAME_FLAG1_MS;
+ // add EN flag from Error signaling module
+ bFlag1 |=
+ EplDllkInstance_g.
+ m_bFlag1 & EPL_FRAME_FLAG1_EN;
+ if (NmtState != kEplNmtCsOperational) { // mark PDO as invalid in NMT state Op
+ // reset only RD flag
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Pres.
+ m_le_bFlag1,
+ bFlag1);
+ } else { // leave RD flag untouched
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Pres.
+ m_le_bFlag1,
+ (AmiGetByteFromLe
+ (&pTxFrame->
+ m_Data.m_Pres.
+ m_le_bFlag1) &
+ EPL_FRAME_FLAG1_RD)
+ | bFlag1);
+ }
+ // $$$ update EPL_DLL_PRES_READY_AFTER_* code
+ // send PRes frame
+ Ret = EdrvSendTxMsg(pTxBuffer);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
#endif
- }
+ }
#endif
- // inform PDO module
+ // inform PDO module
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- if (NmtState >= kEplNmtCsReadyToOperate)
- { // inform PDO module only in ReadyToOp and Op
- if (NmtState != kEplNmtCsOperational)
- {
- // reset RD flag and all other flags, but that does not matter, because they were processed above
- AmiSetByteToLe(&pFrame->m_Data.m_Preq.m_le_bFlag1, 0);
- }
-
- // compares real frame size and PDO size
- if ((unsigned int) (AmiGetWordFromLe(&pFrame->m_Data.m_Preq.m_le_wSize) + 24)
- > FrameInfo.m_uiFrameSize)
- { // format error
- tEplErrorHandlerkEvent DllEvent;
-
- DllEvent.m_ulDllErrorEvents = EPL_DLL_ERR_INVALID_FORMAT;
- DllEvent.m_uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
- DllEvent.m_NmtState = NmtState;
- Event.m_EventSink = kEplEventSinkErrk;
- Event.m_EventType = kEplEventTypeDllError;
- Event.m_NetTime = FrameInfo.m_NetTime;
- Event.m_uiSize = sizeof (DllEvent);
- Event.m_pArg = &DllEvent;
- Ret = EplEventkPost(&Event);
- break;
- }
-
- // forward PReq frame as RPDO to PDO module
- Ret = EplPdokCbPdoReceived(&FrameInfo);
-
- }
+ if (NmtState >= kEplNmtCsReadyToOperate) { // inform PDO module only in ReadyToOp and Op
+ if (NmtState != kEplNmtCsOperational) {
+ // reset RD flag and all other flags, but that does not matter, because they were processed above
+ AmiSetByteToLe(&pFrame->m_Data.
+ m_Preq.
+ m_le_bFlag1, 0);
+ }
+ // compares real frame size and PDO size
+ if ((unsigned
+ int)(AmiGetWordFromLe(&pFrame->
+ m_Data.
+ m_Preq.
+ m_le_wSize) +
+ 24)
+ > FrameInfo.m_uiFrameSize) { // format error
+ tEplErrorHandlerkEvent DllEvent;
+
+ DllEvent.m_ulDllErrorEvents =
+ EPL_DLL_ERR_INVALID_FORMAT;
+ DllEvent.m_uiNodeId =
+ AmiGetByteFromLe(&pFrame->
+ m_le_bSrcNodeId);
+ DllEvent.m_NmtState = NmtState;
+ Event.m_EventSink =
+ kEplEventSinkErrk;
+ Event.m_EventType =
+ kEplEventTypeDllError;
+ Event.m_NetTime =
+ FrameInfo.m_NetTime;
+ Event.m_uiSize =
+ sizeof(DllEvent);
+ Event.m_pArg = &DllEvent;
+ Ret = EplEventkPost(&Event);
+ break;
+ }
+ // forward PReq frame as RPDO to PDO module
+ Ret = EplPdokCbPdoReceived(&FrameInfo);
+
+ }
#if (EPL_DLL_PRES_READY_AFTER_SOC != FALSE)
- if (pTxBuffer->m_pbBuffer != NULL)
- { // PRes does exist
- // inform PDO module about PRes after PReq
- FrameInfo.m_pFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
- FrameInfo.m_uiFrameSize = pTxBuffer->m_uiMaxBufferLen;
- Ret = EplPdokCbPdoTransmitted(&FrameInfo);
- }
+ if (pTxBuffer->m_pbBuffer != NULL) { // PRes does exist
+ // inform PDO module about PRes after PReq
+ FrameInfo.m_pFrame =
+ (tEplFrame *) pTxBuffer->m_pbBuffer;
+ FrameInfo.m_uiFrameSize =
+ pTxBuffer->m_uiMaxBufferLen;
+ Ret =
+ EplPdokCbPdoTransmitted(&FrameInfo);
+ }
#endif
#endif
#if EDRV_EARLY_RX_INT == FALSE
- // $$$ inform emergency protocol handling (error signaling module) about flags
- }
+ // $$$ inform emergency protocol handling (error signaling module) about flags
+ }
#endif
- // reset cycle counter
- EplDllkInstance_g.m_uiCycleCount = 0;
+ // reset cycle counter
+ EplDllkInstance_g.m_uiCycleCount = 0;
- break;
- }
+ break;
+ }
- case kEplMsgTypePres:
- {
+ case kEplMsgTypePres:
+ {
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- tEplDllkNodeInfo* pIntNodeInfo;
- tEplHeartbeatEvent HeartbeatEvent;
+ tEplDllkNodeInfo *pIntNodeInfo;
+ tEplHeartbeatEvent HeartbeatEvent;
#endif
- // PRes frame
- NmtEvent = kEplNmtEventDllCePres;
+ // PRes frame
+ NmtEvent = kEplNmtEventDllCePres;
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
+ uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
- if ((NmtState >= kEplNmtCsPreOperational2)
- && (NmtState <= kEplNmtCsOperational))
- { // process PRes frames only in PreOp2, ReadyToOp and Op of CN
+ if ((NmtState >= kEplNmtCsPreOperational2)
+ && (NmtState <= kEplNmtCsOperational)) { // process PRes frames only in PreOp2, ReadyToOp and Op of CN
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- pIntNodeInfo = EplDllkGetNodeInfo(uiNodeId);
- if (pIntNodeInfo == NULL)
- { // no node info structure available
- Ret = kEplDllNoNodeInfo;
- goto Exit;
- }
- }
- else if (EplDllkInstance_g.m_DllState == kEplDllMsWaitPres)
- { // or process PRes frames in MsWaitPres
-
- pIntNodeInfo = EplDllkInstance_g.m_pCurNodeInfo;
- if ((pIntNodeInfo == NULL) || (pIntNodeInfo->m_uiNodeId != uiNodeId))
- { // ignore PRes, because it is from wrong CN
- // $$$ maybe post event to NmtMn module
- goto Exit;
- }
-
- // forward Flag2 to asynchronous scheduler
- bFlag1 = AmiGetByteFromLe(&pFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bFlag2);
- Ret = EplDllkCalAsyncSetPendingRequests(uiNodeId,
- ((tEplDllAsyncReqPriority) ((bFlag1 & EPL_FRAME_FLAG2_PR) >> EPL_FRAME_FLAG2_PR_SHIFT)),
- (bFlag1 & EPL_FRAME_FLAG2_RS));
+ pIntNodeInfo = EplDllkGetNodeInfo(uiNodeId);
+ if (pIntNodeInfo == NULL) { // no node info structure available
+ Ret = kEplDllNoNodeInfo;
+ goto Exit;
+ }
+ } else if (EplDllkInstance_g.m_DllState == kEplDllMsWaitPres) { // or process PRes frames in MsWaitPres
+
+ pIntNodeInfo = EplDllkInstance_g.m_pCurNodeInfo;
+ if ((pIntNodeInfo == NULL) || (pIntNodeInfo->m_uiNodeId != uiNodeId)) { // ignore PRes, because it is from wrong CN
+ // $$$ maybe post event to NmtMn module
+ goto Exit;
+ }
+ // forward Flag2 to asynchronous scheduler
+ bFlag1 =
+ AmiGetByteFromLe(&pFrame->m_Data.m_Asnd.
+ m_Payload.m_StatusResponse.
+ m_le_bFlag2);
+ Ret =
+ EplDllkCalAsyncSetPendingRequests(uiNodeId,
+ ((tEplDllAsyncReqPriority) ((bFlag1 & EPL_FRAME_FLAG2_PR) >> EPL_FRAME_FLAG2_PR_SHIFT)), (bFlag1 & EPL_FRAME_FLAG2_RS));
#endif
- }
- else
- { // ignore PRes, because it was received in wrong NMT state
- // but execute EplDllkChangeState() and post event to NMT module
- break;
- }
+ } else { // ignore PRes, because it was received in wrong NMT state
+ // but execute EplDllkChangeState() and post event to NMT module
+ break;
+ }
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- { // check NMT state of CN
- HeartbeatEvent.m_wErrorCode = EPL_E_NO_ERROR;
- HeartbeatEvent.m_NmtState =
- (tEplNmtState) (AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bNmtStatus) | EPL_NMT_TYPE_CS);
- if (pIntNodeInfo->m_NmtState != HeartbeatEvent.m_NmtState)
- { // NMT state of CN has changed -> post event to NmtMnu module
- if (pIntNodeInfo->m_fSoftDelete == FALSE)
- { // normal isochronous CN
- HeartbeatEvent.m_uiNodeId = uiNodeId;
- Event.m_EventSink = kEplEventSinkNmtMnu;
- Event.m_EventType = kEplEventTypeHeartbeat;
- Event.m_uiSize = sizeof (HeartbeatEvent);
- Event.m_pArg = &HeartbeatEvent;
- }
- else
- { // CN shall be deleted softly
- Event.m_EventSink = kEplEventSinkDllkCal;
- Event.m_EventType = kEplEventTypeDllkSoftDelNode;
- Event.m_uiSize = sizeof (unsigned int);
- Event.m_pArg = &pIntNodeInfo->m_uiNodeId;
- }
- Event.m_NetTime = FrameInfo.m_NetTime;
- Ret = EplEventkPost(&Event);
-
- // save current NMT state of CN in internal node structure
- pIntNodeInfo->m_NmtState = HeartbeatEvent.m_NmtState;
- }
- }
+ { // check NMT state of CN
+ HeartbeatEvent.m_wErrorCode = EPL_E_NO_ERROR;
+ HeartbeatEvent.m_NmtState =
+ (tEplNmtState) (AmiGetByteFromLe
+ (&pFrame->m_Data.m_Pres.
+ m_le_bNmtStatus) |
+ EPL_NMT_TYPE_CS);
+ if (pIntNodeInfo->m_NmtState != HeartbeatEvent.m_NmtState) { // NMT state of CN has changed -> post event to NmtMnu module
+ if (pIntNodeInfo->m_fSoftDelete == FALSE) { // normal isochronous CN
+ HeartbeatEvent.m_uiNodeId =
+ uiNodeId;
+ Event.m_EventSink =
+ kEplEventSinkNmtMnu;
+ Event.m_EventType =
+ kEplEventTypeHeartbeat;
+ Event.m_uiSize =
+ sizeof(HeartbeatEvent);
+ Event.m_pArg = &HeartbeatEvent;
+ } else { // CN shall be deleted softly
+ Event.m_EventSink =
+ kEplEventSinkDllkCal;
+ Event.m_EventType =
+ kEplEventTypeDllkSoftDelNode;
+ Event.m_uiSize =
+ sizeof(unsigned int);
+ Event.m_pArg =
+ &pIntNodeInfo->m_uiNodeId;
+ }
+ Event.m_NetTime = FrameInfo.m_NetTime;
+ Ret = EplEventkPost(&Event);
+
+ // save current NMT state of CN in internal node structure
+ pIntNodeInfo->m_NmtState =
+ HeartbeatEvent.m_NmtState;
+ }
+ }
#endif
- // inform PDO module
+ // inform PDO module
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- if ((NmtState != kEplNmtCsPreOperational2)
- && (NmtState != kEplNmtMsPreOperational2))
- { // inform PDO module only in ReadyToOp and Op
- // compare real frame size and PDO size?
- if (((unsigned int) (AmiGetWordFromLe(&pFrame->m_Data.m_Pres.m_le_wSize) + 24)
- > FrameInfo.m_uiFrameSize)
+ if ((NmtState != kEplNmtCsPreOperational2)
+ && (NmtState != kEplNmtMsPreOperational2)) { // inform PDO module only in ReadyToOp and Op
+ // compare real frame size and PDO size?
+ if (((unsigned
+ int)(AmiGetWordFromLe(&pFrame->m_Data.
+ m_Pres.m_le_wSize) +
+ 24)
+ > FrameInfo.m_uiFrameSize)
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- || (AmiGetWordFromLe(&pFrame->m_Data.m_Pres.m_le_wSize) > pIntNodeInfo->m_wPresPayloadLimit)
+ ||
+ (AmiGetWordFromLe
+ (&pFrame->m_Data.m_Pres.m_le_wSize) >
+ pIntNodeInfo->m_wPresPayloadLimit)
#endif
- )
- { // format error
- tEplErrorHandlerkEvent DllEvent;
-
- DllEvent.m_ulDllErrorEvents = EPL_DLL_ERR_INVALID_FORMAT;
- DllEvent.m_uiNodeId = uiNodeId;
- DllEvent.m_NmtState = NmtState;
- Event.m_EventSink = kEplEventSinkErrk;
- Event.m_EventType = kEplEventTypeDllError;
- Event.m_NetTime = FrameInfo.m_NetTime;
- Event.m_uiSize = sizeof (DllEvent);
- Event.m_pArg = &DllEvent;
- Ret = EplEventkPost(&Event);
- break;
- }
- if ((NmtState != kEplNmtCsOperational)
- && (NmtState != kEplNmtMsOperational))
- {
- // reset RD flag and all other flags, but that does not matter, because they were processed above
- AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bFlag1, 0);
- }
- Ret = EplPdokCbPdoReceived(&FrameInfo);
- }
+ ) { // format error
+ tEplErrorHandlerkEvent DllEvent;
+
+ DllEvent.m_ulDllErrorEvents =
+ EPL_DLL_ERR_INVALID_FORMAT;
+ DllEvent.m_uiNodeId = uiNodeId;
+ DllEvent.m_NmtState = NmtState;
+ Event.m_EventSink = kEplEventSinkErrk;
+ Event.m_EventType =
+ kEplEventTypeDllError;
+ Event.m_NetTime = FrameInfo.m_NetTime;
+ Event.m_uiSize = sizeof(DllEvent);
+ Event.m_pArg = &DllEvent;
+ Ret = EplEventkPost(&Event);
+ break;
+ }
+ if ((NmtState != kEplNmtCsOperational)
+ && (NmtState != kEplNmtMsOperational)) {
+ // reset RD flag and all other flags, but that does not matter, because they were processed above
+ AmiSetByteToLe(&pFrame->m_Data.m_Pres.
+ m_le_bFlag1, 0);
+ }
+ Ret = EplPdokCbPdoReceived(&FrameInfo);
+ }
#endif
- break;
- }
+ break;
+ }
- case kEplMsgTypeSoc:
- {
- // SoC frame
- NmtEvent = kEplNmtEventDllCeSoc;
-
- if (NmtState >= kEplNmtMsNotActive)
- { // MN is active -> wrong msg type
- break;
- }
+ case kEplMsgTypeSoc:
+ {
+ // SoC frame
+ NmtEvent = kEplNmtEventDllCeSoc;
+ if (NmtState >= kEplNmtMsNotActive) { // MN is active -> wrong msg type
+ break;
+ }
#if EPL_DLL_PRES_READY_AFTER_SOC != FALSE
- // post PRes to transmit FIFO of the ethernet controller, but don't start
- // transmission over bus
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
- // Does PRes exist?
- if (pTxBuffer->m_pbBuffer != NULL)
- { // PRes does exist
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
- // update frame (NMT state, RD, RS, PR, MS, EN flags)
- if (NmtState < kEplNmtCsPreOperational2)
- { // NMT state is not PreOp2, ReadyToOp or Op
- // fake NMT state PreOp2, because PRes will be sent only in PreOp2 or greater
- NmtState = kEplNmtCsPreOperational2;
- }
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- if (NmtState != kEplNmtCsOperational)
- { // mark PDO as invalid in NMT state Op
- // $$$ reset only RD flag; set other flags appropriately
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1, 0);
- }
- // $$$ make function that updates Pres, StatusRes
- // mark PRes frame as ready for transmission
- Ret = EdrvTxMsgReady(pTxBuffer);
- }
+ // post PRes to transmit FIFO of the ethernet controller, but don't start
+ // transmission over bus
+ pTxBuffer =
+ &EplDllkInstance_g.
+ m_pTxBuffer[EPL_DLLK_TXFRAME_PRES];
+ // Does PRes exist?
+ if (pTxBuffer->m_pbBuffer != NULL) { // PRes does exist
+ pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
+ // update frame (NMT state, RD, RS, PR, MS, EN flags)
+ if (NmtState < kEplNmtCsPreOperational2) { // NMT state is not PreOp2, ReadyToOp or Op
+ // fake NMT state PreOp2, because PRes will be sent only in PreOp2 or greater
+ NmtState = kEplNmtCsPreOperational2;
+ }
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bFlag2,
+ EplDllkInstance_g.m_bFlag2);
+ if (NmtState != kEplNmtCsOperational) { // mark PDO as invalid in NMT state Op
+ // $$$ reset only RD flag; set other flags appropriately
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.
+ m_le_bFlag1, 0);
+ }
+ // $$$ make function that updates Pres, StatusRes
+ // mark PRes frame as ready for transmission
+ Ret = EdrvTxMsgReady(pTxBuffer);
+ }
#endif
- if (NmtState >= kEplNmtCsPreOperational2)
- { // SoC frames only in PreOp2, ReadyToOp and Op
- // trigger synchronous task
- Event.m_EventSink = kEplEventSinkSync;
- Event.m_EventType = kEplEventTypeSync;
- Event.m_uiSize = 0;
- Ret = EplEventkPost(&Event);
-
- // update cycle counter
- if (EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt > 0)
- { // multiplexed cycle active
- EplDllkInstance_g.m_uiCycleCount = (EplDllkInstance_g.m_uiCycleCount + 1) % EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt;
- }
- }
-
- // reprogram timer
+ if (NmtState >= kEplNmtCsPreOperational2) { // SoC frames only in PreOp2, ReadyToOp and Op
+ // trigger synchronous task
+ Event.m_EventSink = kEplEventSinkSync;
+ Event.m_EventType = kEplEventTypeSync;
+ Event.m_uiSize = 0;
+ Ret = EplEventkPost(&Event);
+
+ // update cycle counter
+ if (EplDllkInstance_g.m_DllConfigParam.m_uiMultiplCycleCnt > 0) { // multiplexed cycle active
+ EplDllkInstance_g.m_uiCycleCount =
+ (EplDllkInstance_g.m_uiCycleCount +
+ 1) %
+ EplDllkInstance_g.m_DllConfigParam.
+ m_uiMultiplCycleCnt;
+ }
+ }
+ // reprogram timer
#if EPL_TIMER_USE_HIGHRES != FALSE
- if (EplDllkInstance_g.m_ullFrameTimeout != 0)
- {
- Ret = EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.m_TimerHdlCycle, EplDllkInstance_g.m_ullFrameTimeout, EplDllkCbCnTimer, 0L, FALSE);
- }
+ if (EplDllkInstance_g.m_ullFrameTimeout != 0) {
+ Ret =
+ EplTimerHighReskModifyTimerNs
+ (&EplDllkInstance_g.m_TimerHdlCycle,
+ EplDllkInstance_g.m_ullFrameTimeout,
+ EplDllkCbCnTimer, 0L, FALSE);
+ }
#endif
- break;
- }
-
- case kEplMsgTypeSoa:
- {
- // SoA frame
- NmtEvent = kEplNmtEventDllCeSoa;
-
- if (NmtState >= kEplNmtMsNotActive)
- { // MN is active -> wrong msg type
- break;
- }
-
- pTxFrame = NULL;
-
- if ((NmtState & EPL_NMT_SUPERSTATE_MASK) != EPL_NMT_CS_EPLMODE)
- { // do not respond, if NMT state is < PreOp1 (i.e. not EPL_MODE)
- break;
- }
-
- // check TargetNodeId
- uiNodeId = AmiGetByteFromLe(&pFrame->m_Data.m_Soa.m_le_bReqServiceTarget);
- if (uiNodeId == EplDllkInstance_g.m_DllConfigParam.m_uiNodeId)
- { // local node is the target of the current request
-
- // check ServiceId
- ReqServiceId = (tEplDllReqServiceId) AmiGetByteFromLe(&pFrame->m_Data.m_Soa.m_le_bReqServiceId);
- if (ReqServiceId == kEplDllReqServiceStatus)
- { // StatusRequest
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES].m_pbBuffer != NULL)
- { // StatusRes does exist
-
- pTxFrame = (tEplFrame *) EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES].m_pbBuffer;
- // update StatusRes frame (NMT state, EN, EC, RS, PR flags)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bFlag1, EplDllkInstance_g.m_bFlag1);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- // send StatusRes
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- TGT_DBG_SIGNAL_TRACE_POINT(8);
-
- // update error signaling
- bFlag1 = AmiGetByteFromLe(&pFrame->m_Data.m_Soa.m_le_bFlag1);
- if (((bFlag1 ^ EplDllkInstance_g.m_bMnFlag1) & EPL_FRAME_FLAG1_ER) != 0)
- { // exception reset flag was changed by MN
- // assume same state for EC in next cycle (clear all other bits)
- if ((bFlag1 & EPL_FRAME_FLAG1_ER) != 0)
- {
- // set EC and reset rest
- EplDllkInstance_g.m_bFlag1 = EPL_FRAME_FLAG1_EC;
- }
- else
- {
- // reset complete flag 1 (including EC and EN)
- EplDllkInstance_g.m_bFlag1 = 0;
- }
- }
- // save flag 1 from MN for Status request response cycle
- EplDllkInstance_g.m_bMnFlag1 = bFlag1;
- }
- }
- else if (ReqServiceId == kEplDllReqServiceIdent)
- { // IdentRequest
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES].m_pbBuffer != NULL)
- { // IdentRes does exist
- pTxFrame = (tEplFrame *) EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES].m_pbBuffer;
- // update IdentRes frame (NMT state, RS, PR flags)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- // send IdentRes
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- TGT_DBG_SIGNAL_TRACE_POINT(7);
- }
- }
- else if (ReqServiceId == kEplDllReqServiceNmtRequest)
- { // NmtRequest
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_pbBuffer != NULL)
- { // NmtRequest does exist
- // check if frame is not empty and not being filled
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_FILLING)
- {
- /*if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen < EPL_DLLK_BUFLEN_MIN)
- { // pad frame
- EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen = EPL_DLLK_BUFLEN_MIN;
- }*/
- // memorize transmission
- pTxFrame = (tEplFrame*)1;
- // send NmtRequest
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
-
- }
- }
-
- }
- else if (ReqServiceId == kEplDllReqServiceUnspecified)
- { // unspecified invite
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_pbBuffer != NULL)
- { // non-EPL frame does exist
- // check if frame is not empty and not being filled
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_uiTxMsgLen > EPL_DLLK_BUFLEN_FILLING)
- {
- /*if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen < EPL_DLLK_BUFLEN_MIN)
- { // pad frame
- EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen = EPL_DLLK_BUFLEN_MIN;
- }*/
- // memorize transmission
- pTxFrame = (tEplFrame*)1;
- // send non-EPL frame
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
-
- }
- }
-
- }
- else if (ReqServiceId == kEplDllReqServiceNo)
- { // no async service requested -> do nothing
- }
- }
-
+ break;
+ }
+
+ case kEplMsgTypeSoa:
+ {
+ // SoA frame
+ NmtEvent = kEplNmtEventDllCeSoa;
+
+ if (NmtState >= kEplNmtMsNotActive) { // MN is active -> wrong msg type
+ break;
+ }
+
+ pTxFrame = NULL;
+
+ if ((NmtState & EPL_NMT_SUPERSTATE_MASK) != EPL_NMT_CS_EPLMODE) { // do not respond, if NMT state is < PreOp1 (i.e. not EPL_MODE)
+ break;
+ }
+ // check TargetNodeId
+ uiNodeId =
+ AmiGetByteFromLe(&pFrame->m_Data.m_Soa.
+ m_le_bReqServiceTarget);
+ if (uiNodeId == EplDllkInstance_g.m_DllConfigParam.m_uiNodeId) { // local node is the target of the current request
+
+ // check ServiceId
+ ReqServiceId =
+ (tEplDllReqServiceId)
+ AmiGetByteFromLe(&pFrame->m_Data.m_Soa.
+ m_le_bReqServiceId);
+ if (ReqServiceId == kEplDllReqServiceStatus) { // StatusRequest
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES].m_pbBuffer != NULL) { // StatusRes does exist
+
+ pTxFrame =
+ (tEplFrame *)
+ EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_STATUSRES].
+ m_pbBuffer;
+ // update StatusRes frame (NMT state, EN, EC, RS, PR flags)
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Asnd.
+ m_Payload.
+ m_StatusResponse.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Asnd.
+ m_Payload.
+ m_StatusResponse.
+ m_le_bFlag1,
+ EplDllkInstance_g.
+ m_bFlag1);
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Asnd.
+ m_Payload.
+ m_StatusResponse.
+ m_le_bFlag2,
+ EplDllkInstance_g.
+ m_bFlag2);
+ // send StatusRes
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_STATUSRES]);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ TGT_DBG_SIGNAL_TRACE_POINT(8);
+
+ // update error signaling
+ bFlag1 =
+ AmiGetByteFromLe(&pFrame->
+ m_Data.
+ m_Soa.
+ m_le_bFlag1);
+ if (((bFlag1 ^ EplDllkInstance_g.m_bMnFlag1) & EPL_FRAME_FLAG1_ER) != 0) { // exception reset flag was changed by MN
+ // assume same state for EC in next cycle (clear all other bits)
+ if ((bFlag1 &
+ EPL_FRAME_FLAG1_ER)
+ != 0) {
+ // set EC and reset rest
+ EplDllkInstance_g.
+ m_bFlag1 =
+ EPL_FRAME_FLAG1_EC;
+ } else {
+ // reset complete flag 1 (including EC and EN)
+ EplDllkInstance_g.
+ m_bFlag1 =
+ 0;
+ }
+ }
+ // save flag 1 from MN for Status request response cycle
+ EplDllkInstance_g.m_bMnFlag1 =
+ bFlag1;
+ }
+ } else if (ReqServiceId == kEplDllReqServiceIdent) { // IdentRequest
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES].m_pbBuffer != NULL) { // IdentRes does exist
+ pTxFrame =
+ (tEplFrame *)
+ EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_IDENTRES].
+ m_pbBuffer;
+ // update IdentRes frame (NMT state, RS, PR flags)
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Asnd.
+ m_Payload.
+ m_IdentResponse.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->
+ m_Data.m_Asnd.
+ m_Payload.
+ m_IdentResponse.
+ m_le_bFlag2,
+ EplDllkInstance_g.
+ m_bFlag2);
+ // send IdentRes
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_IDENTRES]);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ TGT_DBG_SIGNAL_TRACE_POINT(7);
+ }
+ } else if (ReqServiceId == kEplDllReqServiceNmtRequest) { // NmtRequest
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_pbBuffer != NULL) { // NmtRequest does exist
+ // check if frame is not empty and not being filled
+ if (EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ].
+ m_uiTxMsgLen >
+ EPL_DLLK_BUFLEN_FILLING) {
+ /*if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen < EPL_DLLK_BUFLEN_MIN)
+ { // pad frame
+ EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen = EPL_DLLK_BUFLEN_MIN;
+ } */
+ // memorize transmission
+ pTxFrame =
+ (tEplFrame *) 1;
+ // send NmtRequest
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ]);
+ if (Ret !=
+ kEplSuccessful) {
+ goto Exit;
+ }
+
+ }
+ }
+
+ } else if (ReqServiceId == kEplDllReqServiceUnspecified) { // unspecified invite
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_pbBuffer != NULL) { // non-EPL frame does exist
+ // check if frame is not empty and not being filled
+ if (EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NONEPL].
+ m_uiTxMsgLen >
+ EPL_DLLK_BUFLEN_FILLING) {
+ /*if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen < EPL_DLLK_BUFLEN_MIN)
+ { // pad frame
+ EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen = EPL_DLLK_BUFLEN_MIN;
+ } */
+ // memorize transmission
+ pTxFrame =
+ (tEplFrame *) 1;
+ // send non-EPL frame
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NONEPL]);
+ if (Ret !=
+ kEplSuccessful) {
+ goto Exit;
+ }
+
+ }
+ }
+
+ } else if (ReqServiceId == kEplDllReqServiceNo) { // no async service requested -> do nothing
+ }
+ }
#if EPL_DLL_PRES_READY_AFTER_SOA != FALSE
- if (pTxFrame == NULL)
- { // signal process function readiness of PRes frame
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkPresReady;
- Event.m_uiSize = 0;
- Event.m_pArg = NULL;
- Ret = EplEventkPost(&Event);
- }
+ if (pTxFrame == NULL) { // signal process function readiness of PRes frame
+ Event.m_EventSink = kEplEventSinkDllk;
+ Event.m_EventType = kEplEventTypeDllkPresReady;
+ Event.m_uiSize = 0;
+ Event.m_pArg = NULL;
+ Ret = EplEventkPost(&Event);
+ }
#endif
- // inform PDO module
+ // inform PDO module
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
// Ret = EplPdokCbSoa(&FrameInfo);
#endif
- // $$$ put SrcNodeId, NMT state and NetTime as HeartbeatEvent into eventqueue
+ // $$$ put SrcNodeId, NMT state and NetTime as HeartbeatEvent into eventqueue
- // $$$ inform emergency protocol handling about flags
- break;
- }
+ // $$$ inform emergency protocol handling about flags
+ break;
+ }
- case kEplMsgTypeAsnd:
- {
- // ASnd frame
- NmtEvent = kEplNmtEventDllCeAsnd;
+ case kEplMsgTypeAsnd:
+ {
+ // ASnd frame
+ NmtEvent = kEplNmtEventDllCeAsnd;
- // ASnd service registered?
- uiAsndServiceId = (unsigned int) AmiGetByteFromLe(&pFrame->m_Data.m_Asnd.m_le_bServiceId);
+ // ASnd service registered?
+ uiAsndServiceId =
+ (unsigned int)AmiGetByteFromLe(&pFrame->m_Data.
+ m_Asnd.
+ m_le_bServiceId);
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if ((EplDllkInstance_g.m_DllState >= kEplDllMsNonCyclic)
- && ((((tEplDllAsndServiceId) uiAsndServiceId) == kEplDllAsndStatusResponse)
- || (((tEplDllAsndServiceId) uiAsndServiceId) == kEplDllAsndIdentResponse)))
- { // StatusRes or IdentRes received
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
- if ((EplDllkInstance_g.m_LastReqServiceId == ((tEplDllReqServiceId) uiAsndServiceId))
- && (uiNodeId == EplDllkInstance_g.m_uiLastTargetNodeId))
- { // mark request as responded
- EplDllkInstance_g.m_LastReqServiceId = kEplDllReqServiceNo;
- }
- if (((tEplDllAsndServiceId) uiAsndServiceId) == kEplDllAsndIdentResponse)
- { // memorize MAC address of CN for PReq
- tEplDllkNodeInfo* pIntNodeInfo;
-
- pIntNodeInfo = EplDllkGetNodeInfo(uiNodeId);
- if (pIntNodeInfo == NULL)
- { // no node info structure available
- Ret = kEplDllNoNodeInfo;
- }
- else
- {
- EPL_MEMCPY(pIntNodeInfo->m_be_abMacAddr, pFrame->m_be_abSrcMac, 6);
- }
- }
-
- // forward Flag2 to asynchronous scheduler
- bFlag1 = AmiGetByteFromLe(&pFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bFlag2);
- Ret = EplDllkCalAsyncSetPendingRequests(uiNodeId,
- ((tEplDllAsyncReqPriority) ((bFlag1 & EPL_FRAME_FLAG2_PR) >> EPL_FRAME_FLAG2_PR_SHIFT)),
- (bFlag1 & EPL_FRAME_FLAG2_RS));
- }
+ if ((EplDllkInstance_g.m_DllState >= kEplDllMsNonCyclic)
+ &&
+ ((((tEplDllAsndServiceId) uiAsndServiceId) ==
+ kEplDllAsndStatusResponse)
+ || (((tEplDllAsndServiceId) uiAsndServiceId) == kEplDllAsndIdentResponse))) { // StatusRes or IdentRes received
+ uiNodeId =
+ AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
+ if ((EplDllkInstance_g.m_LastReqServiceId ==
+ ((tEplDllReqServiceId) uiAsndServiceId))
+ && (uiNodeId == EplDllkInstance_g.m_uiLastTargetNodeId)) { // mark request as responded
+ EplDllkInstance_g.m_LastReqServiceId =
+ kEplDllReqServiceNo;
+ }
+ if (((tEplDllAsndServiceId) uiAsndServiceId) == kEplDllAsndIdentResponse) { // memorize MAC address of CN for PReq
+ tEplDllkNodeInfo *pIntNodeInfo;
+
+ pIntNodeInfo =
+ EplDllkGetNodeInfo(uiNodeId);
+ if (pIntNodeInfo == NULL) { // no node info structure available
+ Ret = kEplDllNoNodeInfo;
+ } else {
+ EPL_MEMCPY(pIntNodeInfo->
+ m_be_abMacAddr,
+ pFrame->
+ m_be_abSrcMac, 6);
+ }
+ }
+ // forward Flag2 to asynchronous scheduler
+ bFlag1 =
+ AmiGetByteFromLe(&pFrame->m_Data.m_Asnd.
+ m_Payload.m_StatusResponse.
+ m_le_bFlag2);
+ Ret =
+ EplDllkCalAsyncSetPendingRequests(uiNodeId,
+ ((tEplDllAsyncReqPriority) ((bFlag1 & EPL_FRAME_FLAG2_PR) >> EPL_FRAME_FLAG2_PR_SHIFT)), (bFlag1 & EPL_FRAME_FLAG2_RS));
+ }
#endif
- if (uiAsndServiceId < EPL_DLL_MAX_ASND_SERVICE_ID)
- { // ASnd service ID is valid
- if (EplDllkInstance_g.m_aAsndFilter[uiAsndServiceId] == kEplDllAsndFilterAny)
- { // ASnd service ID is registered
- // forward frame via async receive FIFO to userspace
- Ret = EplDllkCalAsyncFrameReceived(&FrameInfo);
- }
- else if (EplDllkInstance_g.m_aAsndFilter[uiAsndServiceId] == kEplDllAsndFilterLocal)
- { // ASnd service ID is registered, but only local node ID or broadcasts
- // shall be forwarded
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bDstNodeId);
- if ((uiNodeId == EplDllkInstance_g.m_DllConfigParam.m_uiNodeId)
- || (uiNodeId == EPL_C_ADR_BROADCAST))
- { // ASnd frame is intended for us
- // forward frame via async receive FIFO to userspace
- Ret = EplDllkCalAsyncFrameReceived(&FrameInfo);
- }
- }
- }
- break;
- }
-
- default:
- {
- break;
- }
- }
-
- if (NmtEvent != kEplNmtEventNoEvent)
- { // event for DLL and NMT state machine generated
- Ret = EplDllkChangeState(NmtEvent, NmtState);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
-
- if ((NmtEvent != kEplNmtEventDllCeAsnd)
- && ((NmtState <= kEplNmtCsPreOperational1) || (NmtEvent != kEplNmtEventDllCePres)))
- { // NMT state machine is not interested in ASnd frames and PRes frames when not CsNotActive or CsPreOp1
- // inform NMT module
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType = kEplEventTypeNmtEvent;
- Event.m_uiSize = sizeof (NmtEvent);
- Event.m_pArg = &NmtEvent;
- Ret = EplEventkPost(&Event);
- }
- }
-
-Exit:
- if (Ret != kEplSuccessful)
- {
- DWORD dwArg;
-
- BENCHMARK_MOD_02_TOGGLE(9);
-
- dwArg = EplDllkInstance_g.m_DllState | (NmtEvent << 8);
-
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret,
- sizeof(dwArg),
- &dwArg);
- }
- BENCHMARK_MOD_02_RESET(3);
- return;
+ if (uiAsndServiceId < EPL_DLL_MAX_ASND_SERVICE_ID) { // ASnd service ID is valid
+ if (EplDllkInstance_g.m_aAsndFilter[uiAsndServiceId] == kEplDllAsndFilterAny) { // ASnd service ID is registered
+ // forward frame via async receive FIFO to userspace
+ Ret =
+ EplDllkCalAsyncFrameReceived
+ (&FrameInfo);
+ } else if (EplDllkInstance_g.m_aAsndFilter[uiAsndServiceId] == kEplDllAsndFilterLocal) { // ASnd service ID is registered, but only local node ID or broadcasts
+ // shall be forwarded
+ uiNodeId =
+ AmiGetByteFromLe(&pFrame->
+ m_le_bDstNodeId);
+ if ((uiNodeId ==
+ EplDllkInstance_g.m_DllConfigParam.
+ m_uiNodeId)
+ || (uiNodeId == EPL_C_ADR_BROADCAST)) { // ASnd frame is intended for us
+ // forward frame via async receive FIFO to userspace
+ Ret =
+ EplDllkCalAsyncFrameReceived
+ (&FrameInfo);
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+
+ if (NmtEvent != kEplNmtEventNoEvent) { // event for DLL and NMT state machine generated
+ Ret = EplDllkChangeState(NmtEvent, NmtState);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+
+ if ((NmtEvent != kEplNmtEventDllCeAsnd)
+ && ((NmtState <= kEplNmtCsPreOperational1) || (NmtEvent != kEplNmtEventDllCePres))) { // NMT state machine is not interested in ASnd frames and PRes frames when not CsNotActive or CsPreOp1
+ // inform NMT module
+ Event.m_EventSink = kEplEventSinkNmtk;
+ Event.m_EventType = kEplEventTypeNmtEvent;
+ Event.m_uiSize = sizeof(NmtEvent);
+ Event.m_pArg = &NmtEvent;
+ Ret = EplEventkPost(&Event);
+ }
+ }
+
+ Exit:
+ if (Ret != kEplSuccessful) {
+ DWORD dwArg;
+
+ BENCHMARK_MOD_02_TOGGLE(9);
+
+ dwArg = EplDllkInstance_g.m_DllState | (NmtEvent << 8);
+
+ // Error event for API layer
+ Ret = EplEventkPostError(kEplEventSourceDllk,
+ Ret, sizeof(dwArg), &dwArg);
+ }
+ BENCHMARK_MOD_02_RESET(3);
+ return;
}
//---------------------------------------------------------------------------
@@ -2947,235 +3187,282 @@ Exit:
static void EplDllkCbFrameTransmitted(tEdrvTxBuffer * pTxBuffer_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplEvent Event;
-tEplDllAsyncReqPriority Priority;
-tEplNmtState NmtState;
+ tEplKernel Ret = kEplSuccessful;
+ tEplEvent Event;
+ tEplDllAsyncReqPriority Priority;
+ tEplNmtState NmtState;
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0) \
&& (EPL_DLL_PRES_READY_AFTER_SOC == FALSE)
-tEplFrameInfo FrameInfo;
+ tEplFrameInfo FrameInfo;
#endif
- NmtState = EplNmtkGetNmtState();
-
- if (NmtState <= kEplNmtGsResetConfiguration)
- {
- goto Exit;
- }
-
- if ((pTxBuffer_p - EplDllkInstance_g.m_pTxBuffer) == EPL_DLLK_TXFRAME_NMTREQ)
- { // frame from NMT request FIFO sent
- // mark Tx-buffer as empty
- pTxBuffer_p->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
-
- // post event to DLL
- Priority = kEplDllAsyncReqPrioNmt;
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkFillTx;
- EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
- Event.m_pArg = &Priority;
- Event.m_uiSize = sizeof(Priority);
- Ret = EplEventkPost(&Event);
- }
- else if ((pTxBuffer_p - EplDllkInstance_g.m_pTxBuffer) == EPL_DLLK_TXFRAME_NONEPL)
- { // frame from generic priority FIFO sent
- // mark Tx-buffer as empty
- pTxBuffer_p->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
-
- // post event to DLL
- Priority = kEplDllAsyncReqPrioGeneric;
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkFillTx;
- EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
- Event.m_pArg = &Priority;
- Event.m_uiSize = sizeof(Priority);
- Ret = EplEventkPost(&Event);
- }
+ NmtState = EplNmtkGetNmtState();
+
+ if (NmtState <= kEplNmtGsResetConfiguration) {
+ goto Exit;
+ }
+
+ if ((pTxBuffer_p - EplDllkInstance_g.m_pTxBuffer) == EPL_DLLK_TXFRAME_NMTREQ) { // frame from NMT request FIFO sent
+ // mark Tx-buffer as empty
+ pTxBuffer_p->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
+
+ // post event to DLL
+ Priority = kEplDllAsyncReqPrioNmt;
+ Event.m_EventSink = kEplEventSinkDllk;
+ Event.m_EventType = kEplEventTypeDllkFillTx;
+ EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
+ Event.m_pArg = &Priority;
+ Event.m_uiSize = sizeof(Priority);
+ Ret = EplEventkPost(&Event);
+ } else if ((pTxBuffer_p - EplDllkInstance_g.m_pTxBuffer) == EPL_DLLK_TXFRAME_NONEPL) { // frame from generic priority FIFO sent
+ // mark Tx-buffer as empty
+ pTxBuffer_p->m_uiTxMsgLen = EPL_DLLK_BUFLEN_EMPTY;
+
+ // post event to DLL
+ Priority = kEplDllAsyncReqPrioGeneric;
+ Event.m_EventSink = kEplEventSinkDllk;
+ Event.m_EventType = kEplEventTypeDllkFillTx;
+ EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
+ Event.m_pArg = &Priority;
+ Event.m_uiSize = sizeof(Priority);
+ Ret = EplEventkPost(&Event);
+ }
#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0) \
&& (EPL_DLL_PRES_READY_AFTER_SOC == FALSE)) \
|| (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- else if ((pTxBuffer_p->m_EplMsgType == kEplMsgTypePreq)
- || (pTxBuffer_p->m_EplMsgType == kEplMsgTypePres))
- { // PRes resp. PReq frame sent
+ else if ((pTxBuffer_p->m_EplMsgType == kEplMsgTypePreq)
+ || (pTxBuffer_p->m_EplMsgType == kEplMsgTypePres)) { // PRes resp. PReq frame sent
- #if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0) \
+#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0) \
&& (EPL_DLL_PRES_READY_AFTER_SOC == FALSE))
- {
- // inform PDO module
- FrameInfo.m_pFrame = (tEplFrame *) pTxBuffer_p->m_pbBuffer;
- FrameInfo.m_uiFrameSize = pTxBuffer_p->m_uiMaxBufferLen;
- Ret = EplPdokCbPdoTransmitted(&FrameInfo);
- }
- #endif
-
- #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- {
- // if own Pres on MN, trigger SoA
- if ((NmtState >= kEplNmtMsPreOperational2)
- && (pTxBuffer_p == &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES]))
- {
- Ret = EplDllkChangeState(kEplNmtEventDllMeSoaTrig, NmtState);
- }
- }
- #endif
-
- #if EPL_DLL_PRES_READY_AFTER_SOA != FALSE
- goto Exit;
- #endif
- }
+ {
+ // inform PDO module
+ FrameInfo.m_pFrame =
+ (tEplFrame *) pTxBuffer_p->m_pbBuffer;
+ FrameInfo.m_uiFrameSize = pTxBuffer_p->m_uiMaxBufferLen;
+ Ret = EplPdokCbPdoTransmitted(&FrameInfo);
+ }
#endif
+
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- else if (pTxBuffer_p->m_EplMsgType == kEplMsgTypeSoa)
- { // SoA frame sent
- tEplNmtEvent NmtEvent = kEplNmtEventDllMeSoaSent;
+ {
+ // if own Pres on MN, trigger SoA
+ if ((NmtState >= kEplNmtMsPreOperational2)
+ && (pTxBuffer_p ==
+ &EplDllkInstance_g.
+ m_pTxBuffer[EPL_DLLK_TXFRAME_PRES])) {
+ Ret =
+ EplDllkChangeState(kEplNmtEventDllMeSoaTrig,
+ NmtState);
+ }
+ }
+#endif
- // check if we are invited
- if (EplDllkInstance_g.m_uiLastTargetNodeId == EplDllkInstance_g.m_DllConfigParam.m_uiNodeId)
- {
- tEplFrame *pTxFrame;
-
- if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceStatus)
- { // StatusRequest
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES].m_pbBuffer != NULL)
- { // StatusRes does exist
-
- pTxFrame = (tEplFrame *) EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES].m_pbBuffer;
- // update StatusRes frame (NMT state, EN, EC, RS, PR flags)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bFlag1, EplDllkInstance_g.m_bFlag1);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- // send StatusRes
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- TGT_DBG_SIGNAL_TRACE_POINT(8);
-
- }
- }
- else if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceIdent)
- { // IdentRequest
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES].m_pbBuffer != NULL)
- { // IdentRes does exist
- pTxFrame = (tEplFrame *) EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES].m_pbBuffer;
- // update IdentRes frame (NMT state, RS, PR flags)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_bNmtStatus, (BYTE) NmtState);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse.m_le_bFlag2, EplDllkInstance_g.m_bFlag2);
- // send IdentRes
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- TGT_DBG_SIGNAL_TRACE_POINT(7);
- }
- }
- else if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceNmtRequest)
- { // NmtRequest
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_pbBuffer != NULL)
- { // NmtRequest does exist
- // check if frame is not empty and not being filled
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen > EPL_DLLK_BUFLEN_FILLING)
- {
- // check if this frame is a NMT command,
- // then forward this frame back to NmtMnu module,
- // because it needs the time, when this frame is
- // actually sent, to start the timer for monitoring
- // the NMT state change.
-
- pTxFrame = (tEplFrame *) EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_pbBuffer;
- if ((AmiGetByteFromLe(&pTxFrame->m_le_bMessageType)
- == (BYTE) kEplMsgTypeAsnd)
- && (AmiGetByteFromLe(&pTxFrame->m_Data.m_Asnd.m_le_bServiceId)
- == (BYTE) kEplDllAsndNmtCommand))
- { // post event directly to NmtMnu module
- Event.m_EventSink = kEplEventSinkNmtMnu;
- Event.m_EventType = kEplEventTypeNmtMnuNmtCmdSent;
- Event.m_uiSize = EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_uiTxMsgLen;
- Event.m_pArg = pTxFrame;
- Ret = EplEventkPost(&Event);
-
- }
-
- // send NmtRequest
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
-
- }
- }
-
- }
- else if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceUnspecified)
- { // unspecified invite
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_pbBuffer != NULL)
- { // non-EPL frame does exist
- // check if frame is not empty and not being filled
- if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_uiTxMsgLen > EPL_DLLK_BUFLEN_FILLING)
- {
- // send non-EPL frame
- Ret = EdrvSendTxMsg(&EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL]);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
-
- }
- }
- }
- // ASnd frame was sent, remove the request
- EplDllkInstance_g.m_LastReqServiceId = kEplDllReqServiceNo;
- }
-
- // forward event to ErrorHandler and PDO module
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType = kEplEventTypeNmtEvent;
- Event.m_uiSize = sizeof (NmtEvent);
- Event.m_pArg = &NmtEvent;
- Ret = EplEventkPost(&Event);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- }
+#if EPL_DLL_PRES_READY_AFTER_SOA != FALSE
+ goto Exit;
+#endif
+ }
+#endif
+#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
+ else if (pTxBuffer_p->m_EplMsgType == kEplMsgTypeSoa) { // SoA frame sent
+ tEplNmtEvent NmtEvent = kEplNmtEventDllMeSoaSent;
+
+ // check if we are invited
+ if (EplDllkInstance_g.m_uiLastTargetNodeId ==
+ EplDllkInstance_g.m_DllConfigParam.m_uiNodeId) {
+ tEplFrame *pTxFrame;
+
+ if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceStatus) { // StatusRequest
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_STATUSRES].m_pbBuffer != NULL) { // StatusRes does exist
+
+ pTxFrame =
+ (tEplFrame *) EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_STATUSRES].
+ m_pbBuffer;
+ // update StatusRes frame (NMT state, EN, EC, RS, PR flags)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.
+ m_Payload.
+ m_StatusResponse.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.
+ m_Payload.
+ m_StatusResponse.
+ m_le_bFlag1,
+ EplDllkInstance_g.
+ m_bFlag1);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.
+ m_Payload.
+ m_StatusResponse.
+ m_le_bFlag2,
+ EplDllkInstance_g.
+ m_bFlag2);
+ // send StatusRes
+ Ret =
+ EdrvSendTxMsg(&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_STATUSRES]);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ TGT_DBG_SIGNAL_TRACE_POINT(8);
+
+ }
+ } else if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceIdent) { // IdentRequest
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_IDENTRES].m_pbBuffer != NULL) { // IdentRes does exist
+ pTxFrame =
+ (tEplFrame *) EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_IDENTRES].
+ m_pbBuffer;
+ // update IdentRes frame (NMT state, RS, PR flags)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.
+ m_Payload.
+ m_IdentResponse.
+ m_le_bNmtStatus,
+ (BYTE) NmtState);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Asnd.
+ m_Payload.
+ m_IdentResponse.
+ m_le_bFlag2,
+ EplDllkInstance_g.
+ m_bFlag2);
+ // send IdentRes
+ Ret =
+ EdrvSendTxMsg(&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_IDENTRES]);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ TGT_DBG_SIGNAL_TRACE_POINT(7);
+ }
+ } else if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceNmtRequest) { // NmtRequest
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NMTREQ].m_pbBuffer != NULL) { // NmtRequest does exist
+ // check if frame is not empty and not being filled
+ if (EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ].
+ m_uiTxMsgLen >
+ EPL_DLLK_BUFLEN_FILLING) {
+ // check if this frame is a NMT command,
+ // then forward this frame back to NmtMnu module,
+ // because it needs the time, when this frame is
+ // actually sent, to start the timer for monitoring
+ // the NMT state change.
+
+ pTxFrame =
+ (tEplFrame *)
+ EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ].
+ m_pbBuffer;
+ if ((AmiGetByteFromLe
+ (&pTxFrame->
+ m_le_bMessageType)
+ == (BYTE) kEplMsgTypeAsnd)
+ &&
+ (AmiGetByteFromLe
+ (&pTxFrame->m_Data.m_Asnd.
+ m_le_bServiceId)
+ == (BYTE) kEplDllAsndNmtCommand)) { // post event directly to NmtMnu module
+ Event.m_EventSink =
+ kEplEventSinkNmtMnu;
+ Event.m_EventType =
+ kEplEventTypeNmtMnuNmtCmdSent;
+ Event.m_uiSize =
+ EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ].
+ m_uiTxMsgLen;
+ Event.m_pArg = pTxFrame;
+ Ret =
+ EplEventkPost
+ (&Event);
+
+ }
+ // send NmtRequest
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NMTREQ]);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+
+ }
+ }
+
+ } else if (EplDllkInstance_g.m_LastReqServiceId == kEplDllReqServiceUnspecified) { // unspecified invite
+ if (EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_NONEPL].m_pbBuffer != NULL) { // non-EPL frame does exist
+ // check if frame is not empty and not being filled
+ if (EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NONEPL].
+ m_uiTxMsgLen >
+ EPL_DLLK_BUFLEN_FILLING) {
+ // send non-EPL frame
+ Ret =
+ EdrvSendTxMsg
+ (&EplDllkInstance_g.
+ m_pTxBuffer
+ [EPL_DLLK_TXFRAME_NONEPL]);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+
+ }
+ }
+ }
+ // ASnd frame was sent, remove the request
+ EplDllkInstance_g.m_LastReqServiceId =
+ kEplDllReqServiceNo;
+ }
+ // forward event to ErrorHandler and PDO module
+ Event.m_EventSink = kEplEventSinkNmtk;
+ Event.m_EventType = kEplEventTypeNmtEvent;
+ Event.m_uiSize = sizeof(NmtEvent);
+ Event.m_pArg = &NmtEvent;
+ Ret = EplEventkPost(&Event);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ }
#endif
#if EPL_DLL_PRES_READY_AFTER_SOA != FALSE
- else
- { // d.k.: Why that else? on CN it is entered on IdentRes and StatusRes
- goto Exit;
- }
+ else { // d.k.: Why that else? on CN it is entered on IdentRes and StatusRes
+ goto Exit;
+ }
- // signal process function readiness of PRes frame
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkPresReady;
- Event.m_uiSize = 0;
- Event.m_pArg = NULL;
- Ret = EplEventkPost(&Event);
+ // signal process function readiness of PRes frame
+ Event.m_EventSink = kEplEventSinkDllk;
+ Event.m_EventType = kEplEventTypeDllkPresReady;
+ Event.m_uiSize = 0;
+ Event.m_pArg = NULL;
+ Ret = EplEventkPost(&Event);
#endif
-Exit:
- if (Ret != kEplSuccessful)
- {
- DWORD dwArg;
+ Exit:
+ if (Ret != kEplSuccessful) {
+ DWORD dwArg;
- BENCHMARK_MOD_02_TOGGLE(9);
+ BENCHMARK_MOD_02_TOGGLE(9);
- dwArg = EplDllkInstance_g.m_DllState | (pTxBuffer_p->m_EplMsgType << 16);
+ dwArg =
+ EplDllkInstance_g.m_DllState | (pTxBuffer_p->
+ m_EplMsgType << 16);
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret,
- sizeof(dwArg),
- &dwArg);
- }
+ // Error event for API layer
+ Ret = EplEventkPostError(kEplEventSourceDllk,
+ Ret, sizeof(dwArg), &dwArg);
+ }
- return;
+ return;
}
//---------------------------------------------------------------------------
@@ -3194,53 +3481,53 @@ Exit:
//
//---------------------------------------------------------------------------
-static tEplKernel EplDllkCheckFrame(tEplFrame * pFrame_p, unsigned int uiFrameSize_p)
+static tEplKernel EplDllkCheckFrame(tEplFrame * pFrame_p,
+ unsigned int uiFrameSize_p)
{
-tEplMsgType MsgType;
-WORD wEtherType;
-
- // check frame
- if (pFrame_p != NULL)
- {
- // check SrcMAC
- if (AmiGetQword48FromBe(pFrame_p->m_be_abSrcMac) == 0)
- {
- // source MAC address
- EPL_MEMCPY(&pFrame_p->m_be_abSrcMac[0], &EplDllkInstance_g.m_be_abSrcMac[0], 6);
- }
-
- // check ethertype
- wEtherType = AmiGetWordFromBe(&pFrame_p->m_be_wEtherType);
- if (wEtherType == 0)
- {
- // assume EPL frame
- wEtherType = EPL_C_DLL_ETHERTYPE_EPL;
- AmiSetWordToBe(&pFrame_p->m_be_wEtherType, wEtherType);
- }
-
- if (wEtherType == EPL_C_DLL_ETHERTYPE_EPL)
- {
- // source node ID
- AmiSetByteToLe(&pFrame_p->m_le_bSrcNodeId, (BYTE) EplDllkInstance_g.m_DllConfigParam.m_uiNodeId);
-
- // check message type
- MsgType = AmiGetByteFromLe(&pFrame_p->m_le_bMessageType);
- if (MsgType == 0)
- {
- MsgType = kEplMsgTypeAsnd;
- AmiSetByteToLe(&pFrame_p->m_le_bMessageType, (BYTE) MsgType);
- }
-
- if (MsgType == kEplMsgTypeAsnd)
- {
- // destination MAC address
- AmiSetQword48ToBe(&pFrame_p->m_be_abDstMac[0], EPL_C_DLL_MULTICAST_ASND);
- }
-
- }
- }
-
- return kEplSuccessful;
+ tEplMsgType MsgType;
+ WORD wEtherType;
+
+ // check frame
+ if (pFrame_p != NULL) {
+ // check SrcMAC
+ if (AmiGetQword48FromBe(pFrame_p->m_be_abSrcMac) == 0) {
+ // source MAC address
+ EPL_MEMCPY(&pFrame_p->m_be_abSrcMac[0],
+ &EplDllkInstance_g.m_be_abSrcMac[0], 6);
+ }
+ // check ethertype
+ wEtherType = AmiGetWordFromBe(&pFrame_p->m_be_wEtherType);
+ if (wEtherType == 0) {
+ // assume EPL frame
+ wEtherType = EPL_C_DLL_ETHERTYPE_EPL;
+ AmiSetWordToBe(&pFrame_p->m_be_wEtherType, wEtherType);
+ }
+
+ if (wEtherType == EPL_C_DLL_ETHERTYPE_EPL) {
+ // source node ID
+ AmiSetByteToLe(&pFrame_p->m_le_bSrcNodeId,
+ (BYTE) EplDllkInstance_g.
+ m_DllConfigParam.m_uiNodeId);
+
+ // check message type
+ MsgType =
+ AmiGetByteFromLe(&pFrame_p->m_le_bMessageType);
+ if (MsgType == 0) {
+ MsgType = kEplMsgTypeAsnd;
+ AmiSetByteToLe(&pFrame_p->m_le_bMessageType,
+ (BYTE) MsgType);
+ }
+
+ if (MsgType == kEplMsgTypeAsnd) {
+ // destination MAC address
+ AmiSetQword48ToBe(&pFrame_p->m_be_abDstMac[0],
+ EPL_C_DLL_MULTICAST_ASND);
+ }
+
+ }
+ }
+
+ return kEplSuccessful;
}
//---------------------------------------------------------------------------
@@ -3259,34 +3546,30 @@ WORD wEtherType;
//---------------------------------------------------------------------------
#if EPL_TIMER_USE_HIGHRES != FALSE
-static tEplKernel PUBLIC EplDllkCbCnTimer(tEplTimerEventArg* pEventArg_p)
+static tEplKernel PUBLIC EplDllkCbCnTimer(tEplTimerEventArg * pEventArg_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplNmtState NmtState;
+ tEplKernel Ret = kEplSuccessful;
+ tEplNmtState NmtState;
#if EPL_TIMER_USE_HIGHRES != FALSE
- if (pEventArg_p->m_TimerHdl != EplDllkInstance_g.m_TimerHdlCycle)
- { // zombie callback
- // just exit
- goto Exit;
- }
+ if (pEventArg_p->m_TimerHdl != EplDllkInstance_g.m_TimerHdlCycle) { // zombie callback
+ // just exit
+ goto Exit;
+ }
#endif
- NmtState = EplNmtkGetNmtState();
+ NmtState = EplNmtkGetNmtState();
- if (NmtState <= kEplNmtGsResetConfiguration)
- {
- goto Exit;
- }
-
- Ret = EplDllkChangeState(kEplNmtEventDllCeFrameTimeout, NmtState);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
+ if (NmtState <= kEplNmtGsResetConfiguration) {
+ goto Exit;
+ }
- // 2008/10/15 d.k. reprogramming of timer not necessary,
- // because it will be programmed, when SoC is received.
+ Ret = EplDllkChangeState(kEplNmtEventDllCeFrameTimeout, NmtState);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ // 2008/10/15 d.k. reprogramming of timer not necessary,
+ // because it will be programmed, when SoC is received.
/*
// reprogram timer
#if EPL_TIMER_USE_HIGHRES != FALSE
@@ -3298,23 +3581,22 @@ tEplNmtState NmtState;
#endif
*/
-Exit:
- if (Ret != kEplSuccessful)
- {
- DWORD dwArg;
+ Exit:
+ if (Ret != kEplSuccessful) {
+ DWORD dwArg;
- BENCHMARK_MOD_02_TOGGLE(9);
+ BENCHMARK_MOD_02_TOGGLE(9);
- dwArg = EplDllkInstance_g.m_DllState | (kEplNmtEventDllCeFrameTimeout << 8);
+ dwArg =
+ EplDllkInstance_g.
+ m_DllState | (kEplNmtEventDllCeFrameTimeout << 8);
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret,
- sizeof(dwArg),
- &dwArg);
- }
+ // Error event for API layer
+ Ret = EplEventkPostError(kEplEventSourceDllk,
+ Ret, sizeof(dwArg), &dwArg);
+ }
- return Ret;
+ return Ret;
}
#endif
@@ -3335,48 +3617,44 @@ Exit:
//
//---------------------------------------------------------------------------
-static tEplKernel PUBLIC EplDllkCbMnTimerCycle(tEplTimerEventArg* pEventArg_p)
+static tEplKernel PUBLIC EplDllkCbMnTimerCycle(tEplTimerEventArg * pEventArg_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplNmtState NmtState;
+ tEplKernel Ret = kEplSuccessful;
+ tEplNmtState NmtState;
#if EPL_TIMER_USE_HIGHRES != FALSE
- if (pEventArg_p->m_TimerHdl != EplDllkInstance_g.m_TimerHdlCycle)
- { // zombie callback
- // just exit
- goto Exit;
- }
+ if (pEventArg_p->m_TimerHdl != EplDllkInstance_g.m_TimerHdlCycle) { // zombie callback
+ // just exit
+ goto Exit;
+ }
#endif
- NmtState = EplNmtkGetNmtState();
+ NmtState = EplNmtkGetNmtState();
- if (NmtState <= kEplNmtGsResetConfiguration)
- {
- goto Exit;
- }
+ if (NmtState <= kEplNmtGsResetConfiguration) {
+ goto Exit;
+ }
- Ret = EplDllkChangeState(kEplNmtEventDllMeSocTrig, NmtState);
+ Ret = EplDllkChangeState(kEplNmtEventDllMeSocTrig, NmtState);
-Exit:
- if (Ret != kEplSuccessful)
- {
- DWORD dwArg;
+ Exit:
+ if (Ret != kEplSuccessful) {
+ DWORD dwArg;
- BENCHMARK_MOD_02_TOGGLE(9);
+ BENCHMARK_MOD_02_TOGGLE(9);
- dwArg = EplDllkInstance_g.m_DllState | (kEplNmtEventDllMeSocTrig << 8);
+ dwArg =
+ EplDllkInstance_g.
+ m_DllState | (kEplNmtEventDllMeSocTrig << 8);
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret,
- sizeof(dwArg),
- &dwArg);
- }
+ // Error event for API layer
+ Ret = EplEventkPostError(kEplEventSourceDllk,
+ Ret, sizeof(dwArg), &dwArg);
+ }
- return Ret;
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkCbMnTimerResponse()
@@ -3392,48 +3670,45 @@ Exit:
//
//---------------------------------------------------------------------------
-static tEplKernel PUBLIC EplDllkCbMnTimerResponse(tEplTimerEventArg* pEventArg_p)
+static tEplKernel PUBLIC EplDllkCbMnTimerResponse(tEplTimerEventArg *
+ pEventArg_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEplNmtState NmtState;
+ tEplKernel Ret = kEplSuccessful;
+ tEplNmtState NmtState;
#if EPL_TIMER_USE_HIGHRES != FALSE
- if (pEventArg_p->m_TimerHdl != EplDllkInstance_g.m_TimerHdlResponse)
- { // zombie callback
- // just exit
- goto Exit;
- }
+ if (pEventArg_p->m_TimerHdl != EplDllkInstance_g.m_TimerHdlResponse) { // zombie callback
+ // just exit
+ goto Exit;
+ }
#endif
- NmtState = EplNmtkGetNmtState();
+ NmtState = EplNmtkGetNmtState();
- if (NmtState <= kEplNmtGsResetConfiguration)
- {
- goto Exit;
- }
+ if (NmtState <= kEplNmtGsResetConfiguration) {
+ goto Exit;
+ }
- Ret = EplDllkChangeState(kEplNmtEventDllMePresTimeout, NmtState);
+ Ret = EplDllkChangeState(kEplNmtEventDllMePresTimeout, NmtState);
-Exit:
- if (Ret != kEplSuccessful)
- {
- DWORD dwArg;
+ Exit:
+ if (Ret != kEplSuccessful) {
+ DWORD dwArg;
- BENCHMARK_MOD_02_TOGGLE(9);
+ BENCHMARK_MOD_02_TOGGLE(9);
- dwArg = EplDllkInstance_g.m_DllState | (kEplNmtEventDllMePresTimeout << 8);
+ dwArg =
+ EplDllkInstance_g.
+ m_DllState | (kEplNmtEventDllMePresTimeout << 8);
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret,
- sizeof(dwArg),
- &dwArg);
- }
+ // Error event for API layer
+ Ret = EplEventkPostError(kEplEventSourceDllk,
+ Ret, sizeof(dwArg), &dwArg);
+ }
- return Ret;
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkGetNodeInfo()
@@ -3449,22 +3724,18 @@ Exit:
//
//---------------------------------------------------------------------------
-static tEplDllkNodeInfo* EplDllkGetNodeInfo(unsigned int uiNodeId_p)
+static tEplDllkNodeInfo *EplDllkGetNodeInfo(unsigned int uiNodeId_p)
{
- // $$$ d.k.: use hash algorithm to retrieve the appropriate node info structure
- // if size of array is less than 254.
- uiNodeId_p--; // node ID starts at 1 but array at 0
- if (uiNodeId_p >= tabentries (EplDllkInstance_g.m_aNodeInfo))
- {
- return NULL;
- }
- else
- {
- return &EplDllkInstance_g.m_aNodeInfo[uiNodeId_p];
- }
+ // $$$ d.k.: use hash algorithm to retrieve the appropriate node info structure
+ // if size of array is less than 254.
+ uiNodeId_p--; // node ID starts at 1 but array at 0
+ if (uiNodeId_p >= tabentries(EplDllkInstance_g.m_aNodeInfo)) {
+ return NULL;
+ } else {
+ return &EplDllkInstance_g.m_aNodeInfo[uiNodeId_p];
+ }
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkMnSendSoa()
@@ -3484,97 +3755,105 @@ static tEplDllkNodeInfo* EplDllkGetNodeInfo(unsigned int uiNodeId_p)
//---------------------------------------------------------------------------
static tEplKernel EplDllkMnSendSoa(tEplNmtState NmtState_p,
- tEplDllState* pDllStateProposed_p,
- BOOL fEnableInvitation_p)
+ tEplDllState * pDllStateProposed_p,
+ BOOL fEnableInvitation_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEdrvTxBuffer *pTxBuffer = NULL;
-tEplFrame *pTxFrame;
-tEplDllkNodeInfo* pNodeInfo;
-
- *pDllStateProposed_p = kEplDllMsNonCyclic;
-
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_SOA];
- if (pTxBuffer->m_pbBuffer != NULL)
- { // SoA does exist
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
-
- if (fEnableInvitation_p != FALSE)
- { // fetch target of asynchronous phase
- if (EplDllkInstance_g.m_bFlag2 == 0)
- { // own queues are empty
- EplDllkInstance_g.m_LastReqServiceId = kEplDllReqServiceNo;
- }
- else if (((tEplDllAsyncReqPriority) (EplDllkInstance_g.m_bFlag2 >> EPL_FRAME_FLAG2_PR_SHIFT)) == kEplDllAsyncReqPrioNmt)
- { // frames in own NMT request queue available
- EplDllkInstance_g.m_LastReqServiceId = kEplDllReqServiceNmtRequest;
- }
- else
- {
- EplDllkInstance_g.m_LastReqServiceId = kEplDllReqServiceUnspecified;
- }
- Ret = EplDllkCalAsyncGetSoaRequest(&EplDllkInstance_g.m_LastReqServiceId, &EplDllkInstance_g.m_uiLastTargetNodeId);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- if (EplDllkInstance_g.m_LastReqServiceId != kEplDllReqServiceNo)
- { // asynchronous phase will be assigned to one node
- if (EplDllkInstance_g.m_uiLastTargetNodeId == EPL_C_ADR_INVALID)
- { // exchange invalid node ID with local node ID
- EplDllkInstance_g.m_uiLastTargetNodeId = EplDllkInstance_g.m_DllConfigParam.m_uiNodeId;
- // d.k. DLL state WaitAsndTrig is not helpful;
- // so just step over to WaitSocTrig,
- // because own ASnd is sent automatically in CbFrameTransmitted() after SoA.
- //*pDllStateProposed_p = kEplDllMsWaitAsndTrig;
- *pDllStateProposed_p = kEplDllMsWaitSocTrig;
- }
- else
- { // assignment to CN
- *pDllStateProposed_p = kEplDllMsWaitAsnd;
- }
-
- pNodeInfo = EplDllkGetNodeInfo(EplDllkInstance_g.m_uiLastTargetNodeId);
- if (pNodeInfo == NULL)
- { // no node info structure available
- Ret = kEplDllNoNodeInfo;
- goto Exit;
- }
-
- // update frame (EA, ER flags)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bFlag1,
- pNodeInfo->m_bSoaFlag1 & (EPL_FRAME_FLAG1_EA | EPL_FRAME_FLAG1_ER));
- }
- else
- { // no assignment of asynchronous phase
- *pDllStateProposed_p = kEplDllMsWaitSocTrig;
- EplDllkInstance_g.m_uiLastTargetNodeId = EPL_C_ADR_INVALID;
- }
-
- // update frame (target)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bReqServiceId, (BYTE) EplDllkInstance_g.m_LastReqServiceId);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bReqServiceTarget, (BYTE) EplDllkInstance_g.m_uiLastTargetNodeId);
-
- }
- else
- { // invite nobody
- // update frame (target)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bReqServiceId, (BYTE) 0);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bReqServiceTarget, (BYTE) 0);
- }
-
- // update frame (NMT state)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bNmtStatus, (BYTE) NmtState_p);
-
- // send SoA frame
- Ret = EdrvSendTxMsg(pTxBuffer);
- }
-
-Exit:
- return Ret;
+ tEplKernel Ret = kEplSuccessful;
+ tEdrvTxBuffer *pTxBuffer = NULL;
+ tEplFrame *pTxFrame;
+ tEplDllkNodeInfo *pNodeInfo;
+
+ *pDllStateProposed_p = kEplDllMsNonCyclic;
+
+ pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_SOA];
+ if (pTxBuffer->m_pbBuffer != NULL) { // SoA does exist
+ pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
+
+ if (fEnableInvitation_p != FALSE) { // fetch target of asynchronous phase
+ if (EplDllkInstance_g.m_bFlag2 == 0) { // own queues are empty
+ EplDllkInstance_g.m_LastReqServiceId =
+ kEplDllReqServiceNo;
+ } else if (((tEplDllAsyncReqPriority) (EplDllkInstance_g.m_bFlag2 >> EPL_FRAME_FLAG2_PR_SHIFT)) == kEplDllAsyncReqPrioNmt) { // frames in own NMT request queue available
+ EplDllkInstance_g.m_LastReqServiceId =
+ kEplDllReqServiceNmtRequest;
+ } else {
+ EplDllkInstance_g.m_LastReqServiceId =
+ kEplDllReqServiceUnspecified;
+ }
+ Ret =
+ EplDllkCalAsyncGetSoaRequest(&EplDllkInstance_g.
+ m_LastReqServiceId,
+ &EplDllkInstance_g.
+ m_uiLastTargetNodeId);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ if (EplDllkInstance_g.m_LastReqServiceId != kEplDllReqServiceNo) { // asynchronous phase will be assigned to one node
+ if (EplDllkInstance_g.m_uiLastTargetNodeId == EPL_C_ADR_INVALID) { // exchange invalid node ID with local node ID
+ EplDllkInstance_g.m_uiLastTargetNodeId =
+ EplDllkInstance_g.m_DllConfigParam.
+ m_uiNodeId;
+ // d.k. DLL state WaitAsndTrig is not helpful;
+ // so just step over to WaitSocTrig,
+ // because own ASnd is sent automatically in CbFrameTransmitted() after SoA.
+ //*pDllStateProposed_p = kEplDllMsWaitAsndTrig;
+ *pDllStateProposed_p =
+ kEplDllMsWaitSocTrig;
+ } else { // assignment to CN
+ *pDllStateProposed_p =
+ kEplDllMsWaitAsnd;
+ }
+
+ pNodeInfo =
+ EplDllkGetNodeInfo(EplDllkInstance_g.
+ m_uiLastTargetNodeId);
+ if (pNodeInfo == NULL) { // no node info structure available
+ Ret = kEplDllNoNodeInfo;
+ goto Exit;
+ }
+ // update frame (EA, ER flags)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
+ m_le_bFlag1,
+ pNodeInfo->
+ m_bSoaFlag1 & (EPL_FRAME_FLAG1_EA
+ |
+ EPL_FRAME_FLAG1_ER));
+ } else { // no assignment of asynchronous phase
+ *pDllStateProposed_p = kEplDllMsWaitSocTrig;
+ EplDllkInstance_g.m_uiLastTargetNodeId =
+ EPL_C_ADR_INVALID;
+ }
+
+ // update frame (target)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
+ m_le_bReqServiceId,
+ (BYTE) EplDllkInstance_g.
+ m_LastReqServiceId);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
+ m_le_bReqServiceTarget,
+ (BYTE) EplDllkInstance_g.
+ m_uiLastTargetNodeId);
+
+ } else { // invite nobody
+ // update frame (target)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
+ m_le_bReqServiceId, (BYTE) 0);
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
+ m_le_bReqServiceTarget, (BYTE) 0);
+ }
+
+ // update frame (NMT state)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bNmtStatus,
+ (BYTE) NmtState_p);
+
+ // send SoA frame
+ Ret = EdrvSendTxMsg(pTxBuffer);
+ }
+
+ Exit:
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkMnSendSoc()
@@ -3592,37 +3871,33 @@ Exit:
static tEplKernel EplDllkMnSendSoc(void)
{
-tEplKernel Ret = kEplSuccessful;
-tEdrvTxBuffer* pTxBuffer = NULL;
-tEplFrame* pTxFrame;
-tEplEvent Event;
-
- pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_SOC];
- if (pTxBuffer->m_pbBuffer != NULL)
- { // SoC does exist
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
-
- // $$$ update NetTime
-
- // send SoC frame
- Ret = EdrvSendTxMsg(pTxBuffer);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
-
- // trigger synchronous task
- Event.m_EventSink = kEplEventSinkSync;
- Event.m_EventType = kEplEventTypeSync;
- Event.m_uiSize = 0;
- Ret = EplEventkPost(&Event);
- }
-
-Exit:
- return Ret;
+ tEplKernel Ret = kEplSuccessful;
+ tEdrvTxBuffer *pTxBuffer = NULL;
+ tEplFrame *pTxFrame;
+ tEplEvent Event;
+
+ pTxBuffer = &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_SOC];
+ if (pTxBuffer->m_pbBuffer != NULL) { // SoC does exist
+ pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
+
+ // $$$ update NetTime
+
+ // send SoC frame
+ Ret = EdrvSendTxMsg(pTxBuffer);
+ if (Ret != kEplSuccessful) {
+ goto Exit;
+ }
+ // trigger synchronous task
+ Event.m_EventSink = kEplEventSinkSync;
+ Event.m_EventType = kEplEventTypeSync;
+ Event.m_uiSize = 0;
+ Ret = EplEventkPost(&Event);
+ }
+
+ Exit:
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkMnSendPreq()
@@ -3641,87 +3916,83 @@ Exit:
//---------------------------------------------------------------------------
static tEplKernel EplDllkMnSendPreq(tEplNmtState NmtState_p,
- tEplDllState* pDllStateProposed_p)
+ tEplDllState * pDllStateProposed_p)
{
-tEplKernel Ret = kEplSuccessful;
-tEdrvTxBuffer *pTxBuffer = NULL;
-tEplFrame *pTxFrame;
-BYTE bFlag1 = 0;
-
-
- if (EplDllkInstance_g.m_pCurNodeInfo == NULL)
- { // start with first isochronous CN
- EplDllkInstance_g.m_pCurNodeInfo = EplDllkInstance_g.m_pFirstNodeInfo;
- }
- else
- { // iterate to next isochronous CN
- EplDllkInstance_g.m_pCurNodeInfo = EplDllkInstance_g.m_pCurNodeInfo->m_pNextNodeInfo;
- }
-
- if (EplDllkInstance_g.m_pCurNodeInfo == NULL)
- { // last isochronous CN reached
- Ret = EplDllkMnSendSoa(NmtState_p, pDllStateProposed_p, TRUE);
- goto Exit;
- }
- else
- {
- pTxBuffer = EplDllkInstance_g.m_pCurNodeInfo->m_pPreqTxBuffer;
- bFlag1 = EplDllkInstance_g.m_pCurNodeInfo->m_bSoaFlag1 & EPL_FRAME_FLAG1_EA;
- *pDllStateProposed_p = kEplDllMsWaitPres;
-
- // start PRes Timer
- // $$$ d.k.: maybe move this call to CbFrameTransmitted(), because the time should run from there
+ tEplKernel Ret = kEplSuccessful;
+ tEdrvTxBuffer *pTxBuffer = NULL;
+ tEplFrame *pTxFrame;
+ BYTE bFlag1 = 0;
+
+ if (EplDllkInstance_g.m_pCurNodeInfo == NULL) { // start with first isochronous CN
+ EplDllkInstance_g.m_pCurNodeInfo =
+ EplDllkInstance_g.m_pFirstNodeInfo;
+ } else { // iterate to next isochronous CN
+ EplDllkInstance_g.m_pCurNodeInfo =
+ EplDllkInstance_g.m_pCurNodeInfo->m_pNextNodeInfo;
+ }
+
+ if (EplDllkInstance_g.m_pCurNodeInfo == NULL) { // last isochronous CN reached
+ Ret = EplDllkMnSendSoa(NmtState_p, pDllStateProposed_p, TRUE);
+ goto Exit;
+ } else {
+ pTxBuffer = EplDllkInstance_g.m_pCurNodeInfo->m_pPreqTxBuffer;
+ bFlag1 =
+ EplDllkInstance_g.m_pCurNodeInfo->
+ m_bSoaFlag1 & EPL_FRAME_FLAG1_EA;
+ *pDllStateProposed_p = kEplDllMsWaitPres;
+
+ // start PRes Timer
+ // $$$ d.k.: maybe move this call to CbFrameTransmitted(), because the time should run from there
#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.m_TimerHdlResponse,
- EplDllkInstance_g.m_pCurNodeInfo->m_dwPresTimeout,
- EplDllkCbMnTimerResponse,
- 0L,
- FALSE);
+ Ret =
+ EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.
+ m_TimerHdlResponse,
+ EplDllkInstance_g.
+ m_pCurNodeInfo->
+ m_dwPresTimeout,
+ EplDllkCbMnTimerResponse, 0L,
+ FALSE);
#endif
- }
-
- if (pTxBuffer == NULL)
- { // PReq does not exist
- Ret = kEplDllTxBufNotReady;
- goto Exit;
- }
-
- pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
-
- if (pTxFrame != NULL)
- { // PReq does exist
- if (NmtState_p == kEplNmtMsOperational)
- { // leave RD flag untouched
- bFlag1 |= AmiGetByteFromLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag1) & EPL_FRAME_FLAG1_RD;
- }
-
- if (pTxBuffer == &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES])
- { // PRes of MN will be sent
- // update NMT state
- AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bNmtStatus, (BYTE) NmtState_p);
- *pDllStateProposed_p = kEplDllMsWaitSoaTrig;
- }
-
- // $$$ d.k. set EPL_FRAME_FLAG1_MS if necessary
- // update frame (Flag1)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag1, bFlag1);
-
- // calculate frame size from payload size
- pTxBuffer->m_uiTxMsgLen = AmiGetWordFromLe(&pTxFrame->m_Data.m_Preq.m_le_wSize) + 24;
-
- // send PReq frame
- Ret = EdrvSendTxMsg(pTxBuffer);
- }
- else
- {
- Ret = kEplDllTxFrameInvalid;
- }
-
-Exit:
- return Ret;
+ }
+
+ if (pTxBuffer == NULL) { // PReq does not exist
+ Ret = kEplDllTxBufNotReady;
+ goto Exit;
+ }
+
+ pTxFrame = (tEplFrame *) pTxBuffer->m_pbBuffer;
+
+ if (pTxFrame != NULL) { // PReq does exist
+ if (NmtState_p == kEplNmtMsOperational) { // leave RD flag untouched
+ bFlag1 |=
+ AmiGetByteFromLe(&pTxFrame->m_Data.m_Preq.
+ m_le_bFlag1) & EPL_FRAME_FLAG1_RD;
+ }
+
+ if (pTxBuffer == &EplDllkInstance_g.m_pTxBuffer[EPL_DLLK_TXFRAME_PRES]) { // PRes of MN will be sent
+ // update NMT state
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bNmtStatus,
+ (BYTE) NmtState_p);
+ *pDllStateProposed_p = kEplDllMsWaitSoaTrig;
+ }
+ // $$$ d.k. set EPL_FRAME_FLAG1_MS if necessary
+ // update frame (Flag1)
+ AmiSetByteToLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag1, bFlag1);
+
+ // calculate frame size from payload size
+ pTxBuffer->m_uiTxMsgLen =
+ AmiGetWordFromLe(&pTxFrame->m_Data.m_Preq.m_le_wSize) + 24;
+
+ // send PReq frame
+ Ret = EdrvSendTxMsg(pTxBuffer);
+ } else {
+ Ret = kEplDllTxFrameInvalid;
+ }
+
+ Exit:
+ return Ret;
}
-
//---------------------------------------------------------------------------
//
// Function: EplDllkAsyncFrameNotReceived()
@@ -3739,45 +4010,45 @@ Exit:
//
//---------------------------------------------------------------------------
-static tEplKernel EplDllkAsyncFrameNotReceived(tEplDllReqServiceId ReqServiceId_p, unsigned int uiNodeId_p)
+static tEplKernel EplDllkAsyncFrameNotReceived(tEplDllReqServiceId
+ ReqServiceId_p,
+ unsigned int uiNodeId_p)
{
-tEplKernel Ret = kEplSuccessful;
-BYTE abBuffer[18];
-tEplFrame* pFrame = (tEplFrame*) abBuffer;
-tEplFrameInfo FrameInfo;
-
- // check if previous SoA invitation was not answered
- switch (ReqServiceId_p)
- {
- case kEplDllReqServiceIdent:
- case kEplDllReqServiceStatus:
- // ASnd service registered?
- if (EplDllkInstance_g.m_aAsndFilter[ReqServiceId_p] == kEplDllAsndFilterAny)
- { // ASnd service ID is registered
- AmiSetByteToLe(&pFrame->m_le_bSrcNodeId, (BYTE) uiNodeId_p);
- // EPL MsgType ASnd
- AmiSetByteToLe(&pFrame->m_le_bMessageType, (BYTE) kEplMsgTypeAsnd);
- // ASnd Service ID
- AmiSetByteToLe(&pFrame->m_Data.m_Asnd.m_le_bServiceId, (BYTE) ReqServiceId_p);
- // create frame info structure
- FrameInfo.m_pFrame = pFrame;
- FrameInfo.m_uiFrameSize = 18; // empty non existing ASnd frame
- // forward frame via async receive FIFO to userspace
- Ret = EplDllkCalAsyncFrameReceived(&FrameInfo);
- }
- break;
- default:
- // no invitation issued or it was successfully answered or it is uninteresting
- break;
- }
-
- return Ret;
+ tEplKernel Ret = kEplSuccessful;
+ BYTE abBuffer[18];
+ tEplFrame *pFrame = (tEplFrame *) abBuffer;
+ tEplFrameInfo FrameInfo;
+
+ // check if previous SoA invitation was not answered
+ switch (ReqServiceId_p) {
+ case kEplDllReqServiceIdent:
+ case kEplDllReqServiceStatus:
+ // ASnd service registered?
+ if (EplDllkInstance_g.m_aAsndFilter[ReqServiceId_p] == kEplDllAsndFilterAny) { // ASnd service ID is registered
+ AmiSetByteToLe(&pFrame->m_le_bSrcNodeId,
+ (BYTE) uiNodeId_p);
+ // EPL MsgType ASnd
+ AmiSetByteToLe(&pFrame->m_le_bMessageType,
+ (BYTE) kEplMsgTypeAsnd);
+ // ASnd Service ID
+ AmiSetByteToLe(&pFrame->m_Data.m_Asnd.m_le_bServiceId,
+ (BYTE) ReqServiceId_p);
+ // create frame info structure
+ FrameInfo.m_pFrame = pFrame;
+ FrameInfo.m_uiFrameSize = 18; // empty non existing ASnd frame
+ // forward frame via async receive FIFO to userspace
+ Ret = EplDllkCalAsyncFrameReceived(&FrameInfo);
+ }
+ break;
+ default:
+ // no invitation issued or it was successfully answered or it is uninteresting
+ break;
+ }
+
+ return Ret;
}
-
#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
// EOF
-