diff options
Diffstat (limited to 'drivers/staging/epl/EplPdou.c')
-rw-r--r-- | drivers/staging/epl/EplPdou.c | 565 |
1 files changed, 0 insertions, 565 deletions
diff --git a/drivers/staging/epl/EplPdou.c b/drivers/staging/epl/EplPdou.c deleted file mode 100644 index d6d0624..0000000 --- a/drivers/staging/epl/EplPdou.c +++ /dev/null @@ -1,565 +0,0 @@ -/**************************************************************************** - - (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29 - www.systec-electronic.com - - Project: openPOWERLINK - - Description: source file for user PDO module - Currently, this module just implements a OD callback function - to check if the PDO configuration is valid. - - 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: EplPdou.c,v $ - - $Author: D.Krueger $ - - $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $ - - $State: Exp $ - - Build Environment: - GCC V3.4 - - ------------------------------------------------------------------------- - - Revision History: - - 2006/05/22 d.k.: start of the implementation, version 1.00 - -****************************************************************************/ - -#include "EplInc.h" -//#include "user/EplPdouCal.h" -#include "user/EplObdu.h" -#include "user/EplPdou.h" -#include "EplSdoAc.h" - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOU)) != 0) - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0) && (EPL_OBD_USE_KERNEL == FALSE) -#error "EPL PDOu module needs EPL module OBDU or OBDK!" -#endif - -/***************************************************************************/ -/* */ -/* */ -/* G L O B A L D E F I N I T I O N S */ -/* */ -/* */ -/***************************************************************************/ - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -#define EPL_PDOU_OBD_IDX_RX_COMM_PARAM 0x1400 -#define EPL_PDOU_OBD_IDX_RX_MAPP_PARAM 0x1600 -#define EPL_PDOU_OBD_IDX_TX_COMM_PARAM 0x1800 -#define EPL_PDOU_OBD_IDX_TX_MAPP_PARAM 0x1A00 -#define EPL_PDOU_OBD_IDX_MAPP_PARAM 0x0200 -#define EPL_PDOU_OBD_IDX_MASK 0xFF00 -#define EPL_PDOU_PDO_ID_MASK 0x00FF - -//--------------------------------------------------------------------------- -// local types -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// modul globale vars -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- - -/***************************************************************************/ -/* */ -/* */ -/* C L A S S EplPdou */ -/* */ -/* */ -/***************************************************************************/ -// -// Description: -// -// -/***************************************************************************/ - -//=========================================================================// -// // -// P R I V A T E D E F I N I T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local types -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local vars -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- - -static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam *pParam_p, - unsigned int uiIndex_p); - -static void EplPdouDecodeObjectMapping(u64 qwObjectMapping_p, - unsigned int *puiIndex_p, - unsigned int *puiSubIndex_p, - unsigned int *puiBitOffset_p, - unsigned int *puiBitSize_p); - -static tEplKernel EplPdouCheckObjectMapping(u64 qwObjectMapping_p, - tEplObdAccess AccessType_p, - u32 * pdwAbortCode_p, - unsigned int *puiPdoSize_p); - -//=========================================================================// -// // -// P U B L I C F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: EplPdouAddInstance() -// -// Description: add and initialize new instance of EPL stack -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplPdouAddInstance(void) -{ - - return kEplSuccessful; -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouDelInstance() -// -// Description: deletes an instance of EPL stack -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplPdouDelInstance(void) -{ - - return kEplSuccessful; -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouCbObdAccess -// -// Description: callback function for OD accesses -// -// Parameters: pParam_p = OBD parameter -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplPdouCbObdAccess(tEplObdCbParam *pParam_p) -{ - tEplKernel Ret = kEplSuccessful; - unsigned int uiPdoId; - unsigned int uiIndexType; - tEplObdSize ObdSize; - u8 bObjectCount; - u64 qwObjectMapping; - tEplObdAccess AccessType; - u8 bMappSubindex; - unsigned int uiCurPdoSize; - u16 wMaxPdoSize; - unsigned int uiSubIndex; - - // fetch PDO ID - uiPdoId = pParam_p->m_uiIndex & EPL_PDOU_PDO_ID_MASK; - - // fetch object index type - uiIndexType = pParam_p->m_uiIndex & EPL_PDOU_OBD_IDX_MASK; - - if (pParam_p->m_ObdEvent != kEplObdEvPreWrite) { // read accesses, post write events etc. are OK - pParam_p->m_dwAbortCode = 0; - goto Exit; - } - // check index type - switch (uiIndexType) { - case EPL_PDOU_OBD_IDX_RX_COMM_PARAM: - // RPDO communication parameter accessed - case EPL_PDOU_OBD_IDX_TX_COMM_PARAM: - { // TPDO communication parameter accessed - Ret = EplPdouCheckPdoValidity(pParam_p, - (EPL_PDOU_OBD_IDX_MAPP_PARAM - | pParam_p->m_uiIndex)); - if (Ret != kEplSuccessful) { // PDO is valid or does not exist - goto Exit; - } - - goto Exit; - } - - case EPL_PDOU_OBD_IDX_RX_MAPP_PARAM: - { // RPDO mapping parameter accessed - - AccessType = kEplObdAccWrite; - break; - } - - case EPL_PDOU_OBD_IDX_TX_MAPP_PARAM: - { // TPDO mapping parameter accessed - - AccessType = kEplObdAccRead; - break; - } - - default: - { // this callback function is only for - // PDO mapping and communication parameters - pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR; - goto Exit; - } - } - - // RPDO and TPDO mapping parameter accessed - - if (pParam_p->m_uiSubIndex == 0) { // object mapping count accessed - - // PDO is enabled or disabled - bObjectCount = *((u8 *) pParam_p->m_pArg); - - if (bObjectCount == 0) { // PDO shall be disabled - - // that is always possible - goto Exit; - } - // PDO shall be enabled - // it should have been disabled for this operation - Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex); - if (Ret != kEplSuccessful) { // PDO is valid or does not exist - goto Exit; - } - - if (AccessType == kEplObdAccWrite) { - uiSubIndex = 0x04; // PReqActPayloadLimit_U16 - } else { - uiSubIndex = 0x05; // PResActPayloadLimit_U16 - } - - // fetch maximum PDO size from Object 1F98h: NMT_CycleTiming_REC - ObdSize = sizeof(wMaxPdoSize); - Ret = - EplObduReadEntry(0x1F98, uiSubIndex, &wMaxPdoSize, - &ObdSize); - if (Ret != kEplSuccessful) { // other fatal error occured - pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR; - goto Exit; - } - // check all objectmappings - for (bMappSubindex = 1; bMappSubindex <= bObjectCount; - bMappSubindex++) { - // read object mapping from OD - ObdSize = sizeof(qwObjectMapping); // u64 - Ret = EplObduReadEntry(pParam_p->m_uiIndex, - bMappSubindex, &qwObjectMapping, - &ObdSize); - if (Ret != kEplSuccessful) { // other fatal error occured - pParam_p->m_dwAbortCode = - EPL_SDOAC_GENERAL_ERROR; - goto Exit; - } - // check object mapping - Ret = EplPdouCheckObjectMapping(qwObjectMapping, - AccessType, - &pParam_p-> - m_dwAbortCode, - &uiCurPdoSize); - if (Ret != kEplSuccessful) { // illegal object mapping - goto Exit; - } - - if (uiCurPdoSize > wMaxPdoSize) { // mapping exceeds object size - pParam_p->m_dwAbortCode = - EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoVarNotFound; - } - - } - - } else { // ObjectMapping - Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex); - if (Ret != kEplSuccessful) { // PDO is valid or does not exist - goto Exit; - } - // check existence of object and validity of object length - - qwObjectMapping = *((u64 *) pParam_p->m_pArg); - - Ret = EplPdouCheckObjectMapping(qwObjectMapping, - AccessType, - &pParam_p->m_dwAbortCode, - &uiCurPdoSize); - - } - - Exit: - return Ret; -} - -//=========================================================================// -// // -// P R I V A T E F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: EplPdouCheckPdoValidity -// -// Description: check if PDO is valid -// -// Parameters: pParam_p = OBD parameter -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam *pParam_p, - unsigned int uiIndex_p) -{ - tEplKernel Ret = kEplSuccessful; - tEplObdSize ObdSize; - u8 bObjectCount; - - ObdSize = 1; - // read number of mapped objects from OD; this indicates if the PDO is valid - Ret = EplObduReadEntry(uiIndex_p, 0x00, &bObjectCount, &ObdSize); - if (Ret != kEplSuccessful) { // other fatal error occured - pParam_p->m_dwAbortCode = - EPL_SDOAC_GEN_INTERNAL_INCOMPATIBILITY; - goto Exit; - } - // entry read successfully - if (bObjectCount != 0) { // PDO in OD is still valid - pParam_p->m_dwAbortCode = EPL_SDOAC_GEN_PARAM_INCOMPATIBILITY; - Ret = kEplPdoNotExist; - goto Exit; - } - - Exit: - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouDecodeObjectMapping -// -// Description: decodes the given object mapping entry into index, subindex, -// bit offset and bit size. -// -// Parameters: qwObjectMapping_p = object mapping entry -// puiIndex_p = [OUT] pointer to object index -// puiSubIndex_p = [OUT] pointer to subindex -// puiBitOffset_p = [OUT] pointer to bit offset -// puiBitSize_p = [OUT] pointer to bit size -// -// Returns: (void) -// -// State: -// -//--------------------------------------------------------------------------- - -static void EplPdouDecodeObjectMapping(u64 qwObjectMapping_p, - unsigned int *puiIndex_p, - unsigned int *puiSubIndex_p, - unsigned int *puiBitOffset_p, - unsigned int *puiBitSize_p) -{ - *puiIndex_p = (unsigned int) - (qwObjectMapping_p & 0x000000000000FFFFLL); - - *puiSubIndex_p = (unsigned int) - ((qwObjectMapping_p & 0x0000000000FF0000LL) >> 16); - - *puiBitOffset_p = (unsigned int) - ((qwObjectMapping_p & 0x0000FFFF00000000LL) >> 32); - - *puiBitSize_p = (unsigned int) - ((qwObjectMapping_p & 0xFFFF000000000000LL) >> 48); - -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouCheckObjectMapping -// -// Description: checks the given object mapping entry. -// -// Parameters: qwObjectMapping_p = object mapping entry -// AccessType_p = access type to mapped object: -// write = RPDO and read = TPDO -// puiPdoSize_p = [OUT] pointer to covered PDO size -// (offset + size) in byte; -// 0 if mapping failed -// pdwAbortCode_p = [OUT] pointer to SDO abort code; -// 0 if mapping is possible -// -// Returns: tEplKernel = error code -// -// State: -// -//--------------------------------------------------------------------------- - -static tEplKernel EplPdouCheckObjectMapping(u64 qwObjectMapping_p, - tEplObdAccess AccessType_p, - u32 * pdwAbortCode_p, - unsigned int *puiPdoSize_p) -{ - tEplKernel Ret = kEplSuccessful; - tEplObdSize ObdSize; - unsigned int uiIndex; - unsigned int uiSubIndex; - unsigned int uiBitOffset; - unsigned int uiBitSize; - tEplObdAccess AccessType; - BOOL fNumerical; - - if (qwObjectMapping_p == 0) { // discard zero value - *puiPdoSize_p = 0; - goto Exit; - } - // decode object mapping - EplPdouDecodeObjectMapping(qwObjectMapping_p, - &uiIndex, - &uiSubIndex, &uiBitOffset, &uiBitSize); - - if ((uiBitOffset & 0x7) != 0x0) { // bit mapping is not supported - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoGranularityMismatch; - goto Exit; - } - - if ((uiBitSize & 0x7) != 0x0) { // bit mapping is not supported - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoGranularityMismatch; - goto Exit; - } - // check access type - Ret = EplObduGetAccessType(uiIndex, uiSubIndex, &AccessType); - if (Ret != kEplSuccessful) { // entry doesn't exist - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST; - goto Exit; - } - - if ((AccessType & kEplObdAccPdo) == 0) { // object is not mappable - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE; - Ret = kEplPdoVarNotFound; - goto Exit; - } - - if ((AccessType & AccessType_p) == 0) { // object is not writeable (RPDO) or readable (TPDO) respectively - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE; - Ret = kEplPdoVarNotFound; - goto Exit; - } - - ObdSize = EplObduGetDataSize(uiIndex, uiSubIndex); - if (ObdSize < (uiBitSize >> 3)) { // object does not exist or has smaller size - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoVarNotFound; - } - - Ret = EplObduIsNumerical(uiIndex, uiSubIndex, &fNumerical); - if (Ret != kEplSuccessful) { // entry doesn't exist - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST; - goto Exit; - } - - if ((fNumerical != FALSE) - && ((uiBitSize >> 3) != ObdSize)) { - // object is numerical, - // therefor size has to fit, but it does not. - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoVarNotFound; - goto Exit; - } - // calucaled needed PDO size - *puiPdoSize_p = (uiBitOffset >> 3) + (uiBitSize >> 3); - - Exit: - return Ret; -} - -#endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOU)) != 0) - -// EOF |