//------------------------------------------------------------------------------ static tOplkError cbCnLossOfSync(void) { tOplkError ret = kErrorOk; tNmtState nmtState; UINT32 arg; TGT_DLLK_DECLARE_FLAGS; TGT_DLLK_ENTER_CRITICAL_SECTION(); nmtState = dllkInstance_g.nmtState; if (nmtState <= kNmtGsResetConfiguration) goto Exit; ret = dllkstatemachine_changeState(kNmtEventDllCeFrameTimeout, nmtState); if (ret != kErrorOk) goto Exit; Exit: if (ret != kErrorOk) { BENCHMARK_MOD_02_TOGGLE(7); arg = dllkInstance_g.dllState | (kNmtEventDllCeFrameTimeout << 8); // Error event for API layer ret = eventk_postError(kEventSourceDllk, ret, sizeof(arg), &arg); } TGT_DLLK_LEAVE_CRITICAL_SECTION(); return ret; }
//------------------------------------------------------------------------------ static tOplkError cbCnPresFallbackTimeout(void) { tOplkError ret = kErrorOk; tNmtState nmtState; UINT32 arg; TGT_DLLK_DECLARE_FLAGS; TGT_DLLK_ENTER_CRITICAL_SECTION(); nmtState = dllkInstance_g.nmtState; if (nmtState <= kNmtGsResetConfiguration) goto Exit; ret = dllkframe_presChainingDisable(); Exit: if (ret != kErrorOk) { BENCHMARK_MOD_02_TOGGLE(7); arg = dllkInstance_g.dllState | (kNmtEventDllCeFrameTimeout << 8); // Error event for API layer ret = eventk_postError(kEventSourceDllk, ret, sizeof(arg), &arg); } TGT_DLLK_LEAVE_CRITICAL_SECTION(); return ret; }
//------------------------------------------------------------------------------ void eventkcal_process(void) { tOplkError ret; tEvent* pEvent; size_t readSize = sizeof(aRxBuffer_l); if (instance_l.fInitialized == FALSE) return; if (eventkcal_getEventCountCircbuf(kEventQueueKInt) > 0) { ret = eventkcal_getEventCircbuf(kEventQueueKInt, aRxBuffer_l, &readSize); if (ret == kErrorOk) { pEvent = (tEvent*)aRxBuffer_l; pEvent->eventArgSize = (readSize - sizeof(tEvent)); if (pEvent->eventArgSize > 0) pEvent->eventArg.pEventArg = &aRxBuffer_l[sizeof(tEvent)]; else pEvent->eventArg.pEventArg = NULL; if (!eventSinkIsKernel(pEvent->eventSink)) { // Events from the kernel-internal queue to the user layer // have to be posted to the kernel-to-user queue finally. ret = eventkcal_postEventCircbuf(kEventQueueK2U, pEvent); if (ret != kErrorOk) { tEventQueue eventQueue = kEventQueueK2U; // Forward error to API eventk_postError(kEventSourceEventk, ret, sizeof(eventQueue), &eventQueue); } } else { // Events from the kernel-internal queue to kernel event sinks // can be processed directly. ret = eventk_process(pEvent); } } } else { if (eventkcal_getEventCountCircbuf(kEventQueueU2K) > 0) { ret = eventkcal_processEventCircbuf(kEventQueueU2K); } } }
//------------------------------------------------------------------------------ tOplkError dllk_cbTimerSwitchOver(tTimerEventArg* pEventArg_p) { tOplkError ret = kErrorOk; tNmtState nmtState; UINT32 arg; tNmtEvent nmtEvent; tEvent event; TGT_DLLK_DECLARE_FLAGS; TGT_DLLK_ENTER_CRITICAL_SECTION(); #if CONFIG_TIMER_USE_HIGHRES != FALSE if (pEventArg_p->timerHdl != dllkInstance_g.timerHdlSwitchOver) { // zombie callback - just exit goto Exit; } #endif nmtState = dllkInstance_g.nmtState; if (!NMT_IF_ACTIVE_CN(nmtState)) goto Exit; ret = edrv_sendTxBuffer(&dllkInstance_g.pTxBuffer[DLLK_TXFRAME_AMNI]); if (ret != kErrorOk) goto Exit; // increment relativeTime for missing SoC dllkInstance_g.relativeTime += dllkInstance_g.dllConfigParam.cycleLen; nmtEvent = kNmtEventDllReSwitchOverTimeout; event.eventSink = kEventSinkNmtk; event.eventType = kEventTypeNmtEvent; event.eventArgSize = sizeof(nmtEvent); event.pEventArg = &nmtEvent; ret = eventk_postEvent(&event); Exit: if (ret != kErrorOk) { BENCHMARK_MOD_02_TOGGLE(7); arg = dllkInstance_g.dllState | (kNmtEventDllReSwitchOverTimeout << 8); // Error event for API layer ret = eventk_postError(kEventSourceDllk, ret, sizeof(arg), &arg); } TGT_DLLK_LEAVE_CRITICAL_SECTION(); return ret; }
//------------------------------------------------------------------------------ static tOplkError cbMnSyncHandler(void) { tOplkError ret = kErrorOk; tNmtState nmtState; BYTE* pbCnNodeId; UINT32 arg; TGT_DLLK_DECLARE_FLAGS; TGT_DLLK_ENTER_CRITICAL_SECTION(); nmtState = dllkInstance_g.nmtState; if (nmtState <= kNmtGsResetConfiguration) goto Exit; // do cycle finish which has to be done inside the callback function triggered by interrupt pbCnNodeId = &dllkInstance_g.aCnNodeIdList[dllkInstance_g.curTxBufferOffsetCycle][dllkInstance_g.curNodeIndex]; while (*pbCnNodeId != C_ADR_INVALID) { // issue error for each CN in list which was not processed yet, i.e. PRes received ret = dllknode_issueLossOfPres(*pbCnNodeId); if (ret != kErrorOk) goto Exit; pbCnNodeId++; } dllkInstance_g.fSyncProcessed = FALSE; dllkInstance_g.fPrcSlotFinished = FALSE; // switch to next cycle dllkInstance_g.curTxBufferOffsetCycle ^= 1; dllkInstance_g.curNodeIndex = 0; ret = dllk_postEvent(kEventTypeDllkCycleFinish); Exit: if (ret != kErrorOk) { BENCHMARK_MOD_02_TOGGLE(7); arg = dllkInstance_g.dllState | (kNmtEventDllMeSocTrig << 8); // Error event for API layer ret = eventk_postError(kEventSourceDllk, ret, sizeof(arg), &arg); } TGT_DLLK_LEAVE_CRITICAL_SECTION(); return ret; }
//------------------------------------------------------------------------------ tOplkError dllk_cbCyclicError(tOplkError errorCode_p, tEdrvTxBuffer* pTxBuffer_p) { tOplkError ret = kErrorOk; tNmtState nmtState; UINT handle = 0; UINT32 arg; tEventDllError dllEvent; TGT_DLLK_DECLARE_FLAGS; UNUSED_PARAMETER(pTxBuffer_p); TGT_DLLK_ENTER_CRITICAL_SECTION(); nmtState = dllkInstance_g.nmtState; if (!NMT_IF_MN(nmtState)) { #if defined(CONFIG_INCLUDE_NMT_RMN) if (errorCode_p == kErrorEdrvCurTxListEmpty) { switch (dllkInstance_g.nmtEventGoToStandby) { case kNmtEventGoToStandby: hrestimer_modifyTimer(&dllkInstance_g.timerHdlSwitchOver, (dllkInstance_g.dllConfigParam.switchOverTimeMn - dllkInstance_g.dllConfigParam.cycleLen) * 1000ULL, dllk_cbTimerSwitchOver, 0L, FALSE); dllkInstance_g.nmtEventGoToStandby = kNmtEventNoEvent; break; case kNmtEventGoToStandbyDelayed: hrestimer_modifyTimer(&dllkInstance_g.timerHdlSwitchOver, (dllkInstance_g.dllConfigParam.delayedSwitchOverTimeMn - dllkInstance_g.dllConfigParam.cycleLen) * 1000ULL, dllk_cbTimerSwitchOver, 0L, FALSE); dllkInstance_g.nmtEventGoToStandby = kNmtEventNoEvent; break; default: break; } } #endif // ignore errors if not MN goto Exit; } if (pTxBuffer_p != NULL) { handle = (UINT)(pTxBuffer_p - dllkInstance_g.pTxBuffer); } BENCHMARK_MOD_02_TOGGLE(7); switch (errorCode_p) { case kErrorEdrvCurTxListEmpty: case kErrorEdrvTxListNotFinishedYet: case kErrorEdrvNoFreeTxDesc: dllEvent.dllErrorEvents = DLL_ERR_MN_CYCTIMEEXCEED; dllEvent.nodeId = handle; dllEvent.nmtState = nmtState; dllEvent.oplkError = errorCode_p; ret = errhndk_postError(&dllEvent); break; default: arg = dllkInstance_g.dllState | (handle << 16); // Error event for API layer ret = eventk_postError(kEventSourceDllk, errorCode_p, sizeof(arg), &arg); break; } Exit: TGT_DLLK_LEAVE_CRITICAL_SECTION(); return ret; }