aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/epl/EplDllkCal.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/epl/EplDllkCal.c')
-rw-r--r--drivers/staging/epl/EplDllkCal.c1260
1 files changed, 0 insertions, 1260 deletions
diff --git a/drivers/staging/epl/EplDllkCal.c b/drivers/staging/epl/EplDllkCal.c
deleted file mode 100644
index 0e283d5d0181..000000000000
--- a/drivers/staging/epl/EplDllkCal.c
+++ /dev/null
@@ -1,1260 +0,0 @@
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for kernel DLL Communication Abstraction Layer module
-
- License:
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of SYSTEC electronic GmbH nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without prior written permission. For written
- permission, please contact info@systec-electronic.com.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- Severability Clause:
-
- If a provision of this License is or becomes illegal, invalid or
- unenforceable in any jurisdiction, that shall not affect:
- 1. the validity or enforceability in that jurisdiction of any other
- provision of this License; or
- 2. the validity or enforceability in other jurisdictions of that or
- any other provision of this License.
-
- -------------------------------------------------------------------------
-
- $RCSfile: EplDllkCal.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.7 $ $Date: 2008/11/13 17:13:09 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/15 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#include "kernel/EplDllkCal.h"
-#include "kernel/EplDllk.h"
-#include "kernel/EplEventk.h"
-
-#include "EplDllCal.h"
-#ifndef EPL_NO_FIFO
-#include "SharedBuff.h"
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef min
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-#endif
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S EplDllkCal */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#define EPL_DLLKCAL_MAX_QUEUES 5 // CnGenReq, CnNmtReq, {MnGenReq, MnNmtReq}, MnIdentReq, MnStatusReq
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
-#ifndef EPL_NO_FIFO
-// tShbInstance m_ShbInstanceRx; // FIFO for Rx ASnd frames
- tShbInstance m_ShbInstanceTxNmt; // FIFO for Tx frames with NMT request priority
- tShbInstance m_ShbInstanceTxGen; // FIFO for Tx frames with generic priority
-#else
- unsigned int m_uiFrameSizeNmt;
- u8 m_abFrameNmt[1500];
- unsigned int m_uiFrameSizeGen;
- u8 m_abFrameGen[1500];
-#endif
-
- tEplDllkCalStatistics m_Statistics;
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // IdentRequest queue with CN node IDs
- unsigned int m_auiQueueIdentReq[EPL_D_NMT_MaxCNNumber_U8 + 1]; // 1 entry is reserved to distinguish between full and empty
- unsigned int m_uiWriteIdentReq;
- unsigned int m_uiReadIdentReq;
-
- // StatusRequest queue with CN node IDs
- unsigned int m_auiQueueStatusReq[EPL_D_NMT_MaxCNNumber_U8 + 1]; // 1 entry is reserved to distinguish between full and empty
- unsigned int m_uiWriteStatusReq;
- unsigned int m_uiReadStatusReq;
-
- unsigned int m_auiQueueCnRequests[254 * 2];
- // first 254 entries represent the generic requests of the corresponding node
- // second 254 entries represent the NMT requests of the corresponding node
- unsigned int m_uiNextQueueCnRequest;
- unsigned int m_uiNextRequestQueue;
-#endif
-
-} tEplDllkCalInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-// if no dynamic memory allocation shall be used
-// define structures statically
-static tEplDllkCalInstance EplDllkCalInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAddInstance()
-//
-// Description: add and initialize new instance of DLL CAL module
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAddInstance(void)
-{
- tEplKernel Ret = kEplSuccessful;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
- unsigned int fShbNewCreated;
-
-/* ShbError = ShbCirAllocBuffer (EPL_DLLCAL_BUFFER_SIZE_RX, EPL_DLLCAL_BUFFER_ID_RX,
- &EplDllkCalInstance_g.m_ShbInstanceRx, &fShbNewCreated);
- // returns kShbOk, kShbOpenMismatch, kShbOutOfMem or kShbInvalidArg
-
- if (ShbError != kShbOk)
- {
- Ret = kEplNoResource;
- }
-*/
- ShbError =
- ShbCirAllocBuffer(EPL_DLLCAL_BUFFER_SIZE_TX_NMT,
- EPL_DLLCAL_BUFFER_ID_TX_NMT,
- &EplDllkCalInstance_g.m_ShbInstanceTxNmt,
- &fShbNewCreated);
- // returns kShbOk, kShbOpenMismatch, kShbOutOfMem or kShbInvalidArg
-
- if (ShbError != kShbOk) {
- Ret = kEplNoResource;
- }
-
-/* ShbError = ShbCirSetSignalHandlerNewData (EplDllkCalInstance_g.m_ShbInstanceTxNmt, EplDllkCalTxNmtSignalHandler, kShbPriorityNormal);
- // returns kShbOk, kShbAlreadySignaling or kShbInvalidArg
-
- if (ShbError != kShbOk)
- {
- Ret = kEplNoResource;
- }
-*/
- ShbError =
- ShbCirAllocBuffer(EPL_DLLCAL_BUFFER_SIZE_TX_GEN,
- EPL_DLLCAL_BUFFER_ID_TX_GEN,
- &EplDllkCalInstance_g.m_ShbInstanceTxGen,
- &fShbNewCreated);
- // returns kShbOk, kShbOpenMismatch, kShbOutOfMem or kShbInvalidArg
-
- if (ShbError != kShbOk) {
- Ret = kEplNoResource;
- }
-
-/* ShbError = ShbCirSetSignalHandlerNewData (EplDllkCalInstance_g.m_ShbInstanceTxGen, EplDllkCalTxGenSignalHandler, kShbPriorityNormal);
- // returns kShbOk, kShbAlreadySignaling or kShbInvalidArg
-
- if (ShbError != kShbOk)
- {
- Ret = kEplNoResource;
- }
-*/
-#else
- EplDllkCalInstance_g.m_uiFrameSizeNmt = 0;
- EplDllkCalInstance_g.m_uiFrameSizeGen = 0;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalDelInstance()
-//
-// Description: deletes instance of DLL CAL module
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalDelInstance(void)
-{
- tEplKernel Ret = kEplSuccessful;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-
-/* ShbError = ShbCirReleaseBuffer (EplDllkCalInstance_g.m_ShbInstanceRx);
- if (ShbError != kShbOk)
- {
- Ret = kEplNoResource;
- }
- EplDllkCalInstance_g.m_ShbInstanceRx = NULL;
-*/
- ShbError = ShbCirReleaseBuffer(EplDllkCalInstance_g.m_ShbInstanceTxNmt);
- if (ShbError != kShbOk) {
- Ret = kEplNoResource;
- }
- EplDllkCalInstance_g.m_ShbInstanceTxNmt = NULL;
-
- ShbError = ShbCirReleaseBuffer(EplDllkCalInstance_g.m_ShbInstanceTxGen);
- if (ShbError != kShbOk) {
- Ret = kEplNoResource;
- }
- EplDllkCalInstance_g.m_ShbInstanceTxGen = NULL;
-
-#else
- EplDllkCalInstance_g.m_uiFrameSizeNmt = 0;
- EplDllkCalInstance_g.m_uiFrameSizeGen = 0;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalProcess
-//
-// Description: process the passed configuration
-//
-// Parameters: pEvent_p = event containing configuration options
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalProcess(tEplEvent * pEvent_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- switch (pEvent_p->m_EventType) {
- case kEplEventTypeDllkServFilter:
- {
- tEplDllCalAsndServiceIdFilter *pServFilter;
-
- pServFilter =
- (tEplDllCalAsndServiceIdFilter *) pEvent_p->m_pArg;
- Ret =
- EplDllkSetAsndServiceIdFilter(pServFilter->
- m_ServiceId,
- pServFilter->
- m_Filter);
- break;
- }
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- case kEplEventTypeDllkIssueReq:
- {
- tEplDllCalIssueRequest *pIssueReq;
-
- pIssueReq = (tEplDllCalIssueRequest *) pEvent_p->m_pArg;
- Ret =
- EplDllkCalIssueRequest(pIssueReq->m_Service,
- pIssueReq->m_uiNodeId,
- pIssueReq->m_bSoaFlag1);
- break;
- }
-
- case kEplEventTypeDllkAddNode:
- {
- tEplDllNodeInfo *pNodeInfo;
-
- pNodeInfo = (tEplDllNodeInfo *) pEvent_p->m_pArg;
- Ret = EplDllkAddNode(pNodeInfo);
- break;
- }
-
- case kEplEventTypeDllkDelNode:
- {
- unsigned int *puiNodeId;
-
- puiNodeId = (unsigned int *)pEvent_p->m_pArg;
- Ret = EplDllkDeleteNode(*puiNodeId);
- break;
- }
-
- case kEplEventTypeDllkSoftDelNode:
- {
- unsigned int *puiNodeId;
-
- puiNodeId = (unsigned int *)pEvent_p->m_pArg;
- Ret = EplDllkSoftDeleteNode(*puiNodeId);
- break;
- }
-#endif
-
- case kEplEventTypeDllkIdentity:
- {
- tEplDllIdentParam *pIdentParam;
-
- pIdentParam = (tEplDllIdentParam *) pEvent_p->m_pArg;
- if (pIdentParam->m_uiSizeOfStruct > pEvent_p->m_uiSize) {
- pIdentParam->m_uiSizeOfStruct =
- pEvent_p->m_uiSize;
- }
- Ret = EplDllkSetIdentity(pIdentParam);
- break;
- }
-
- case kEplEventTypeDllkConfig:
- {
- tEplDllConfigParam *pConfigParam;
-
- pConfigParam = (tEplDllConfigParam *) pEvent_p->m_pArg;
- if (pConfigParam->m_uiSizeOfStruct > pEvent_p->m_uiSize) {
- pConfigParam->m_uiSizeOfStruct =
- pEvent_p->m_uiSize;
- }
- Ret = EplDllkConfig(pConfigParam);
- break;
- }
-
- default:
- break;
- }
-
-//Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncGetTxCount()
-//
-// Description: returns count of Tx frames of FIFO with highest priority
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAsyncGetTxCount(tEplDllAsyncReqPriority * pPriority_p,
- unsigned int *puiCount_p)
-{
- tEplKernel Ret = kEplSuccessful;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
- unsigned long ulFrameCount;
-
- // get frame count of Tx FIFO with NMT request priority
- ShbError =
- ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxNmt,
- &ulFrameCount);
- // returns kShbOk, kShbInvalidArg
-
- // error handling
- if (ShbError != kShbOk) {
- Ret = kEplNoResource;
- goto Exit;
- }
-
- if (ulFrameCount >
- EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt) {
- EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt =
- ulFrameCount;
- }
-
- if (ulFrameCount != 0) { // NMT requests are in queue
- *pPriority_p = kEplDllAsyncReqPrioNmt;
- *puiCount_p = (unsigned int)ulFrameCount;
- goto Exit;
- }
- // get frame count of Tx FIFO with generic priority
- ShbError =
- ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxGen,
- &ulFrameCount);
- // returns kShbOk, kShbInvalidArg
-
- // error handling
- if (ShbError != kShbOk) {
- Ret = kEplNoResource;
- goto Exit;
- }
-
- if (ulFrameCount >
- EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen) {
- EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen =
- ulFrameCount;
- }
-
- *pPriority_p = kEplDllAsyncReqPrioGeneric;
- *puiCount_p = (unsigned int)ulFrameCount;
-
- Exit:
-#else
- if (EplDllkCalInstance_g.m_uiFrameSizeNmt > 0) {
- *pPriority_p = kEplDllAsyncReqPrioNmt;
- *puiCount_p = 1;
- } else if (EplDllkCalInstance_g.m_uiFrameSizeGen > 0) {
- *pPriority_p = kEplDllAsyncReqPrioGeneric;
- *puiCount_p = 1;
- } else {
- *pPriority_p = kEplDllAsyncReqPrioGeneric;
- *puiCount_p = 0;
- }
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncGetTxFrame()
-//
-// Description: returns Tx frames from FIFO with specified priority
-//
-// Parameters: pFrame_p = IN: pointer to buffer
-// puiFrameSize_p = IN: max size of buffer
-// OUT: actual size of frame
-// Priority_p = IN: priority
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAsyncGetTxFrame(void *pFrame_p,
- unsigned int *puiFrameSize_p,
- tEplDllAsyncReqPriority Priority_p)
-{
- tEplKernel Ret = kEplSuccessful;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
- unsigned long ulFrameSize;
-
- switch (Priority_p) {
- case kEplDllAsyncReqPrioNmt: // NMT request priority
- ShbError =
- ShbCirReadDataBlock(EplDllkCalInstance_g.m_ShbInstanceTxNmt,
- (u8 *) pFrame_p, *puiFrameSize_p,
- &ulFrameSize);
- // returns kShbOk, kShbDataTruncated, kShbInvalidArg, kShbNoReadableData
- break;
-
- default: // generic priority
- ShbError =
- ShbCirReadDataBlock(EplDllkCalInstance_g.m_ShbInstanceTxGen,
- (u8 *) pFrame_p, *puiFrameSize_p,
- &ulFrameSize);
- // returns kShbOk, kShbDataTruncated, kShbInvalidArg, kShbNoReadableData
- break;
-
- }
-
- // error handling
- if (ShbError != kShbOk) {
- if (ShbError == kShbNoReadableData) {
- Ret = kEplDllAsyncTxBufferEmpty;
- } else { // other error
- Ret = kEplNoResource;
- }
- goto Exit;
- }
-
- *puiFrameSize_p = (unsigned int)ulFrameSize;
-
- Exit:
-#else
- switch (Priority_p) {
- case kEplDllAsyncReqPrioNmt: // NMT request priority
- *puiFrameSize_p =
- min(*puiFrameSize_p, EplDllkCalInstance_g.m_uiFrameSizeNmt);
- EPL_MEMCPY(pFrame_p, EplDllkCalInstance_g.m_abFrameNmt,
- *puiFrameSize_p);
- EplDllkCalInstance_g.m_uiFrameSizeNmt = 0;
- break;
-
- default: // generic priority
- *puiFrameSize_p =
- min(*puiFrameSize_p, EplDllkCalInstance_g.m_uiFrameSizeGen);
- EPL_MEMCPY(pFrame_p, EplDllkCalInstance_g.m_abFrameGen,
- *puiFrameSize_p);
- EplDllkCalInstance_g.m_uiFrameSizeGen = 0;
- break;
- }
-
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncFrameReceived()
-//
-// Description: passes ASnd frame to receive FIFO.
-// It will be called only for frames with registered AsndServiceIds.
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAsyncFrameReceived(tEplFrameInfo * pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkDlluCal;
- Event.m_EventType = kEplEventTypeAsndRx;
- Event.m_pArg = pFrameInfo_p->m_pFrame;
- Event.m_uiSize = pFrameInfo_p->m_uiFrameSize;
- // pass NetTime of frame to userspace
- Event.m_NetTime = pFrameInfo_p->m_NetTime;
-
- Ret = EplEventkPost(&Event);
- if (Ret != kEplSuccessful) {
- EplDllkCalInstance_g.m_Statistics.m_ulCurRxFrameCount++;
- } else {
- EplDllkCalInstance_g.m_Statistics.m_ulMaxRxFrameCount++;
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncSend()
-//
-// Description: puts the given frame into the transmit FIFO with the specified
-// priority.
-//
-// Parameters: pFrameInfo_p = frame info structure
-// Priority_p = priority
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAsyncSend(tEplFrameInfo * pFrameInfo_p,
- tEplDllAsyncReqPriority Priority_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-
- switch (Priority_p) {
- case kEplDllAsyncReqPrioNmt: // NMT request priority
- ShbError =
- ShbCirWriteDataBlock(EplDllkCalInstance_g.
- m_ShbInstanceTxNmt,
- pFrameInfo_p->m_pFrame,
- pFrameInfo_p->m_uiFrameSize);
- // returns kShbOk, kShbExceedDataSizeLimit, kShbBufferFull, kShbInvalidArg
- break;
-
- default: // generic priority
- ShbError =
- ShbCirWriteDataBlock(EplDllkCalInstance_g.
- m_ShbInstanceTxGen,
- pFrameInfo_p->m_pFrame,
- pFrameInfo_p->m_uiFrameSize);
- // returns kShbOk, kShbExceedDataSizeLimit, kShbBufferFull, kShbInvalidArg
- break;
-
- }
-
- // error handling
- switch (ShbError) {
- case kShbOk:
- break;
-
- case kShbExceedDataSizeLimit:
- Ret = kEplDllAsyncTxBufferFull;
- break;
-
- case kShbBufferFull:
- Ret = kEplDllAsyncTxBufferFull;
- break;
-
- case kShbInvalidArg:
- default:
- Ret = kEplNoResource;
- break;
- }
-
-#else
-
- switch (Priority_p) {
- case kEplDllAsyncReqPrioNmt: // NMT request priority
- if (EplDllkCalInstance_g.m_uiFrameSizeNmt == 0) {
- EPL_MEMCPY(EplDllkCalInstance_g.m_abFrameNmt,
- pFrameInfo_p->m_pFrame,
- pFrameInfo_p->m_uiFrameSize);
- EplDllkCalInstance_g.m_uiFrameSizeNmt =
- pFrameInfo_p->m_uiFrameSize;
- } else {
- Ret = kEplDllAsyncTxBufferFull;
- goto Exit;
- }
- break;
-
- default: // generic priority
- if (EplDllkCalInstance_g.m_uiFrameSizeGen == 0) {
- EPL_MEMCPY(EplDllkCalInstance_g.m_abFrameGen,
- pFrameInfo_p->m_pFrame,
- pFrameInfo_p->m_uiFrameSize);
- EplDllkCalInstance_g.m_uiFrameSizeGen =
- pFrameInfo_p->m_uiFrameSize;
- } else {
- Ret = kEplDllAsyncTxBufferFull;
- goto Exit;
- }
- break;
- }
-
-#endif
-
- // post event to DLL
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkFillTx;
- EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
- Event.m_pArg = &Priority_p;
- Event.m_uiSize = sizeof(Priority_p);
- Ret = EplEventkPost(&Event);
-
-#ifdef EPL_NO_FIFO
- Exit:
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncClearBuffer()
-//
-// Description: clears the transmit buffer
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAsyncClearBuffer(void)
-{
- tEplKernel Ret = kEplSuccessful;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-
- ShbError =
- ShbCirResetBuffer(EplDllkCalInstance_g.m_ShbInstanceTxNmt, 1000,
- NULL);
- ShbError =
- ShbCirResetBuffer(EplDllkCalInstance_g.m_ShbInstanceTxGen, 1000,
- NULL);
-
-#else
- EplDllkCalInstance_g.m_uiFrameSizeNmt = 0;
- EplDllkCalInstance_g.m_uiFrameSizeGen = 0;
-#endif
-
-// EPL_MEMSET(&EplDllkCalInstance_g.m_Statistics, 0, sizeof (tEplDllkCalStatistics));
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncClearQueues()
-//
-// Description: clears the transmit buffer
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-tEplKernel EplDllkCalAsyncClearQueues(void)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // clear MN asynchronous queues
- EplDllkCalInstance_g.m_uiNextQueueCnRequest = 0;
- EplDllkCalInstance_g.m_uiNextRequestQueue = 0;
- EplDllkCalInstance_g.m_uiReadIdentReq = 0;
- EplDllkCalInstance_g.m_uiWriteIdentReq = 0;
- EplDllkCalInstance_g.m_uiReadStatusReq = 0;
- EplDllkCalInstance_g.m_uiWriteStatusReq = 0;
-
- return Ret;
-}
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalGetStatistics()
-//
-// Description: returns statistics of the asynchronous queues.
-//
-// Parameters: ppStatistics = statistics structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalGetStatistics(tEplDllkCalStatistics ** ppStatistics)
-{
- tEplKernel Ret = kEplSuccessful;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-
- ShbError =
- ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxNmt,
- &EplDllkCalInstance_g.m_Statistics.
- m_ulCurTxFrameCountNmt);
- ShbError =
- ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxGen,
- &EplDllkCalInstance_g.m_Statistics.
- m_ulCurTxFrameCountGen);
-// ShbError = ShbCirGetReadBlockCount (EplDllkCalInstance_g.m_ShbInstanceRx, &EplDllkCalInstance_g.m_Statistics.m_ulCurRxFrameCount);
-
-#else
- if (EplDllkCalInstance_g.m_uiFrameSizeNmt > 0) {
- EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountNmt = 1;
- } else {
- EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountNmt = 0;
- }
- if (EplDllkCalInstance_g.m_uiFrameSizeGen > 0) {
- EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountGen = 1;
- } else {
- EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountGen = 0;
- }
-#endif
-
- *ppStatistics = &EplDllkCalInstance_g.m_Statistics;
- return Ret;
-}
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalIssueRequest()
-//
-// Description: issues a StatusRequest or a IdentRequest to the specified node.
-//
-// Parameters: Service_p = request service ID
-// uiNodeId_p = node ID
-// bSoaFlag1_p = flag1 for this node (transmit in SoA and PReq)
-// If 0xFF this flag is ignored.
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalIssueRequest(tEplDllReqServiceId Service_p,
- unsigned int uiNodeId_p, u8 bSoaFlag1_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if (bSoaFlag1_p != 0xFF) {
- Ret = EplDllkSetFlag1OfNode(uiNodeId_p, bSoaFlag1_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
- // add node to appropriate request queue
- switch (Service_p) {
- case kEplDllReqServiceIdent:
- {
- if (((EplDllkCalInstance_g.m_uiWriteIdentReq +
- 1) %
- tabentries(EplDllkCalInstance_g.
- m_auiQueueIdentReq))
- == EplDllkCalInstance_g.m_uiReadIdentReq) { // queue is full
- Ret = kEplDllAsyncTxBufferFull;
- goto Exit;
- }
- EplDllkCalInstance_g.
- m_auiQueueIdentReq[EplDllkCalInstance_g.
- m_uiWriteIdentReq] = uiNodeId_p;
- EplDllkCalInstance_g.m_uiWriteIdentReq =
- (EplDllkCalInstance_g.m_uiWriteIdentReq +
- 1) %
- tabentries(EplDllkCalInstance_g.m_auiQueueIdentReq);
- break;
- }
-
- case kEplDllReqServiceStatus:
- {
- if (((EplDllkCalInstance_g.m_uiWriteStatusReq +
- 1) %
- tabentries(EplDllkCalInstance_g.
- m_auiQueueStatusReq))
- == EplDllkCalInstance_g.m_uiReadStatusReq) { // queue is full
- Ret = kEplDllAsyncTxBufferFull;
- goto Exit;
- }
- EplDllkCalInstance_g.
- m_auiQueueStatusReq[EplDllkCalInstance_g.
- m_uiWriteStatusReq] =
- uiNodeId_p;
- EplDllkCalInstance_g.m_uiWriteStatusReq =
- (EplDllkCalInstance_g.m_uiWriteStatusReq +
- 1) %
- tabentries(EplDllkCalInstance_g.
- m_auiQueueStatusReq);
- break;
- }
-
- default:
- {
- Ret = kEplDllInvalidParam;
- goto Exit;
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncGetSoaRequest()
-//
-// Description: returns next request for SoA. This function is called by DLLk module.
-//
-// Parameters: pReqServiceId_p = pointer to request service ID
-// IN: available request for MN NMT or generic request queue (Flag2.PR)
-// or kEplDllReqServiceNo if queues are empty
-// OUT: next request
-// puiNodeId_p = OUT: pointer to node ID of next request
-// = EPL_C_ADR_INVALID, if request is self addressed
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAsyncGetSoaRequest(tEplDllReqServiceId * pReqServiceId_p,
- unsigned int *puiNodeId_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiCount;
-
-// *pReqServiceId_p = kEplDllReqServiceNo;
-
- for (uiCount = EPL_DLLKCAL_MAX_QUEUES; uiCount > 0; uiCount--) {
- switch (EplDllkCalInstance_g.m_uiNextRequestQueue) {
- case 0:
- { // CnGenReq
- for (;
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest <
- (tabentries
- (EplDllkCalInstance_g.
- m_auiQueueCnRequests) / 2);
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest++) {
- if (EplDllkCalInstance_g.m_auiQueueCnRequests[EplDllkCalInstance_g.m_uiNextQueueCnRequest] > 0) { // non empty queue found
- // remove one request from queue
- EplDllkCalInstance_g.
- m_auiQueueCnRequests
- [EplDllkCalInstance_g.
- m_uiNextQueueCnRequest]--;
- *puiNodeId_p =
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest + 1;
- *pReqServiceId_p =
- kEplDllReqServiceUnspecified;
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest++;
- if (EplDllkCalInstance_g.m_uiNextQueueCnRequest >= (tabentries(EplDllkCalInstance_g.m_auiQueueCnRequests) / 2)) { // last node reached
- // continue with CnNmtReq queue at next SoA
- EplDllkCalInstance_g.
- m_uiNextRequestQueue
- = 1;
- }
- goto Exit;
- }
- }
- // all CnGenReq queues are empty -> continue with CnNmtReq queue
- EplDllkCalInstance_g.m_uiNextRequestQueue = 1;
- break;
- }
-
- case 1:
- { // CnNmtReq
- for (;
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest <
- tabentries(EplDllkCalInstance_g.
- m_auiQueueCnRequests);
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest++) {
- if (EplDllkCalInstance_g.m_auiQueueCnRequests[EplDllkCalInstance_g.m_uiNextQueueCnRequest] > 0) { // non empty queue found
- // remove one request from queue
- EplDllkCalInstance_g.
- m_auiQueueCnRequests
- [EplDllkCalInstance_g.
- m_uiNextQueueCnRequest]--;
- *puiNodeId_p =
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest + 1 -
- (tabentries
- (EplDllkCalInstance_g.
- m_auiQueueCnRequests) /
- 2);
- *pReqServiceId_p =
- kEplDllReqServiceNmtRequest;
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest++;
- if (EplDllkCalInstance_g.m_uiNextQueueCnRequest > tabentries(EplDllkCalInstance_g.m_auiQueueCnRequests)) { // last node reached
- // restart CnGenReq queue
- EplDllkCalInstance_g.
- m_uiNextQueueCnRequest
- = 0;
- // continue with MnGenReq queue at next SoA
- EplDllkCalInstance_g.
- m_uiNextRequestQueue
- = 2;
- }
- goto Exit;
- }
- }
- // restart CnGenReq queue
- EplDllkCalInstance_g.m_uiNextQueueCnRequest = 0;
- // all CnNmtReq queues are empty -> continue with MnGenReq queue
- EplDllkCalInstance_g.m_uiNextRequestQueue = 2;
- break;
- }
-
- case 2:
- { // MnNmtReq and MnGenReq
- // next queue will be MnIdentReq queue
- EplDllkCalInstance_g.m_uiNextRequestQueue = 3;
- if (*pReqServiceId_p != kEplDllReqServiceNo) {
- *puiNodeId_p = EPL_C_ADR_INVALID; // DLLk must exchange this with the actual node ID
- goto Exit;
- }
- break;
- }
-
- case 3:
- { // MnIdentReq
- // next queue will be MnStatusReq queue
- EplDllkCalInstance_g.m_uiNextRequestQueue = 4;
- if (EplDllkCalInstance_g.m_uiReadIdentReq != EplDllkCalInstance_g.m_uiWriteIdentReq) { // queue is not empty
- *puiNodeId_p =
- EplDllkCalInstance_g.
- m_auiQueueIdentReq
- [EplDllkCalInstance_g.
- m_uiReadIdentReq];
- EplDllkCalInstance_g.m_uiReadIdentReq =
- (EplDllkCalInstance_g.
- m_uiReadIdentReq +
- 1) %
- tabentries(EplDllkCalInstance_g.
- m_auiQueueIdentReq);
- *pReqServiceId_p =
- kEplDllReqServiceIdent;
- goto Exit;
- }
- break;
- }
-
- case 4:
- { // MnStatusReq
- // next queue will be CnGenReq queue
- EplDllkCalInstance_g.m_uiNextRequestQueue = 0;
- if (EplDllkCalInstance_g.m_uiReadStatusReq != EplDllkCalInstance_g.m_uiWriteStatusReq) { // queue is not empty
- *puiNodeId_p =
- EplDllkCalInstance_g.
- m_auiQueueStatusReq
- [EplDllkCalInstance_g.
- m_uiReadStatusReq];
- EplDllkCalInstance_g.m_uiReadStatusReq =
- (EplDllkCalInstance_g.
- m_uiReadStatusReq +
- 1) %
- tabentries(EplDllkCalInstance_g.
- m_auiQueueStatusReq);
- *pReqServiceId_p =
- kEplDllReqServiceStatus;
- goto Exit;
- }
- break;
- }
-
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCalAsyncSetPendingRequests()
-//
-// Description: sets the pending asynchronous frame requests of the specified node.
-// This will add the node to the asynchronous request scheduler.
-//
-// Parameters: uiNodeId_p = node ID
-// AsyncReqPrio_p = asynchronous request priority
-// uiCount_p = count of asynchronous frames
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkCalAsyncSetPendingRequests(unsigned int uiNodeId_p,
- tEplDllAsyncReqPriority
- AsyncReqPrio_p,
- unsigned int uiCount_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // add node to appropriate request queue
- switch (AsyncReqPrio_p) {
- case kEplDllAsyncReqPrioNmt:
- {
- uiNodeId_p--;
- if (uiNodeId_p >=
- (tabentries
- (EplDllkCalInstance_g.m_auiQueueCnRequests) / 2)) {
- Ret = kEplDllInvalidParam;
- goto Exit;
- }
- uiNodeId_p +=
- tabentries(EplDllkCalInstance_g.
- m_auiQueueCnRequests) / 2;
- EplDllkCalInstance_g.m_auiQueueCnRequests[uiNodeId_p] =
- uiCount_p;
- break;
- }
-
- default:
- {
- uiNodeId_p--;
- if (uiNodeId_p >=
- (tabentries
- (EplDllkCalInstance_g.m_auiQueueCnRequests) / 2)) {
- Ret = kEplDllInvalidParam;
- goto Exit;
- }
- EplDllkCalInstance_g.m_auiQueueCnRequests[uiNodeId_p] =
- uiCount_p;
- break;
- }
- }
-
- 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 //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// Callback handler for new data signaling
-//---------------------------------------------------------------------------
-
-#ifndef EPL_NO_FIFO
-/*static void EplDllkCalTxNmtSignalHandler (
- tShbInstance pShbRxInstance_p,
- unsigned long ulDataSize_p)
-{
-tEplKernel Ret = kEplSuccessful;
-tEplEvent Event;
-tEplDllAsyncReqPriority Priority;
-#ifndef EPL_NO_FIFO
-tShbError ShbError;
-unsigned long ulBlockCount;
-
- ShbError = ShbCirGetReadBlockCount (EplDllkCalInstance_g.m_ShbInstanceTxNmt, &ulBlockCount);
- if (ulBlockCount > EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt)
- {
- EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt = ulBlockCount;
- }
-
-#endif
-
- // 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);
-
-}
-
-static void EplDllkCalTxGenSignalHandler (
- tShbInstance pShbRxInstance_p,
- unsigned long ulDataSize_p)
-{
-tEplKernel Ret = kEplSuccessful;
-tEplEvent Event;
-tEplDllAsyncReqPriority Priority;
-#ifndef EPL_NO_FIFO
-tShbError ShbError;
-unsigned long ulBlockCount;
-
- ShbError = ShbCirGetReadBlockCount (EplDllkCalInstance_g.m_ShbInstanceTxGen, &ulBlockCount);
- if (ulBlockCount > EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen)
- {
- EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen = ulBlockCount;
- }
-
-#endif
-
- // 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);
-
-}
-*/
-#endif
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-// EOF