source "drivers/staging/frontier/Kconfig"
-source "drivers/staging/epl/Kconfig"
-
source "drivers/staging/android/Kconfig"
source "drivers/staging/dream/Kconfig"
obj-$(CONFIG_USB_RSPI) += rspiusb/
obj-$(CONFIG_INPUT_MIMIO) += mimio/
obj-$(CONFIG_TRANZPORT) += frontier/
-obj-$(CONFIG_EPL) += epl/
obj-$(CONFIG_ANDROID) += android/
obj-$(CONFIG_ANDROID) += dream/
obj-$(CONFIG_DST) += dst/
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: header file for benchmarking
-
- 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: Benchmark.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- ...
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/08/16 d.k.: start of implementation
-
-****************************************************************************/
-
-#ifndef _BENCHMARK_H_
-#define _BENCHMARK_H_
-
-#include "global.h"
-
-#include <linux/kernel.h>
-
-#ifdef CONFIG_COLDFIRE
-#include <asm/coldfire.h>
-#include <asm/m5485gpio.h>
-
-#define BENCHMARK_SET(x) MCF_GPIO_PODR_PCIBG |= (1 << (x)) // (x+1)
-#define BENCHMARK_RESET(x) MCF_GPIO_PODR_PCIBG &= ~(1 << (x)) // (x+1)
-#define BENCHMARK_TOGGLE(x) MCF_GPIO_PODR_PCIBR ^= (1 << (x - 5))
-#else
-#undef BENCHMARK_MODULES
-#define BENCHMARK_MODULES 0x00000000
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef BENCHMARK_MODULES
-#define BENCHMARK_MODULES 0x00000000
-#endif
-
-#define BENCHMARK_MOD_01 0x00000001
-#define BENCHMARK_MOD_02 0x00000002
-#define BENCHMARK_MOD_03 0x00000004
-#define BENCHMARK_MOD_04 0x00000008
-#define BENCHMARK_MOD_05 0x00000010
-#define BENCHMARK_MOD_06 0x00000020
-#define BENCHMARK_MOD_07 0x00000040
-#define BENCHMARK_MOD_08 0x00000080
-#define BENCHMARK_MOD_09 0x00000100
-#define BENCHMARK_MOD_10 0x00000200
-#define BENCHMARK_MOD_11 0x00000400
-#define BENCHMARK_MOD_12 0x00000800
-#define BENCHMARK_MOD_13 0x00001000
-#define BENCHMARK_MOD_14 0x00002000
-#define BENCHMARK_MOD_15 0x00004000
-#define BENCHMARK_MOD_16 0x00008000
-#define BENCHMARK_MOD_17 0x00010000
-#define BENCHMARK_MOD_18 0x00020000
-#define BENCHMARK_MOD_19 0x00040000
-#define BENCHMARK_MOD_20 0x00080000
-#define BENCHMARK_MOD_21 0x00100000
-#define BENCHMARK_MOD_22 0x00200000
-#define BENCHMARK_MOD_23 0x00400000
-#define BENCHMARK_MOD_24 0x00800000
-#define BENCHMARK_MOD_25 0x01000000
-#define BENCHMARK_MOD_26 0x02000000
-#define BENCHMARK_MOD_27 0x04000000
-#define BENCHMARK_MOD_28 0x08000000
-#define BENCHMARK_MOD_29 0x10000000
-#define BENCHMARK_MOD_30 0x20000000
-#define BENCHMARK_MOD_31 0x40000000
-#define BENCHMARK_MOD_32 0x80000000
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_01)
-#define BENCHMARK_MOD_01_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_01_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_01_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_01_SET(x)
-#define BENCHMARK_MOD_01_RESET(x)
-#define BENCHMARK_MOD_01_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_02)
-#define BENCHMARK_MOD_02_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_02_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_02_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_02_SET(x)
-#define BENCHMARK_MOD_02_RESET(x)
-#define BENCHMARK_MOD_02_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_03)
-#define BENCHMARK_MOD_03_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_03_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_03_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_03_SET(x)
-#define BENCHMARK_MOD_03_RESET(x)
-#define BENCHMARK_MOD_03_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_04)
-#define BENCHMARK_MOD_04_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_04_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_04_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_04_SET(x)
-#define BENCHMARK_MOD_04_RESET(x)
-#define BENCHMARK_MOD_04_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_05)
-#define BENCHMARK_MOD_05_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_05_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_05_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_05_SET(x)
-#define BENCHMARK_MOD_05_RESET(x)
-#define BENCHMARK_MOD_05_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_06)
-#define BENCHMARK_MOD_06_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_06_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_06_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_06_SET(x)
-#define BENCHMARK_MOD_06_RESET(x)
-#define BENCHMARK_MOD_06_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_07)
-#define BENCHMARK_MOD_07_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_07_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_07_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_07_SET(x)
-#define BENCHMARK_MOD_07_RESET(x)
-#define BENCHMARK_MOD_07_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_08)
-#define BENCHMARK_MOD_08_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_08_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_08_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_08_SET(x)
-#define BENCHMARK_MOD_08_RESET(x)
-#define BENCHMARK_MOD_08_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_09)
-#define BENCHMARK_MOD_09_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_09_RESET(x) BENCHMARK_RESET(x)
-#define BENCHMARK_MOD_09_TOGGLE(x) BENCHMARK_TOGGLE(x)
-#else
-#define BENCHMARK_MOD_09_SET(x)
-#define BENCHMARK_MOD_09_RESET(x)
-#define BENCHMARK_MOD_09_TOGGLE(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_10)
-#define BENCHMARK_MOD_10_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_10_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_10_SET(x)
-#define BENCHMARK_MOD_10_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_11)
-#define BENCHMARK_MOD_11_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_11_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_11_SET(x)
-#define BENCHMARK_MOD_11_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_12)
-#define BENCHMARK_MOD_12_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_12_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_12_SET(x)
-#define BENCHMARK_MOD_12_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_13)
-#define BENCHMARK_MOD_13_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_13_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_13_SET(x)
-#define BENCHMARK_MOD_13_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_14)
-#define BENCHMARK_MOD_14_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_14_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_14_SET(x)
-#define BENCHMARK_MOD_14_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_15)
-#define BENCHMARK_MOD_15_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_15_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_15_SET(x)
-#define BENCHMARK_MOD_15_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_16)
-#define BENCHMARK_MOD_16_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_16_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_16_SET(x)
-#define BENCHMARK_MOD_16_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_17)
-#define BENCHMARK_MOD_17_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_17_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_17_SET(x)
-#define BENCHMARK_MOD_17_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_18)
-#define BENCHMARK_MOD_18_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_18_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_18_SET(x)
-#define BENCHMARK_MOD_18_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_19)
-#define BENCHMARK_MOD_19_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_19_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_19_SET(x)
-#define BENCHMARK_MOD_19_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_20)
-#define BENCHMARK_MOD_20_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_20_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_20_SET(x)
-#define BENCHMARK_MOD_20_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_21)
-#define BENCHMARK_MOD_21_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_21_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_21_SET(x)
-#define BENCHMARK_MOD_21_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_22)
-#define BENCHMARK_MOD_22_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_22_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_22_SET(x)
-#define BENCHMARK_MOD_22_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_23)
-#define BENCHMARK_MOD_23_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_23_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_23_SET(x)
-#define BENCHMARK_MOD_23_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_24)
-#define BENCHMARK_MOD_24_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_24_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_24_SET(x)
-#define BENCHMARK_MOD_24_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_25)
-#define BENCHMARK_MOD_25_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_25_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_25_SET(x)
-#define BENCHMARK_MOD_25_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_26)
-#define BENCHMARK_MOD_26_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_26_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_26_SET(x)
-#define BENCHMARK_MOD_26_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_27)
-#define BENCHMARK_MOD_27_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_27_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_27_SET(x)
-#define BENCHMARK_MOD_27_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_28)
-#define BENCHMARK_MOD_28_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_28_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_28_SET(x)
-#define BENCHMARK_MOD_28_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_29)
-#define BENCHMARK_MOD_29_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_29_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_29_SET(x)
-#define BENCHMARK_MOD_29_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_30)
-#define BENCHMARK_MOD_30_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_30_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_30_SET(x)
-#define BENCHMARK_MOD_30_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_31)
-#define BENCHMARK_MOD_31_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_31_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_31_SET(x)
-#define BENCHMARK_MOD_31_RESET(x)
-#endif
-
-#if (BENCHMARK_MODULES & BENCHMARK_MOD_32)
-#define BENCHMARK_MOD_32_SET(x) BENCHMARK_SET(x)
-#define BENCHMARK_MOD_32_RESET(x) BENCHMARK_RESET(x)
-#else
-#define BENCHMARK_MOD_32_SET(x)
-#define BENCHMARK_MOD_32_RESET(x)
-#endif
-
-//---------------------------------------------------------------------------
-// modul global types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-#endif // _BENCHMARK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: Debug interface
-
- 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: Debug.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- ...
-
- -------------------------------------------------------------------------
-
- Revision History:
-
-****************************************************************************/
-
-#ifndef _DEBUG_H_
-#define _DEBUG_H_
-
-#include "global.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// global const defines
-//---------------------------------------------------------------------------
-
-// These definitions are important for level-debug traces.
-// A macro DEBUG_GLB_LVL() defines the current debug-level using following bis.
-// If the corresponding bit is set then trace message will be printed out
-// (only if NDEBUG is not defined). The upper debug-levels are reserved for
-// the debug-levels ALWAYS, ERROR and ASSERT.
-#define DEBUG_LVL_01 0x00000001
-#define DEBUG_LVL_02 0x00000002
-#define DEBUG_LVL_03 0x00000004
-#define DEBUG_LVL_04 0x00000008
-#define DEBUG_LVL_05 0x00000010
-#define DEBUG_LVL_06 0x00000020
-#define DEBUG_LVL_07 0x00000040
-#define DEBUG_LVL_08 0x00000080
-#define DEBUG_LVL_09 0x00000100
-#define DEBUG_LVL_10 0x00000200
-#define DEBUG_LVL_11 0x00000400
-#define DEBUG_LVL_12 0x00000800
-#define DEBUG_LVL_13 0x00001000
-#define DEBUG_LVL_14 0x00002000
-#define DEBUG_LVL_15 0x00004000
-#define DEBUG_LVL_16 0x00008000
-#define DEBUG_LVL_17 0x00010000
-#define DEBUG_LVL_18 0x00020000
-#define DEBUG_LVL_19 0x00040000
-#define DEBUG_LVL_20 0x00080000
-#define DEBUG_LVL_21 0x00100000
-#define DEBUG_LVL_22 0x00200000
-#define DEBUG_LVL_23 0x00400000
-#define DEBUG_LVL_24 0x00800000
-#define DEBUG_LVL_25 0x01000000
-#define DEBUG_LVL_26 0x02000000
-#define DEBUG_LVL_27 0x04000000
-#define DEBUG_LVL_28 0x08000000
-#define DEBUG_LVL_29 0x10000000
-#define DEBUG_LVL_ASSERT 0x20000000
-#define DEBUG_LVL_ERROR 0x40000000
-#define DEBUG_LVL_ALWAYS 0x80000000
-
-//---------------------------------------------------------------------------
-// global types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// global vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// global function prototypes
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// global macros
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// this macro defines a version string
-
-
-//---------------------------------------------------------------------------
-// this macro defines a build info string (e.g. for using in printf())
-#define DEBUG_MAKE_BUILD_INFO(prefix,product,prodid,descr,verstr,author) "\n" \
- prefix "***************************************************\n" \
- prefix "Project: " product ", " prodid "\n" \
- prefix "Descript.: " descr "\n" \
- prefix "Author: " author "\n" \
- prefix "Date: " __DATE__ "\n" \
- prefix "Version: " verstr "\n" \
- prefix "***************************************************\n\n"
-
-//---------------------------------------------------------------------------
-// The default debug-level is: ERROR and ALWAYS.
-// You can define an other debug-level in project settings.
-#ifndef DEF_DEBUG_LVL
-#define DEF_DEBUG_LVL (DEBUG_LVL_ALWAYS | DEBUG_LVL_ERROR)
-#endif
-#ifndef DEBUG_GLB_LVL
-#define DEBUG_GLB_LVL() (DEF_DEBUG_LVL)
-#endif
-
-//---------------------------------------------------------------------------
- // At microcontrollers we do reduce the memory usage by deleting DEBUG_TRACE-lines
- // (compiler does delete the lines).
- //
- // Here the parameter 'lvl' can only be used with one debug-level.
- //
- // Example: DEBUG_TRACE1(DEBUG_LVL_ERROR, "error code %d", dwRet);
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_ALWAYS)
-#define DEBUG_LVL_ALWAYS_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_ALWAYS_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_ALWAYS_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_ALWAYS_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_ALWAYS_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_ALWAYS_TRACE0(str)
-#define DEBUG_LVL_ALWAYS_TRACE1(str,p1)
-#define DEBUG_LVL_ALWAYS_TRACE2(str,p1,p2)
-#define DEBUG_LVL_ALWAYS_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_ALWAYS_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_ERROR)
-#define DEBUG_LVL_ERROR_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_ERROR_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_ERROR_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_ERROR_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_ERROR_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_ERROR_TRACE0(str)
-#define DEBUG_LVL_ERROR_TRACE1(str,p1)
-#define DEBUG_LVL_ERROR_TRACE2(str,p1,p2)
-#define DEBUG_LVL_ERROR_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_ERROR_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_ASSERT)
-#define DEBUG_LVL_ASSERT_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_ASSERT_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_ASSERT_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_ASSERT_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_ASSERT_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_ASSERT_TRACE0(str)
-#define DEBUG_LVL_ASSERT_TRACE1(str,p1)
-#define DEBUG_LVL_ASSERT_TRACE2(str,p1,p2)
-#define DEBUG_LVL_ASSERT_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_ASSERT_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_29)
-#define DEBUG_LVL_29_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_29_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_29_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_29_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_29_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_29_TRACE0(str)
-#define DEBUG_LVL_29_TRACE1(str,p1)
-#define DEBUG_LVL_29_TRACE2(str,p1,p2)
-#define DEBUG_LVL_29_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_29_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_28)
-#define DEBUG_LVL_28_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_28_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_28_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_28_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_28_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_28_TRACE0(str)
-#define DEBUG_LVL_28_TRACE1(str,p1)
-#define DEBUG_LVL_28_TRACE2(str,p1,p2)
-#define DEBUG_LVL_28_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_28_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_27)
-#define DEBUG_LVL_27_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_27_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_27_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_27_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_27_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_27_TRACE0(str)
-#define DEBUG_LVL_27_TRACE1(str,p1)
-#define DEBUG_LVL_27_TRACE2(str,p1,p2)
-#define DEBUG_LVL_27_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_27_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_26)
-#define DEBUG_LVL_26_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_26_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_26_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_26_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_26_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_26_TRACE0(str)
-#define DEBUG_LVL_26_TRACE1(str,p1)
-#define DEBUG_LVL_26_TRACE2(str,p1,p2)
-#define DEBUG_LVL_26_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_26_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_25)
-#define DEBUG_LVL_25_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_25_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_25_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_25_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_25_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_25_TRACE0(str)
-#define DEBUG_LVL_25_TRACE1(str,p1)
-#define DEBUG_LVL_25_TRACE2(str,p1,p2)
-#define DEBUG_LVL_25_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_25_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_24)
-#define DEBUG_LVL_24_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_24_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_24_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_24_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_24_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_24_TRACE0(str)
-#define DEBUG_LVL_24_TRACE1(str,p1)
-#define DEBUG_LVL_24_TRACE2(str,p1,p2)
-#define DEBUG_LVL_24_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_24_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_23)
-#define DEBUG_LVL_23_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_23_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_23_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_23_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_23_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_23_TRACE0(str)
-#define DEBUG_LVL_23_TRACE1(str,p1)
-#define DEBUG_LVL_23_TRACE2(str,p1,p2)
-#define DEBUG_LVL_23_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_23_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_22)
-#define DEBUG_LVL_22_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_22_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_22_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_22_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_22_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_22_TRACE0(str)
-#define DEBUG_LVL_22_TRACE1(str,p1)
-#define DEBUG_LVL_22_TRACE2(str,p1,p2)
-#define DEBUG_LVL_22_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_22_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_21)
-#define DEBUG_LVL_21_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_21_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_21_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_21_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_21_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_21_TRACE0(str)
-#define DEBUG_LVL_21_TRACE1(str,p1)
-#define DEBUG_LVL_21_TRACE2(str,p1,p2)
-#define DEBUG_LVL_21_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_21_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_20)
-#define DEBUG_LVL_20_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_20_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_20_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_20_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_20_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_20_TRACE0(str)
-#define DEBUG_LVL_20_TRACE1(str,p1)
-#define DEBUG_LVL_20_TRACE2(str,p1,p2)
-#define DEBUG_LVL_20_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_20_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_19)
-#define DEBUG_LVL_19_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_19_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_19_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_19_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_19_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_19_TRACE0(str)
-#define DEBUG_LVL_19_TRACE1(str,p1)
-#define DEBUG_LVL_19_TRACE2(str,p1,p2)
-#define DEBUG_LVL_19_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_19_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_18)
-#define DEBUG_LVL_18_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_18_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_18_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_18_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_18_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_18_TRACE0(str)
-#define DEBUG_LVL_18_TRACE1(str,p1)
-#define DEBUG_LVL_18_TRACE2(str,p1,p2)
-#define DEBUG_LVL_18_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_18_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_17)
-#define DEBUG_LVL_17_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_17_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_17_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_17_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_17_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_17_TRACE0(str)
-#define DEBUG_LVL_17_TRACE1(str,p1)
-#define DEBUG_LVL_17_TRACE2(str,p1,p2)
-#define DEBUG_LVL_17_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_17_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_16)
-#define DEBUG_LVL_16_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_16_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_16_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_16_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_16_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_16_TRACE0(str)
-#define DEBUG_LVL_16_TRACE1(str,p1)
-#define DEBUG_LVL_16_TRACE2(str,p1,p2)
-#define DEBUG_LVL_16_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_16_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_15)
-#define DEBUG_LVL_15_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_15_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_15_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_15_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_15_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_15_TRACE0(str)
-#define DEBUG_LVL_15_TRACE1(str,p1)
-#define DEBUG_LVL_15_TRACE2(str,p1,p2)
-#define DEBUG_LVL_15_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_15_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_14)
-#define DEBUG_LVL_14_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_14_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_14_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_14_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_14_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_14_TRACE0(str)
-#define DEBUG_LVL_14_TRACE1(str,p1)
-#define DEBUG_LVL_14_TRACE2(str,p1,p2)
-#define DEBUG_LVL_14_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_14_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_13)
-#define DEBUG_LVL_13_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_13_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_13_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_13_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_13_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_13_TRACE0(str)
-#define DEBUG_LVL_13_TRACE1(str,p1)
-#define DEBUG_LVL_13_TRACE2(str,p1,p2)
-#define DEBUG_LVL_13_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_13_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_12)
-#define DEBUG_LVL_12_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_12_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_12_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_12_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_12_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_12_TRACE0(str)
-#define DEBUG_LVL_12_TRACE1(str,p1)
-#define DEBUG_LVL_12_TRACE2(str,p1,p2)
-#define DEBUG_LVL_12_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_12_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_11)
-#define DEBUG_LVL_11_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_11_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_11_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_11_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_11_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_11_TRACE0(str)
-#define DEBUG_LVL_11_TRACE1(str,p1)
-#define DEBUG_LVL_11_TRACE2(str,p1,p2)
-#define DEBUG_LVL_11_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_11_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_10)
-#define DEBUG_LVL_10_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_10_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_10_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_10_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_10_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_10_TRACE0(str)
-#define DEBUG_LVL_10_TRACE1(str,p1)
-#define DEBUG_LVL_10_TRACE2(str,p1,p2)
-#define DEBUG_LVL_10_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_10_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_09)
-#define DEBUG_LVL_09_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_09_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_09_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_09_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_09_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_09_TRACE0(str)
-#define DEBUG_LVL_09_TRACE1(str,p1)
-#define DEBUG_LVL_09_TRACE2(str,p1,p2)
-#define DEBUG_LVL_09_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_09_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_08)
-#define DEBUG_LVL_08_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_08_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_08_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_08_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_08_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_08_TRACE0(str)
-#define DEBUG_LVL_08_TRACE1(str,p1)
-#define DEBUG_LVL_08_TRACE2(str,p1,p2)
-#define DEBUG_LVL_08_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_08_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_07)
-#define DEBUG_LVL_07_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_07_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_07_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_07_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_07_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_07_TRACE0(str)
-#define DEBUG_LVL_07_TRACE1(str,p1)
-#define DEBUG_LVL_07_TRACE2(str,p1,p2)
-#define DEBUG_LVL_07_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_07_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_06)
-#define DEBUG_LVL_06_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_06_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_06_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_06_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_06_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_06_TRACE0(str)
-#define DEBUG_LVL_06_TRACE1(str,p1)
-#define DEBUG_LVL_06_TRACE2(str,p1,p2)
-#define DEBUG_LVL_06_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_06_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_05)
-#define DEBUG_LVL_05_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_05_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_05_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_05_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_05_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_05_TRACE0(str)
-#define DEBUG_LVL_05_TRACE1(str,p1)
-#define DEBUG_LVL_05_TRACE2(str,p1,p2)
-#define DEBUG_LVL_05_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_05_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_04)
-#define DEBUG_LVL_04_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_04_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_04_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_04_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_04_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_04_TRACE0(str)
-#define DEBUG_LVL_04_TRACE1(str,p1)
-#define DEBUG_LVL_04_TRACE2(str,p1,p2)
-#define DEBUG_LVL_04_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_04_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_03)
-#define DEBUG_LVL_03_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_03_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_03_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_03_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_03_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_03_TRACE0(str)
-#define DEBUG_LVL_03_TRACE1(str,p1)
-#define DEBUG_LVL_03_TRACE2(str,p1,p2)
-#define DEBUG_LVL_03_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_03_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_02)
-#define DEBUG_LVL_02_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_02_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_02_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_02_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_02_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_02_TRACE0(str)
-#define DEBUG_LVL_02_TRACE1(str,p1)
-#define DEBUG_LVL_02_TRACE2(str,p1,p2)
-#define DEBUG_LVL_02_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_02_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#if (DEBUG_GLB_LVL() & DEBUG_LVL_01)
-#define DEBUG_LVL_01_TRACE0(str) TRACE0(str)
-#define DEBUG_LVL_01_TRACE1(str,p1) TRACE1(str,p1)
-#define DEBUG_LVL_01_TRACE2(str,p1,p2) TRACE2(str,p1,p2)
-#define DEBUG_LVL_01_TRACE3(str,p1,p2,p3) TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_01_TRACE4(str,p1,p2,p3,p4) TRACE4(str,p1,p2,p3,p4)
-#else
-#define DEBUG_LVL_01_TRACE0(str)
-#define DEBUG_LVL_01_TRACE1(str,p1)
-#define DEBUG_LVL_01_TRACE2(str,p1,p2)
-#define DEBUG_LVL_01_TRACE3(str,p1,p2,p3)
-#define DEBUG_LVL_01_TRACE4(str,p1,p2,p3,p4)
-#endif
-
-#define DEBUG_TRACE0(lvl,str) lvl##_TRACE0(str)
-#define DEBUG_TRACE1(lvl,str,p1) lvl##_TRACE1(str,p1)
-#define DEBUG_TRACE2(lvl,str,p1,p2) lvl##_TRACE2(str,p1,p2)
-#define DEBUG_TRACE3(lvl,str,p1,p2,p3) lvl##_TRACE3(str,p1,p2,p3)
-#define DEBUG_TRACE4(lvl,str,p1,p2,p3,p4) lvl##_TRACE4(str,p1,p2,p3,p4)
-
-//---------------------------------------------------------------------------
-// The macro DEBUG_DUMP_DATA() can be used with the same debug-levels to dump
-// out data bytes. Function DumpData() has to be included.
-// NOTE: DUMP_DATA has to be defined in project settings.
-#if (!defined (NDEBUG) && defined (DUMP_DATA))
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- void DumpData(char *szStr_p, u8 *pbData_p, u16 wSize_p);
-
-#ifdef __cplusplus
-} // von extern "C"
-#endif
-#define DEBUG_DUMP_DATA(lvl,str,ptr,siz) if ((DEBUG_GLB_LVL() & (lvl))==(lvl)) \
- DumpData (str, (u8 *)(ptr), (u16)(siz));
-#else
-
-#define DEBUG_DUMP_DATA(lvl,str,ptr,siz)
-
-#endif
-
-//---------------------------------------------------------------------------
-// The macro DEBUG_ASSERT() can be used to print out an error string if the
-// parametered expresion does not result TRUE.
-// NOTE: If DEBUG_KEEP_ASSERT is defined, then DEBUG_ASSERT-line will not be
-// deleted from compiler (in release version too).
-#if !defined (NDEBUG) || defined (DEBUG_KEEP_ASSERT)
-
- // For microcontrollers process will be stopped using endless loop.
-
-#define DEBUG_ASSERT0(expr,str) if (!(expr )) { \
- DEBUG_LVL_ASSERT_TRACE3 ( \
- "Assertion failed: line %d file '%s'\n" \
- " -> '%s'\n", __LINE__, __FILE__, str); \
- while (1); }
-
-#define DEBUG_ASSERT1(expr,str,p1) if (!(expr )) { \
- DEBUG_LVL_ASSERT_TRACE4 ( \
- "Assertion failed: line %d file '%s'\n" \
- " -> '%s'\n" \
- " -> 0x%08lX\n", __LINE__, __FILE__, str, (u32) p1); \
- while (1); }
-
-
-#else
-
-#define DEBUG_ASSERT0(expr,str)
-#define DEBUG_ASSERT1(expr,str,p1)
-
-#endif
-
-//---------------------------------------------------------------------------
-// The macro DEBUG_ONLY() implements code, if NDEBUG is not defined.
-#if !defined (DEBUG_ONLY)
-#if !defined (NDEBUG)
-
-#define DEBUG_ONLY(expr) expr
-
-#else
-
-#define DEBUG_ONLY(expr)
-
-#endif
-#endif
-
-#endif // _DEBUG_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: Ethernet driver for Realtek RTL8139 chips
- except the RTL8139C+, because it has a different
- Tx descriptor handling.
-
- 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: Edrv8139.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.10 $ $Date: 2008/11/21 09:00:38 $
-
- $State: Exp $
-
- Build Environment:
- Dev C++ and GNU-Compiler for m68k
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2008/02/05 d.k.: start of implementation
-
-****************************************************************************/
-
-#include "global.h"
-#include "EplInc.h"
-#include "edrv.h"
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/major.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/atomic.h>
-#include <asm/irq.h>
-#include <linux/sched.h>
-#include <linux/delay.h>
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-// Buffer handling:
-// All buffers are created statically (i.e. at compile time resp. at
-// initialisation via kmalloc() ) and not dynamically on request (i.e. via
-// EdrvAllocTxMsgBuffer().
-// EdrvAllocTxMsgBuffer() searches for an unused buffer which is large enough.
-// EdrvInit() may allocate some buffers with sizes less than maximum frame
-// size (i.e. 1514 bytes), e.g. for SoC, SoA, StatusResponse, IdentResponse,
-// NMT requests / commands. The less the size of the buffer the less the
-// number of the buffer.
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef EDRV_MAX_TX_BUFFERS
-#define EDRV_MAX_TX_BUFFERS 20
-#endif
-
-#define EDRV_MAX_FRAME_SIZE 0x600
-
-#define EDRV_RX_BUFFER_SIZE 0x8610 // 32 kB + 16 Byte + 1,5 kB (WRAP is enabled)
-#define EDRV_RX_BUFFER_LENGTH (EDRV_RX_BUFFER_SIZE & 0xF800) // buffer size cut down to 2 kB alignment
-
-#define EDRV_TX_BUFFER_SIZE (EDRV_MAX_TX_BUFFERS * EDRV_MAX_FRAME_SIZE) // n * (MTU + 14 + 4)
-
-#define DRV_NAME "epl"
-
-#define EDRV_REGW_INT_MASK 0x3C // interrupt mask register
-#define EDRV_REGW_INT_STATUS 0x3E // interrupt status register
-#define EDRV_REGW_INT_ROK 0x0001 // Receive OK interrupt
-#define EDRV_REGW_INT_RER 0x0002 // Receive error interrupt
-#define EDRV_REGW_INT_TOK 0x0004 // Transmit OK interrupt
-#define EDRV_REGW_INT_TER 0x0008 // Transmit error interrupt
-#define EDRV_REGW_INT_RXOVW 0x0010 // Rx buffer overflow interrupt
-#define EDRV_REGW_INT_PUN 0x0020 // Packet underrun/ link change interrupt
-#define EDRV_REGW_INT_FOVW 0x0040 // Rx FIFO overflow interrupt
-#define EDRV_REGW_INT_LENCHG 0x2000 // Cable length change interrupt
-#define EDRV_REGW_INT_TIMEOUT 0x4000 // Time out interrupt
-#define EDRV_REGW_INT_SERR 0x8000 // System error interrupt
-#define EDRV_REGW_INT_MASK_DEF (EDRV_REGW_INT_ROK \
- | EDRV_REGW_INT_RER \
- | EDRV_REGW_INT_TOK \
- | EDRV_REGW_INT_TER \
- | EDRV_REGW_INT_RXOVW \
- | EDRV_REGW_INT_FOVW \
- | EDRV_REGW_INT_PUN \
- | EDRV_REGW_INT_TIMEOUT \
- | EDRV_REGW_INT_SERR) // default interrupt mask
-
-#define EDRV_REGB_COMMAND 0x37 // command register
-#define EDRV_REGB_COMMAND_RST 0x10
-#define EDRV_REGB_COMMAND_RE 0x08
-#define EDRV_REGB_COMMAND_TE 0x04
-#define EDRV_REGB_COMMAND_BUFE 0x01
-
-#define EDRV_REGB_CMD9346 0x50 // 93C46 command register
-#define EDRV_REGB_CMD9346_LOCK 0x00 // lock configuration registers
-#define EDRV_REGB_CMD9346_UNLOCK 0xC0 // unlock configuration registers
-
-#define EDRV_REGDW_RCR 0x44 // Rx configuration register
-#define EDRV_REGDW_RCR_NO_FTH 0x0000E000 // no receive FIFO threshold
-#define EDRV_REGDW_RCR_RBLEN32K 0x00001000 // 32 kB receive buffer
-#define EDRV_REGDW_RCR_MXDMAUNL 0x00000700 // unlimited maximum DMA burst size
-#define EDRV_REGDW_RCR_NOWRAP 0x00000080 // do not wrap frame at end of buffer
-#define EDRV_REGDW_RCR_AER 0x00000020 // accept error frames (CRC, alignment, collided)
-#define EDRV_REGDW_RCR_AR 0x00000010 // accept runt
-#define EDRV_REGDW_RCR_AB 0x00000008 // accept broadcast frames
-#define EDRV_REGDW_RCR_AM 0x00000004 // accept multicast frames
-#define EDRV_REGDW_RCR_APM 0x00000002 // accept physical match frames
-#define EDRV_REGDW_RCR_AAP 0x00000001 // accept all frames
-#define EDRV_REGDW_RCR_DEF (EDRV_REGDW_RCR_NO_FTH \
- | EDRV_REGDW_RCR_RBLEN32K \
- | EDRV_REGDW_RCR_MXDMAUNL \
- | EDRV_REGDW_RCR_NOWRAP \
- | EDRV_REGDW_RCR_AB \
- | EDRV_REGDW_RCR_AM \
- | EDRV_REGDW_RCR_APM) // default value
-
-#define EDRV_REGDW_TCR 0x40 // Tx configuration register
-#define EDRV_REGDW_TCR_VER_MASK 0x7CC00000 // mask for hardware version
-#define EDRV_REGDW_TCR_VER_C 0x74000000 // RTL8139C
-#define EDRV_REGDW_TCR_VER_D 0x74400000 // RTL8139D
-#define EDRV_REGDW_TCR_IFG96 0x03000000 // default interframe gap (960 ns)
-#define EDRV_REGDW_TCR_CRC 0x00010000 // disable appending of CRC by the controller
-#define EDRV_REGDW_TCR_MXDMAUNL 0x00000700 // maximum DMA burst size of 2048 b
-#define EDRV_REGDW_TCR_TXRETRY 0x00000000 // 16 retries
-#define EDRV_REGDW_TCR_DEF (EDRV_REGDW_TCR_IFG96 \
- | EDRV_REGDW_TCR_MXDMAUNL \
- | EDRV_REGDW_TCR_TXRETRY)
-
-#define EDRV_REGW_MULINT 0x5C // multiple interrupt select register
-
-#define EDRV_REGDW_MPC 0x4C // missed packet counter register
-
-#define EDRV_REGDW_TSAD0 0x20 // Transmit start address of descriptor 0
-#define EDRV_REGDW_TSAD1 0x24 // Transmit start address of descriptor 1
-#define EDRV_REGDW_TSAD2 0x28 // Transmit start address of descriptor 2
-#define EDRV_REGDW_TSAD3 0x2C // Transmit start address of descriptor 3
-#define EDRV_REGDW_TSD0 0x10 // Transmit status of descriptor 0
-#define EDRV_REGDW_TSD_CRS 0x80000000 // Carrier sense lost
-#define EDRV_REGDW_TSD_TABT 0x40000000 // Transmit Abort
-#define EDRV_REGDW_TSD_OWC 0x20000000 // Out of window collision
-#define EDRV_REGDW_TSD_TXTH_DEF 0x00020000 // Transmit FIFO threshold of 64 bytes
-#define EDRV_REGDW_TSD_TOK 0x00008000 // Transmit OK
-#define EDRV_REGDW_TSD_TUN 0x00004000 // Transmit FIFO underrun
-#define EDRV_REGDW_TSD_OWN 0x00002000 // Owner
-
-#define EDRV_REGDW_RBSTART 0x30 // Receive buffer start address
-
-#define EDRV_REGW_CAPR 0x38 // Current address of packet read
-
-#define EDRV_REGDW_IDR0 0x00 // ID register 0
-#define EDRV_REGDW_IDR4 0x04 // ID register 4
-
-#define EDRV_REGDW_MAR0 0x08 // Multicast address register 0
-#define EDRV_REGDW_MAR4 0x0C // Multicast address register 4
-
-// defines for the status word in the receive buffer
-#define EDRV_RXSTAT_MAR 0x8000 // Multicast address received
-#define EDRV_RXSTAT_PAM 0x4000 // Physical address matched
-#define EDRV_RXSTAT_BAR 0x2000 // Broadcast address received
-#define EDRV_RXSTAT_ISE 0x0020 // Invalid symbol error
-#define EDRV_RXSTAT_RUNT 0x0010 // Runt packet received
-#define EDRV_RXSTAT_LONG 0x0008 // Long packet
-#define EDRV_RXSTAT_CRC 0x0004 // CRC error
-#define EDRV_RXSTAT_FAE 0x0002 // Frame alignment error
-#define EDRV_RXSTAT_ROK 0x0001 // Receive OK
-
-#define EDRV_REGDW_WRITE(dwReg, dwVal) writel(dwVal, EdrvInstance_l.m_pIoAddr + dwReg)
-#define EDRV_REGW_WRITE(dwReg, wVal) writew(wVal, EdrvInstance_l.m_pIoAddr + dwReg)
-#define EDRV_REGB_WRITE(dwReg, bVal) writeb(bVal, EdrvInstance_l.m_pIoAddr + dwReg)
-#define EDRV_REGDW_READ(dwReg) readl(EdrvInstance_l.m_pIoAddr + dwReg)
-#define EDRV_REGW_READ(dwReg) readw(EdrvInstance_l.m_pIoAddr + dwReg)
-#define EDRV_REGB_READ(dwReg) readb(EdrvInstance_l.m_pIoAddr + dwReg)
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 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)
-#endif
-
-#define EDRV_COUNT_SEND TGT_DBG_SIGNAL_TRACE_POINT(2)
-#define EDRV_COUNT_TIMEOUT TGT_DBG_SIGNAL_TRACE_POINT(3)
-#define EDRV_COUNT_PCI_ERR TGT_DBG_SIGNAL_TRACE_POINT(4)
-#define EDRV_COUNT_TX TGT_DBG_SIGNAL_TRACE_POINT(5)
-#define EDRV_COUNT_RX TGT_DBG_SIGNAL_TRACE_POINT(6)
-#define EDRV_COUNT_LATECOLLISION TGT_DBG_SIGNAL_TRACE_POINT(10)
-#define EDRV_COUNT_TX_COL_RL TGT_DBG_SIGNAL_TRACE_POINT(11)
-#define EDRV_COUNT_TX_FUN TGT_DBG_SIGNAL_TRACE_POINT(12)
-#define EDRV_COUNT_TX_ERR TGT_DBG_SIGNAL_TRACE_POINT(13)
-#define EDRV_COUNT_RX_CRC TGT_DBG_SIGNAL_TRACE_POINT(14)
-#define EDRV_COUNT_RX_ERR TGT_DBG_SIGNAL_TRACE_POINT(15)
-#define EDRV_COUNT_RX_FOVW TGT_DBG_SIGNAL_TRACE_POINT(16)
-#define EDRV_COUNT_RX_PUN TGT_DBG_SIGNAL_TRACE_POINT(17)
-#define EDRV_COUNT_RX_FAE TGT_DBG_SIGNAL_TRACE_POINT(18)
-#define EDRV_COUNT_RX_OVW TGT_DBG_SIGNAL_TRACE_POINT(19)
-
-#define EDRV_TRACE_CAPR(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x06000000)
-#define EDRV_TRACE_RX_CRC(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x0E000000)
-#define EDRV_TRACE_RX_ERR(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x0F000000)
-#define EDRV_TRACE_RX_PUN(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x11000000)
-#define EDRV_TRACE(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF0000) | 0x0000FEC0)
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-/*
-typedef struct
-{
- BOOL m_fUsed;
- unsigned int m_uiSize;
- MCD_bufDescFec *m_pBufDescr;
-
-} tEdrvTxBufferIntern;
-*/
-
-// Private structure
-typedef struct {
- struct pci_dev *m_pPciDev; // pointer to PCI device structure
- void *m_pIoAddr; // pointer to register space of Ethernet controller
- u8 *m_pbRxBuf; // pointer to Rx buffer
- dma_addr_t m_pRxBufDma;
- u8 *m_pbTxBuf; // pointer to Tx buffer
- dma_addr_t m_pTxBufDma;
- BOOL m_afTxBufUsed[EDRV_MAX_TX_BUFFERS];
- unsigned int m_uiCurTxDesc;
-
- tEdrvInitParam m_InitParam;
- tEdrvTxBuffer *m_pLastTransmittedTxBuffer;
-
-} tEdrvInstance;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static int EdrvInitOne(struct pci_dev *pPciDev,
- const struct pci_device_id *pId);
-
-static void EdrvRemoveOne(struct pci_dev *pPciDev);
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-// buffers and buffer descriptors and pointers
-
-static struct pci_device_id aEdrvPciTbl[] = {
- {0x10ec, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0,}
-};
-
-MODULE_DEVICE_TABLE(pci, aEdrvPciTbl);
-
-static tEdrvInstance EdrvInstance_l;
-
-static struct pci_driver EdrvDriver = {
- .name = DRV_NAME,
- .id_table = aEdrvPciTbl,
- .probe = EdrvInitOne,
- .remove = EdrvRemoveOne,
-};
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <edrv> */
-/* */
-/* */
-/***************************************************************************/
-//
-// 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 u8 EdrvCalcHash(u8 * pbMAC_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvInit
-//
-// Description: function for init of the Ethernet controller
-//
-// Parameters: pEdrvInitParam_p = pointer to struct including the init-parameters
-//
-// Returns: Errorcode = kEplSuccessful
-// = kEplNoResource
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvInit(tEdrvInitParam * pEdrvInitParam_p)
-{
- tEplKernel Ret;
- int iResult;
-
- Ret = kEplSuccessful;
-
- // clear instance structure
- EPL_MEMSET(&EdrvInstance_l, 0, sizeof(EdrvInstance_l));
-
- // save the init data
- EdrvInstance_l.m_InitParam = *pEdrvInitParam_p;
-
- // register PCI driver
- iResult = pci_register_driver(&EdrvDriver);
- if (iResult != 0) {
- printk("%s pci_register_driver failed with %d\n", __func__,
- iResult);
- Ret = kEplNoResource;
- goto Exit;
- }
-
- if (EdrvInstance_l.m_pPciDev == NULL) {
- printk("%s m_pPciDev=NULL\n", __func__);
- Ret = kEplNoResource;
- goto Exit;
- }
- // read MAC address from controller
- printk("%s local MAC = ", __func__);
- for (iResult = 0; iResult < 6; iResult++) {
- pEdrvInitParam_p->m_abMyMacAddr[iResult] =
- EDRV_REGB_READ((EDRV_REGDW_IDR0 + iResult));
- printk("%02X ",
- (unsigned int)pEdrvInitParam_p->m_abMyMacAddr[iResult]);
- }
- printk("\n");
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvShutdown
-//
-// Description: Shutdown the Ethernet controller
-//
-// Parameters: void
-//
-// Returns: Errorcode = kEplSuccessful
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvShutdown(void)
-{
-
- // unregister PCI driver
- printk("%s calling pci_unregister_driver()\n", __func__);
- pci_unregister_driver(&EdrvDriver);
-
- return kEplSuccessful;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvDefineRxMacAddrEntry
-//
-// Description: Set a multicast entry into the Ethernet controller
-//
-// Parameters: pbMacAddr_p = pointer to multicast entry to set
-//
-// Returns: Errorcode = kEplSuccessful
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvDefineRxMacAddrEntry(u8 * pbMacAddr_p)
-{
- tEplKernel Ret = kEplSuccessful;
- u32 dwData;
- u8 bHash;
-
- bHash = EdrvCalcHash(pbMacAddr_p);
-/*
- dwData = ether_crc(6, pbMacAddr_p);
-
- printk("EdrvDefineRxMacAddrEntry('%02X:%02X:%02X:%02X:%02X:%02X') hash = %u / %u ether_crc = 0x%08lX\n",
- (u16) pbMacAddr_p[0], (u16) pbMacAddr_p[1], (u16) pbMacAddr_p[2],
- (u16) pbMacAddr_p[3], (u16) pbMacAddr_p[4], (u16) pbMacAddr_p[5],
- (u16) bHash, (u16) (dwData >> 26), dwData);
-*/
- if (bHash > 31) {
- dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR4);
- dwData |= 1 << (bHash - 32);
- EDRV_REGDW_WRITE(EDRV_REGDW_MAR4, dwData);
- } else {
- dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR0);
- dwData |= 1 << bHash;
- EDRV_REGDW_WRITE(EDRV_REGDW_MAR0, dwData);
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvUndefineRxMacAddrEntry
-//
-// Description: Reset a multicast entry in the Ethernet controller
-//
-// Parameters: pbMacAddr_p = pointer to multicast entry to reset
-//
-// Returns: Errorcode = kEplSuccessful
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvUndefineRxMacAddrEntry(u8 * pbMacAddr_p)
-{
- tEplKernel Ret = kEplSuccessful;
- u32 dwData;
- u8 bHash;
-
- bHash = EdrvCalcHash(pbMacAddr_p);
-
- if (bHash > 31) {
- dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR4);
- dwData &= ~(1 << (bHash - 32));
- EDRV_REGDW_WRITE(EDRV_REGDW_MAR4, dwData);
- } else {
- dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR0);
- dwData &= ~(1 << bHash);
- EDRV_REGDW_WRITE(EDRV_REGDW_MAR0, dwData);
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvAllocTxMsgBuffer
-//
-// Description: Register a Tx-Buffer
-//
-// Parameters: pBuffer_p = pointer to Buffer structure
-//
-// Returns: Errorcode = kEplSuccessful
-// = kEplEdrvNoFreeBufEntry
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvAllocTxMsgBuffer(tEdrvTxBuffer * pBuffer_p)
-{
- tEplKernel Ret = kEplSuccessful;
- u32 i;
-
- if (pBuffer_p->m_uiMaxBufferLen > EDRV_MAX_FRAME_SIZE) {
- Ret = kEplEdrvNoFreeBufEntry;
- goto Exit;
- }
- // search a free Tx buffer with appropriate size
- for (i = 0; i < EDRV_MAX_TX_BUFFERS; i++) {
- if (EdrvInstance_l.m_afTxBufUsed[i] == FALSE) {
- // free channel found
- EdrvInstance_l.m_afTxBufUsed[i] = TRUE;
- pBuffer_p->m_uiBufferNumber = i;
- pBuffer_p->m_pbBuffer =
- EdrvInstance_l.m_pbTxBuf +
- (i * EDRV_MAX_FRAME_SIZE);
- pBuffer_p->m_uiMaxBufferLen = EDRV_MAX_FRAME_SIZE;
- break;
- }
- }
- if (i >= EDRV_MAX_TX_BUFFERS) {
- Ret = kEplEdrvNoFreeBufEntry;
- goto Exit;
- }
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvReleaseTxMsgBuffer
-//
-// Description: Register a Tx-Buffer
-//
-// Parameters: pBuffer_p = pointer to Buffer structure
-//
-// Returns: Errorcode = kEplSuccessful
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvReleaseTxMsgBuffer(tEdrvTxBuffer * pBuffer_p)
-{
- unsigned int uiBufferNumber;
-
- uiBufferNumber = pBuffer_p->m_uiBufferNumber;
-
- if (uiBufferNumber < EDRV_MAX_TX_BUFFERS) {
- EdrvInstance_l.m_afTxBufUsed[uiBufferNumber] = FALSE;
- }
-
- return kEplSuccessful;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvSendTxMsg
-//
-// Description: immediately starts the transmission of the buffer
-//
-// Parameters: pBuffer_p = buffer descriptor to transmit
-//
-// Returns: Errorcode = kEplSuccessful
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvSendTxMsg(tEdrvTxBuffer * pBuffer_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiBufferNumber;
- u32 dwTemp;
-
- uiBufferNumber = pBuffer_p->m_uiBufferNumber;
-
- if ((uiBufferNumber >= EDRV_MAX_TX_BUFFERS)
- || (EdrvInstance_l.m_afTxBufUsed[uiBufferNumber] == FALSE)) {
- Ret = kEplEdrvBufNotExisting;
- goto Exit;
- }
-
- if (EdrvInstance_l.m_pLastTransmittedTxBuffer != NULL) { // transmission is already active
- Ret = kEplInvalidOperation;
- dwTemp =
- EDRV_REGDW_READ((EDRV_REGDW_TSD0 +
- (EdrvInstance_l.m_uiCurTxDesc *
- sizeof(u32))));
- printk("%s InvOp TSD%u = 0x%08X", __func__,
- EdrvInstance_l.m_uiCurTxDesc, dwTemp);
- printk(" Cmd = 0x%02X\n",
- (u16) EDRV_REGB_READ(EDRV_REGB_COMMAND));
- goto Exit;
- }
- // save pointer to buffer structure for TxHandler
- EdrvInstance_l.m_pLastTransmittedTxBuffer = pBuffer_p;
-
- EDRV_COUNT_SEND;
-
- // pad with zeros if necessary, because controller does not do it
- if (pBuffer_p->m_uiTxMsgLen < MIN_ETH_SIZE) {
- EPL_MEMSET(pBuffer_p->m_pbBuffer + pBuffer_p->m_uiTxMsgLen, 0,
- MIN_ETH_SIZE - pBuffer_p->m_uiTxMsgLen);
- pBuffer_p->m_uiTxMsgLen = MIN_ETH_SIZE;
- }
- // set DMA address of buffer
- EDRV_REGDW_WRITE((EDRV_REGDW_TSAD0 +
- (EdrvInstance_l.m_uiCurTxDesc * sizeof(u32))),
- (EdrvInstance_l.m_pTxBufDma +
- (uiBufferNumber * EDRV_MAX_FRAME_SIZE)));
- dwTemp =
- EDRV_REGDW_READ((EDRV_REGDW_TSAD0 +
- (EdrvInstance_l.m_uiCurTxDesc * sizeof(u32))));
-// printk("%s TSAD%u = 0x%08lX", __func__, EdrvInstance_l.m_uiCurTxDesc, dwTemp);
-
- // start transmission
- EDRV_REGDW_WRITE((EDRV_REGDW_TSD0 +
- (EdrvInstance_l.m_uiCurTxDesc * sizeof(u32))),
- (EDRV_REGDW_TSD_TXTH_DEF | pBuffer_p->m_uiTxMsgLen));
- dwTemp =
- EDRV_REGDW_READ((EDRV_REGDW_TSD0 +
- (EdrvInstance_l.m_uiCurTxDesc * sizeof(u32))));
-// printk(" TSD%u = 0x%08lX / 0x%08lX\n", EdrvInstance_l.m_uiCurTxDesc, dwTemp, (u32)(EDRV_REGDW_TSD_TXTH_DEF | pBuffer_p->m_uiTxMsgLen));
-
- Exit:
- return Ret;
-}
-
-#if 0
-//---------------------------------------------------------------------------
-//
-// Function: EdrvTxMsgReady
-//
-// Description: starts copying the buffer to the ethernet controller's FIFO
-//
-// Parameters: pbBuffer_p - bufferdescriptor to transmit
-//
-// Returns: Errorcode - kEplSuccessful
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvTxMsgReady(tEdrvTxBuffer * pBuffer_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiBufferNumber;
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvTxMsgStart
-//
-// Description: starts transmission of the ethernet controller's FIFO
-//
-// Parameters: pbBuffer_p - bufferdescriptor to transmit
-//
-// Returns: Errorcode - kEplSuccessful
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EdrvTxMsgStart(tEdrvTxBuffer * pBuffer_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- return Ret;
-}
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvReinitRx
-//
-// Description: reinitialize the Rx process, because of error
-//
-// Parameters: void
-//
-// Returns: void
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static void EdrvReinitRx(void)
-{
- u8 bCmd;
-
- // simply switch off and on the receiver
- // this will reset the CAPR register
- bCmd = EDRV_REGB_READ(EDRV_REGB_COMMAND);
- EDRV_REGB_WRITE(EDRV_REGB_COMMAND, (bCmd & ~EDRV_REGB_COMMAND_RE));
- EDRV_REGB_WRITE(EDRV_REGB_COMMAND, bCmd);
-
- // set receive configuration register
- EDRV_REGDW_WRITE(EDRV_REGDW_RCR, EDRV_REGDW_RCR_DEF);
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvInterruptHandler
-//
-// Description: interrupt handler
-//
-// Parameters: void
-//
-// Returns: void
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if 0
-void EdrvInterruptHandler(void)
-{
-}
-#endif
-
-static int TgtEthIsr(int nIrqNum_p, void *ppDevInstData_p)
-{
-// EdrvInterruptHandler();
- tEdrvRxBuffer RxBuffer;
- tEdrvTxBuffer *pTxBuffer;
- u16 wStatus;
- u32 dwTxStatus;
- u32 dwRxStatus;
- u16 wCurRx;
- u8 *pbRxBuf;
- unsigned int uiLength;
- int iHandled = IRQ_HANDLED;
-
-// printk("¤");
-
- // read the interrupt status
- wStatus = EDRV_REGW_READ(EDRV_REGW_INT_STATUS);
-
- // acknowledge the interrupts
- EDRV_REGW_WRITE(EDRV_REGW_INT_STATUS, wStatus);
-
- if (wStatus == 0) {
- iHandled = IRQ_NONE;
- goto Exit;
- }
- // process tasks
- if ((wStatus & (EDRV_REGW_INT_TER | EDRV_REGW_INT_TOK)) != 0) { // transmit interrupt
-
- if (EdrvInstance_l.m_pbTxBuf == NULL) {
- printk("%s Tx buffers currently not allocated\n",
- __func__);
- goto Exit;
- }
- // read transmit status
- dwTxStatus =
- EDRV_REGDW_READ((EDRV_REGDW_TSD0 +
- (EdrvInstance_l.m_uiCurTxDesc *
- sizeof(u32))));
- if ((dwTxStatus & (EDRV_REGDW_TSD_TOK | EDRV_REGDW_TSD_TABT | EDRV_REGDW_TSD_TUN)) != 0) { // transmit finished
- EdrvInstance_l.m_uiCurTxDesc =
- (EdrvInstance_l.m_uiCurTxDesc + 1) & 0x03;
- pTxBuffer = EdrvInstance_l.m_pLastTransmittedTxBuffer;
- EdrvInstance_l.m_pLastTransmittedTxBuffer = NULL;
-
- if ((dwTxStatus & EDRV_REGDW_TSD_TOK) != 0) {
- EDRV_COUNT_TX;
- } else if ((dwTxStatus & EDRV_REGDW_TSD_TUN) != 0) {
- EDRV_COUNT_TX_FUN;
- } else { // assume EDRV_REGDW_TSD_TABT
- EDRV_COUNT_TX_COL_RL;
- }
-
-// printk("T");
- if (pTxBuffer != NULL) {
- // call Tx handler of Data link layer
- EdrvInstance_l.m_InitParam.
- m_pfnTxHandler(pTxBuffer);
- }
- } else {
- EDRV_COUNT_TX_ERR;
- }
- }
-
- if ((wStatus & (EDRV_REGW_INT_RER | EDRV_REGW_INT_FOVW | EDRV_REGW_INT_RXOVW | EDRV_REGW_INT_PUN)) != 0) { // receive error interrupt
-
- if ((wStatus & EDRV_REGW_INT_FOVW) != 0) {
- EDRV_COUNT_RX_FOVW;
- } else if ((wStatus & EDRV_REGW_INT_RXOVW) != 0) {
- EDRV_COUNT_RX_OVW;
- } else if ((wStatus & EDRV_REGW_INT_PUN) != 0) { // Packet underrun
- EDRV_TRACE_RX_PUN(wStatus);
- EDRV_COUNT_RX_PUN;
- } else { /*if ((wStatus & EDRV_REGW_INT_RER) != 0) */
-
- EDRV_TRACE_RX_ERR(wStatus);
- EDRV_COUNT_RX_ERR;
- }
-
- // reinitialize Rx process
- EdrvReinitRx();
- }
-
- if ((wStatus & EDRV_REGW_INT_ROK) != 0) { // receive interrupt
-
- if (EdrvInstance_l.m_pbRxBuf == NULL) {
- printk("%s Rx buffers currently not allocated\n",
- __func__);
- goto Exit;
- }
- // read current offset in receive buffer
- wCurRx =
- (EDRV_REGW_READ(EDRV_REGW_CAPR) +
- 0x10) % EDRV_RX_BUFFER_LENGTH;
-
- while ((EDRV_REGB_READ(EDRV_REGB_COMMAND) & EDRV_REGB_COMMAND_BUFE) == 0) { // frame available
-
- // calculate pointer to current frame in receive buffer
- pbRxBuf = EdrvInstance_l.m_pbRxBuf + wCurRx;
-
- // read receive status u32
- dwRxStatus = le32_to_cpu(*((u32 *) pbRxBuf));
-
- // calculate length of received frame
- uiLength = dwRxStatus >> 16;
-
- if (uiLength == 0xFFF0) { // frame is unfinished (maybe early Rx interrupt is active)
- break;
- }
-
- if ((dwRxStatus & EDRV_RXSTAT_ROK) == 0) { // error occured while receiving this frame
- // ignore it
- if ((dwRxStatus & EDRV_RXSTAT_FAE) != 0) {
- EDRV_COUNT_RX_FAE;
- } else if ((dwRxStatus & EDRV_RXSTAT_CRC) != 0) {
- EDRV_TRACE_RX_CRC(dwRxStatus);
- EDRV_COUNT_RX_CRC;
- } else {
- EDRV_TRACE_RX_ERR(dwRxStatus);
- EDRV_COUNT_RX_ERR;
- }
-
- // reinitialize Rx process
- EdrvReinitRx();
-
- break;
- } else { // frame is OK
- RxBuffer.m_BufferInFrame =
- kEdrvBufferLastInFrame;
- RxBuffer.m_uiRxMsgLen = uiLength - ETH_CRC_SIZE;
- RxBuffer.m_pbBuffer =
- pbRxBuf + sizeof(dwRxStatus);
-
-// printk("R");
- EDRV_COUNT_RX;
-
- // call Rx handler of Data link layer
- EdrvInstance_l.m_InitParam.
- m_pfnRxHandler(&RxBuffer);
- }
-
- // calulate new offset (u32 aligned)
- wCurRx =
- (u16) ((wCurRx + uiLength + sizeof(dwRxStatus) +
- 3) & ~0x3);
- EDRV_TRACE_CAPR(wCurRx - 0x10);
- EDRV_REGW_WRITE(EDRV_REGW_CAPR, wCurRx - 0x10);
-
- // reread current offset in receive buffer
- wCurRx =
- (EDRV_REGW_READ(EDRV_REGW_CAPR) +
- 0x10) % EDRV_RX_BUFFER_LENGTH;
-
- }
- }
-
- if ((wStatus & EDRV_REGW_INT_SERR) != 0) { // PCI error
- EDRV_COUNT_PCI_ERR;
- }
-
- if ((wStatus & EDRV_REGW_INT_TIMEOUT) != 0) { // Timeout
- EDRV_COUNT_TIMEOUT;
- }
-
- Exit:
- return iHandled;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvInitOne
-//
-// Description: initializes one PCI device
-//
-// Parameters: pPciDev = pointer to corresponding PCI device structure
-// pId = PCI device ID
-//
-// Returns: (int) = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static int EdrvInitOne(struct pci_dev *pPciDev, const struct pci_device_id *pId)
-{
- int iResult = 0;
- u32 dwTemp;
-
- if (EdrvInstance_l.m_pPciDev != NULL) { // Edrv is already connected to a PCI device
- printk("%s device %s discarded\n", __func__,
- pci_name(pPciDev));
- iResult = -ENODEV;
- goto Exit;
- }
-
- if (pPciDev->revision >= 0x20) {
- printk
- ("%s device %s is an enhanced 8139C+ version, which is not supported\n",
- __func__, pci_name(pPciDev));
- iResult = -ENODEV;
- goto Exit;
- }
-
- EdrvInstance_l.m_pPciDev = pPciDev;
-
- // enable device
- printk("%s enable device\n", __func__);
- iResult = pci_enable_device(pPciDev);
- if (iResult != 0) {
- goto Exit;
- }
-
- if ((pci_resource_flags(pPciDev, 1) & IORESOURCE_MEM) == 0) {
- iResult = -ENODEV;
- goto Exit;
- }
-
- printk("%s request regions\n", __func__);
- iResult = pci_request_regions(pPciDev, DRV_NAME);
- if (iResult != 0) {
- goto Exit;
- }
-
- printk("%s ioremap\n", __func__);
- EdrvInstance_l.m_pIoAddr =
- ioremap(pci_resource_start(pPciDev, 1),
- pci_resource_len(pPciDev, 1));
- if (EdrvInstance_l.m_pIoAddr == NULL) { // remap of controller's register space failed
- iResult = -EIO;
- goto Exit;
- }
- // enable PCI busmaster
- printk("%s enable busmaster\n", __func__);
- pci_set_master(pPciDev);
-
- // reset controller
- printk("%s reset controller\n", __func__);
- EDRV_REGB_WRITE(EDRV_REGB_COMMAND, EDRV_REGB_COMMAND_RST);
-
- // wait until reset has finished
- for (iResult = 500; iResult > 0; iResult--) {
- if ((EDRV_REGB_READ(EDRV_REGB_COMMAND) & EDRV_REGB_COMMAND_RST)
- == 0) {
- break;
- }
-
- schedule_timeout(10);
- }
-
- // check hardware version, i.e. chip ID
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TCR);
- if (((dwTemp & EDRV_REGDW_TCR_VER_MASK) != EDRV_REGDW_TCR_VER_C)
- && ((dwTemp & EDRV_REGDW_TCR_VER_MASK) != EDRV_REGDW_TCR_VER_D)) { // unsupported chip
- printk("%s Unsupported chip! TCR = 0x%08X\n", __func__,
- dwTemp);
- iResult = -ENODEV;
- goto Exit;
- }
- // disable interrupts
- printk("%s disable interrupts\n", __func__);
- EDRV_REGW_WRITE(EDRV_REGW_INT_MASK, 0);
- // acknowledge all pending interrupts
- EDRV_REGW_WRITE(EDRV_REGW_INT_STATUS,
- EDRV_REGW_READ(EDRV_REGW_INT_STATUS));
-
- // install interrupt handler
- printk("%s install interrupt handler\n", __func__);
- iResult =
- request_irq(pPciDev->irq, TgtEthIsr, IRQF_SHARED,
- DRV_NAME /*pPciDev->dev.name */ , pPciDev);
- if (iResult != 0) {
- goto Exit;
- }
-
-/*
- // unlock configuration registers
- printk("%s unlock configuration registers\n", __func__);
- EDRV_REGB_WRITE(EDRV_REGB_CMD9346, EDRV_REGB_CMD9346_UNLOCK);
-
- // check if user specified a MAC address
- printk("%s check specified MAC address\n", __func__);
- for (iResult = 0; iResult < 6; iResult++)
- {
- if (EdrvInstance_l.m_InitParam.m_abMyMacAddr[iResult] != 0)
- {
- printk("%s set local MAC address\n", __func__);
- // write this MAC address to controller
- EDRV_REGDW_WRITE(EDRV_REGDW_IDR0,
- le32_to_cpu(*((u32*)&EdrvInstance_l.m_InitParam.m_abMyMacAddr[0])));
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_IDR0);
-
- EDRV_REGDW_WRITE(EDRV_REGDW_IDR4,
- le32_to_cpu(*((u32*)&EdrvInstance_l.m_InitParam.m_abMyMacAddr[4])));
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_IDR4);
- break;
- }
- }
- iResult = 0;
-
- // lock configuration registers
- EDRV_REGB_WRITE(EDRV_REGB_CMD9346, EDRV_REGB_CMD9346_LOCK);
-*/
-
- // allocate buffers
- printk("%s allocate buffers\n", __func__);
- EdrvInstance_l.m_pbTxBuf =
- pci_alloc_consistent(pPciDev, EDRV_TX_BUFFER_SIZE,
- &EdrvInstance_l.m_pTxBufDma);
- if (EdrvInstance_l.m_pbTxBuf == NULL) {
- iResult = -ENOMEM;
- goto Exit;
- }
-
- EdrvInstance_l.m_pbRxBuf =
- pci_alloc_consistent(pPciDev, EDRV_RX_BUFFER_SIZE,
- &EdrvInstance_l.m_pRxBufDma);
- if (EdrvInstance_l.m_pbRxBuf == NULL) {
- iResult = -ENOMEM;
- goto Exit;
- }
- // reset pointers for Tx buffers
- printk("%s reset pointers fo Tx buffers\n", __func__);
- EDRV_REGDW_WRITE(EDRV_REGDW_TSAD0, 0);
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD0);
- EDRV_REGDW_WRITE(EDRV_REGDW_TSAD1, 0);
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD1);
- EDRV_REGDW_WRITE(EDRV_REGDW_TSAD2, 0);
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD2);
- EDRV_REGDW_WRITE(EDRV_REGDW_TSAD3, 0);
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD3);
-
- printk(" Command = 0x%02X\n",
- (u16) EDRV_REGB_READ(EDRV_REGB_COMMAND));
-
- // set pointer for receive buffer in controller
- printk("%s set pointer to Rx buffer\n", __func__);
- EDRV_REGDW_WRITE(EDRV_REGDW_RBSTART, EdrvInstance_l.m_pRxBufDma);
-
- // enable transmitter and receiver
- printk("%s enable Tx and Rx", __func__);
- EDRV_REGB_WRITE(EDRV_REGB_COMMAND,
- (EDRV_REGB_COMMAND_RE | EDRV_REGB_COMMAND_TE));
- printk(" Command = 0x%02X\n",
- (u16) EDRV_REGB_READ(EDRV_REGB_COMMAND));
-
- // clear missed packet counter to enable Rx/Tx process
- EDRV_REGDW_WRITE(EDRV_REGDW_MPC, 0);
-
- // set transmit configuration register
- printk("%s set Tx conf register", __func__);
- EDRV_REGDW_WRITE(EDRV_REGDW_TCR, EDRV_REGDW_TCR_DEF);
- printk(" = 0x%08X\n", EDRV_REGDW_READ(EDRV_REGDW_TCR));
-
- // set receive configuration register
- printk("%s set Rx conf register", __func__);
- EDRV_REGDW_WRITE(EDRV_REGDW_RCR, EDRV_REGDW_RCR_DEF);
- printk(" = 0x%08X\n", EDRV_REGDW_READ(EDRV_REGDW_RCR));
-
- // reset multicast MAC address filter
- EDRV_REGDW_WRITE(EDRV_REGDW_MAR0, 0);
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_MAR0);
- EDRV_REGDW_WRITE(EDRV_REGDW_MAR4, 0);
- dwTemp = EDRV_REGDW_READ(EDRV_REGDW_MAR4);
-
-/*
- // enable transmitter and receiver
- printk("%s enable Tx and Rx", __func__);
- EDRV_REGB_WRITE(EDRV_REGB_COMMAND, (EDRV_REGB_COMMAND_RE | EDRV_REGB_COMMAND_TE));
- printk(" Command = 0x%02X\n", (u16) EDRV_REGB_READ(EDRV_REGB_COMMAND));
-*/
- // disable early interrupts
- EDRV_REGW_WRITE(EDRV_REGW_MULINT, 0);
-
- // enable interrupts
- printk("%s enable interrupts\n", __func__);
- EDRV_REGW_WRITE(EDRV_REGW_INT_MASK, EDRV_REGW_INT_MASK_DEF);
-
- Exit:
- printk("%s finished with %d\n", __func__, iResult);
- return iResult;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvRemoveOne
-//
-// Description: shuts down one PCI device
-//
-// Parameters: pPciDev = pointer to corresponding PCI device structure
-//
-// Returns: (void)
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static void EdrvRemoveOne(struct pci_dev *pPciDev)
-{
-
- if (EdrvInstance_l.m_pPciDev != pPciDev) { // trying to remove unknown device
- BUG_ON(EdrvInstance_l.m_pPciDev != pPciDev);
- goto Exit;
- }
- // disable transmitter and receiver
- EDRV_REGB_WRITE(EDRV_REGB_COMMAND, 0);
-
- // disable interrupts
- EDRV_REGW_WRITE(EDRV_REGW_INT_MASK, 0);
-
- // remove interrupt handler
- free_irq(pPciDev->irq, pPciDev);
-
- // free buffers
- if (EdrvInstance_l.m_pbTxBuf != NULL) {
- pci_free_consistent(pPciDev, EDRV_TX_BUFFER_SIZE,
- EdrvInstance_l.m_pbTxBuf,
- EdrvInstance_l.m_pTxBufDma);
- EdrvInstance_l.m_pbTxBuf = NULL;
- }
-
- if (EdrvInstance_l.m_pbRxBuf != NULL) {
- pci_free_consistent(pPciDev, EDRV_RX_BUFFER_SIZE,
- EdrvInstance_l.m_pbRxBuf,
- EdrvInstance_l.m_pRxBufDma);
- EdrvInstance_l.m_pbRxBuf = NULL;
- }
- // unmap controller's register space
- if (EdrvInstance_l.m_pIoAddr != NULL) {
- iounmap(EdrvInstance_l.m_pIoAddr);
- }
- // disable the PCI device
- pci_disable_device(pPciDev);
-
- // release memory regions
- pci_release_regions(pPciDev);
-
- EdrvInstance_l.m_pPciDev = NULL;
-
- Exit:;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EdrvCalcHash
-//
-// Description: function calculates the entry for the hash-table from MAC
-// address
-//
-// Parameters: pbMAC_p - pointer to MAC address
-//
-// Returns: hash value
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#define HASH_BITS 6 // used bits in hash
-#define CRC32_POLY 0x04C11DB6 //
-//#define CRC32_POLY 0xEDB88320 //
-// G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
-
-static u8 EdrvCalcHash(u8 * pbMAC_p)
-{
- u32 dwByteCounter;
- u32 dwBitCounter;
- u32 dwData;
- u32 dwCrc;
- u32 dwCarry;
- u8 *pbData;
- u8 bHash;
-
- pbData = pbMAC_p;
-
- // calculate crc32 value of mac address
- dwCrc = 0xFFFFFFFF;
-
- for (dwByteCounter = 0; dwByteCounter < 6; dwByteCounter++) {
- dwData = *pbData;
- pbData++;
- for (dwBitCounter = 0; dwBitCounter < 8;
- dwBitCounter++, dwData >>= 1) {
- dwCarry = (((dwCrc >> 31) ^ dwData) & 1);
- dwCrc = dwCrc << 1;
- if (dwCarry != 0) {
- dwCrc = (dwCrc ^ CRC32_POLY) | dwCarry;
- }
- }
- }
-
-// printk("MyCRC = 0x%08lX\n", dwCrc);
- // only upper 6 bits (HASH_BITS) are used
- // which point to specific bit in the hash registers
- bHash = (u8) ((dwCrc >> (32 - HASH_BITS)) & 0x3f);
-
- return bHash;
-}
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: interface for ethernetdriver
- "fast ethernet controller" (FEC)
- freescale coldfire MCF528x and compatible FEC
-
- 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: EdrvFec.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- Dev C++ and GNU-Compiler for m68k
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2005/08/01 m.b.: start of implementation
-
-****************************************************************************/
-
-#ifndef _EDRVFEC_H_
-#define _EDRVFEC_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-// do this in config header
-#define TARGET_HARDWARE TGTHW_SPLC_CF54
-
-// base addresses
-#if ((TARGET_HARDWARE & TGT_CPU_MASK_) == TGT_CPU_5282)
-
-#elif ((TARGET_HARDWARE & TGT_CPU_MASK_) == TGT_CPU_5485)
-
-#else
-
-#error 'ERROR: Target was never implemented!'
-
-#endif
-
-//---------------------------------------------------------------------------
-// types
-//---------------------------------------------------------------------------
-
-// Rx and Tx buffer descriptor format
-typedef struct {
- u16 m_wStatus; // control / status --- used by edrv, do not change in application
- u16 m_wLength; // transfer length
- u8 *m_pbData; // buffer address
-} tBufferDescr;
-
-#if ((TARGET_HARDWARE & TGT_CPU_MASK_) == TGT_CPU_5282)
-
-#elif ((TARGET_HARDWARE & TGT_CPU_MASK_) == TGT_CPU_5485)
-
-#endif
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EDRV_FEC_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: interface for ethernet driver simulation
-
- 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: EdrvSim.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- Dev C++ and GNU-Compiler for m68k
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/15 d.k.: start of implementation
-
-****************************************************************************/
-
-#ifndef _EDRVSIM_H_
-#define _EDRVSIM_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-void EdrvRxInterruptHandler(u8 bBufferInFrame_p, u8 * pbEthernetData_p,
- u16 wDataLen_p);
-
-#endif // #ifndef _EDRVSIM_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for EPL API layer
-
- 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: Epl.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/11/17 16:40:39 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/05/22 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_API_H_
-#define _EPL_API_H_
-
-#include "EplInc.h"
-#include "EplSdo.h"
-#include "EplObd.h"
-#include "EplLed.h"
-#include "EplEvent.h"
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef struct {
- unsigned int m_uiNodeId;
- tEplNmtState m_NmtState;
- tEplNmtNodeEvent m_NodeEvent;
- u16 m_wErrorCode; // EPL error code if m_NodeEvent == kEplNmtNodeEventError
- BOOL m_fMandatory;
-
-} tEplApiEventNode;
-
-typedef struct {
- tEplNmtState m_NmtState; // local NMT state
- tEplNmtBootEvent m_BootEvent;
- u16 m_wErrorCode; // EPL error code if m_BootEvent == kEplNmtBootEventError
-
-} tEplApiEventBoot;
-
-typedef struct {
- tEplLedType m_LedType; // type of the LED (e.g. Status or Error)
- BOOL m_fOn; // state of the LED (e.g. on or off)
-
-} tEplApiEventLed;
-
-typedef enum {
- kEplApiEventNmtStateChange = 0x10, // m_NmtStateChange
-// kEplApiEventRequestNmt = 0x11, // m_bNmtCmd
- kEplApiEventCriticalError = 0x12, // m_InternalError, Stack halted
- kEplApiEventWarning = 0x13, // m_InternalError, Stack running
- kEplApiEventNode = 0x20, // m_Node
- kEplApiEventBoot = 0x21, // m_Boot
- kEplApiEventSdo = 0x62, // m_Sdo
- kEplApiEventObdAccess = 0x69, // m_ObdCbParam
- kEplApiEventLed = 0x70, // m_Led
-
-} tEplApiEventType;
-
-typedef union {
- tEplEventNmtStateChange m_NmtStateChange;
- tEplEventError m_InternalError;
- tEplSdoComFinished m_Sdo;
- tEplObdCbParam m_ObdCbParam;
- tEplApiEventNode m_Node;
- tEplApiEventBoot m_Boot;
- tEplApiEventLed m_Led;
-
-} tEplApiEventArg;
-
-typedef tEplKernel(*tEplApiCbEvent) (tEplApiEventType EventType_p, // IN: event type (enum)
- tEplApiEventArg *pEventArg_p, // IN: event argument (union)
- void *pUserArg_p);
-
-typedef struct {
- unsigned int m_uiSizeOfStruct;
- BOOL m_fAsyncOnly; // do not need to register PRes
- unsigned int m_uiNodeId; // local node ID
- u8 m_abMacAddress[6]; // local MAC address
-
- // 0x1F82: NMT_FeatureFlags_U32
- u32 m_dwFeatureFlags;
- // Cycle Length (0x1006: NMT_CycleLen_U32) in [us]
- u32 m_dwCycleLen; // required for error detection
- // 0x1F98: NMT_CycleTiming_REC
- // 0x1F98.1: IsochrTxMaxPayload_U16
- unsigned int m_uiIsochrTxMaxPayload; // const
- // 0x1F98.2: IsochrRxMaxPayload_U16
- unsigned int m_uiIsochrRxMaxPayload; // const
- // 0x1F98.3: PResMaxLatency_U32
- u32 m_dwPresMaxLatency; // const in [ns], only required for IdentRes
- // 0x1F98.4: PReqActPayloadLimit_U16
- unsigned int m_uiPreqActPayloadLimit; // required for initialisation (+28 bytes)
- // 0x1F98.5: PResActPayloadLimit_U16
- unsigned int m_uiPresActPayloadLimit; // required for initialisation of Pres frame (+28 bytes)
- // 0x1F98.6: ASndMaxLatency_U32
- u32 m_dwAsndMaxLatency; // const in [ns], only required for IdentRes
- // 0x1F98.7: MultiplCycleCnt_U8
- unsigned int m_uiMultiplCycleCnt; // required for error detection
- // 0x1F98.8: AsyncMTU_U16
- unsigned int m_uiAsyncMtu; // required to set up max frame size
- // 0x1F98.9: Prescaler_U16
- unsigned int m_uiPrescaler; // required for sync
- // $$$ Multiplexed Slot
-
- // 0x1C14: DLL_LossOfFrameTolerance_U32 in [ns]
- u32 m_dwLossOfFrameTolerance;
-
- // 0x1F8A: NMT_MNCycleTiming_REC
- // 0x1F8A.1: WaitSoCPReq_U32 in [ns]
- u32 m_dwWaitSocPreq;
-
- // 0x1F8A.2: AsyncSlotTimeout_U32 in [ns]
- u32 m_dwAsyncSlotTimeout;
-
- u32 m_dwDeviceType; // NMT_DeviceType_U32
- u32 m_dwVendorId; // NMT_IdentityObject_REC.VendorId_U32
- u32 m_dwProductCode; // NMT_IdentityObject_REC.ProductCode_U32
- u32 m_dwRevisionNumber; // NMT_IdentityObject_REC.RevisionNo_U32
- u32 m_dwSerialNumber; // NMT_IdentityObject_REC.SerialNo_U32
- u64 m_qwVendorSpecificExt1;
- u32 m_dwVerifyConfigurationDate; // CFM_VerifyConfiguration_REC.ConfDate_U32
- u32 m_dwVerifyConfigurationTime; // CFM_VerifyConfiguration_REC.ConfTime_U32
- u32 m_dwApplicationSwDate; // PDL_LocVerApplSw_REC.ApplSwDate_U32 on programmable device or date portion of NMT_ManufactSwVers_VS on non-programmable device
- u32 m_dwApplicationSwTime; // PDL_LocVerApplSw_REC.ApplSwTime_U32 on programmable device or time portion of NMT_ManufactSwVers_VS on non-programmable device
- u32 m_dwIpAddress;
- u32 m_dwSubnetMask;
- u32 m_dwDefaultGateway;
- u8 m_sHostname[32];
- u8 m_abVendorSpecificExt2[48];
-
- char *m_pszDevName; // NMT_ManufactDevName_VS (0x1008/0 local OD)
- char *m_pszHwVersion; // NMT_ManufactHwVers_VS (0x1009/0 local OD)
- char *m_pszSwVersion; // NMT_ManufactSwVers_VS (0x100A/0 local OD)
-
- tEplApiCbEvent m_pfnCbEvent;
- void *m_pEventUserArg;
- tEplSyncCb m_pfnCbSync;
-
-} tEplApiInitParam;
-
-typedef struct {
- void *m_pImage;
- unsigned int m_uiSize;
-
-} tEplApiProcessImage;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-tEplKernel EplApiInitialize(tEplApiInitParam *pInitParam_p);
-
-tEplKernel EplApiShutdown(void);
-
-tEplKernel EplApiReadObject(tEplSdoComConHdl *pSdoComConHdl_p,
- unsigned int uiNodeId_p,
- unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pDstData_le_p,
- unsigned int *puiSize_p,
- tEplSdoType SdoType_p, void *pUserArg_p);
-
-tEplKernel EplApiWriteObject(tEplSdoComConHdl *pSdoComConHdl_p,
- unsigned int uiNodeId_p,
- unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pSrcData_le_p,
- unsigned int uiSize_p,
- tEplSdoType SdoType_p, void *pUserArg_p);
-
-tEplKernel EplApiFreeSdoChannel(tEplSdoComConHdl SdoComConHdl_p);
-
-tEplKernel EplApiReadLocalObject(unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pDstData_p,
- unsigned int *puiSize_p);
-
-tEplKernel EplApiWriteLocalObject(unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pSrcData_p,
- unsigned int uiSize_p);
-
-tEplKernel EplApiCbObdAccess(tEplObdCbParam *pParam_p);
-
-tEplKernel EplApiLinkObject(unsigned int uiObjIndex_p,
- void *pVar_p,
- unsigned int *puiVarEntries_p,
- tEplObdSize *pEntrySize_p,
- unsigned int uiFirstSubindex_p);
-
-tEplKernel EplApiExecNmtCommand(tEplNmtEvent NmtEvent_p);
-
-tEplKernel EplApiProcess(void);
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-tEplKernel EplApiMnTriggerStateChange(unsigned int uiNodeId_p,
- tEplNmtNodeCommand NodeCommand_p);
-#endif
-
-tEplKernel EplApiGetIdentResponse(unsigned int uiNodeId_p,
- tEplIdentResponse **ppIdentResponse_p);
-
-// functions for process image will be implemented in separate file
-tEplKernel EplApiProcessImageSetup(void);
-tEplKernel EplApiProcessImageExchangeIn(tEplApiProcessImage *pPI_p);
-tEplKernel EplApiProcessImageExchangeOut(tEplApiProcessImage *pPI_p);
-
-#endif // #ifndef _EPL_API_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: Definitions for Abstract Memory Interface
-
- 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: EplAmi.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.2 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 06.03.2000 -rs
- Implementation
-
- 16.09.2002 -as
- To save code space the functions AmiSetByte and AmiGetByte
- are replaced by macros. For targets which assign u8 by
- an 16Bit type, the definition of macros must changed to
- functions.
-
- 23.02.2005 r.d.:
- Functions included for extended data types such as UNSIGNED24,
- UNSIGNED40, ...
-
- 13.06.2006 d.k.:
- Extended the interface for EPL with the different functions
- for little endian and big endian
-
-****************************************************************************/
-
-#ifndef _EPLAMI_H_
-#define _EPLAMI_H_
-
-
-//---------------------------------------------------------------------------
-// types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Prototypen
-//---------------------------------------------------------------------------
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-//---------------------------------------------------------------------------
-//
-// write functions
-//
-// To save code space the function AmiSetByte is replaced by
-// an macro.
-// void AmiSetByte (void * pAddr_p, u8 bByteVal_p);
-
-#define AmiSetByteToBe(pAddr_p, bByteVal_p) {*(u8 *)(pAddr_p) = (bByteVal_p);}
-#define AmiSetByteToLe(pAddr_p, bByteVal_p) {*(u8 *)(pAddr_p) = (bByteVal_p);}
-
-void AmiSetWordToBe(void *pAddr_p, u16 wWordVal_p);
-void AmiSetDwordToBe(void *pAddr_p, u32 dwDwordVal_p);
-void AmiSetWordToLe(void *pAddr_p, u16 wWordVal_p);
-void AmiSetDwordToLe(void *pAddr_p, u32 dwDwordVal_p);
-
-//---------------------------------------------------------------------------
-//
-// read functions
-//
-// To save code space the function AmiGetByte is replaced by
-// an macro.
-// u8 AmiGetByte (void * pAddr_p);
-
-#define AmiGetByteFromBe(pAddr_p) (*(u8 *)(pAddr_p))
-#define AmiGetByteFromLe(pAddr_p) (*(u8 *)(pAddr_p))
-
-u16 AmiGetWordFromBe(void *pAddr_p);
-u32 AmiGetDwordFromBe(void *pAddr_p);
-u16 AmiGetWordFromLe(void *pAddr_p);
-u32 AmiGetDwordFromLe(void *pAddr_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetDword24()
-//
-// Description: sets a 24 bit value to a buffer
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// dwDwordVal_p = value to set
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-
-void AmiSetDword24ToBe(void *pAddr_p, u32 dwDwordVal_p);
-void AmiSetDword24ToLe(void *pAddr_p, u32 dwDwordVal_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetDword24()
-//
-// Description: reads a 24 bit value from a buffer
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u32 = read value
-//
-//---------------------------------------------------------------------------
-
-u32 AmiGetDword24FromBe(void *pAddr_p);
-u32 AmiGetDword24FromLe(void *pAddr_p);
-
-//#ifdef USE_VAR64
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword40()
-//
-// Description: sets a 40 bit value to a buffer
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword40ToBe(void *pAddr_p, u64 qwQwordVal_p);
-void AmiSetQword40ToLe(void *pAddr_p, u64 qwQwordVal_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword40()
-//
-// Description: reads a 40 bit value from a buffer
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword40FromBe(void *pAddr_p);
-u64 AmiGetQword40FromLe(void *pAddr_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword48()
-//
-// Description: sets a 48 bit value to a buffer
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword48ToBe(void *pAddr_p, u64 qwQwordVal_p);
-void AmiSetQword48ToLe(void *pAddr_p, u64 qwQwordVal_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword48()
-//
-// Description: reads a 48 bit value from a buffer
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword48FromBe(void *pAddr_p);
-u64 AmiGetQword48FromLe(void *pAddr_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword56()
-//
-// Description: sets a 56 bit value to a buffer
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword56ToBe(void *pAddr_p, u64 qwQwordVal_p);
-void AmiSetQword56ToLe(void *pAddr_p, u64 qwQwordVal_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword56()
-//
-// Description: reads a 56 bit value from a buffer
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword56FromBe(void *pAddr_p);
-u64 AmiGetQword56FromLe(void *pAddr_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword64()
-//
-// Description: sets a 64 bit value to a buffer
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword64ToBe(void *pAddr_p, u64 qwQwordVal_p);
-void AmiSetQword64ToLe(void *pAddr_p, u64 qwQwordVal_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword64()
-//
-// Description: reads a 64 bit value from a buffer
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword64FromBe(void *pAddr_p);
-u64 AmiGetQword64FromLe(void *pAddr_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetTimeOfDay()
-//
-// Description: sets a TIME_OF_DAY (CANopen) value to a buffer
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// pTimeOfDay_p = pointer to struct TIME_OF_DAY
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-void AmiSetTimeOfDay(void *pAddr_p, tTimeOfDay *pTimeOfDay_p);
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetTimeOfDay()
-//
-// Description: reads a TIME_OF_DAY (CANopen) value from a buffer
-//
-// Parameters: pAddr_p = pointer to source buffer
-// pTimeOfDay_p = pointer to struct TIME_OF_DAY
-//
-// Return: void
-//
-//---------------------------------------------------------------------------
-void AmiGetTimeOfDay(void *pAddr_p, tTimeOfDay *pTimeOfDay_p);
-
-#ifdef __cplusplus
-}
-#endif
-#endif // ifndef _EPLAMI_H_
-// Die letzte Zeile muß unbedingt eine leere Zeile sein, weil manche Compiler// damit ein Problem haben, wenn das nicht so ist (z.B. GNU oder Borland C++ Builder).
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for generic EPL API 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: EplApiGeneric.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.21 $ $Date: 2008/11/21 09:00:38 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/09/05 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#include "Epl.h"
-#include "kernel/EplDllk.h"
-#include "kernel/EplErrorHandlerk.h"
-#include "kernel/EplEventk.h"
-#include "kernel/EplNmtk.h"
-#include "kernel/EplObdk.h"
-#include "kernel/EplTimerk.h"
-#include "kernel/EplDllkCal.h"
-#include "kernel/EplPdokCal.h"
-#include "user/EplDlluCal.h"
-#include "user/EplLedu.h"
-#include "user/EplNmtCnu.h"
-#include "user/EplNmtMnu.h"
-#include "user/EplSdoComu.h"
-#include "user/EplIdentu.h"
-#include "user/EplStatusu.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-#include "kernel/EplPdok.h"
-#endif
-
-#include "SharedBuff.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) == 0)
-#error "EPL API layer needs EPL module OBDK!"
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S EplApi */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- tEplApiInitParam m_InitParam;
-
-} tEplApiInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-static tEplApiInstance EplApiInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-// NMT state change event callback function
-static tEplKernel EplApiCbNmtStateChange(tEplEventNmtStateChange NmtStateChange_p);
-
-// update DLL configuration from OD
-static tEplKernel EplApiUpdateDllConfig(BOOL fUpdateIdentity_p);
-
-// update OD from init param
-static tEplKernel EplApiUpdateObd(void);
-
-// process events from user event queue
-static tEplKernel EplApiProcessEvent(tEplEvent *pEplEvent_p);
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-// callback function of SDO module
-static tEplKernel EplApiCbSdoCon(tEplSdoComFinished *pSdoComFinished_p);
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-// callback functions of NmtMnu module
-static tEplKernel EplApiCbNodeEvent(unsigned int uiNodeId_p,
- tEplNmtNodeEvent NodeEvent_p,
- tEplNmtState NmtState_p,
- u16 wErrorCode_p, BOOL fMandatory_p);
-
-static tEplKernel EplApiCbBootEvent(tEplNmtBootEvent BootEvent_p,
- tEplNmtState NmtState_p,
- u16 wErrorCode_p);
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
-// callback function of Ledu module
-static tEplKernel EplApiCbLedStateChange(tEplLedType LedType_p, BOOL fOn_p);
-#endif
-
-// OD initialization function (implemented in Objdict.c)
-tEplKernel EplObdInitRam(tEplObdInitParam *pInitParam_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiInitialize()
-//
-// Description: add and initialize new instance of EPL stack.
-// After return from this function the application must start
-// the NMT state machine via
-// EplApiExecNmtCommand(kEplNmtEventSwReset)
-// and thereby the whole EPL stack :-)
-//
-// Parameters: pInitParam_p = initialisation parameters
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplApiInitialize(tEplApiInitParam *pInitParam_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplObdInitParam ObdInitParam;
- tEplDllkInitParam DllkInitParam;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-#endif
-
- // reset instance structure
- EPL_MEMSET(&EplApiInstance_g, 0, sizeof(EplApiInstance_g));
-
- EPL_MEMCPY(&EplApiInstance_g.m_InitParam, pInitParam_p,
- min(sizeof(tEplApiInitParam),
- pInitParam_p->m_uiSizeOfStruct));
-
- // check event callback function pointer
- if (EplApiInstance_g.m_InitParam.m_pfnCbEvent == NULL) { // application must always have an event callback function
- Ret = kEplApiInvalidParam;
- goto Exit;
- }
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- // init OD
-// FIXME
-// Ret = EplObdInitRam(&ObdInitParam);
-// if (Ret != kEplSuccessful)
-// {
-// goto Exit;
-// }
-
- // initialize EplObd module
- Ret = EplObdInit(&ObdInitParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
-#ifndef EPL_NO_FIFO
- ShbError = ShbInit();
- if (ShbError != kShbOk) {
- Ret = kEplNoResource;
- goto Exit;
- }
-#endif
-
- // initialize EplEventk module
- Ret = EplEventkInit(EplApiInstance_g.m_InitParam.m_pfnCbSync);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // initialize EplEventu module
- Ret = EplEventuInit(EplApiProcessEvent);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // init EplTimerk module
- Ret = EplTimerkInit();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // initialize EplNmtk module before DLL
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
- Ret = EplNmtkInit();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // initialize EplDllk module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- EPL_MEMCPY(DllkInitParam.m_be_abSrcMac,
- EplApiInstance_g.m_InitParam.m_abMacAddress, 6);
- Ret = EplDllkAddInstance(&DllkInitParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // initialize EplErrorHandlerk module
- Ret = EplErrorHandlerkInit();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // initialize EplDllkCal module
- Ret = EplDllkCalAddInstance();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // initialize EplDlluCal module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- Ret = EplDlluCalAddInstance();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // initialize EplPdok module
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- Ret = EplPdokAddInstance();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret = EplPdokCalAddInstance();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // initialize EplNmtCnu module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_CN)) != 0)
- Ret = EplNmtCnuAddInstance(EplApiInstance_g.m_InitParam.m_uiNodeId);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // initialize EplNmtu module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret = EplNmtuInit();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // register NMT event callback function
- Ret = EplNmtuRegisterStateChangeCb(EplApiCbNmtStateChange);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // initialize EplNmtMnu module
- Ret = EplNmtMnuInit(EplApiCbNodeEvent, EplApiCbBootEvent);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // initialize EplIdentu module
- Ret = EplIdentuInit();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // initialize EplStatusu module
- Ret = EplStatusuInit();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // initialize EplLedu module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
- Ret = EplLeduInit(EplApiCbLedStateChange);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // init SDO module
-#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) || \
- (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0))
- // init sdo command layer
- Ret = EplSdoComInit();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // the application must start NMT state machine
- // via EplApiExecNmtCommand(kEplNmtEventSwReset)
- // and thereby the whole EPL stack
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiShutdown()
-//
-// Description: deletes an instance of EPL stack
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplApiShutdown(void)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // $$$ d.k.: check if NMT state is NMT_GS_OFF
-
- // $$$ d.k.: maybe delete event queues at first, but this implies that
- // no other module must not use the event queues for communication
- // during shutdown.
-
- // delete instance for all modules
-
- // deinitialize EplSdoCom module
-#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) || \
- (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0))
- Ret = EplSdoComDelInstance();
-// PRINTF1("EplSdoComDelInstance(): 0x%X\n", Ret);
-#endif
-
- // deinitialize EplLedu module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
- Ret = EplLeduDelInstance();
-// PRINTF1("EplLeduDelInstance(): 0x%X\n", Ret);
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // deinitialize EplNmtMnu module
- Ret = EplNmtMnuDelInstance();
-// PRINTF1("EplNmtMnuDelInstance(): 0x%X\n", Ret);
-
- // deinitialize EplIdentu module
- Ret = EplIdentuDelInstance();
-// PRINTF1("EplIdentuDelInstance(): 0x%X\n", Ret);
-
- // deinitialize EplStatusu module
- Ret = EplStatusuDelInstance();
-// PRINTF1("EplStatusuDelInstance(): 0x%X\n", Ret);
-#endif
-
- // deinitialize EplNmtCnu module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_CN)) != 0)
- Ret = EplNmtCnuDelInstance();
-// PRINTF1("EplNmtCnuDelInstance(): 0x%X\n", Ret);
-#endif
-
- // deinitialize EplNmtu module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret = EplNmtuDelInstance();
-// PRINTF1("EplNmtuDelInstance(): 0x%X\n", Ret);
-#endif
-
- // deinitialize EplDlluCal module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- Ret = EplDlluCalDelInstance();
-// PRINTF1("EplDlluCalDelInstance(): 0x%X\n", Ret);
-
-#endif
-
- // deinitialize EplEventu module
- Ret = EplEventuDelInstance();
-// PRINTF1("EplEventuDelInstance(): 0x%X\n", Ret);
-
- // deinitialize EplNmtk module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
- Ret = EplNmtkDelInstance();
-// PRINTF1("EplNmtkDelInstance(): 0x%X\n", Ret);
-#endif
-
- // deinitialize EplDllk module
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- Ret = EplDllkDelInstance();
-// PRINTF1("EplDllkDelInstance(): 0x%X\n", Ret);
-
- // deinitialize EplDllkCal module
- Ret = EplDllkCalDelInstance();
-// PRINTF1("EplDllkCalDelInstance(): 0x%X\n", Ret);
-#endif
-
- // deinitialize EplEventk module
- Ret = EplEventkDelInstance();
-// PRINTF1("EplEventkDelInstance(): 0x%X\n", Ret);
-
- // deinitialize EplTimerk module
- Ret = EplTimerkDelInstance();
-// PRINTF1("EplTimerkDelInstance(): 0x%X\n", Ret);
-
-#ifndef EPL_NO_FIFO
- ShbExit();
-#endif
-
- return Ret;
-}
-
-//----------------------------------------------------------------------------
-// Function: EplApiExecNmtCommand()
-//
-// Description: executes a NMT command, i.e. post the NMT command/event to the
-// NMTk module. NMT commands which are not appropriate in the current
-// NMT state are silently ignored. Please keep in mind that the
-// NMT state may change until the NMT command is actually executed.
-//
-// Parameters: NmtEvent_p = NMT command/event
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//----------------------------------------------------------------------------
-
-tEplKernel EplApiExecNmtCommand(tEplNmtEvent NmtEvent_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret = EplNmtuNmtEvent(NmtEvent_p);
-#endif
-
- return Ret;
-}
-
-//----------------------------------------------------------------------------
-// Function: EplApiLinkObject()
-//
-// Description: Function maps array of application variables onto specified object in OD
-//
-// Parameters: uiObjIndex_p = Function maps variables for this object index
-// pVar_p = Pointer to data memory area for the specified object
-// puiVarEntries_p = IN: pointer to number of entries to map
-// OUT: pointer to number of actually used entries
-// pEntrySize_p = IN: pointer to size of one entry;
-// if size is zero, the actual size will be read from OD
-// OUT: pointer to entire size of all entries mapped
-// uiFirstSubindex_p = This is the first subindex to be mapped.
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//----------------------------------------------------------------------------
-
-tEplKernel EplApiLinkObject(unsigned int uiObjIndex_p,
- void *pVar_p,
- unsigned int *puiVarEntries_p,
- tEplObdSize *pEntrySize_p,
- unsigned int uiFirstSubindex_p)
-{
- u8 bVarEntries;
- u8 bIndexEntries;
- u8 *pbData;
- unsigned int uiSubindex;
- tEplVarParam VarParam;
- tEplObdSize EntrySize;
- tEplObdSize UsedSize;
-
- tEplKernel RetCode = kEplSuccessful;
-
- if ((pVar_p == NULL)
- || (puiVarEntries_p == NULL)
- || (*puiVarEntries_p == 0)
- || (pEntrySize_p == NULL)) {
- RetCode = kEplApiInvalidParam;
- goto Exit;
- }
-
- pbData = (u8 *)pVar_p;
- bVarEntries = (u8) * puiVarEntries_p;
- UsedSize = 0;
-
- // init VarParam structure with default values
- VarParam.m_uiIndex = uiObjIndex_p;
- VarParam.m_ValidFlag = kVarValidAll;
-
- if (uiFirstSubindex_p != 0) { // check if object exists by reading subindex 0x00,
- // because user wants to link a variable to a subindex unequal 0x00
- // read number of entries
- EntrySize = (tEplObdSize) sizeof(bIndexEntries);
- RetCode = EplObdReadEntry(uiObjIndex_p,
- 0x00,
- (void *)&bIndexEntries,
- &EntrySize);
-
- if ((RetCode != kEplSuccessful) || (bIndexEntries == 0x00)) {
- // Object doesn't exist or invalid entry number
- RetCode = kEplObdIndexNotExist;
- goto Exit;
- }
- } else { // user wants to link a variable to subindex 0x00
- // that's OK
- bIndexEntries = 0;
- }
-
- // Correct number of entries if number read from OD is greater
- // than the specified number.
- // This is done, so that we do not set more entries than subindexes the
- // object actually has.
- if ((bIndexEntries > (bVarEntries + uiFirstSubindex_p - 1)) &&
- (bVarEntries != 0x00)) {
- bIndexEntries = (u8) (bVarEntries + uiFirstSubindex_p - 1);
- }
- // map entries
- for (uiSubindex = uiFirstSubindex_p; uiSubindex <= bIndexEntries;
- uiSubindex++) {
- // if passed entry size is 0, then get size from OD
- if (*pEntrySize_p == 0x00) {
- // read entry size
- EntrySize = EplObdGetDataSize(uiObjIndex_p, uiSubindex);
-
- if (EntrySize == 0x00) {
- // invalid entry size (maybe object doesn't exist or entry of type DOMAIN is empty)
- RetCode = kEplObdSubindexNotExist;
- break;
- }
- } else { // use passed entry size
- EntrySize = *pEntrySize_p;
- }
-
- VarParam.m_uiSubindex = uiSubindex;
-
- // set pointer to user var
- VarParam.m_Size = EntrySize;
- VarParam.m_pData = pbData;
-
- UsedSize += EntrySize;
- pbData += EntrySize;
-
- RetCode = EplObdDefineVar(&VarParam);
- if (RetCode != kEplSuccessful) {
- break;
- }
- }
-
- // set number of mapped entries and entry size
- *puiVarEntries_p = ((bIndexEntries - uiFirstSubindex_p) + 1);
- *pEntrySize_p = UsedSize;
-
- Exit:
-
- return (RetCode);
-
-}
-
-// ----------------------------------------------------------------------------
-//
-// Function: EplApiReadObject()
-//
-// Description: reads the specified entry from the OD of the specified node.
-// If this node is a remote node, it performs a SDO transfer, which
-// means this function returns kEplApiTaskDeferred and the application
-// is informed via the event callback function when the task is completed.
-//
-// Parameters: pSdoComConHdl_p = INOUT: pointer to SDO connection handle (may be NULL in case of local OD access)
-// uiNodeId_p = IN: node ID (0 = itself)
-// uiIndex_p = IN: index of object in OD
-// uiSubindex_p = IN: sub-index of object in OD
-// pDstData_le_p = OUT: pointer to data in little endian
-// puiSize_p = INOUT: pointer to size of data
-// SdoType_p = IN: type of SDO transfer
-// pUserArg_p = IN: user-definable argument pointer,
-// which will be passed to the event callback function
-//
-// Return: tEplKernel = error code
-//
-// ----------------------------------------------------------------------------
-
-tEplKernel EplApiReadObject(tEplSdoComConHdl *pSdoComConHdl_p,
- unsigned int uiNodeId_p,
- unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pDstData_le_p,
- unsigned int *puiSize_p,
- tEplSdoType SdoType_p, void *pUserArg_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if ((uiIndex_p == 0) || (pDstData_le_p == NULL) || (puiSize_p == NULL)
- || (*puiSize_p == 0)) {
- Ret = kEplApiInvalidParam;
- goto Exit;
- }
-
- if (uiNodeId_p == 0 || uiNodeId_p == EplObdGetNodeId()) { // local OD access can be performed
- tEplObdSize ObdSize;
-
- ObdSize = (tEplObdSize) * puiSize_p;
- Ret =
- EplObdReadEntryToLe(uiIndex_p, uiSubindex_p, pDstData_le_p,
- &ObdSize);
- *puiSize_p = (unsigned int)ObdSize;
- } else { // perform SDO transfer
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- tEplSdoComTransParamByIndex TransParamByIndex;
-// tEplSdoComConHdl SdoComConHdl;
-
- // check if application provides space for handle
- if (pSdoComConHdl_p == NULL) {
- Ret = kEplApiInvalidParam;
- goto Exit;
-// pSdoComConHdl_p = &SdoComConHdl;
- }
- // init command layer connection
- Ret = EplSdoComDefineCon(pSdoComConHdl_p, uiNodeId_p, // target node id
- SdoType_p); // SDO type
- if ((Ret != kEplSuccessful) && (Ret != kEplSdoComHandleExists)) {
- goto Exit;
- }
- TransParamByIndex.m_pData = pDstData_le_p;
- TransParamByIndex.m_SdoAccessType = kEplSdoAccessTypeRead;
- TransParamByIndex.m_SdoComConHdl = *pSdoComConHdl_p;
- TransParamByIndex.m_uiDataSize = *puiSize_p;
- TransParamByIndex.m_uiIndex = uiIndex_p;
- TransParamByIndex.m_uiSubindex = uiSubindex_p;
- TransParamByIndex.m_pfnSdoFinishedCb = EplApiCbSdoCon;
- TransParamByIndex.m_pUserArg = pUserArg_p;
-
- Ret = EplSdoComInitTransferByIndex(&TransParamByIndex);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- Ret = kEplApiTaskDeferred;
-
-#else
- Ret = kEplApiInvalidParam;
-#endif
- }
-
- Exit:
- return Ret;
-}
-
-// ----------------------------------------------------------------------------
-//
-// Function: EplApiWriteObject()
-//
-// Description: writes the specified entry to the OD of the specified node.
-// If this node is a remote node, it performs a SDO transfer, which
-// means this function returns kEplApiTaskDeferred and the application
-// is informed via the event callback function when the task is completed.
-//
-// Parameters: pSdoComConHdl_p = INOUT: pointer to SDO connection handle (may be NULL in case of local OD access)
-// uiNodeId_p = IN: node ID (0 = itself)
-// uiIndex_p = IN: index of object in OD
-// uiSubindex_p = IN: sub-index of object in OD
-// pSrcData_le_p = IN: pointer to data in little endian
-// uiSize_p = IN: size of data in bytes
-// SdoType_p = IN: type of SDO transfer
-// pUserArg_p = IN: user-definable argument pointer,
-// which will be passed to the event callback function
-//
-// Return: tEplKernel = error code
-//
-// ----------------------------------------------------------------------------
-
-tEplKernel EplApiWriteObject(tEplSdoComConHdl *pSdoComConHdl_p,
- unsigned int uiNodeId_p,
- unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pSrcData_le_p,
- unsigned int uiSize_p,
- tEplSdoType SdoType_p, void *pUserArg_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if ((uiIndex_p == 0) || (pSrcData_le_p == NULL) || (uiSize_p == 0)) {
- Ret = kEplApiInvalidParam;
- goto Exit;
- }
-
- if (uiNodeId_p == 0 || uiNodeId_p == EplObdGetNodeId()) { // local OD access can be performed
-
- Ret =
- EplObdWriteEntryFromLe(uiIndex_p, uiSubindex_p,
- pSrcData_le_p, uiSize_p);
- } else { // perform SDO transfer
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- tEplSdoComTransParamByIndex TransParamByIndex;
-// tEplSdoComConHdl SdoComConHdl;
-
- // check if application provides space for handle
- if (pSdoComConHdl_p == NULL) {
- Ret = kEplApiInvalidParam;
- goto Exit;
-// pSdoComConHdl_p = &SdoComConHdl;
- }
- // d.k.: How to recycle command layer connection?
- // Try to redefine it, which will return kEplSdoComHandleExists
- // and the existing command layer handle.
- // If the returned handle is busy, EplSdoComInitTransferByIndex()
- // will return with error.
- // $$$ d.k.: Collisions may occur with Configuration Manager, if both the application and
- // Configuration Manager, are trying to communicate with the very same node.
- // possible solution: disallow communication by application if Configuration Manager is busy
-
- // init command layer connection
- Ret = EplSdoComDefineCon(pSdoComConHdl_p, uiNodeId_p, // target node id
- SdoType_p); // SDO type
- if ((Ret != kEplSuccessful) && (Ret != kEplSdoComHandleExists)) {
- goto Exit;
- }
- TransParamByIndex.m_pData = pSrcData_le_p;
- TransParamByIndex.m_SdoAccessType = kEplSdoAccessTypeWrite;
- TransParamByIndex.m_SdoComConHdl = *pSdoComConHdl_p;
- TransParamByIndex.m_uiDataSize = uiSize_p;
- TransParamByIndex.m_uiIndex = uiIndex_p;
- TransParamByIndex.m_uiSubindex = uiSubindex_p;
- TransParamByIndex.m_pfnSdoFinishedCb = EplApiCbSdoCon;
- TransParamByIndex.m_pUserArg = pUserArg_p;
-
- Ret = EplSdoComInitTransferByIndex(&TransParamByIndex);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- Ret = kEplApiTaskDeferred;
-
-#else
- Ret = kEplApiInvalidParam;
-#endif
- }
-
- Exit:
- return Ret;
-}
-
-// ----------------------------------------------------------------------------
-//
-// Function: EplApiFreeSdoChannel()
-//
-// Description: frees the specified SDO channel.
-// This function must be called after each call to EplApiReadObject()/EplApiWriteObject()
-// which returns kEplApiTaskDeferred and the application
-// is informed via the event callback function when the task is completed.
-//
-// Parameters: SdoComConHdl_p = IN: SDO connection handle
-//
-// Return: tEplKernel = error code
-//
-// ----------------------------------------------------------------------------
-
-tEplKernel EplApiFreeSdoChannel(tEplSdoComConHdl SdoComConHdl_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-
- // init command layer connection
- Ret = EplSdoComUndefineCon(SdoComConHdl_p);
-
-#else
- Ret = kEplApiInvalidParam;
-#endif
-
- return Ret;
-}
-
-// ----------------------------------------------------------------------------
-//
-// Function: EplApiReadLocalObject()
-//
-// Description: reads the specified entry from the local OD.
-//
-// Parameters: uiIndex_p = IN: index of object in OD
-// uiSubindex_p = IN: sub-index of object in OD
-// pDstData_p = OUT: pointer to data in platform byte order
-// puiSize_p = INOUT: pointer to size of data
-//
-// Return: tEplKernel = error code
-//
-// ----------------------------------------------------------------------------
-
-tEplKernel EplApiReadLocalObject(unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pDstData_p, unsigned int *puiSize_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplObdSize ObdSize;
-
- ObdSize = (tEplObdSize) * puiSize_p;
- Ret = EplObdReadEntry(uiIndex_p, uiSubindex_p, pDstData_p, &ObdSize);
- *puiSize_p = (unsigned int)ObdSize;
-
- return Ret;
-}
-
-// ----------------------------------------------------------------------------
-//
-// Function: EplApiWriteLocalObject()
-//
-// Description: writes the specified entry to the local OD.
-//
-// Parameters: uiIndex_p = IN: index of object in OD
-// uiSubindex_p = IN: sub-index of object in OD
-// pSrcData_p = IN: pointer to data in platform byte order
-// uiSize_p = IN: size of data in bytes
-//
-// Return: tEplKernel = error code
-//
-// ----------------------------------------------------------------------------
-
-tEplKernel EplApiWriteLocalObject(unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- void *pSrcData_p,
- unsigned int uiSize_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- Ret =
- EplObdWriteEntry(uiIndex_p, uiSubindex_p, pSrcData_p,
- (tEplObdSize) uiSize_p);
-
- return Ret;
-}
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-// ----------------------------------------------------------------------------
-//
-// Function: EplApiMnTriggerStateChange()
-//
-// Description: triggers the specified node command for the specified node.
-//
-// Parameters: uiNodeId_p = node ID for which the node command will be executed
-// NodeCommand_p = node command
-//
-// Return: tEplKernel = error code
-//
-// ----------------------------------------------------------------------------
-
-tEplKernel EplApiMnTriggerStateChange(unsigned int uiNodeId_p,
- tEplNmtNodeCommand NodeCommand_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- Ret = EplNmtMnuTriggerStateChange(uiNodeId_p, NodeCommand_p);
-
- return Ret;
-}
-
-#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiCbObdAccess
-//
-// Description: callback function for OD accesses
-//
-// Parameters: pParam_p = OBD parameter
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplApiCbObdAccess(tEplObdCbParam *pParam_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
-#if (EPL_API_OBD_FORWARD_EVENT != FALSE)
- tEplApiEventArg EventArg;
-
- // call user callback
- // must be disabled for EplApiLinuxKernel.c, because of reentrancy problem
- // for local OD access. This is not so bad as user callback function in
- // application does not use OD callbacks at the moment.
- EventArg.m_ObdCbParam = *pParam_p;
- Ret = EplApiInstance_g.m_InitParam.m_pfnCbEvent(kEplApiEventObdAccess,
- &EventArg,
- EplApiInstance_g.
- m_InitParam.
- m_pEventUserArg);
-#endif
-
- switch (pParam_p->m_uiIndex) {
- //case 0x1006: // NMT_CycleLen_U32 (valid on reset)
- case 0x1C14: // DLL_LossOfFrameTolerance_U32
- //case 0x1F98: // NMT_CycleTiming_REC (valid on reset)
- {
- if (pParam_p->m_ObdEvent == kEplObdEvPostWrite) {
- // update DLL configuration
- Ret = EplApiUpdateDllConfig(FALSE);
- }
- break;
- }
-
- case 0x1020: // CFM_VerifyConfiguration_REC.ConfId_U32 != 0
- {
- if ((pParam_p->m_ObdEvent == kEplObdEvPostWrite)
- && (pParam_p->m_uiSubIndex == 3)
- && (*((u32 *) pParam_p->m_pArg) != 0)) {
- u32 dwVerifyConfInvalid = 0;
- // set CFM_VerifyConfiguration_REC.VerifyConfInvalid_U32 to 0
- Ret =
- EplObdWriteEntry(0x1020, 4,
- &dwVerifyConfInvalid, 4);
- // ignore any error because this objekt is optional
- Ret = kEplSuccessful;
- }
- break;
- }
-
- case 0x1F9E: // NMT_ResetCmd_U8
- {
- if (pParam_p->m_ObdEvent == kEplObdEvPreWrite) {
- u8 bNmtCommand;
-
- bNmtCommand = *((u8 *) pParam_p->m_pArg);
- // check value range
- switch ((tEplNmtCommand) bNmtCommand) {
- case kEplNmtCmdResetNode:
- case kEplNmtCmdResetCommunication:
- case kEplNmtCmdResetConfiguration:
- case kEplNmtCmdSwReset:
- case kEplNmtCmdInvalidService:
- // valid command identifier specified
- break;
-
- default:
- pParam_p->m_dwAbortCode =
- EPL_SDOAC_VALUE_RANGE_EXCEEDED;
- Ret = kEplObdAccessViolation;
- break;
- }
- } else if (pParam_p->m_ObdEvent == kEplObdEvPostWrite) {
- u8 bNmtCommand;
-
- bNmtCommand = *((u8 *) pParam_p->m_pArg);
- // check value range
- switch ((tEplNmtCommand) bNmtCommand) {
- case kEplNmtCmdResetNode:
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventResetNode);
-#endif
- break;
-
- case kEplNmtCmdResetCommunication:
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventResetCom);
-#endif
- break;
-
- case kEplNmtCmdResetConfiguration:
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventResetConfig);
-#endif
- break;
-
- case kEplNmtCmdSwReset:
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventSwReset);
-#endif
- break;
-
- case kEplNmtCmdInvalidService:
- break;
-
- default:
- pParam_p->m_dwAbortCode =
- EPL_SDOAC_VALUE_RANGE_EXCEEDED;
- Ret = kEplObdAccessViolation;
- break;
- }
- }
- break;
- }
-
- default:
- break;
- }
-
-//Exit:
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiProcessEvent
-//
-// Description: processes events from event queue and forwards these to
-// the application's event callback function
-//
-// Parameters: pEplEvent_p = pointer to event
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplApiProcessEvent(tEplEvent *pEplEvent_p)
-{
- tEplKernel Ret;
- tEplEventError *pEventError;
- tEplApiEventType EventType;
-
- Ret = kEplSuccessful;
-
- // process event
- switch (pEplEvent_p->m_EventType) {
- // error event
- case kEplEventTypeError:
- {
- pEventError = (tEplEventError *) pEplEvent_p->m_pArg;
- switch (pEventError->m_EventSource) {
- // treat the errors from the following sources as critical
- case kEplEventSourceEventk:
- case kEplEventSourceEventu:
- case kEplEventSourceDllk:
- {
- EventType = kEplApiEventCriticalError;
- // halt the stack by entering NMT state Off
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventCriticalError);
- break;
- }
-
- // the other errors are just warnings
- default:
- {
- EventType = kEplApiEventWarning;
- break;
- }
- }
-
- // call user callback
- Ret =
- EplApiInstance_g.m_InitParam.m_pfnCbEvent(EventType,
- (tEplApiEventArg
- *)
- pEventError,
- EplApiInstance_g.
- m_InitParam.
- m_pEventUserArg);
- // discard error from callback function, because this could generate an endless loop
- Ret = kEplSuccessful;
- break;
- }
-
- // at present, there are no other events for this module
- default:
- break;
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiCbNmtStateChange
-//
-// Description: callback function for NMT state changes
-//
-// Parameters: NmtStateChange_p = NMT state change event
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplApiCbNmtStateChange(tEplEventNmtStateChange NmtStateChange_p)
-{
- tEplKernel Ret = kEplSuccessful;
- u8 bNmtState;
- tEplApiEventArg EventArg;
-
- // save NMT state in OD
- bNmtState = (u8) NmtStateChange_p.m_NewNmtState;
- Ret = EplObdWriteEntry(0x1F8C, 0, &bNmtState, 1);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // do work which must be done in that state
- switch (NmtStateChange_p.m_NewNmtState) {
- // EPL stack is not running
- case kEplNmtGsOff:
- break;
-
- // first init of the hardware
- case kEplNmtGsInitialising:
-#if 0
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- // configure SDO via UDP (i.e. bind it to the EPL ethernet interface)
- Ret =
- EplSdoUdpuConfig(EplApiInstance_g.m_InitParam.m_dwIpAddress,
- EPL_C_SDO_EPL_PORT);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-#endif
-
- break;
-
- // init of the manufacturer-specific profile area and the
- // standardised device profile area
- case kEplNmtGsResetApplication:
- {
- // reset application part of OD
- Ret = EplObdAccessOdPart(kEplObdPartApp,
- kEplObdDirLoad);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- break;
- }
-
- // init of the communication profile area
- case kEplNmtGsResetCommunication:
- {
- // reset communication part of OD
- Ret = EplObdAccessOdPart(kEplObdPartGen,
- kEplObdDirLoad);
-
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // $$$ d.k.: update OD only if OD was not loaded from non-volatile memory
- Ret = EplApiUpdateObd();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- break;
- }
-
- // build the configuration with infos from OD
- case kEplNmtGsResetConfiguration:
- {
-
- Ret = EplApiUpdateDllConfig(TRUE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- break;
- }
-
- //-----------------------------------------------------------
- // CN part of the state machine
-
- // node liste for EPL-Frames and check timeout
- case kEplNmtCsNotActive:
- {
- // indicate completion of reset in NMT_ResetCmd_U8
- bNmtState = (u8) kEplNmtCmdInvalidService;
- Ret = EplObdWriteEntry(0x1F9E, 0, &bNmtState, 1);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- break;
- }
-
- // node process only async frames
- case kEplNmtCsPreOperational1:
- {
- break;
- }
-
- // node process isochronus and asynchronus frames
- case kEplNmtCsPreOperational2:
- {
- break;
- }
-
- // node should be configured und application is ready
- case kEplNmtCsReadyToOperate:
- {
- break;
- }
-
- // normal work state
- case kEplNmtCsOperational:
- {
- break;
- }
-
- // node stopped by MN
- // -> only process asynchronus frames
- case kEplNmtCsStopped:
- {
- break;
- }
-
- // no EPL cycle
- // -> normal ethernet communication
- case kEplNmtCsBasicEthernet:
- {
- break;
- }
-
- //-----------------------------------------------------------
- // MN part of the state machine
-
- // node listens for EPL-Frames and check timeout
- case kEplNmtMsNotActive:
- {
- break;
- }
-
- // node processes only async frames
- case kEplNmtMsPreOperational1:
- {
- break;
- }
-
- // node processes isochronous and asynchronous frames
- case kEplNmtMsPreOperational2:
- {
- break;
- }
-
- // node should be configured und application is ready
- case kEplNmtMsReadyToOperate:
- {
- break;
- }
-
- // normal work state
- case kEplNmtMsOperational:
- {
- break;
- }
-
- // no EPL cycle
- // -> normal ethernet communication
- case kEplNmtMsBasicEthernet:
- {
- break;
- }
-
- default:
- {
- TRACE0
- ("EplApiCbNmtStateChange(): unhandled NMT state\n");
- }
- }
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
- // forward event to Led module
- Ret = EplLeduCbNmtStateChange(NmtStateChange_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // forward event to NmtMn module
- Ret = EplNmtMnuCbNmtStateChange(NmtStateChange_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // call user callback
- EventArg.m_NmtStateChange = NmtStateChange_p;
- Ret =
- EplApiInstance_g.m_InitParam.
- m_pfnCbEvent(kEplApiEventNmtStateChange, &EventArg,
- EplApiInstance_g.m_InitParam.m_pEventUserArg);
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiUpdateDllConfig
-//
-// Description: update configuration of DLL
-//
-// Parameters: fUpdateIdentity_p = TRUE, if identity must be updated
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplApiUpdateDllConfig(BOOL fUpdateIdentity_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplDllConfigParam DllConfigParam;
- tEplDllIdentParam DllIdentParam;
- tEplObdSize ObdSize;
- u16 wTemp;
- u8 bTemp;
-
- // configure Dll
- EPL_MEMSET(&DllConfigParam, 0, sizeof(DllConfigParam));
- DllConfigParam.m_uiNodeId = EplObdGetNodeId();
-
- // Cycle Length (0x1006: NMT_CycleLen_U32) in [us]
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1006, 0, &DllConfigParam.m_dwCycleLen, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // 0x1F82: NMT_FeatureFlags_U32
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1F82, 0, &DllConfigParam.m_dwFeatureFlags,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // d.k. There is no dependance between FeatureFlags and async-only CN
- DllConfigParam.m_fAsyncOnly = EplApiInstance_g.m_InitParam.m_fAsyncOnly;
-
- // 0x1C14: DLL_LossOfFrameTolerance_U32 in [ns]
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1C14, 0, &DllConfigParam.m_dwLossOfFrameTolerance,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // 0x1F98: NMT_CycleTiming_REC
- // 0x1F98.1: IsochrTxMaxPayload_U16
- ObdSize = 2;
- Ret = EplObdReadEntry(0x1F98, 1, &wTemp, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- DllConfigParam.m_uiIsochrTxMaxPayload = wTemp;
-
- // 0x1F98.2: IsochrRxMaxPayload_U16
- ObdSize = 2;
- Ret = EplObdReadEntry(0x1F98, 2, &wTemp, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- DllConfigParam.m_uiIsochrRxMaxPayload = wTemp;
-
- // 0x1F98.3: PResMaxLatency_U32
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1F98, 3, &DllConfigParam.m_dwPresMaxLatency,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // 0x1F98.4: PReqActPayloadLimit_U16
- ObdSize = 2;
- Ret = EplObdReadEntry(0x1F98, 4, &wTemp, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- DllConfigParam.m_uiPreqActPayloadLimit = wTemp;
-
- // 0x1F98.5: PResActPayloadLimit_U16
- ObdSize = 2;
- Ret = EplObdReadEntry(0x1F98, 5, &wTemp, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- DllConfigParam.m_uiPresActPayloadLimit = wTemp;
-
- // 0x1F98.6: ASndMaxLatency_U32
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1F98, 6, &DllConfigParam.m_dwAsndMaxLatency,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // 0x1F98.7: MultiplCycleCnt_U8
- ObdSize = 1;
- Ret = EplObdReadEntry(0x1F98, 7, &bTemp, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- DllConfigParam.m_uiMultiplCycleCnt = bTemp;
-
- // 0x1F98.8: AsyncMTU_U16
- ObdSize = 2;
- Ret = EplObdReadEntry(0x1F98, 8, &wTemp, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- DllConfigParam.m_uiAsyncMtu = wTemp;
-
- // $$$ Prescaler
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // 0x1F8A.1: WaitSoCPReq_U32 in [ns]
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1F8A, 1, &DllConfigParam.m_dwWaitSocPreq,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // 0x1F8A.2: AsyncSlotTimeout_U32 in [ns] (optional)
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1F8A, 2, &DllConfigParam.m_dwAsyncSlotTimeout,
- &ObdSize);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
-#endif
-
- DllConfigParam.m_uiSizeOfStruct = sizeof(DllConfigParam);
- Ret = EplDllkConfig(&DllConfigParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if (fUpdateIdentity_p != FALSE) {
- // configure Identity
- EPL_MEMSET(&DllIdentParam, 0, sizeof(DllIdentParam));
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1000, 0, &DllIdentParam.m_dwDeviceType,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1018, 1, &DllIdentParam.m_dwVendorId,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1018, 2, &DllIdentParam.m_dwProductCode,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1018, 3,
- &DllIdentParam.m_dwRevisionNumber,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1018, 4, &DllIdentParam.m_dwSerialNumber,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- DllIdentParam.m_dwIpAddress =
- EplApiInstance_g.m_InitParam.m_dwIpAddress;
- DllIdentParam.m_dwSubnetMask =
- EplApiInstance_g.m_InitParam.m_dwSubnetMask;
- EPL_MEMCPY(DllIdentParam.m_sHostname,
- EplApiInstance_g.m_InitParam.m_sHostname,
- sizeof(DllIdentParam.m_sHostname));
-
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1020, 1,
- &DllIdentParam.m_dwVerifyConfigurationDate,
- &ObdSize);
- // ignore any error, because this object is optional
-
- ObdSize = 4;
- Ret =
- EplObdReadEntry(0x1020, 2,
- &DllIdentParam.m_dwVerifyConfigurationTime,
- &ObdSize);
- // ignore any error, because this object is optional
-
- // $$$ d.k.: fill rest of ident structure
-
- DllIdentParam.m_uiSizeOfStruct = sizeof(DllIdentParam);
- Ret = EplDllkSetIdentity(&DllIdentParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiUpdateObd
-//
-// Description: update OD from init param
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplApiUpdateObd(void)
-{
- tEplKernel Ret = kEplSuccessful;
- u16 wTemp;
- u8 bTemp;
-
- // set node id in OD
- Ret = EplObdSetNodeId(EplApiInstance_g.m_InitParam.m_uiNodeId, // node id
- kEplObdNodeIdHardware); // set by hardware
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if (EplApiInstance_g.m_InitParam.m_dwCycleLen != -1) {
- Ret =
- EplObdWriteEntry(0x1006, 0,
- &EplApiInstance_g.m_InitParam.m_dwCycleLen,
- 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_dwLossOfFrameTolerance != -1) {
- Ret =
- EplObdWriteEntry(0x1C14, 0,
- &EplApiInstance_g.m_InitParam.
- m_dwLossOfFrameTolerance, 4);
- /* if(Ret != kEplSuccessful)
- {
- goto Exit;
- } */
- }
- // d.k. There is no dependance between FeatureFlags and async-only CN.
- if (EplApiInstance_g.m_InitParam.m_dwFeatureFlags != -1) {
- Ret =
- EplObdWriteEntry(0x1F82, 0,
- &EplApiInstance_g.m_InitParam.
- m_dwFeatureFlags, 4);
- /* if(Ret != kEplSuccessful)
- {
- goto Exit;
- } */
- }
-
- wTemp = (u16) EplApiInstance_g.m_InitParam.m_uiIsochrTxMaxPayload;
- Ret = EplObdWriteEntry(0x1F98, 1, &wTemp, 2);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
-
- wTemp = (u16) EplApiInstance_g.m_InitParam.m_uiIsochrRxMaxPayload;
- Ret = EplObdWriteEntry(0x1F98, 2, &wTemp, 2);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
-
- Ret =
- EplObdWriteEntry(0x1F98, 3,
- &EplApiInstance_g.m_InitParam.m_dwPresMaxLatency,
- 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
-
- if (EplApiInstance_g.m_InitParam.m_uiPreqActPayloadLimit <=
- EPL_C_DLL_ISOCHR_MAX_PAYL) {
- wTemp =
- (u16) EplApiInstance_g.m_InitParam.m_uiPreqActPayloadLimit;
- Ret = EplObdWriteEntry(0x1F98, 4, &wTemp, 2);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_uiPresActPayloadLimit <=
- EPL_C_DLL_ISOCHR_MAX_PAYL) {
- wTemp =
- (u16) EplApiInstance_g.m_InitParam.m_uiPresActPayloadLimit;
- Ret = EplObdWriteEntry(0x1F98, 5, &wTemp, 2);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- Ret =
- EplObdWriteEntry(0x1F98, 6,
- &EplApiInstance_g.m_InitParam.m_dwAsndMaxLatency,
- 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
-
- if (EplApiInstance_g.m_InitParam.m_uiMultiplCycleCnt <= 0xFF) {
- bTemp = (u8) EplApiInstance_g.m_InitParam.m_uiMultiplCycleCnt;
- Ret = EplObdWriteEntry(0x1F98, 7, &bTemp, 1);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_uiAsyncMtu <=
- EPL_C_DLL_MAX_ASYNC_MTU) {
- wTemp = (u16) EplApiInstance_g.m_InitParam.m_uiAsyncMtu;
- Ret = EplObdWriteEntry(0x1F98, 8, &wTemp, 2);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_uiPrescaler <= 1000) {
- wTemp = (u16) EplApiInstance_g.m_InitParam.m_uiPrescaler;
- Ret = EplObdWriteEntry(0x1F98, 9, &wTemp, 2);
- // ignore return code
- Ret = kEplSuccessful;
- }
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if (EplApiInstance_g.m_InitParam.m_dwWaitSocPreq != -1) {
- Ret =
- EplObdWriteEntry(0x1F8A, 1,
- &EplApiInstance_g.m_InitParam.
- m_dwWaitSocPreq, 4);
- /* if(Ret != kEplSuccessful)
- {
- goto Exit;
- } */
- }
-
- if ((EplApiInstance_g.m_InitParam.m_dwAsyncSlotTimeout != 0)
- && (EplApiInstance_g.m_InitParam.m_dwAsyncSlotTimeout != -1)) {
- Ret =
- EplObdWriteEntry(0x1F8A, 2,
- &EplApiInstance_g.m_InitParam.
- m_dwAsyncSlotTimeout, 4);
- /* if(Ret != kEplSuccessful)
- {
- goto Exit;
- } */
- }
-#endif
-
- // configure Identity
- if (EplApiInstance_g.m_InitParam.m_dwDeviceType != -1) {
- Ret =
- EplObdWriteEntry(0x1000, 0,
- &EplApiInstance_g.m_InitParam.
- m_dwDeviceType, 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_dwVendorId != -1) {
- Ret =
- EplObdWriteEntry(0x1018, 1,
- &EplApiInstance_g.m_InitParam.m_dwVendorId,
- 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_dwProductCode != -1) {
- Ret =
- EplObdWriteEntry(0x1018, 2,
- &EplApiInstance_g.m_InitParam.
- m_dwProductCode, 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_dwRevisionNumber != -1) {
- Ret =
- EplObdWriteEntry(0x1018, 3,
- &EplApiInstance_g.m_InitParam.
- m_dwRevisionNumber, 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_dwSerialNumber != -1) {
- Ret =
- EplObdWriteEntry(0x1018, 4,
- &EplApiInstance_g.m_InitParam.
- m_dwSerialNumber, 4);
-/* if(Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_pszDevName != NULL) {
- // write Device Name (0x1008)
- Ret =
- EplObdWriteEntry(0x1008, 0,
- (void *)EplApiInstance_g.
- m_InitParam.m_pszDevName,
- (tEplObdSize) strlen(EplApiInstance_g.
- m_InitParam.
- m_pszDevName));
-/* if (Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_pszHwVersion != NULL) {
- // write Hardware version (0x1009)
- Ret =
- EplObdWriteEntry(0x1009, 0,
- (void *)EplApiInstance_g.
- m_InitParam.m_pszHwVersion,
- (tEplObdSize) strlen(EplApiInstance_g.
- m_InitParam.
- m_pszHwVersion));
-/* if (Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- if (EplApiInstance_g.m_InitParam.m_pszSwVersion != NULL) {
- // write Software version (0x100A)
- Ret =
- EplObdWriteEntry(0x100A, 0,
- (void *)EplApiInstance_g.
- m_InitParam.m_pszSwVersion,
- (tEplObdSize) strlen(EplApiInstance_g.
- m_InitParam.
- m_pszSwVersion));
-/* if (Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiCbSdoCon
-//
-// Description: callback function for SDO transfers
-//
-// Parameters: pSdoComFinished_p = SDO parameter
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-static tEplKernel EplApiCbSdoCon(tEplSdoComFinished *pSdoComFinished_p)
-{
- tEplKernel Ret;
- tEplApiEventArg EventArg;
-
- Ret = kEplSuccessful;
-
- // call user callback
- EventArg.m_Sdo = *pSdoComFinished_p;
- Ret = EplApiInstance_g.m_InitParam.m_pfnCbEvent(kEplApiEventSdo,
- &EventArg,
- EplApiInstance_g.
- m_InitParam.
- m_pEventUserArg);
-
- return Ret;
-
-}
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiCbNodeEvent
-//
-// Description: callback function for node events
-//
-// Parameters: uiNodeId_p = node ID of the CN
-// NodeEvent_p = event from the specified CN
-// NmtState_p = current NMT state of the CN
-// wErrorCode_p = EPL error code if NodeEvent_p==kEplNmtNodeEventError
-// fMandatory_p = flag if CN is mandatory
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplApiCbNodeEvent(unsigned int uiNodeId_p,
- tEplNmtNodeEvent NodeEvent_p,
- tEplNmtState NmtState_p,
- u16 wErrorCode_p, BOOL fMandatory_p)
-{
- tEplKernel Ret;
- tEplApiEventArg EventArg;
-
- Ret = kEplSuccessful;
-
- // call user callback
- EventArg.m_Node.m_uiNodeId = uiNodeId_p;
- EventArg.m_Node.m_NodeEvent = NodeEvent_p;
- EventArg.m_Node.m_NmtState = NmtState_p;
- EventArg.m_Node.m_wErrorCode = wErrorCode_p;
- EventArg.m_Node.m_fMandatory = fMandatory_p;
-
- Ret = EplApiInstance_g.m_InitParam.m_pfnCbEvent(kEplApiEventNode,
- &EventArg,
- EplApiInstance_g.
- m_InitParam.
- m_pEventUserArg);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiCbBootEvent
-//
-// Description: callback function for boot events
-//
-// Parameters: BootEvent_p = event from the boot-up process
-// NmtState_p = current local NMT state
-// wErrorCode_p = EPL error code if BootEvent_p==kEplNmtBootEventError
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplApiCbBootEvent(tEplNmtBootEvent BootEvent_p,
- tEplNmtState NmtState_p,
- u16 wErrorCode_p)
-{
- tEplKernel Ret;
- tEplApiEventArg EventArg;
-
- Ret = kEplSuccessful;
-
- // call user callback
- EventArg.m_Boot.m_BootEvent = BootEvent_p;
- EventArg.m_Boot.m_NmtState = NmtState_p;
- EventArg.m_Boot.m_wErrorCode = wErrorCode_p;
-
- Ret = EplApiInstance_g.m_InitParam.m_pfnCbEvent(kEplApiEventBoot,
- &EventArg,
- EplApiInstance_g.
- m_InitParam.
- m_pEventUserArg);
-
- return Ret;
-
-}
-
-#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiCbLedStateChange
-//
-// Description: callback function for LED change events.
-//
-// Parameters: LedType_p = type of LED
-// fOn_p = state of LED
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplApiCbLedStateChange(tEplLedType LedType_p, BOOL fOn_p)
-{
- tEplKernel Ret;
- tEplApiEventArg EventArg;
-
- Ret = kEplSuccessful;
-
- // call user callback
- EventArg.m_Led.m_LedType = LedType_p;
- EventArg.m_Led.m_fOn = fOn_p;
-
- Ret = EplApiInstance_g.m_InitParam.m_pfnCbEvent(kEplApiEventLed,
- &EventArg,
- EplApiInstance_g.
- m_InitParam.
- m_pEventUserArg);
-
- return Ret;
-
-}
-
-#endif
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for EPL API layer for Linux (kernel and user space)
-
- 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: EplApiLinux.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/08/25 12:17:41 $
-
- $State: Exp $
-
- Build Environment:
- KEIL uVision 2
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/10/11 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_API_LINUX_H_
-#define _EPL_API_LINUX_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#define EPLLIN_DEV_NAME "epl" // used for "/dev" and "/proc" entry
-
-//---------------------------------------------------------------------------
-// Commands for <ioctl>
-//---------------------------------------------------------------------------
-
-#define EPLLIN_CMD_INITIALIZE 0 // ulArg_p ~ tEplApiInitParam*
-#define EPLLIN_CMD_PI_IN 1 // ulArg_p ~ tEplApiProcessImage*
-#define EPLLIN_CMD_PI_OUT 2 // ulArg_p ~ tEplApiProcessImage*
-#define EPLLIN_CMD_WRITE_OBJECT 3 // ulArg_p ~ tEplLinSdoObject*
-#define EPLLIN_CMD_READ_OBJECT 4 // ulArg_p ~ tEplLinSdoObject*
-#define EPLLIN_CMD_WRITE_LOCAL_OBJECT 5 // ulArg_p ~ tEplLinLocalObject*
-#define EPLLIN_CMD_READ_LOCAL_OBJECT 6 // ulArg_p ~ tEplLinLocalObject*
-#define EPLLIN_CMD_FREE_SDO_CHANNEL 7 // ulArg_p ~ tEplSdoComConHdl
-#define EPLLIN_CMD_NMT_COMMAND 8 // ulArg_p ~ tEplNmtEvent
-#define EPLLIN_CMD_GET_EVENT 9 // ulArg_p ~ tEplLinEvent*
-#define EPLLIN_CMD_MN_TRIGGER_STATE_CHANGE 10 // ulArg_p ~ tEplLinNodeCmdObject*
-#define EPLLIN_CMD_PI_SETUP 11 // ulArg_p ~ 0
-#define EPLLIN_CMD_SHUTDOWN 12 // ulArg_p ~ 0
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef struct {
- unsigned int m_uiEventArgSize;
- tEplApiEventArg *m_pEventArg;
- tEplApiEventType *m_pEventType;
- tEplKernel m_RetCbEvent;
-
-} tEplLinEvent;
-
-typedef struct {
- tEplSdoComConHdl m_SdoComConHdl;
- BOOL m_fValidSdoComConHdl;
- unsigned int m_uiNodeId;
- unsigned int m_uiIndex;
- unsigned int m_uiSubindex;
- void *m_le_pData;
- unsigned int m_uiSize;
- tEplSdoType m_SdoType;
- void *m_pUserArg;
-
-} tEplLinSdoObject;
-
-typedef struct {
- unsigned int m_uiIndex;
- unsigned int m_uiSubindex;
- void *m_pData;
- unsigned int m_uiSize;
-
-} tEplLinLocalObject;
-
-typedef struct {
- unsigned int m_uiNodeId;
- tEplNmtNodeCommand m_NodeCommand;
-
-} tEplLinNodeCmdObject;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_API_LINUX_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: Linux kernel module as wrapper of EPL API layer,
- i.e. counterpart to a Linux application
-
- 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: EplApiLinuxKernel.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.9 $ $Date: 2008/11/21 09:00:38 $
-
- $State: Exp $
-
- Build Environment:
- GNU-Compiler for m68k
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/10/11 d.k.: Initial Version
- 2008/04/10 m.u.: Changed to new char driver init
-
-****************************************************************************/
-
-// kernel modul and driver
-
-#include <linux/module.h>
-#include <linux/fs.h>
-#include <linux/cdev.h>
-#include <linux/types.h>
-
-//#include <linux/module.h>
-//#include <linux/kernel.h>
-//#include <linux/init.h>
-//#include <linux/errno.h>
-
-// scheduling
-#include <linux/sched.h>
-
-// memory access
-#include <asm/uaccess.h>
-#include <linux/vmalloc.h>
-
-#include "Epl.h"
-#include "EplApiLinux.h"
-//#include "kernel/EplPdokCal.h"
-#include "proc_fs.h"
-
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-// Metainformation
-MODULE_LICENSE("Dual BSD/GPL");
-#ifdef MODULE_AUTHOR
-MODULE_AUTHOR("Daniel.Krueger@SYSTEC-electronic.com");
-MODULE_DESCRIPTION("EPL API driver");
-#endif
-
-//---------------------------------------------------------------------------
-// Configuration
-//---------------------------------------------------------------------------
-
-#define EPLLIN_DRV_NAME "systec_epl" // used for <register_chrdev>
-
-//---------------------------------------------------------------------------
-// Constant definitions
-//---------------------------------------------------------------------------
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
-#else
-#define TGT_DBG_SIGNAL_TRACE_POINT(p)
-#endif
-
-#define EVENT_STATE_INIT 0
-#define EVENT_STATE_IOCTL 1 // ioctl entered and ready to receive EPL event
-#define EVENT_STATE_READY 2 // EPL event can be forwarded to user application
-#define EVENT_STATE_TERM 3 // terminate processing
-
-#define EPL_STATE_NOTOPEN 0
-#define EPL_STATE_NOTINIT 1
-#define EPL_STATE_RUNNING 2
-#define EPL_STATE_SHUTDOWN 3
-
-//---------------------------------------------------------------------------
-// Global variables
-//---------------------------------------------------------------------------
-
- // device number (major and minor)
-static dev_t nDevNum_g;
-static struct cdev *pEpl_cdev_g;
-
-static volatile unsigned int uiEplState_g = EPL_STATE_NOTOPEN;
-
-static struct semaphore SemaphoreCbEvent_g; // semaphore for EplLinCbEvent
-static wait_queue_head_t WaitQueueCbEvent_g; // wait queue EplLinCbEvent
-static wait_queue_head_t WaitQueueProcess_g; // wait queue for EplApiProcess (user process)
-static wait_queue_head_t WaitQueueRelease_g; // wait queue for EplLinRelease
-static atomic_t AtomicEventState_g = ATOMIC_INIT(EVENT_STATE_INIT);
-static tEplApiEventType EventType_g; // event type (enum)
-static tEplApiEventArg *pEventArg_g; // event argument (union)
-static tEplKernel RetCbEvent_g; // return code from event callback function
-static wait_queue_head_t WaitQueueCbSync_g; // wait queue EplLinCbSync
-static wait_queue_head_t WaitQueuePI_In_g; // wait queue for EplApiProcessImageExchangeIn (user process)
-static atomic_t AtomicSyncState_g = ATOMIC_INIT(EVENT_STATE_INIT);
-
-//---------------------------------------------------------------------------
-// Local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- void *m_pUserArg;
- void *m_pData;
-
-} tEplLinSdoBufHeader;
-
-//---------------------------------------------------------------------------
-// Local variables
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Prototypes of internal functions
-//---------------------------------------------------------------------------
-
-tEplKernel EplLinCbEvent(tEplApiEventType EventType_p, // IN: event type (enum)
- tEplApiEventArg *pEventArg_p, // IN: event argument (union)
- void *pUserArg_p);
-
-tEplKernel EplLinCbSync(void);
-
-static int __init EplLinInit(void);
-static void __exit EplLinExit(void);
-
-static int EplLinOpen(struct inode *pDeviceFile_p, struct file *pInstance_p);
-static int EplLinRelease(struct inode *pDeviceFile_p, struct file *pInstance_p);
-static ssize_t EplLinRead(struct file *pInstance_p, char *pDstBuff_p,
- size_t BuffSize_p, loff_t * pFileOffs_p);
-static ssize_t EplLinWrite(struct file *pInstance_p, const char *pSrcBuff_p,
- size_t BuffSize_p, loff_t * pFileOffs_p);
-static int EplLinIoctl(struct inode *pDeviceFile_p, struct file *pInstance_p,
- unsigned int uiIoctlCmd_p, unsigned long ulArg_p);
-
-//---------------------------------------------------------------------------
-// Kernel Module specific Data Structures
-//---------------------------------------------------------------------------
-
-module_init(EplLinInit);
-module_exit(EplLinExit);
-
-static struct file_operations EplLinFileOps_g = {
- .owner = THIS_MODULE,
- .open = EplLinOpen,
- .release = EplLinRelease,
- .read = EplLinRead,
- .write = EplLinWrite,
- .ioctl = EplLinIoctl,
-
-};
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// Initailize Driver
-//---------------------------------------------------------------------------
-// -> insmod driver
-//---------------------------------------------------------------------------
-
-static int __init EplLinInit(void)
-{
-
- tEplKernel EplRet;
- int iErr;
- int iRet;
-
- TRACE0("EPL: + EplLinInit...\n");
- TRACE2("EPL: Driver build: %s / %s\n", __DATE__, __TIME__);
-
- iRet = 0;
-
- // initialize global variables
- atomic_set(&AtomicEventState_g, EVENT_STATE_INIT);
- sema_init(&SemaphoreCbEvent_g, 1);
- init_waitqueue_head(&WaitQueueCbEvent_g);
- init_waitqueue_head(&WaitQueueProcess_g);
- init_waitqueue_head(&WaitQueueRelease_g);
-
- // register character device handler
- // only one Minor required
- TRACE2("EPL: Installing Driver '%s', Version %s...\n",
- EPLLIN_DRV_NAME, EPL_PRODUCT_VERSION);
- iRet = alloc_chrdev_region(&nDevNum_g, 0, 1, EPLLIN_DRV_NAME);
- if (iRet == 0) {
- TRACE2
- ("EPL: Driver '%s' installed successful, assigned MajorNumber=%d\n",
- EPLLIN_DRV_NAME, MAJOR(nDevNum_g));
- } else {
- TRACE1
- ("EPL: ERROR: Driver '%s' is unable to get a free MajorNumber!\n",
- EPLLIN_DRV_NAME);
- iRet = -EIO;
- goto Exit;
- }
-
- // register cdev structure
- pEpl_cdev_g = cdev_alloc();
- pEpl_cdev_g->ops = &EplLinFileOps_g;
- pEpl_cdev_g->owner = THIS_MODULE;
- iErr = cdev_add(pEpl_cdev_g, nDevNum_g, 1);
- if (iErr) {
- TRACE2("EPL: ERROR %d: Driver '%s' could not be added!\n",
- iErr, EPLLIN_DRV_NAME);
- iRet = -EIO;
- goto Exit;
- }
-
- // create device node in PROCFS
- EplRet = EplLinProcInit();
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
-
- Exit:
-
- TRACE1("EPL: - EplLinInit (iRet=%d)\n", iRet);
- return (iRet);
-
-}
-
-//---------------------------------------------------------------------------
-// Remove Driver
-//---------------------------------------------------------------------------
-// -> rmmod driver
-//---------------------------------------------------------------------------
-
-static void __exit EplLinExit(void)
-{
-
- tEplKernel EplRet;
-
- // delete instance for all modules
-// EplRet = EplApiShutdown();
-// printk("EplApiShutdown(): 0x%X\n", EplRet);
-
- // deinitialize proc fs
- EplRet = EplLinProcFree();
- printk("EplLinProcFree(): 0x%X\n", EplRet);
-
- TRACE0("EPL: + EplLinExit...\n");
-
- // remove cdev structure
- cdev_del(pEpl_cdev_g);
-
- // unregister character device handler
- unregister_chrdev_region(nDevNum_g, 1);
-
- TRACE1("EPL: Driver '%s' removed.\n", EPLLIN_DRV_NAME);
-
- TRACE0("EPL: - EplLinExit\n");
-
-}
-
-//---------------------------------------------------------------------------
-// Open Driver
-//---------------------------------------------------------------------------
-// -> open("/dev/driver", O_RDWR)...
-//---------------------------------------------------------------------------
-
-static int EplLinOpen(struct inode *pDeviceFile_p, // information about the device to open
- struct file *pInstance_p) // information about driver instance
-{
-
- int iRet;
-
- TRACE0("EPL: + EplLinOpen...\n");
-
- if (uiEplState_g != EPL_STATE_NOTOPEN) { // stack already initialized
- iRet = -EALREADY;
- } else {
- atomic_set(&AtomicEventState_g, EVENT_STATE_INIT);
- sema_init(&SemaphoreCbEvent_g, 1);
- init_waitqueue_head(&WaitQueueCbEvent_g);
- init_waitqueue_head(&WaitQueueProcess_g);
- init_waitqueue_head(&WaitQueueRelease_g);
- atomic_set(&AtomicSyncState_g, EVENT_STATE_INIT);
- init_waitqueue_head(&WaitQueueCbSync_g);
- init_waitqueue_head(&WaitQueuePI_In_g);
-
- uiEplState_g = EPL_STATE_NOTINIT;
- iRet = 0;
- }
-
- TRACE1("EPL: - EplLinOpen (iRet=%d)\n", iRet);
- return (iRet);
-
-}
-
-//---------------------------------------------------------------------------
-// Close Driver
-//---------------------------------------------------------------------------
-// -> close(device)...
-//---------------------------------------------------------------------------
-
-static int EplLinRelease(struct inode *pDeviceFile_p, // information about the device to open
- struct file *pInstance_p) // information about driver instance
-{
-
- tEplKernel EplRet = kEplSuccessful;
- int iRet;
-
- TRACE0("EPL: + EplLinRelease...\n");
-
- if (uiEplState_g != EPL_STATE_NOTINIT) {
- // pass control to sync kernel thread, but signal termination
- atomic_set(&AtomicSyncState_g, EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbSync_g);
- wake_up_interruptible(&WaitQueuePI_In_g);
-
- // pass control to event queue kernel thread
- atomic_set(&AtomicEventState_g, EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbEvent_g);
-
- if (uiEplState_g == EPL_STATE_RUNNING) { // post NmtEventSwitchOff
- EplRet = EplApiExecNmtCommand(kEplNmtEventSwitchOff);
-
- }
-
- if (EplRet == kEplSuccessful) {
- TRACE0("EPL: waiting for NMT_GS_OFF\n");
- wait_event_interruptible(WaitQueueRelease_g,
- (uiEplState_g ==
- EPL_STATE_SHUTDOWN));
- } else { // post NmtEventSwitchOff failed
- TRACE0("EPL: event post failed\n");
- }
-
- // $$$ d.k.: What if waiting was interrupted by signal?
-
- TRACE0("EPL: call EplApiShutdown()\n");
- // EPL stack can be safely shut down
- // delete instance for all EPL modules
- EplRet = EplApiShutdown();
- printk("EplApiShutdown(): 0x%X\n", EplRet);
- }
-
- uiEplState_g = EPL_STATE_NOTOPEN;
- iRet = 0;
-
- TRACE1("EPL: - EplLinRelease (iRet=%d)\n", iRet);
- return (iRet);
-
-}
-
-//---------------------------------------------------------------------------
-// Read Data from Driver
-//---------------------------------------------------------------------------
-// -> read(...)
-//---------------------------------------------------------------------------
-
-static ssize_t EplLinRead(struct file *pInstance_p, // information about driver instance
- char *pDstBuff_p, // address of buffer to fill with data
- size_t BuffSize_p, // length of the buffer
- loff_t * pFileOffs_p) // offset in the file
-{
-
- int iRet;
-
- TRACE0("EPL: + EplLinRead...\n");
-
- TRACE0("EPL: Sorry, this operation isn't supported.\n");
- iRet = -EINVAL;
-
- TRACE1("EPL: - EplLinRead (iRet=%d)\n", iRet);
- return (iRet);
-
-}
-
-//---------------------------------------------------------------------------
-// Write Data to Driver
-//---------------------------------------------------------------------------
-// -> write(...)
-//---------------------------------------------------------------------------
-
-static ssize_t EplLinWrite(struct file *pInstance_p, // information about driver instance
- const char *pSrcBuff_p, // address of buffer to get data from
- size_t BuffSize_p, // length of the buffer
- loff_t * pFileOffs_p) // offset in the file
-{
-
- int iRet;
-
- TRACE0("EPL: + EplLinWrite...\n");
-
- TRACE0("EPL: Sorry, this operation isn't supported.\n");
- iRet = -EINVAL;
-
- TRACE1("EPL: - EplLinWrite (iRet=%d)\n", iRet);
- return (iRet);
-
-}
-
-//---------------------------------------------------------------------------
-// Generic Access to Driver
-//---------------------------------------------------------------------------
-// -> ioctl(...)
-//---------------------------------------------------------------------------
-
-static int EplLinIoctl(struct inode *pDeviceFile_p, // information about the device to open
- struct file *pInstance_p, // information about driver instance
- unsigned int uiIoctlCmd_p, // Ioctl command to execute
- unsigned long ulArg_p) // Ioctl command specific argument/parameter
-{
-
- tEplKernel EplRet;
- int iErr;
- int iRet;
-
-// TRACE1("EPL: + EplLinIoctl (uiIoctlCmd_p=%d)...\n", uiIoctlCmd_p);
-
- iRet = -EINVAL;
-
- switch (uiIoctlCmd_p) {
- // ----------------------------------------------------------
- case EPLLIN_CMD_INITIALIZE:
- {
- tEplApiInitParam EplApiInitParam;
-
- iErr =
- copy_from_user(&EplApiInitParam,
- (const void *)ulArg_p,
- sizeof(EplApiInitParam));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- EplApiInitParam.m_pfnCbEvent = EplLinCbEvent;
- EplApiInitParam.m_pfnCbSync = EplLinCbSync;
-
- EplRet = EplApiInitialize(&EplApiInitParam);
-
- uiEplState_g = EPL_STATE_RUNNING;
-
- iRet = (int)EplRet;
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_SHUTDOWN:
- { // shutdown the threads
-
- // pass control to sync kernel thread, but signal termination
- atomic_set(&AtomicSyncState_g, EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbSync_g);
- wake_up_interruptible(&WaitQueuePI_In_g);
-
- // pass control to event queue kernel thread
- atomic_set(&AtomicEventState_g, EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbEvent_g);
-
- if (uiEplState_g == EPL_STATE_RUNNING) { // post NmtEventSwitchOff
- EplRet =
- EplApiExecNmtCommand(kEplNmtEventSwitchOff);
-
- }
-
- iRet = 0;
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_READ_LOCAL_OBJECT:
- {
- tEplLinLocalObject LocalObject;
- void *pData;
-
- iErr =
- copy_from_user(&LocalObject, (const void *)ulArg_p,
- sizeof(LocalObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if ((LocalObject.m_pData == NULL)
- || (LocalObject.m_uiSize == 0)) {
- iRet = (int)kEplApiInvalidParam;
- goto Exit;
- }
-
- pData = vmalloc(LocalObject.m_uiSize);
- if (pData == NULL) { // no memory available
- iRet = -ENOMEM;
- goto Exit;
- }
-
- EplRet =
- EplApiReadLocalObject(LocalObject.m_uiIndex,
- LocalObject.m_uiSubindex,
- pData, &LocalObject.m_uiSize);
-
- if (EplRet == kEplSuccessful) {
- iErr =
- copy_to_user(LocalObject.m_pData, pData,
- LocalObject.m_uiSize);
-
- vfree(pData);
-
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
- // return actual size (LocalObject.m_uiSize)
- iErr = put_user(LocalObject.m_uiSize,
- (unsigned int *)(ulArg_p +
- (unsigned long)
- &LocalObject.
- m_uiSize -
- (unsigned long)
- &LocalObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- } else {
- vfree(pData);
- }
-
- iRet = (int)EplRet;
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_WRITE_LOCAL_OBJECT:
- {
- tEplLinLocalObject LocalObject;
- void *pData;
-
- iErr =
- copy_from_user(&LocalObject, (const void *)ulArg_p,
- sizeof(LocalObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if ((LocalObject.m_pData == NULL)
- || (LocalObject.m_uiSize == 0)) {
- iRet = (int)kEplApiInvalidParam;
- goto Exit;
- }
-
- pData = vmalloc(LocalObject.m_uiSize);
- if (pData == NULL) { // no memory available
- iRet = -ENOMEM;
- goto Exit;
- }
- iErr =
- copy_from_user(pData, LocalObject.m_pData,
- LocalObject.m_uiSize);
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- EplRet =
- EplApiWriteLocalObject(LocalObject.m_uiIndex,
- LocalObject.m_uiSubindex,
- pData, LocalObject.m_uiSize);
-
- vfree(pData);
-
- iRet = (int)EplRet;
- break;
- }
-
- case EPLLIN_CMD_READ_OBJECT:
- {
- tEplLinSdoObject SdoObject;
- void *pData;
- tEplLinSdoBufHeader *pBufHeader;
- tEplSdoComConHdl *pSdoComConHdl;
-
- iErr =
- copy_from_user(&SdoObject, (const void *)ulArg_p,
- sizeof(SdoObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if ((SdoObject.m_le_pData == NULL)
- || (SdoObject.m_uiSize == 0)) {
- iRet = (int)kEplApiInvalidParam;
- goto Exit;
- }
-
- pBufHeader =
- (tEplLinSdoBufHeader *)
- vmalloc(sizeof(tEplLinSdoBufHeader) +
- SdoObject.m_uiSize);
- if (pBufHeader == NULL) { // no memory available
- iRet = -ENOMEM;
- goto Exit;
- }
- // initiate temporary buffer
- pBufHeader->m_pUserArg = SdoObject.m_pUserArg; // original user argument pointer
- pBufHeader->m_pData = SdoObject.m_le_pData; // original data pointer from app
- pData = pBufHeader + sizeof(tEplLinSdoBufHeader);
-
- if (SdoObject.m_fValidSdoComConHdl != FALSE) {
- pSdoComConHdl = &SdoObject.m_SdoComConHdl;
- } else {
- pSdoComConHdl = NULL;
- }
-
- EplRet =
- EplApiReadObject(pSdoComConHdl,
- SdoObject.m_uiNodeId,
- SdoObject.m_uiIndex,
- SdoObject.m_uiSubindex, pData,
- &SdoObject.m_uiSize,
- SdoObject.m_SdoType, pBufHeader);
-
- // return actual SDO handle (SdoObject.m_SdoComConHdl)
- iErr = put_user(SdoObject.m_SdoComConHdl,
- (unsigned int *)(ulArg_p +
- (unsigned long)
- &SdoObject.
- m_SdoComConHdl -
- (unsigned long)
- &SdoObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if (EplRet == kEplSuccessful) {
- iErr =
- copy_to_user(SdoObject.m_le_pData, pData,
- SdoObject.m_uiSize);
-
- vfree(pBufHeader);
-
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
- // return actual size (SdoObject.m_uiSize)
- iErr = put_user(SdoObject.m_uiSize,
- (unsigned int *)(ulArg_p +
- (unsigned long)
- &SdoObject.
- m_uiSize -
- (unsigned long)
- &SdoObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
- } else if (EplRet != kEplApiTaskDeferred) { // error ocurred
- vfree(pBufHeader);
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
- }
-
- iRet = (int)EplRet;
- break;
- }
-
- case EPLLIN_CMD_WRITE_OBJECT:
- {
- tEplLinSdoObject SdoObject;
- void *pData;
- tEplLinSdoBufHeader *pBufHeader;
- tEplSdoComConHdl *pSdoComConHdl;
-
- iErr =
- copy_from_user(&SdoObject, (const void *)ulArg_p,
- sizeof(SdoObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if ((SdoObject.m_le_pData == NULL)
- || (SdoObject.m_uiSize == 0)) {
- iRet = (int)kEplApiInvalidParam;
- goto Exit;
- }
-
- pBufHeader =
- (tEplLinSdoBufHeader *)
- vmalloc(sizeof(tEplLinSdoBufHeader) +
- SdoObject.m_uiSize);
- if (pBufHeader == NULL) { // no memory available
- iRet = -ENOMEM;
- goto Exit;
- }
- // initiate temporary buffer
- pBufHeader->m_pUserArg = SdoObject.m_pUserArg; // original user argument pointer
- pBufHeader->m_pData = SdoObject.m_le_pData; // original data pointer from app
- pData = pBufHeader + sizeof(tEplLinSdoBufHeader);
-
- iErr =
- copy_from_user(pData, SdoObject.m_le_pData,
- SdoObject.m_uiSize);
-
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if (SdoObject.m_fValidSdoComConHdl != FALSE) {
- pSdoComConHdl = &SdoObject.m_SdoComConHdl;
- } else {
- pSdoComConHdl = NULL;
- }
-
- EplRet =
- EplApiWriteObject(pSdoComConHdl,
- SdoObject.m_uiNodeId,
- SdoObject.m_uiIndex,
- SdoObject.m_uiSubindex, pData,
- SdoObject.m_uiSize,
- SdoObject.m_SdoType, pBufHeader);
-
- // return actual SDO handle (SdoObject.m_SdoComConHdl)
- iErr = put_user(SdoObject.m_SdoComConHdl,
- (unsigned int *)(ulArg_p +
- (unsigned long)
- &SdoObject.
- m_SdoComConHdl -
- (unsigned long)
- &SdoObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if (EplRet != kEplApiTaskDeferred) { // succeeded or error ocurred, but task not deferred
- vfree(pBufHeader);
- }
-
- iRet = (int)EplRet;
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_FREE_SDO_CHANNEL:
- {
- // forward SDO handle to EPL stack
- EplRet =
- EplApiFreeSdoChannel((tEplSdoComConHdl) ulArg_p);
-
- iRet = (int)EplRet;
- break;
- }
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // ----------------------------------------------------------
- case EPLLIN_CMD_MN_TRIGGER_STATE_CHANGE:
- {
- tEplLinNodeCmdObject NodeCmdObject;
-
- iErr =
- copy_from_user(&NodeCmdObject,
- (const void *)ulArg_p,
- sizeof(NodeCmdObject));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- EplRet =
- EplApiMnTriggerStateChange(NodeCmdObject.m_uiNodeId,
- NodeCmdObject.
- m_NodeCommand);
- iRet = (int)EplRet;
- break;
- }
-#endif
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_GET_EVENT:
- {
- tEplLinEvent Event;
-
- // save event structure
- iErr =
- copy_from_user(&Event, (const void *)ulArg_p,
- sizeof(Event));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
- // save return code from application's event callback function
- RetCbEvent_g = Event.m_RetCbEvent;
-
- if (RetCbEvent_g == kEplShutdown) {
- // pass control to event queue kernel thread, but signal termination
- atomic_set(&AtomicEventState_g,
- EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbEvent_g);
- // exit with error -> EplApiProcess() will leave the infinite loop
- iRet = 1;
- goto Exit;
- }
- // pass control to event queue kernel thread
- atomic_set(&AtomicEventState_g, EVENT_STATE_IOCTL);
- wake_up_interruptible(&WaitQueueCbEvent_g);
-
- // fall asleep itself in own wait queue
- iErr = wait_event_interruptible(WaitQueueProcess_g,
- (atomic_read
- (&AtomicEventState_g)
- == EVENT_STATE_READY)
- ||
- (atomic_read
- (&AtomicEventState_g)
- == EVENT_STATE_TERM));
- if (iErr != 0) { // waiting was interrupted by signal
- // pass control to event queue kernel thread, but signal termination
- atomic_set(&AtomicEventState_g,
- EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbEvent_g);
- // exit with this error -> EplApiProcess() will leave the infinite loop
- iRet = iErr;
- goto Exit;
- } else if (atomic_read(&AtomicEventState_g) == EVENT_STATE_TERM) { // termination in progress
- // pass control to event queue kernel thread, but signal termination
- wake_up_interruptible(&WaitQueueCbEvent_g);
- // exit with this error -> EplApiProcess() will leave the infinite loop
- iRet = 1;
- goto Exit;
- }
- // copy event to user space
- iErr =
- copy_to_user(Event.m_pEventType, &EventType_g,
- sizeof(EventType_g));
- if (iErr != 0) { // not all data could be copied
- iRet = -EIO;
- goto Exit;
- }
- // $$$ d.k. perform SDO event processing
- if (EventType_g == kEplApiEventSdo) {
- void *pData;
- tEplLinSdoBufHeader *pBufHeader;
-
- pBufHeader =
- (tEplLinSdoBufHeader *) pEventArg_g->m_Sdo.
- m_pUserArg;
- pData =
- pBufHeader + sizeof(tEplLinSdoBufHeader);
-
- if (pEventArg_g->m_Sdo.m_SdoAccessType ==
- kEplSdoAccessTypeRead) {
- // copy read data to user space
- iErr =
- copy_to_user(pBufHeader->m_pData,
- pData,
- pEventArg_g->m_Sdo.
- m_uiTransferredByte);
- if (iErr != 0) { // not all data could be copied
- iRet = -EIO;
- goto Exit;
- }
- }
- pEventArg_g->m_Sdo.m_pUserArg =
- pBufHeader->m_pUserArg;
- vfree(pBufHeader);
- }
-
- iErr =
- copy_to_user(Event.m_pEventArg, pEventArg_g,
- min(sizeof(tEplApiEventArg),
- Event.m_uiEventArgSize));
- if (iErr != 0) { // not all data could be copied
- iRet = -EIO;
- goto Exit;
- }
- // return to EplApiProcess(), which will call the application's event callback function
- iRet = 0;
-
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_PI_SETUP:
- {
- EplRet = EplApiProcessImageSetup();
- iRet = (int)EplRet;
-
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_PI_IN:
- {
- tEplApiProcessImage ProcessImageIn;
-
- // save process image structure
- iErr =
- copy_from_user(&ProcessImageIn,
- (const void *)ulArg_p,
- sizeof(ProcessImageIn));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
- // pass control to event queue kernel thread
- atomic_set(&AtomicSyncState_g, EVENT_STATE_IOCTL);
-
- // fall asleep itself in own wait queue
- iErr = wait_event_interruptible(WaitQueuePI_In_g,
- (atomic_read
- (&AtomicSyncState_g) ==
- EVENT_STATE_READY)
- ||
- (atomic_read
- (&AtomicSyncState_g) ==
- EVENT_STATE_TERM));
- if (iErr != 0) { // waiting was interrupted by signal
- // pass control to sync kernel thread, but signal termination
- atomic_set(&AtomicSyncState_g,
- EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbSync_g);
- // exit with this error -> application will leave the infinite loop
- iRet = iErr;
- goto Exit;
- } else if (atomic_read(&AtomicSyncState_g) == EVENT_STATE_TERM) { // termination in progress
- // pass control to sync kernel thread, but signal termination
- wake_up_interruptible(&WaitQueueCbSync_g);
- // exit with this error -> application will leave the infinite loop
- iRet = 1;
- goto Exit;
- }
- // exchange process image
- EplRet = EplApiProcessImageExchangeIn(&ProcessImageIn);
-
- // return to EplApiProcessImageExchangeIn()
- iRet = (int)EplRet;
-
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_PI_OUT:
- {
- tEplApiProcessImage ProcessImageOut;
-
- // save process image structure
- iErr =
- copy_from_user(&ProcessImageOut,
- (const void *)ulArg_p,
- sizeof(ProcessImageOut));
- if (iErr != 0) {
- iRet = -EIO;
- goto Exit;
- }
-
- if (atomic_read(&AtomicSyncState_g) !=
- EVENT_STATE_READY) {
- iRet = (int)kEplInvalidOperation;
- goto Exit;
- }
- // exchange process image
- EplRet =
- EplApiProcessImageExchangeOut(&ProcessImageOut);
-
- // pass control to sync kernel thread
- atomic_set(&AtomicSyncState_g, EVENT_STATE_TERM);
- wake_up_interruptible(&WaitQueueCbSync_g);
-
- // return to EplApiProcessImageExchangeout()
- iRet = (int)EplRet;
-
- break;
- }
-
- // ----------------------------------------------------------
- case EPLLIN_CMD_NMT_COMMAND:
- {
- // forward NMT command to EPL stack
- EplRet = EplApiExecNmtCommand((tEplNmtEvent) ulArg_p);
-
- iRet = (int)EplRet;
-
- break;
- }
-
- // ----------------------------------------------------------
- default:
- {
- break;
- }
- }
-
- Exit:
-
-// TRACE1("EPL: - EplLinIoctl (iRet=%d)\n", iRet);
- return (iRet);
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-tEplKernel EplLinCbEvent(tEplApiEventType EventType_p, // IN: event type (enum)
- tEplApiEventArg *pEventArg_p, // IN: event argument (union)
- void *pUserArg_p)
-{
- tEplKernel EplRet = kEplSuccessful;
- int iErr;
-
- // block any further call to this function, i.e. enter critical section
- iErr = down_interruptible(&SemaphoreCbEvent_g);
- if (iErr != 0) { // waiting was interrupted by signal
- EplRet = kEplShutdown;
- goto Exit;
- }
- // wait for EplApiProcess() to call ioctl
- // normally it should be waiting already for us to pass a new event
- iErr = wait_event_interruptible(WaitQueueCbEvent_g,
- (atomic_read(&AtomicEventState_g) ==
- EVENT_STATE_IOCTL)
- || (atomic_read(&AtomicEventState_g) ==
- EVENT_STATE_TERM));
- if ((iErr != 0) || (atomic_read(&AtomicEventState_g) == EVENT_STATE_TERM)) { // waiting was interrupted by signal
- EplRet = kEplShutdown;
- goto LeaveCriticalSection;
- }
- // save event information for ioctl
- EventType_g = EventType_p;
- pEventArg_g = pEventArg_p;
-
- // pass control to application's event callback function, i.e. EplApiProcess()
- atomic_set(&AtomicEventState_g, EVENT_STATE_READY);
- wake_up_interruptible(&WaitQueueProcess_g);
-
- // now, the application's event callback function processes the event
-
- // wait for completion of application's event callback function, i.e. EplApiProcess() calls ioctl again
- iErr = wait_event_interruptible(WaitQueueCbEvent_g,
- (atomic_read(&AtomicEventState_g) ==
- EVENT_STATE_IOCTL)
- || (atomic_read(&AtomicEventState_g) ==
- EVENT_STATE_TERM));
- if ((iErr != 0) || (atomic_read(&AtomicEventState_g) == EVENT_STATE_TERM)) { // waiting was interrupted by signal
- EplRet = kEplShutdown;
- goto LeaveCriticalSection;
- }
- // read return code from application's event callback function
- EplRet = RetCbEvent_g;
-
- LeaveCriticalSection:
- up(&SemaphoreCbEvent_g);
-
- Exit:
- // check if NMT_GS_OFF is reached
- if (EventType_p == kEplApiEventNmtStateChange) {
- if (pEventArg_p->m_NmtStateChange.m_NewNmtState == kEplNmtGsOff) { // NMT state machine was shut down
- TRACE0("EPL: EplLinCbEvent(NMT_GS_OFF)\n");
- uiEplState_g = EPL_STATE_SHUTDOWN;
- atomic_set(&AtomicEventState_g, EVENT_STATE_TERM);
- wake_up(&WaitQueueRelease_g);
- } else { // NMT state machine is running
- uiEplState_g = EPL_STATE_RUNNING;
- }
- }
-
- return EplRet;
-}
-
-tEplKernel EplLinCbSync(void)
-{
- tEplKernel EplRet = kEplSuccessful;
- int iErr;
-
- // check if user process waits for sync
- if (atomic_read(&AtomicSyncState_g) == EVENT_STATE_IOCTL) {
- // pass control to application, i.e. EplApiProcessImageExchangeIn()
- atomic_set(&AtomicSyncState_g, EVENT_STATE_READY);
- wake_up_interruptible(&WaitQueuePI_In_g);
-
- // now, the application processes the sync event
-
- // wait for call of EplApiProcessImageExchangeOut()
- iErr = wait_event_interruptible(WaitQueueCbSync_g,
- (atomic_read(&AtomicSyncState_g)
- == EVENT_STATE_IOCTL)
- ||
- (atomic_read(&AtomicSyncState_g)
- == EVENT_STATE_TERM));
- if ((iErr != 0) || (atomic_read(&AtomicEventState_g) == EVENT_STATE_IOCTL)) { // waiting was interrupted by signal or application called wrong function
- EplRet = kEplShutdown;
- }
- } else { // application is currently not waiting for sync
- // continue without interruption
- // TPDO are set valid by caller (i.e. EplEventkProcess())
- }
-
- TGT_DBG_SIGNAL_TRACE_POINT(1);
-
- return EplRet;
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for EPL API module (process image)
-
- 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: EplApiProcessImage.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/10/10 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#include "Epl.h"
-
-#include <linux/uaccess.h>
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S EplApi */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-#if ((EPL_API_PROCESS_IMAGE_SIZE_IN > 0) || (EPL_API_PROCESS_IMAGE_SIZE_OUT > 0))
-typedef struct {
-#if EPL_API_PROCESS_IMAGE_SIZE_IN > 0
- u8 m_abProcessImageInput[EPL_API_PROCESS_IMAGE_SIZE_IN];
-#endif
-#if EPL_API_PROCESS_IMAGE_SIZE_OUT > 0
- u8 m_abProcessImageOutput[EPL_API_PROCESS_IMAGE_SIZE_OUT];
-#endif
-
-} tEplApiProcessImageInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-static tEplApiProcessImageInstance EplApiProcessImageInstance_g;
-#endif
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplApiProcessImageSetup()
-//
-// Description: sets up static process image
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplApiProcessImageSetup(void)
-{
- tEplKernel Ret = kEplSuccessful;
-#if ((EPL_API_PROCESS_IMAGE_SIZE_IN > 0) || (EPL_API_PROCESS_IMAGE_SIZE_OUT > 0))
- unsigned int uiVarEntries;
- tEplObdSize ObdSize;
-#endif
-
-#if EPL_API_PROCESS_IMAGE_SIZE_IN > 0
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN;
- ObdSize = 1;
- Ret = EplApiLinkObject(0x2000,
- EplApiProcessImageInstance_g.
- m_abProcessImageInput, &uiVarEntries, &ObdSize,
- 1);
-
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN;
- ObdSize = 1;
- Ret = EplApiLinkObject(0x2001,
- EplApiProcessImageInstance_g.
- m_abProcessImageInput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 2;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
- Ret = EplApiLinkObject(0x2010,
- EplApiProcessImageInstance_g.
- m_abProcessImageInput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 2;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
- Ret = EplApiLinkObject(0x2011,
- EplApiProcessImageInstance_g.
- m_abProcessImageInput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 4;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
- Ret = EplApiLinkObject(0x2020,
- EplApiProcessImageInstance_g.
- m_abProcessImageInput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 4;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
- Ret = EplApiLinkObject(0x2021,
- EplApiProcessImageInstance_g.
- m_abProcessImageInput, &uiVarEntries, &ObdSize,
- 1);
-#endif
-
-#if EPL_API_PROCESS_IMAGE_SIZE_OUT > 0
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT;
- ObdSize = 1;
- Ret = EplApiLinkObject(0x2030,
- EplApiProcessImageInstance_g.
- m_abProcessImageOutput, &uiVarEntries, &ObdSize,
- 1);
-
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT;
- ObdSize = 1;
- Ret = EplApiLinkObject(0x2031,
- EplApiProcessImageInstance_g.
- m_abProcessImageOutput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 2;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
- Ret = EplApiLinkObject(0x2040,
- EplApiProcessImageInstance_g.
- m_abProcessImageOutput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 2;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
- Ret = EplApiLinkObject(0x2041,
- EplApiProcessImageInstance_g.
- m_abProcessImageOutput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 4;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
- Ret = EplApiLinkObject(0x2050,
- EplApiProcessImageInstance_g.
- m_abProcessImageOutput, &uiVarEntries, &ObdSize,
- 1);
-
- ObdSize = 4;
- uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
- Ret = EplApiLinkObject(0x2051,
- EplApiProcessImageInstance_g.
- m_abProcessImageOutput, &uiVarEntries, &ObdSize,
- 1);
-#endif
-
- return Ret;
-}
-
-//----------------------------------------------------------------------------
-// Function: EplApiProcessImageExchangeIn()
-//
-// Description: replaces passed input process image with the one of EPL stack
-//
-// Parameters: pPI_p = input process image
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//----------------------------------------------------------------------------
-
-tEplKernel EplApiProcessImageExchangeIn(tEplApiProcessImage *pPI_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
-#if EPL_API_PROCESS_IMAGE_SIZE_IN > 0
- copy_to_user(pPI_p->m_pImage,
- EplApiProcessImageInstance_g.m_abProcessImageInput,
- min(pPI_p->m_uiSize,
- sizeof(EplApiProcessImageInstance_g.
- m_abProcessImageInput)));
-#endif
-
- return Ret;
-}
-
-//----------------------------------------------------------------------------
-// Function: EplApiProcessImageExchangeOut()
-//
-// Description: copies passed output process image to EPL stack.
-//
-// Parameters: pPI_p = output process image
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//----------------------------------------------------------------------------
-
-tEplKernel EplApiProcessImageExchangeOut(tEplApiProcessImage *pPI_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
-#if EPL_API_PROCESS_IMAGE_SIZE_OUT > 0
- copy_from_user(EplApiProcessImageInstance_g.m_abProcessImageOutput,
- pPI_p->m_pImage,
- min(pPI_p->m_uiSize,
- sizeof(EplApiProcessImageInstance_g.
- m_abProcessImageOutput)));
-#endif
-
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: configuration file
-
- 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: EplCfg.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- ...
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/06 k.t.: Start of Implementation
-
-****************************************************************************/
-
-#ifndef _EPLCFG_H_
-#define _EPLCFG_H_
-
-// =========================================================================
-// generic defines which for whole EPL Stack
-// =========================================================================
-#define EPL_USE_DELETEINST_FUNC TRUE
-
-// needed to support datatypes over 32 bit by global.h
-#define USE_VAR64
-
-// EPL_MAX_INSTANCES specifies count of instances of all EPL modules.
-// If it is greater than 1 the first parameter of all
-// functions is the instance number.
-#define EPL_MAX_INSTANCES 1
-
-// This defines the target hardware. Here is encoded wich CPU and wich external
-// peripherals are connected. For possible values refere to target.h. If
-// necessary value is not available EPL stack has to
-// be adapted and tested.
-#define TARGET_HARDWARE TGTHW_PC_WRAPP
-
-// use no FIFOs, make direct calls
-//#define EPL_NO_FIFO
-
-// use no IPC between user- and kernelspace modules, make direct calls
-#define EPL_NO_USER_KERNEL
-
-#ifndef BENCHMARK_MODULES
-#define BENCHMARK_MODULES 0 //0xEE800042L
-#endif
-
-// Default defug level:
-// Only debug traces of these modules will be compiled which flags are set in define DEF_DEBUG_LVL.
-#ifndef DEF_DEBUG_LVL
-#define DEF_DEBUG_LVL 0xEC000000L
-#endif
-// EPL_DBGLVL_OBD = 0x00000004L
-// * EPL_DBGLVL_ASSERT = 0x20000000L
-// * EPL_DBGLVL_ERROR = 0x40000000L
-// * EPL_DBGLVL_ALWAYS = 0x80000000L
-
-// EPL_MODULE_INTEGRATION defines all modules which are included in
-// EPL application. Please add or delete modules for your application.
-#define EPL_MODULE_INTEGRATION EPL_MODULE_OBDK \
- | EPL_MODULE_PDOK \
- | EPL_MODULE_NMT_MN \
- | EPL_MODULE_SDOS \
- | EPL_MODULE_SDOC \
- | EPL_MODULE_SDO_ASND \
- | EPL_MODULE_SDO_UDP \
- | EPL_MODULE_NMT_CN \
- | EPL_MODULE_NMTU \
- | EPL_MODULE_NMTK \
- | EPL_MODULE_DLLK \
- | EPL_MODULE_DLLU \
- | EPL_MODULE_VETH
-// | EPL_MODULE_OBDU
-
-// =========================================================================
-// EPL ethernet driver (Edrv) specific defines
-// =========================================================================
-
-// switch this define to TRUE if Edrv supports fast tx frames
-#define EDRV_FAST_TXFRAMES FALSE
-//#define EDRV_FAST_TXFRAMES TRUE
-
-// switch this define to TRUE if Edrv supports early receive interrupts
-#define EDRV_EARLY_RX_INT FALSE
-//#define EDRV_EARLY_RX_INT TRUE
-
-// enables setting of several port pins for benchmarking purposes
-#define EDRV_BENCHMARK FALSE
-//#define EDRV_BENCHMARK TRUE // MCF_GPIO_PODR_PCIBR
-
-// Call Tx handler (i.e. EplDllCbFrameTransmitted()) already if DMA has finished,
-// otherwise call the Tx handler if frame was actually transmitted over ethernet.
-#define EDRV_DMA_TX_HANDLER FALSE
-//#define EDRV_DMA_TX_HANDLER TRUE
-
-// number of used ethernet controller
-//#define EDRV_USED_ETH_CTRL 1
-
-// =========================================================================
-// Data Link Layer (DLL) specific defines
-// =========================================================================
-
-// switch this define to TRUE if Edrv supports fast tx frames
-// and DLL shall pass PRes as ready to Edrv after SoC
-#define EPL_DLL_PRES_READY_AFTER_SOC FALSE
-//#define EPL_DLL_PRES_READY_AFTER_SOC TRUE
-
-// switch this define to TRUE if Edrv supports fast tx frames
-// and DLL shall pass PRes as ready to Edrv after SoA
-#define EPL_DLL_PRES_READY_AFTER_SOA FALSE
-//#define EPL_DLL_PRES_READY_AFTER_SOA TRUE
-
-// =========================================================================
-// OBD specific defines
-// =========================================================================
-
-// switch this define to TRUE if Epl should compare object range
-// automaticly
-#define EPL_OBD_CHECK_OBJECT_RANGE FALSE
-//#define EPL_OBD_CHECK_OBJECT_RANGE TRUE
-
-// set this define to TRUE if there are strings or domains in OD, which
-// may be changed in object size and/or object data pointer by its object
-// callback function (called event kObdEvWrStringDomain)
-//#define EPL_OBD_USE_STRING_DOMAIN_IN_RAM FALSE
-#define EPL_OBD_USE_STRING_DOMAIN_IN_RAM TRUE
-
-#define EPL_OBD_USE_VARIABLE_SUBINDEX_TAB TRUE
-
-// =========================================================================
-// Timer module specific defines
-// =========================================================================
-
-// if TRUE it uses the Timer module implementation of EPL user also in EPL kernel
-#define EPL_TIMER_USE_USER TRUE
-
-// if TRUE the high resolution timer module will be used
-#define EPL_TIMER_USE_HIGHRES TRUE
-//#define EPL_TIMER_USE_HIGHRES FALSE
-
-#endif //_EPLCFG_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for EPL default constants
-
- 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: EplDef.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.15 $ $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
-
-****************************************************************************/
-
-#ifndef _EPL_DEF_H_
-#define _EPL_DEF_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#define EPL_C_ADR_BROADCAST 0xFF // EPL broadcast address
-#define EPL_C_ADR_DIAG_DEF_NODE_ID 0xFD // EPL default address of dignostic device
-#define EPL_C_ADR_DUMMY_NODE_ID 0xFC // EPL dummy node address
-#define EPL_C_ADR_INVALID 0x00 // invalid EPL address
-#define EPL_C_ADR_MN_DEF_NODE_ID 0xF0 // EPL default address of MN
-#define EPL_C_ADR_RT1_DEF_NODE_ID 0xFE // EPL default address of router type 1
-#define EPL_C_DLL_ASND_PRIO_NMTRQST 7 // increased ASnd request priority to be used by NMT Requests
-#define EPL_C_DLL_ASND_PRIO_STD 0 // standard ASnd request priority
-#define EPL_C_DLL_ETHERTYPE_EPL 0x88AB
-#define EPL_C_DLL_ISOCHR_MAX_PAYL 1490 // Byte: maximum size of PReq and PRes payload data, requires C_IP_MAX_MTU
-#define EPL_C_DLL_MAX_ASYNC_MTU 1500 // Byte: maximum asynchronous payload in bytes
-#define EPL_C_DLL_MAX_PAYL_OFFSET 1499 // Byte: maximum offset of Ethernet frame payload, requires C_IP_MAX_MTU
-#define EPL_C_DLL_MAX_RS 7
-#define EPL_C_DLL_MIN_ASYNC_MTU 282 // Byte: minimum asynchronous payload in bytes.
-#define EPL_C_DLL_MIN_PAYL_OFFSET 45 // Byte: minimum offset of Ethernet frame payload
-#define EPL_C_DLL_MULTICAST_ASND 0x01111E000004LL // EPL ASnd multicast MAC address, canonical form
-#define EPL_C_DLL_MULTICAST_PRES 0x01111E000002LL // EPL PRes multicast MAC address, canonical form
-#define EPL_C_DLL_MULTICAST_SOA 0x01111E000003LL // EPL SoA multicast MAC address, canonical form
-#define EPL_C_DLL_MULTICAST_SOC 0x01111E000001LL // EPL Soc multicast MAC address, canonical form
-#define EPL_C_DLL_PREOP1_START_CYCLES 10 // number of unassigning SoA frames at start of NMT_MS_PRE_OPERATIONAL_1
-#define EPL_C_DLL_T_BITTIME 10 // ns: Transmission time per bit on 100 Mbit/s network
-#define EPL_C_DLL_T_EPL_PDO_HEADER 10 // Byte: size of PReq and PRes EPL PDO message header
-#define EPL_C_DLL_T_ETH2_WRAPPER 18 // Byte: size of Ethernet type II wrapper consisting of header and checksum
-#define EPL_C_DLL_T_IFG 640 // ns: Ethernet Interframe Gap
-#define EPL_C_DLL_T_MIN_FRAME 5120 // ns: Size of minimum Ethernet frame (without preamble)
-#define EPL_C_DLL_T_PREAMBLE 960 // ns: Size of Ethernet frame preamble
-
-#define EPL_C_DLL_MINSIZE_SOC 36 // minimum size of SoC without padding and CRC
-#define EPL_C_DLL_MINSIZE_PREQ 60 // minimum size of PRec without CRC
-#define EPL_C_DLL_MINSIZE_PRES 60 // minimum size of PRes without CRC
-#define EPL_C_DLL_MINSIZE_SOA 24 // minimum size of SoA without padding and CRC
-#define EPL_C_DLL_MINSIZE_IDENTRES 176 // minimum size of IdentResponse without CRC
-#define EPL_C_DLL_MINSIZE_STATUSRES 72 // minimum size of StatusResponse without CRC
-#define EPL_C_DLL_MINSIZE_NMTCMD 20 // minimum size of NmtCommand without CommandData, padding and CRC
-#define EPL_C_DLL_MINSIZE_NMTCMDEXT 52 // minimum size of NmtCommand without padding and CRC
-#define EPL_C_DLL_MINSIZE_NMTREQ 20 // minimum size of NmtRequest without CommandData, padding and CRC
-#define EPL_C_DLL_MINSIZE_NMTREQEXT 52 // minimum size of NmtRequest without padding and CRC
-
-#define EPL_C_ERR_MONITOR_DELAY 10 // Error monitoring start delay (not used in DS 1.0.0)
-#define EPL_C_IP_ADR_INVALID 0x00000000L // invalid IP address (0.0.0.0) used to indicate no change
-#define EPL_C_IP_INVALID_MTU 0 // Byte: invalid MTU size used to indicate no change
-#define EPL_C_IP_MAX_MTU 1518 // Byte: maximum size in bytes of the IP stack which must be processed.
-#define EPL_C_IP_MIN_MTU 300 // Byte: minimum size in bytes of the IP stack which must be processed.
-#define EPL_C_NMT_STATE_TOLERANCE 5 // Cycles: maximum reaction time to NMT state commands
-#define EPL_C_NMT_STATREQ_CYCLE 5 // sec: StatusRequest cycle time to be applied to AsyncOnly CNs
-#define EPL_C_SDO_EPL_PORT 3819
-
-#define EPL_C_DLL_MAX_ASND_SERVICE_IDS 5 // see tEplDllAsndServiceId in EplDll.h
-
-// Default configuration
-// ======================
-
-#ifndef EPL_D_PDO_Granularity_U8
-#define EPL_D_PDO_Granularity_U8 8 // minimum size of objects to be mapped in bits UNSIGNED8 O O 1 1
-#endif
-
-#ifndef EPL_NMT_MAX_NODE_ID
-#define EPL_NMT_MAX_NODE_ID 254 // maximum node-ID
-#endif
-
-#ifndef EPL_D_NMT_MaxCNNumber_U8
-#define EPL_D_NMT_MaxCNNumber_U8 239 // maximum number of supported regular CNs in the Node ID range 1 .. 239 UNSIGNED8 O O 239 239
-#endif
-
-// defines for EPL API layer static process image
-#ifndef EPL_API_PROCESS_IMAGE_SIZE_IN
-#define EPL_API_PROCESS_IMAGE_SIZE_IN 0
-#endif
-
-#ifndef EPL_API_PROCESS_IMAGE_SIZE_OUT
-#define EPL_API_PROCESS_IMAGE_SIZE_OUT 0
-#endif
-
-// configure whether OD access events shall be forwarded
-// to user callback function.
-// Because of reentrancy for local OD accesses, this has to be disabled
-// when application resides in other address space as the stack (e.g. if
-// EplApiLinuxUser.c and EplApiLinuxKernel.c are used)
-#ifndef EPL_API_OBD_FORWARD_EVENT
-#define EPL_API_OBD_FORWARD_EVENT TRUE
-#endif
-
-#ifndef EPL_OBD_MAX_STRING_SIZE
-#define EPL_OBD_MAX_STRING_SIZE 32 // is used for objects 0x1008/0x1009/0x100A
-#endif
-
-#ifndef EPL_OBD_USE_STORE_RESTORE
-#define EPL_OBD_USE_STORE_RESTORE FALSE
-#endif
-
-#ifndef EPL_OBD_CHECK_OBJECT_RANGE
-#define EPL_OBD_CHECK_OBJECT_RANGE TRUE
-#endif
-
-#ifndef EPL_OBD_USE_STRING_DOMAIN_IN_RAM
-#define EPL_OBD_USE_STRING_DOMAIN_IN_RAM TRUE
-#endif
-
-#ifndef EPL_OBD_USE_VARIABLE_SUBINDEX_TAB
-#define EPL_OBD_USE_VARIABLE_SUBINDEX_TAB TRUE
-#endif
-
-#ifndef EPL_OBD_USE_KERNEL
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0)
-#define EPL_OBD_USE_KERNEL TRUE
-#else
-#define EPL_OBD_USE_KERNEL FALSE
-#endif
-#endif
-
-#ifndef EPL_OBD_INCLUDE_A000_TO_DEVICE_PART
-#define EPL_OBD_INCLUDE_A000_TO_DEVICE_PART FALSE
-#endif
-
-#ifndef EPL_VETH_NAME
-#define EPL_VETH_NAME "epl" // name of net device in Linux
-#endif
-
-/*
-#define EPL_D_CFG_ConfigManager_BOOL // Ability of a MN node to perform Configuration Manager functions BOOLEAN O - N -
-#define EPL_D_CFM_VerifyConf_BOOL // Support of objects CFM_VerifyConfiguration_REC, CFM_ExpConfDateList_AU32, CFM_ExpConfTimeList_AU32 BOOLEAN O O N N
-#define EPL_D_CFM_VerifyConfId_BOOL // Support of objects CFM_VerifyConfiguration_REC.ConfId_U32 and CFM_ExpConfIdList_AU32 BOOLEAN O O N N
-#define EPL_D_DLL_CNFeatureIsochr_BOOL // CN\92s ability to perform isochronous functions BOOLEAN - O - Y
-#define EPL_D_DLL_CNFeatureMultiplex_BOOL // node\92s ability to perform control of multiplexed isochronous communication BOOLEAN - O - N
-#define EPL_D_DLL_FeatureCN_BOOL // node\92s ability to perform CN functions BOOLEAN O O Y Y
-#define EPL_D_DLL_FeatureMN_BOOL // node\92s ability to perform MN functions BOOLEAN M O - N
-#define EPL_D_DLL_MNFeatureMultiplex_BOOL // MN\92s ability to perform control of multiplexed isochronous communication BOOLEAN O - Y -
-#define EPL_D_DLL_MNFeaturePResTx_BOOL // MN\92s ability to transmit PRes BOOLEAN O - Y -
-#define EPL_D_NMT_ASndRxMaxPayload_U16 // size of ASnd frame receive buffer UNSIGNED16 M M - -
-#define EPL_D_NMT_ASndTxMaxPayload_U16 // size of ASnd frame transmit buffer UNSIGNED16 M M - -
-#define EPL_D_NMT_CNASnd2SoC_U32 // minimum delay between end of reception of ASnd and start of reception of SoC UNSIGNED32 - M - -
-#define EPL_D_NMT_CNASndMaxLatency_U32 // delay between end of SoA reception and start of ASnd transmission UNSIGNED32 - M - -
-#define EPL_D_NMT_CNPResMaxLatency_U32 // delay between end of PReq reception and start of PRes transmission UNSIGNED32 - M - -
-#define EPL_D_NMT_CNSoC2PReq_U32 // CN SoC handling maximum time, a subsequent PReq won\92t be handled before SoC handling was finished UNSIGNED32 - M - -
-#define EPL_D_NMT_DeviceType_U32 // Device Type ID UNSIGNED32 M M - -
-#define EPL_D_NMT_EPLVers_U8 EPL // Version implemented by the device UNSIGNED8 M M - -
-#define EPL_D_NMT_ExtStateCmd_BOOL // abitilty to support Extended NMT State Commands BOOLEAN O O Y Y
-#define EPL_D_NMT_InfoSvc_BOOL // ability to support NMT Info Services BOOLEAN O - Y -
-#define EPL_D_NMT_InterfaceAddr_Xh_OSTR // Physical Address of Interface No. Xh OCTET_STRING M M - -
-#define EPL_D_NMT_InterfaceDescr_Xh_VSTR // Description text of Interface No. Xh VISIBLE_STRINGM M - -
-#define EPL_D_NMT_InterfaceMtu_Xh_U32 // MTU of Interface No. Xh UNSIGNED32 M M - -
-#define EPL_D_NMT_InterfaceType_Xh_U8 // Type of Interface No. Xh UNSIGNED8 M M - -
-#define EPL_D_NMT_IsochrRxMaxPayload_U16 // size of isochronous frame receive buffer UNSIGNED16 M M - -
-#define EPL_D_NMT_IsochrTxMaxPayload_U16 // size of isochronous frame transmit buffer UNSIGNED16 M M - -
-#define EPL_D_NMT_ManufactDevName_VS // Manufacturer Device Name VISIBLE_STRING O O - -
-#define EPL_D_NMT_ManufactHwVers_VS // Manufacturer HW version VISIBLE_STRING O O - -
-#define EPL_D_NMT_ManufactSwVers_VS // Manufacturer SW version VISIBLE_STRING O O - -
-#define EPL_D_NMT_MaxCNNodeID_U8 // maximum Node ID available for regular CNs the entry provides an upper limit to the NodeID available for cross traffic PDO reception from a regular CN UNSIGNED8 O O 239 239
-#define EPL_D_NMT_MaxCNNumber_U8 // maximum number of supported regular CNs in the Node ID range 1 .. 239 UNSIGNED8 O O 239 239
-#define EPL_D_NMT_MaxHeartbeats_U8 // number of guard channels UNSIGNED8 O O 254 254
-#define EPL_D_NMT_MNASnd2SoC_U32 // minimum delay between end of reception of ASnd and start of transmission of SoC UNSIGNED32 M - - -
-#define EPL_D_NMT_MNMultiplCycMax_U8 // maximum number of EPL cycles per multiplexed cycle UNSIGNED8 O - 0 -
-#define EPL_D_NMT_MNPRes2PReq_U32 // delay between end of PRes reception and start of PReq transmission UNSIGNED32 M - - -
-#define EPL_D_NMT_MNPRes2PRes_U32 // delay between end of reception of PRes from CNn and start of transmission of PRes by MN UNSIGNED32 M - - -
-#define EPL_D_NMT_MNPResRx2SoA_U32 // delay between end of reception of PRes from CNn and start of transmission of SoA by MN UNSIGNED32 M - - -
-#define EPL_D_NMT_MNPResTx2SoA_U32 // delay between end of PRes transmission by MN and start of transmission of SoA by MN UNSIGNED32 M - - -
-#define EPL_D_NMT_MNSoA2ASndTx_U32 // delay between end of transmission of SoA and start of transmission of ASnd by MN UNSIGNED32 M - - -
-#define EPL_D_NMT_MNSoC2PReq_U32 // MN minimum delay between end of SoC transmission and start of PReq transmission UNSIGNED32 M - - -
-#define EPL_D_NMT_NMTSvcViaUDPIP_BOOL // Ability of a node to perform NMT services via UDP/IP BOOLEAN O - Y -
-#define EPL_D_NMT_NodeIDByHW_BOOL // Ability of a node to support NodeID setup by HW BOOLEAN O O Y Y
-#define EPL_D_NMT_NodeIDBySW_BOOL // Ability of a node to support NodeID setup by SW BOOLEAN O O N N
-#define EPL_D_NMT_ProductCode_U32 // Identity Object Product Code UNSIGNED32 M M - -
-#define EPL_D_NMT_RevisionNo_U32 // Identity Object Revision Number UNSIGNED32 M M - -
-#define EPL_D_NMT_SerialNo_U32 // Identity Object Serial Number UNSIGNED32 M M - -
-#define EPL_D_NMT_SimpleBoot_BOOL // Ability of a MN node to perform Simple Boot Process, if not set Indivual Boot Process shall be proviced BOOLEAN M - - -
-#define EPL_D_NMT_VendorID_U32 // Identity Object Vendor ID UNSIGNED32 M M - -
-#define EPL_D_NWL_Forward_BOOL // Ability of node to forward datagrams BOOLEAN O O N N
-#define EPL_D_NWL_IPSupport_BOOL // Ability of the node cummunicate via IP BOOLEAN - - Y Y
-#define EPL_D_PDO_DynamicMapping_BOOL // Ability of a node to perform dynamic PDO mapping BOOLEAN O O Y Y
-#define EPL_D_PDO_MaxDescrMem_U32 // maximum cumulative memory consumption of TPDO and RPDO describing objects in byte UNSIGNED32 O O MAX_U32 MAX_U32
-#define EPL_D_PDO_RPDOChannels_U8 // number of supported RPDO channels UNSIGNED8 O O 256 256
-#define EPL_D_PDO_RPDOMaxMem_U32 // Maximum memory available for RPDO data per EPL cycle in byte UNSIGNED32 O O MAX_U32 MAX_U32
-#define EPL_D_PDO_RPDOObjects_U8 // Number of supported mapped objects per RPDO channel UNSIGNED8 O O 254 254
-#define EPL_D_PDO_TPDOChannels_U8 // number of supported TPDO channels UNSIGNED8 O - 256 -
-#define EPL_D_PDO_TPDOMaxMem_U32 // Maximum memory available for TPDO data per EPL cycle in byte UNSIGNED32 O O MAX_U32 MAX_U32
-#define EPL_D_PDO_TPDOObjects_U8 // Number of supported mapped objects per TPDO channel UNSIGNED8 O O 254 254
-#define EPL_D_SDO_ViaASnd_BOOL // Ability of a CN to perform SDO transfer by EPL ASnd BOOLEAN - M - -
-#define EPL_D_SDO_ViaPDO_BOOL // Ability of a node to perform SDO transfer by PDO BOOLEAN O O N N
-#define EPL_D_SDO_ViaUDPIP_BOOL // Ability of a CN to perform SDO transfer by UDP/IP BOOLEAN - M - -
-#define EPL_D_SYN_OptimizedSync_BOOL // Ability of node to perform optimized synchronisation BOOLEAN O O N N
-*/
-
-// Emergency error codes
-// ======================
-#define EPL_E_NO_ERROR 0x0000
-// 0xFxxx manufacturer specific error codes
-#define EPL_E_NMT_NO_IDENT_RES 0xF001
-#define EPL_E_NMT_NO_STATUS_RES 0xF002
-
-// 0x816x HW errors
-#define EPL_E_DLL_BAD_PHYS_MODE 0x8161
-#define EPL_E_DLL_COLLISION 0x8162
-#define EPL_E_DLL_COLLISION_TH 0x8163
-#define EPL_E_DLL_CRC_TH 0x8164
-#define EPL_E_DLL_LOSS_OF_LINK 0x8165
-#define EPL_E_DLL_MAC_BUFFER 0x8166
-// 0x82xx Protocol errors
-#define EPL_E_DLL_ADDRESS_CONFLICT 0x8201
-#define EPL_E_DLL_MULTIPLE_MN 0x8202
-// 0x821x Frame size errors
-#define EPL_E_PDO_SHORT_RX 0x8210
-#define EPL_E_PDO_MAP_VERS 0x8211
-#define EPL_E_NMT_ASND_MTU_DIF 0x8212
-#define EPL_E_NMT_ASND_MTU_LIM 0x8213
-#define EPL_E_NMT_ASND_TX_LIM 0x8214
-// 0x823x Timing errors
-#define EPL_E_NMT_CYCLE_LEN 0x8231
-#define EPL_E_DLL_CYCLE_EXCEED 0x8232
-#define EPL_E_DLL_CYCLE_EXCEED_TH 0x8233
-#define EPL_E_NMT_IDLE_LIM 0x8234
-#define EPL_E_DLL_JITTER_TH 0x8235
-#define EPL_E_DLL_LATE_PRES_TH 0x8236
-#define EPL_E_NMT_PREQ_CN 0x8237
-#define EPL_E_NMT_PREQ_LIM 0x8238
-#define EPL_E_NMT_PRES_CN 0x8239
-#define EPL_E_NMT_PRES_RX_LIM 0x823A
-#define EPL_E_NMT_PRES_TX_LIM 0x823B
-// 0x824x Frame errors
-#define EPL_E_DLL_INVALID_FORMAT 0x8241
-#define EPL_E_DLL_LOSS_PREQ_TH 0x8242
-#define EPL_E_DLL_LOSS_PRES_TH 0x8243
-#define EPL_E_DLL_LOSS_SOA_TH 0x8244
-#define EPL_E_DLL_LOSS_SOC_TH 0x8245
-// 0x84xx BootUp Errors
-#define EPL_E_NMT_BA1 0x8410 // other MN in MsNotActive active
-#define EPL_E_NMT_BA1_NO_MN_SUPPORT 0x8411 // MN is not supported
-#define EPL_E_NMT_BPO1 0x8420 // mandatory CN was not found or failed in BootStep1
-#define EPL_E_NMT_BPO1_GET_IDENT 0x8421 // IdentRes was not received
-#define EPL_E_NMT_BPO1_DEVICE_TYPE 0x8422 // wrong device type
-#define EPL_E_NMT_BPO1_VENDOR_ID 0x8423 // wrong vendor ID
-#define EPL_E_NMT_BPO1_PRODUCT_CODE 0x8424 // wrong product code
-#define EPL_E_NMT_BPO1_REVISION_NO 0x8425 // wrong revision number
-#define EPL_E_NMT_BPO1_SERIAL_NO 0x8426 // wrong serial number
-#define EPL_E_NMT_BPO1_CF_VERIFY 0x8428 // verification of configuration failed
-#define EPL_E_NMT_BPO2 0x8430 // mandatory CN failed in BootStep2
-#define EPL_E_NMT_BRO 0x8440 // CheckCommunication failed for mandatory CN
-#define EPL_E_NMT_WRONG_STATE 0x8480 // mandatory CN has wrong NMT state
-
-// Defines for object 0x1F80 NMT_StartUp_U32
-// ==========================================
-#define EPL_NMTST_STARTALLNODES 0x00000002L // Bit 1
-#define EPL_NMTST_NO_AUTOSTART 0x00000004L // Bit 2
-#define EPL_NMTST_NO_STARTNODE 0x00000008L // Bit 3
-#define EPL_NMTST_RESETALL_MAND_CN 0x00000010L // Bit 4
-#define EPL_NMTST_STOPALL_MAND_CN 0x00000040L // Bit 6
-#define EPL_NMTST_NO_AUTOPREOP2 0x00000080L // Bit 7
-#define EPL_NMTST_NO_AUTOREADYTOOP 0x00000100L // Bit 8
-#define EPL_NMTST_EXT_CNIDENTCHECK 0x00000200L // Bit 9
-#define EPL_NMTST_SWVERSIONCHECK 0x00000400L // Bit 10
-#define EPL_NMTST_CONFCHECK 0x00000800L // Bit 11
-#define EPL_NMTST_NO_RETURN_PREOP1 0x00001000L // Bit 12
-#define EPL_NMTST_BASICETHERNET 0x00002000L // Bit 13
-
-// Defines for object 0x1F81 NMT_NodeAssignment_AU32
-// ==================================================
-#define EPL_NODEASSIGN_NODE_EXISTS 0x00000001L // Bit 0
-#define EPL_NODEASSIGN_NODE_IS_CN 0x00000002L // Bit 1
-#define EPL_NODEASSIGN_START_CN 0x00000004L // Bit 2
-#define EPL_NODEASSIGN_MANDATORY_CN 0x00000008L // Bit 3
-#define EPL_NODEASSIGN_KEEPALIVE 0x00000010L //currently not used in EPL V2 standard
-#define EPL_NODEASSIGN_SWVERSIONCHECK 0x00000020L // Bit 5
-#define EPL_NODEASSIGN_SWUPDATE 0x00000040L // Bit 6
-#define EPL_NODEASSIGN_ASYNCONLY_NODE 0x00000100L // Bit 8
-#define EPL_NODEASSIGN_MULTIPLEXED_CN 0x00000200L // Bit 9
-#define EPL_NODEASSIGN_RT1 0x00000400L // Bit 10
-#define EPL_NODEASSIGN_RT2 0x00000800L // Bit 11
-#define EPL_NODEASSIGN_MN_PRES 0x00001000L // Bit 12
-#define EPL_NODEASSIGN_VALID 0x80000000L // Bit 31
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_DEF_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for DLL 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: EplDll.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/08 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_DLL_H_
-#define _EPL_DLL_H_
-
-#include "EplInc.h"
-#include "EplFrame.h"
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef EPL_DLL_MAX_ASND_SERVICE_ID
-#define EPL_DLL_MAX_ASND_SERVICE_ID (EPL_C_DLL_MAX_ASND_SERVICE_IDS + 1) // last is kEplDllAsndSdo == 5
-#endif
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef enum {
- kEplDllAsndNotDefined = 0x00,
- kEplDllAsndIdentResponse = 0x01,
- kEplDllAsndStatusResponse = 0x02,
- kEplDllAsndNmtRequest = 0x03,
- kEplDllAsndNmtCommand = 0x04,
- kEplDllAsndSdo = 0x05
-} tEplDllAsndServiceId;
-
-typedef enum {
- kEplDllAsndFilterNone = 0x00,
- kEplDllAsndFilterLocal = 0x01, // receive only ASnd frames with local or broadcast node ID
- kEplDllAsndFilterAny = 0x02, // receive any ASnd frame
-} tEplDllAsndFilter;
-
-typedef enum {
- kEplDllReqServiceNo = 0x00,
- kEplDllReqServiceIdent = 0x01,
- kEplDllReqServiceStatus = 0x02,
- kEplDllReqServiceNmtRequest = 0x03,
- kEplDllReqServiceUnspecified = 0xFF,
-
-} tEplDllReqServiceId;
-
-typedef enum {
- kEplDllAsyncReqPrioNmt = 0x07, // PRIO_NMT_REQUEST
- kEplDllAsyncReqPrio6 = 0x06,
- kEplDllAsyncReqPrio5 = 0x05,
- kEplDllAsyncReqPrio4 = 0x04,
- kEplDllAsyncReqPrioGeneric = 0x03, // PRIO_GENERIC_REQUEST
- kEplDllAsyncReqPrio2 = 0x02, // till WSP 0.1.3: PRIO_ABOVE_GENERIC
- kEplDllAsyncReqPrio1 = 0x01, // till WSP 0.1.3: PRIO_BELOW_GENERIC
- kEplDllAsyncReqPrio0 = 0x00, // till WSP 0.1.3: PRIO_GENERIC_REQUEST
-
-} tEplDllAsyncReqPriority;
-
-typedef struct {
- unsigned int m_uiFrameSize;
- tEplFrame *m_pFrame;
- tEplNetTime m_NetTime;
-
-} tEplFrameInfo;
-
-typedef struct {
- unsigned int m_uiSizeOfStruct;
- BOOL m_fAsyncOnly; // do not need to register PRes-Frame
- unsigned int m_uiNodeId; // local node ID
-
- // 0x1F82: NMT_FeatureFlags_U32
- u32 m_dwFeatureFlags;
- // Cycle Length (0x1006: NMT_CycleLen_U32) in [us]
- u32 m_dwCycleLen; // required for error detection
- // 0x1F98: NMT_CycleTiming_REC
- // 0x1F98.1: IsochrTxMaxPayload_U16
- unsigned int m_uiIsochrTxMaxPayload; // const
- // 0x1F98.2: IsochrRxMaxPayload_U16
- unsigned int m_uiIsochrRxMaxPayload; // const
- // 0x1F98.3: PResMaxLatency_U32
- u32 m_dwPresMaxLatency; // const in [ns], only required for IdentRes
- // 0x1F98.4: PReqActPayloadLimit_U16
- unsigned int m_uiPreqActPayloadLimit; // required for initialisation (+24 bytes)
- // 0x1F98.5: PResActPayloadLimit_U16
- unsigned int m_uiPresActPayloadLimit; // required for initialisation of Pres frame (+24 bytes)
- // 0x1F98.6: ASndMaxLatency_U32
- u32 m_dwAsndMaxLatency; // const in [ns], only required for IdentRes
- // 0x1F98.7: MultiplCycleCnt_U8
- unsigned int m_uiMultiplCycleCnt; // required for error detection
- // 0x1F98.8: AsyncMTU_U16
- unsigned int m_uiAsyncMtu; // required to set up max frame size
- // $$$ 0x1F98.9: Prescaler_U16
- // $$$ Multiplexed Slot
-
- // 0x1C14: DLL_LossOfFrameTolerance_U32 in [ns]
- u32 m_dwLossOfFrameTolerance;
-
- // 0x1F8A: NMT_MNCycleTiming_REC
- // 0x1F8A.1: WaitSoCPReq_U32 in [ns]
- u32 m_dwWaitSocPreq;
-
- // 0x1F8A.2: AsyncSlotTimeout_U32 in [ns]
- u32 m_dwAsyncSlotTimeout;
-
-} tEplDllConfigParam;
-
-typedef struct {
- unsigned int m_uiSizeOfStruct;
- u32 m_dwDeviceType; // NMT_DeviceType_U32
- u32 m_dwVendorId; // NMT_IdentityObject_REC.VendorId_U32
- u32 m_dwProductCode; // NMT_IdentityObject_REC.ProductCode_U32
- u32 m_dwRevisionNumber; // NMT_IdentityObject_REC.RevisionNo_U32
- u32 m_dwSerialNumber; // NMT_IdentityObject_REC.SerialNo_U32
- u64 m_qwVendorSpecificExt1;
- u32 m_dwVerifyConfigurationDate; // CFM_VerifyConfiguration_REC.ConfDate_U32
- u32 m_dwVerifyConfigurationTime; // CFM_VerifyConfiguration_REC.ConfTime_U32
- u32 m_dwApplicationSwDate; // PDL_LocVerApplSw_REC.ApplSwDate_U32 on programmable device or date portion of NMT_ManufactSwVers_VS on non-programmable device
- u32 m_dwApplicationSwTime; // PDL_LocVerApplSw_REC.ApplSwTime_U32 on programmable device or time portion of NMT_ManufactSwVers_VS on non-programmable device
- u32 m_dwIpAddress;
- u32 m_dwSubnetMask;
- u32 m_dwDefaultGateway;
- u8 m_sHostname[32];
- u8 m_abVendorSpecificExt2[48];
-
-} tEplDllIdentParam;
-
-typedef struct {
- unsigned int m_uiNodeId;
- u16 m_wPreqPayloadLimit; // object 0x1F8B: NMT_MNPReqPayloadLimitList_AU16
- u16 m_wPresPayloadLimit; // object 0x1F8D: NMT_PResPayloadLimitList_AU16
- u32 m_dwPresTimeout; // object 0x1F92: NMT_MNCNPResTimeout_AU32
-
-} tEplDllNodeInfo;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_DLL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for 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: EplDllCal.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/20 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_DLLCAL_H_
-#define _EPL_DLLCAL_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-/*#ifndef EPL_DLLCAL_BUFFER_ID_RX
-#define EPL_DLLCAL_BUFFER_ID_RX "EplSblDllCalRx"
-#endif
-
-#ifndef EPL_DLLCAL_BUFFER_SIZE_RX
-#define EPL_DLLCAL_BUFFER_SIZE_RX 32767
-#endif
-*/
-#ifndef EPL_DLLCAL_BUFFER_ID_TX_NMT
-#define EPL_DLLCAL_BUFFER_ID_TX_NMT "EplSblDllCalTxNmt"
-#endif
-
-#ifndef EPL_DLLCAL_BUFFER_SIZE_TX_NMT
-#define EPL_DLLCAL_BUFFER_SIZE_TX_NMT 32767
-#endif
-
-#ifndef EPL_DLLCAL_BUFFER_ID_TX_GEN
-#define EPL_DLLCAL_BUFFER_ID_TX_GEN "EplSblDllCalTxGen"
-#endif
-
-#ifndef EPL_DLLCAL_BUFFER_SIZE_TX_GEN
-#define EPL_DLLCAL_BUFFER_SIZE_TX_GEN 32767
-#endif
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef struct {
- tEplDllAsndServiceId m_ServiceId;
- tEplDllAsndFilter m_Filter;
-
-} tEplDllCalAsndServiceIdFilter;
-
-typedef struct {
- tEplDllReqServiceId m_Service;
- unsigned int m_uiNodeId;
- u8 m_bSoaFlag1;
-
-} tEplDllCalIssueRequest;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_DLLKCAL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for kernel DLL 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: EplDllk.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.21 $ $Date: 2008/11/13 17:13:09 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/12 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#include "kernel/EplDllk.h"
-#include "kernel/EplDllkCal.h"
-#include "kernel/EplEventk.h"
-#include "kernel/EplNmtk.h"
-#include "edrv.h"
-#include "Benchmark.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-#include "kernel/EplPdok.h"
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
-#include "kernel/VirtualEthernet.h"
-#endif
-
-//#if EPL_TIMER_USE_HIGHRES != FALSE
-#include "kernel/EplTimerHighResk.h"
-//#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) == 0)
-#error "EPL module DLLK needs EPL module NMTK!"
-#endif
-
-#if (EPL_DLL_PRES_READY_AFTER_SOA != FALSE) && (EPL_DLL_PRES_READY_AFTER_SOC != FALSE)
-#error "EPL module DLLK: select only one of EPL_DLL_PRES_READY_AFTER_SOA and EPL_DLL_PRES_READY_AFTER_SOC."
-#endif
-
-#if ((EPL_DLL_PRES_READY_AFTER_SOA != FALSE) || (EPL_DLL_PRES_READY_AFTER_SOC != FALSE)) \
- && (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) == 0)
-#error "EPL module DLLK: currently, EPL_DLL_PRES_READY_AFTER_* is not supported if EPL_MODULE_NMT_MN is enabled."
-#endif
-
-#if (EDRV_FAST_TXFRAMES == FALSE) && \
- ((EPL_DLL_PRES_READY_AFTER_SOA != FALSE) || (EPL_DLL_PRES_READY_AFTER_SOC != FALSE))
-#error "EPL module DLLK: EPL_DLL_PRES_READY_AFTER_* is enabled, but not EDRV_FAST_TXFRAMES."
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 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)
-#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)
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S EplDllk */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// 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
-#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
-#else
-#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
-
-//---------------------------------------------------------------------------
-// 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
-
-} tEplDllState;
-
-typedef struct {
- u8 m_be_abSrcMac[6];
- tEdrvTxBuffer *m_pTxBuffer; // Buffers for Tx-Frames
- unsigned int m_uiMaxTxFrames;
- u8 m_bFlag1; // Flag 1 with EN, EC for PRes, StatusRes
- u8 m_bMnFlag1; // Flag 1 with EA, ER from PReq, SoA of MN
- u8 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;
-#endif
-
-#if EPL_TIMER_USE_HIGHRES != FALSE
- 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)
-#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)
-
-} 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];
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-// change DLL state on event
-static tEplKernel EplDllkChangeState(tEplNmtEvent NmtEvent_p,
- tEplNmtState NmtState_p);
-
-// called from EdrvInterruptHandler()
-static void EplDllkCbFrameReceived(tEdrvRxBuffer * pRxBuffer_p);
-
-// called from EdrvInterruptHandler()
-static void EplDllkCbFrameTransmitted(tEdrvTxBuffer * pTxBuffer_p);
-
-// check frame and set missing information
-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 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);
-
-// transmit SoA
-static tEplKernel EplDllkMnSendSoa(tEplNmtState NmtState_p,
- tEplDllState * pDllStateProposed_p,
- BOOL fEnableInvitation_p);
-
-static tEplKernel EplDllkMnSendSoc(void);
-
-static tEplKernel EplDllkMnSendPreq(tEplNmtState NmtState_p,
- tEplDllState * pDllStateProposed_p);
-
-static tEplKernel EplDllkAsyncFrameNotReceived(tEplDllReqServiceId
- ReqServiceId_p,
- unsigned int uiNodeId_p);
-
-static tEplKernel EplDllkCbMnTimerCycle(tEplTimerEventArg *pEventArg_p);
-
-static tEplKernel EplDllkCbMnTimerResponse(tEplTimerEventArg *pEventArg_p);
-
-#endif
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkAddInstance()
-//
-// Description: add and initialize new instance of EPL stack
-//
-// Parameters: pInitParam_p = initialisation parameters like MAC address
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkAddInstance(tEplDllkInitParam * pInitParam_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiIndex;
- tEdrvInitParam EdrvInitParam;
-
- // 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;
- }
-#endif
-
- // 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 =
- ARRAY_SIZE(aEplDllkTxBuffer_l);
-
- // 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;
- }
-#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;
- }
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
- Ret = VEthAddInstance(pInitParam_p);
-#endif
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkDelInstance()
-//
-// Description: deletes an instance of EPL stack
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkDelInstance(void)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // reset state
- EplDllkInstance_g.m_DllState = kEplDllGsInit;
-
-#if EPL_TIMER_USE_HIGHRES != FALSE
- Ret = EplTimerHighReskDelInstance();
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
- Ret = VEthDelInstance();
-#endif
-
- Ret = EdrvShutdown();
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCreateTxFrame
-//
-// Description: creates the buffer for a Tx frame and registers it to the
-// ethernet driver
-//
-// Parameters: puiHandle_p = OUT: handle to frame buffer
-// ppFrame_p = OUT: pointer to pointer of EPL frame
-// puiFrameSize_p = IN/OUT: pointer to size of frame
-// returned size is always equal or larger than
-// requested size, if that is not possible
-// an error will be returned
-// MsgType_p = EPL message type
-// ServiceId_p = Service ID in case of ASnd frame, otherwise
-// kEplDllAsndNotDefined
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-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,
- (u8) 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,
- (u8)
- 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,
- (u8) EPL_C_ADR_BROADCAST);
- // reset Flags
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soc.m_le_bFlag1, (u8) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soc.m_le_bFlag2, (u8) 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,
- (u8) EPL_C_ADR_BROADCAST);
- // reset Flags
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bFlag1, (u8) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bFlag2, (u8) 0);
- // EPL profile version
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bEplVersion,
- (u8) 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,
- (u8) EPL_C_ADR_BROADCAST);
- // reset Flags
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag1, (u8) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Pres.m_le_bFlag2, (u8) 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, (u8) 0);
- //AmiSetByteToLe(&pTxFrame->m_Data.m_Preq.m_le_bFlag2, (u8) 0);
- // PDO size
- //AmiSetWordToLe(&pTxFrame->m_Data.m_Preq.m_le_wSize, 0);
- break;
-
- default:
- break;
- }
- // EPL message type
- AmiSetByteToLe(&pTxFrame->m_le_bMessageType, (u8) MsgType_p);
- }
-
- *ppFrame_p = pTxFrame;
- *puiFrameSize_p = pTxBuffer->m_uiMaxBufferLen;
- *puiHandle_p = uiHandle;
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkDeleteTxFrame
-//
-// Description: deletes the buffer for a Tx frame and frees it in the
-// ethernet driver
-//
-// Parameters: uiHandle_p = IN: handle to frame buffer
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkDeleteTxFrame(unsigned int uiHandle_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEdrvTxBuffer *pTxBuffer = NULL;
-
- if (uiHandle_p >= EplDllkInstance_g.m_uiMaxTxFrames) { // handle is not valid
- Ret = kEplDllIllegalHdl;
- goto Exit;
- }
-
- 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;
-
- // delete Tx buffer
- Ret = EdrvReleaseTxMsgBuffer(pTxBuffer);
- if (Ret != kEplSuccessful) { // error occured while releasing Tx frame
- goto Exit;
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkProcess
-//
-// Description: process the passed event
-//
-// Parameters: pEvent_p = event to be processed
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkProcess(tEplEvent * pEvent_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplFrame *pTxFrame;
- tEdrvTxBuffer *pTxBuffer;
- unsigned int uiHandle;
- unsigned int uiFrameSize;
- u8 abMulticastMac[6];
- tEplDllAsyncReqPriority AsyncReqPriority;
- unsigned int uiFrameCount;
- tEplNmtState NmtState;
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- tEplFrameInfo FrameInfo;
-#endif
-
- switch (pEvent_p->m_EventType) {
- case kEplEventTypeDllkCreate:
- {
- // $$$ reset ethernet driver
-
- 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;
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // 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,
- (u8) 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,
- (u16) EplDllkInstance_g.
- m_DllConfigParam.m_uiAsyncMtu);
- // PollInSize
- AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
- m_IdentResponse.m_le_wPollInSize,
- (u16) EplDllkInstance_g.
- m_DllConfigParam.
- m_uiPreqActPayloadLimit);
- // PollOutSize
- AmiSetWordToLe(&pTxFrame->m_Data.m_Asnd.m_Payload.
- m_IdentResponse.m_le_wPollOutSize,
- (u16) 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);
-#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);
-
-#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++) {
-// EplDllkInstance_g.m_aNodeInfo[uiIndex].m_uiNodeId = uiIndex + 1;
- EplDllkInstance_g.m_aNodeInfo[uiIndex].
- m_wPresPayloadLimit =
- (u16) 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();
-
- 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;
- }
-#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;
- }
- }
-#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
-#if EPL_TIMER_USE_HIGHRES != FALSE
- 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 =
- (u8) (((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
-
- // 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;
-
- // 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;
-
-#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);
- }
-#endif
-
- 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,
- (u8) 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;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkConfig
-//
-// Description: configure parameters of DLL
-//
-// Parameters: pDllConfigParam_p = configuration parameters
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkConfig(tEplDllConfigParam * pDllConfigParam_p)
-{
- 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;
-
- NmtState = EplNmtkGetNmtState();
-
- if (NmtState > kEplNmtGsResetConfiguration)
- { // only allowed in state DLL_GS_INIT
- Ret = kEplInvalidOperation;
- 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;
- }
-//Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkSetIdentity
-//
-// Description: configure identity of local node for IdentResponse
-//
-// Parameters: pDllIdentParam_p = identity
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkSetIdentity(tEplDllIdentParam * pDllIdentParam_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- 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
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkRegAsyncHandler
-//
-// Description: registers handler for non-EPL frames
-//
-// Parameters: pfnDllkCbAsync_p = pointer to callback function
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkRegAsyncHandler(tEplDllkCbAsync pfnDllkCbAsync_p)
-{
- 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;
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkDeregAsyncHandler
-//
-// Description: deregisters handler for non-EPL frames
-//
-// Parameters: pfnDllkCbAsync_p = pointer to callback function
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkDeregAsyncHandler(tEplDllkCbAsync pfnDllkCbAsync_p)
-{
- 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;
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkSetAsndServiceIdFilter()
-//
-// Description: sets the specified node ID filter for the specified
-// AsndServiceId. It registers C_DLL_MULTICAST_ASND in ethernet
-// driver if any AsndServiceId is open.
-//
-// Parameters: ServiceId_p = ASnd Service ID
-// Filter_p = node ID filter
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p,
- tEplDllAsndFilter Filter_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if (ServiceId_p < tabentries(EplDllkInstance_g.m_aAsndFilter)) {
- EplDllkInstance_g.m_aAsndFilter[ServiceId_p] = Filter_p;
- }
-
- return Ret;
-}
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkSetFlag1OfNode()
-//
-// Description: sets Flag1 (for PReq and SoA) of the specified node ID.
-//
-// Parameters: uiNodeId_p = node ID
-// bSoaFlag1_p = flag1
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkSetFlag1OfNode(unsigned int uiNodeId_p, u8 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;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkGetFirstNodeInfo()
-//
-// Description: returns first info structure of first node in isochronous phase.
-// It is only useful for ErrorHandlerk module.
-//
-// Parameters: ppNodeInfo_p = pointer to pointer of internal node info structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkGetFirstNodeInfo(tEplDllkNodeInfo ** ppNodeInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- *ppNodeInfo_p = EplDllkInstance_g.m_pFirstNodeInfo;
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkAddNode()
-//
-// Description: adds the specified node to the isochronous phase.
-//
-// Parameters: pNodeInfo_p = pointer of node info structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-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);
-
- // 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,
- (u8) 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;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkDeleteNode()
-//
-// Description: removes the specified node from the isochronous phase.
-//
-// Parameters: uiNodeId_p = node ID
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-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);
-/* if (Ret != kEplSuccessful)
- {
- goto Exit;
- }*/
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkSoftDeleteNode()
-//
-// Description: removes the specified node not immediately from the isochronous phase.
-// Instead the will be removed after error (late/loss PRes) without
-// charging the error.
-//
-// Parameters: uiNodeId_p = node ID
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDllkSoftDeleteNode(unsigned int uiNodeId_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplDllkNodeInfo *pIntNodeInfo;
-
- 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);
-
- pIntNodeInfo->m_fSoftDelete = TRUE;
-
- 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
-//
-// Description: change DLL state on event and diagnose some communication errors
-//
-// Parameters: NmtEvent_p = DLL event (wrapped in NMT event)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-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
-// 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 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;
-
-#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
-#if EPL_TIMER_USE_HIGHRES != FALSE
- 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
-#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);
- }
-#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
-#if EPL_TIMER_USE_HIGHRES != FALSE
- 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
-#if EPL_TIMER_USE_HIGHRES != 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
-/*
- // 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;
-#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
- 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);
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCbFrameReceived()
-//
-// Description: called from EdrvInterruptHandler()
-//
-// Parameters: pRxBuffer_p = receive buffer structure
-//
-// Returns: (none)
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-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;
- u8 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];
-#if (EPL_DLL_PRES_READY_AFTER_SOA != FALSE) || (EPL_DLL_PRES_READY_AFTER_SOC != FALSE)
- 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,
- (u8) 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;
- }
- }
-#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;
- }
-#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 (EPL_DLL_PRES_READY_AFTER_SOA != FALSE) || (EPL_DLL_PRES_READY_AFTER_SOC != FALSE)
- 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,
- (u8) 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
-#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 (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);
- }
-#endif
-#endif
-
-#if EDRV_EARLY_RX_INT == FALSE
- // $$$ inform emergency protocol handling (error signaling module) about flags
- }
-#endif
-
- // reset cycle counter
- EplDllkInstance_g.m_uiCycleCount = 0;
-
- break;
- }
-
- case kEplMsgTypePres:
- {
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- tEplDllkNodeInfo *pIntNodeInfo;
- tEplHeartbeatEvent HeartbeatEvent;
-#endif
-
- // PRes frame
- NmtEvent = kEplNmtEventDllCePres;
-
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
-
- 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));
-
-#endif
- } 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;
- }
- }
-#endif
-
- // 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 (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- ||
- (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);
- }
-#endif
-
- 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,
- (u8) 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 EPL_TIMER_USE_HIGHRES != 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,
- (u8) 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,
- (u8) 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);
- }
-#endif
-
- // 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
-
- // $$$ inform emergency protocol handling about flags
- break;
- }
-
- case kEplMsgTypeAsnd:
- {
- // ASnd frame
- NmtEvent = kEplNmtEventDllCeAsnd;
-
- // 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));
- }
-#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) {
- u32 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;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCbFrameTransmitted()
-//
-// Description: called from EdrvInterruptHandler().
-// It signals
-//
-// Parameters: pRxBuffer_p = receive buffer structure
-//
-// Returns: (none)
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static void EplDllkCbFrameTransmitted(tEdrvTxBuffer * pTxBuffer_p)
-{
- 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;
-#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);
- }
-#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
-
-#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
- }
-#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,
- (u8) 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,
- (u8) 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)
- == (u8) kEplMsgTypeAsnd)
- &&
- (AmiGetByteFromLe
- (&pTxFrame->m_Data.m_Asnd.
- m_le_bServiceId)
- == (u8) 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;
- }
-
- // 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) {
- u32 dwArg;
-
- BENCHMARK_MOD_02_TOGGLE(9);
-
- dwArg =
- EplDllkInstance_g.m_DllState | (pTxBuffer_p->
- m_EplMsgType << 16);
-
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret, sizeof(dwArg), &dwArg);
- }
-
- return;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCheckFrame()
-//
-// Description: check frame and set missing information
-//
-// Parameters: pFrame_p = ethernet frame
-// uiFrameSize_p = size of frame
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDllkCheckFrame(tEplFrame * pFrame_p,
- unsigned int uiFrameSize_p)
-{
- tEplMsgType MsgType;
- u16 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,
- (u8) 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,
- (u8) MsgType);
- }
-
- if (MsgType == kEplMsgTypeAsnd) {
- // destination MAC address
- AmiSetQword48ToBe(&pFrame_p->m_be_abDstMac[0],
- EPL_C_DLL_MULTICAST_ASND);
- }
-
- }
- }
-
- return kEplSuccessful;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCbCnTimer()
-//
-// Description: called by timer module. It monitors the EPL cycle when it is a CN.
-//
-// Parameters: pEventArg_p = timer event argument
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#if EPL_TIMER_USE_HIGHRES != FALSE
-static tEplKernel EplDllkCbCnTimer(tEplTimerEventArg *pEventArg_p)
-{
- 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;
- }
-#endif
-
- NmtState = EplNmtkGetNmtState();
-
- if (NmtState <= kEplNmtGsResetConfiguration) {
- goto Exit;
- }
-
- 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
- if ((NmtState > kEplNmtCsPreOperational1)
- && (EplDllkInstance_g.m_ullFrameTimeout != 0))
- {
- Ret = EplTimerHighReskModifyTimerNs(&EplDllkInstance_g.m_TimerHdlCycle, EplDllkInstance_g.m_ullFrameTimeout, EplDllkCbCnTimer, 0L, FALSE);
- }
-#endif
-*/
-
- Exit:
- if (Ret != kEplSuccessful) {
- u32 dwArg;
-
- BENCHMARK_MOD_02_TOGGLE(9);
-
- dwArg =
- EplDllkInstance_g.
- m_DllState | (kEplNmtEventDllCeFrameTimeout << 8);
-
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret, sizeof(dwArg), &dwArg);
- }
-
- return Ret;
-}
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCbMnTimerCycle()
-//
-// Description: called by timer module. It triggers the SoC when it is a MN.
-//
-// Parameters: pEventArg_p = timer event argument
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDllkCbMnTimerCycle(tEplTimerEventArg *pEventArg_p)
-{
- 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;
- }
-#endif
-
- NmtState = EplNmtkGetNmtState();
-
- if (NmtState <= kEplNmtGsResetConfiguration) {
- goto Exit;
- }
-
- Ret = EplDllkChangeState(kEplNmtEventDllMeSocTrig, NmtState);
-
- Exit:
- if (Ret != kEplSuccessful) {
- u32 dwArg;
-
- BENCHMARK_MOD_02_TOGGLE(9);
-
- dwArg =
- EplDllkInstance_g.
- m_DllState | (kEplNmtEventDllMeSocTrig << 8);
-
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret, sizeof(dwArg), &dwArg);
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkCbMnTimerResponse()
-//
-// Description: called by timer module. It monitors the PRes timeout.
-//
-// Parameters: pEventArg_p = timer event argument
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDllkCbMnTimerResponse(tEplTimerEventArg *pEventArg_p)
-{
- 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;
- }
-#endif
-
- NmtState = EplNmtkGetNmtState();
-
- if (NmtState <= kEplNmtGsResetConfiguration) {
- goto Exit;
- }
-
- Ret = EplDllkChangeState(kEplNmtEventDllMePresTimeout, NmtState);
-
- Exit:
- if (Ret != kEplSuccessful) {
- u32 dwArg;
-
- BENCHMARK_MOD_02_TOGGLE(9);
-
- dwArg =
- EplDllkInstance_g.
- m_DllState | (kEplNmtEventDllMePresTimeout << 8);
-
- // Error event for API layer
- Ret = EplEventkPostError(kEplEventSourceDllk,
- Ret, sizeof(dwArg), &dwArg);
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkGetNodeInfo()
-//
-// Description: returns node info structure of the specified node.
-//
-// Parameters: uiNodeId_p = node ID
-//
-// Returns: tEplDllkNodeInfo* = pointer to internal node info structure
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-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];
- }
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkMnSendSoa()
-//
-// Description: it updates and transmits the SoA.
-//
-// Parameters: NmtState_p = current NMT state
-// pDllStateProposed_p = proposed DLL state
-// fEnableInvitation_p = enable invitation for asynchronous phase
-// it will be disabled for EPL_C_DLL_PREOP1_START_CYCLES SoAs
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDllkMnSendSoa(tEplNmtState NmtState_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,
- (u8) EplDllkInstance_g.
- m_LastReqServiceId);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
- m_le_bReqServiceTarget,
- (u8) EplDllkInstance_g.
- m_uiLastTargetNodeId);
-
- } else { // invite nobody
- // update frame (target)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
- m_le_bReqServiceId, (u8) 0);
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.
- m_le_bReqServiceTarget, (u8) 0);
- }
-
- // update frame (NMT state)
- AmiSetByteToLe(&pTxFrame->m_Data.m_Soa.m_le_bNmtStatus,
- (u8) NmtState_p);
-
- // send SoA frame
- Ret = EdrvSendTxMsg(pTxBuffer);
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkMnSendSoc()
-//
-// Description: it updates and transmits the SoA.
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-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;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDllkMnSendPreq()
-//
-// Description: it updates and transmits the PReq for the next isochronous CN
-// or own PRes if enabled.
-//
-// Parameters: NmtState_p = current NMT state
-// pDllStateProposed_p = proposed DLL state
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDllkMnSendPreq(tEplNmtState NmtState_p,
- tEplDllState * pDllStateProposed_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEdrvTxBuffer *pTxBuffer = NULL;
- tEplFrame *pTxFrame;
- u8 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);
-#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,
- (u8) 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()
-//
-// Description: passes empty ASnd frame to receive FIFO.
-// It will be called only for frames with registered AsndServiceIds
-// (only kEplDllAsndFilterAny).
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDllkAsyncFrameNotReceived(tEplDllReqServiceId
- ReqServiceId_p,
- unsigned int uiNodeId_p)
-{
- tEplKernel Ret = kEplSuccessful;
- u8 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,
- (u8) uiNodeId_p);
- // EPL MsgType ASnd
- AmiSetByteToLe(&pFrame->m_le_bMessageType,
- (u8) kEplMsgTypeAsnd);
- // ASnd Service ID
- AmiSetByteToLe(&pFrame->m_Data.m_Asnd.m_le_bServiceId,
- (u8) 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
+++ /dev/null
-/****************************************************************************
-
- (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
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for DLL Communication Abstraction Layer module in EPL user part
-
- 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: EplDlluCal.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.7 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/20 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#include "user/EplDlluCal.h"
-#include "user/EplEventu.h"
-
-#include "EplDllCal.h"
-
-// include only if direct call between user- and kernelspace is enabled
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-#include "kernel/EplDllkCal.h"
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S EplDlluCal */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- tEplDlluCbAsnd m_apfnDlluCbAsnd[EPL_DLL_MAX_ASND_SERVICE_ID];
-
-} tEplDlluCalInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-// if no dynamic memory allocation shall be used
-// define structures statically
-static tEplDlluCalInstance EplDlluCalInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId
- ServiceId_p,
- tEplDllAsndFilter Filter_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalAddInstance()
-//
-// Description: add and initialize new instance of DLL CAL module
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalAddInstance(void)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // reset instance structure
- EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof(EplDlluCalInstance_g));
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalDelInstance()
-//
-// Description: deletes an instance of DLL CAL module
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalDelInstance(void)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // reset instance structure
- EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof(EplDlluCalInstance_g));
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalProcess
-//
-// Description: process the passed asynch frame
-//
-// Parameters: pEvent_p = event containing frame to be processed
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalProcess(tEplEvent * pEvent_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplMsgType MsgType;
- unsigned int uiAsndServiceId;
- tEplFrameInfo FrameInfo;
-
- if (pEvent_p->m_EventType == kEplEventTypeAsndRx) {
- FrameInfo.m_pFrame = (tEplFrame *) pEvent_p->m_pArg;
- FrameInfo.m_uiFrameSize = pEvent_p->m_uiSize;
- // extract NetTime
- FrameInfo.m_NetTime = pEvent_p->m_NetTime;
-
- MsgType =
- (tEplMsgType) AmiGetByteFromLe(&FrameInfo.m_pFrame->
- m_le_bMessageType);
- if (MsgType != kEplMsgTypeAsnd) {
- Ret = kEplInvalidOperation;
- goto Exit;
- }
-
- uiAsndServiceId =
- (unsigned int)AmiGetByteFromLe(&FrameInfo.m_pFrame->m_Data.
- m_Asnd.m_le_bServiceId);
- if (uiAsndServiceId < EPL_DLL_MAX_ASND_SERVICE_ID) { // ASnd service ID is valid
- if (EplDlluCalInstance_g.m_apfnDlluCbAsnd[uiAsndServiceId] != NULL) { // handler was registered
- Ret =
- EplDlluCalInstance_g.
- m_apfnDlluCbAsnd[uiAsndServiceId]
- (&FrameInfo);
- }
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalRegAsndService()
-//
-// Description: registers the specified handler for the specified
-// AsndServiceId with the specified node ID filter.
-//
-// Parameters: ServiceId_p = ASnd Service ID
-// pfnDlluCbAsnd_p = callback function
-// Filter_p = node ID filter
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalRegAsndService(tEplDllAsndServiceId ServiceId_p,
- tEplDlluCbAsnd pfnDlluCbAsnd_p,
- tEplDllAsndFilter Filter_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if (ServiceId_p < tabentries(EplDlluCalInstance_g.m_apfnDlluCbAsnd)) {
- // memorize function pointer
- EplDlluCalInstance_g.m_apfnDlluCbAsnd[ServiceId_p] =
- pfnDlluCbAsnd_p;
-
- if (pfnDlluCbAsnd_p == NULL) { // close filter
- Filter_p = kEplDllAsndFilterNone;
- }
- // set filter in DLL module in kernel part
- Ret = EplDlluCalSetAsndServiceIdFilter(ServiceId_p, Filter_p);
-
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalAsyncSend()
-//
-// Description: sends the frame with the specified priority.
-//
-// Parameters: pFrameInfo_p = frame
-// m_uiFrameSize does not include the
-// ethernet header (14 bytes)
-// Priority_p = priority
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalAsyncSend(tEplFrameInfo * pFrameInfo_p,
- tEplDllAsyncReqPriority Priority_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- pFrameInfo_p->m_uiFrameSize += 14; // add size of ethernet header
- Ret = EplDllkCalAsyncSend(pFrameInfo_p, Priority_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-}
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalIssueRequest()
-//
-// 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 EplDlluCalIssueRequest(tEplDllReqServiceId Service_p,
- unsigned int uiNodeId_p, u8 bSoaFlag1_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // add node to appropriate request queue
- switch (Service_p) {
- case kEplDllReqServiceIdent:
- case kEplDllReqServiceStatus:
- {
- tEplEvent Event;
- tEplDllCalIssueRequest IssueReq;
-
- Event.m_EventSink = kEplEventSinkDllkCal;
- Event.m_EventType = kEplEventTypeDllkIssueReq;
- IssueReq.m_Service = Service_p;
- IssueReq.m_uiNodeId = uiNodeId_p;
- IssueReq.m_bSoaFlag1 = bSoaFlag1_p;
- Event.m_pArg = &IssueReq;
- Event.m_uiSize = sizeof(IssueReq);
-
- Ret = EplEventuPost(&Event);
- break;
- }
-
- default:
- {
- Ret = kEplDllInvalidParam;
- goto Exit;
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalAddNode()
-//
-// Description: adds the specified node to the isochronous phase.
-//
-// Parameters: pNodeInfo_p = pointer of node info structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalAddNode(tEplDllNodeInfo * pNodeInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkDllkCal;
- Event.m_EventType = kEplEventTypeDllkAddNode;
- Event.m_pArg = pNodeInfo_p;
- Event.m_uiSize = sizeof(tEplDllNodeInfo);
-
- Ret = EplEventuPost(&Event);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalDeleteNode()
-//
-// Description: removes the specified node from the isochronous phase.
-//
-// Parameters: uiNodeId_p = node ID
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalDeleteNode(unsigned int uiNodeId_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkDllkCal;
- Event.m_EventType = kEplEventTypeDllkDelNode;
- Event.m_pArg = &uiNodeId_p;
- Event.m_uiSize = sizeof(uiNodeId_p);
-
- Ret = EplEventuPost(&Event);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplDlluCalSoftDeleteNode()
-//
-// Description: removes the specified node softly from the isochronous phase.
-//
-// Parameters: uiNodeId_p = node ID
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplDlluCalSoftDeleteNode(unsigned int uiNodeId_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkDllkCal;
- Event.m_EventType = kEplEventTypeDllkSoftDelNode;
- Event.m_pArg = &uiNodeId_p;
- Event.m_uiSize = sizeof(uiNodeId_p);
-
- Ret = EplEventuPost(&Event);
-
- 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: EplDlluCalSetAsndServiceIdFilter()
-//
-// Description: forwards call to EplDllkSetAsndServiceIdFilter() in kernel part
-//
-// Parameters: ServiceId_p = ASnd Service ID
-// Filter_p = node ID filter
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId
- ServiceId_p,
- tEplDllAsndFilter Filter_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
- tEplDllCalAsndServiceIdFilter ServFilter;
-
- Event.m_EventSink = kEplEventSinkDllkCal;
- Event.m_EventType = kEplEventTypeDllkServFilter;
- ServFilter.m_ServiceId = ServiceId_p;
- ServFilter.m_Filter = Filter_p;
- Event.m_pArg = &ServFilter;
- Event.m_uiSize = sizeof(ServFilter);
-
- Ret = EplEventuPost(&Event);
-
- return Ret;
-}
-
-#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: definitions for all EPL-function return codes
-
- 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: EplErrDef.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.9 $ $Date: 2008/06/23 14:56:33 $
-
- $State: Exp $
-
- Build Environment:
- all
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2005/12/05 -as: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_ERRORDEF_H_
-#define _EPL_ERRORDEF_H_
-
-//---------------------------------------------------------------------------
-// return codes
-//---------------------------------------------------------------------------
-
-typedef enum {
- // area for generic errors 0x0000 - 0x000F
- kEplSuccessful = 0x0000, // no error/successful run
- kEplIllegalInstance = 0x0001, // the called Instanz does not exist
- kEplInvalidInstanceParam = 0x0002, //
- kEplNoFreeInstance = 0x0003, // XxxAddInstance was called but no free instance is available
- kEplWrongSignature = 0x0004, // wrong signature while writing to object 0x1010 or 0x1011
- kEplInvalidOperation = 0x0005, // operation not allowed in this situation
- kEplInvalidNodeId = 0x0007, // invalid NodeId was specified
- kEplNoResource = 0x0008, // resource could not be created (Windows, PxROS, ...)
- kEplShutdown = 0x0009, // stack is shutting down
- kEplReject = 0x000A, // reject the subsequent command
-
- // area for EDRV module 0x0010 - 0x001F
-// kEplEdrvNoFrame = 0x0010, // no CAN message was received
-// kEplEdrvMsgHigh = 0x0011, // CAN message with high priority was received
-// kEplEdrvMsgLow = 0x0012, // CAN message with low priority was received
- kEplEdrvInitError = 0x0013, // initialisation error
- kEplEdrvNoFreeBufEntry = 0x0014, // no free entry in internal buffer table for Tx frames
- kEplEdrvBufNotExisting = 0x0015, // specified Tx buffer does not exist
-// kEplEdrvNoFreeChannel = 0x0014, // CAN controller has not a free channel
-// kEplEdrvTxBuffHighOverrun = 0x0015, // buffer for high priority CAN transmit messages has overrun
-// kEplEdrvTxBuffLowOverrun = 0x0016, // buffer for low priority CAN transmit messages has overrun
-// kEplEdrvIllegalBdi = 0x0017, // unsupported baudrate within baudrate table
-// kEplEdrvBusy = 0x0018, // remote frame can not be updated because no bus contact or CAN
- // transmission is activ
-// kEplEdrvInvalidDriverType = 0x0019, // (PC: Windows or Linux) invalid driver type
-// kEplEdrvDriverNotFound = 0x001A, // (PC: Windows or Linux) driver (DLL) could not be found
-// kEplEdrvInvalidBaseAddress = 0x001B, // (PC: Windows or Linux) driver could not found the CAN controller
-// kEplEdrvInvalidParam = 0x001C, // invalid param in function call
-
- // area for COB module 0x0020 - 0x002F
-/* kEplCobNoFreeEntry = 0x0020, // no free entry in RX- or TX-COB table
- kEplCobAlreadyExist = 0x0021, // COB-ID already exists in RX- resp. TX-COB table
- */
- kEplDllIllegalHdl = 0x0022, // illegal handle for a TxFrame was passed
- kEplDllCbAsyncRegistered = 0x0023, // handler for non-EPL frames was already registered before
-// kEplDllAsyncRxBufferFull = 0x0024, // receive buffer for asynchronous frames is full
- kEplDllAsyncTxBufferEmpty = 0x0025, // transmit buffer for asynchronous frames is empty
- kEplDllAsyncTxBufferFull = 0x0026, // transmit buffer for asynchronous frames is full
- kEplDllNoNodeInfo = 0x0027, // MN: too less space in the internal node info structure
- kEplDllInvalidParam = 0x0028, // invalid parameters passed to function
- kEplDllTxBufNotReady = 0x002E, // TxBuffer (e.g. for PReq) is not ready yet
- kEplDllTxFrameInvalid = 0x002F, // TxFrame (e.g. for PReq) is invalid or does not exist
-/* kEplCobIllegalCanId = 0x0023, // COB-ID is not allowed (like 0x000 is reserved for NMT, ...)
- kEplCobInvalidCanId = 0x0024, // COB-ID is switched off
- kEplCobCdrvStateSet = 0x0025, // at least one bit of CAN driver state is set
- kEplCobNoFreeEntryHighBuf = 0x0026, // no free entry in high priotity RX- or TX-COB table
- kEplCobOwnId = 0x0027, // COB-ID already exists in own module which calls CobDefine() or CobCheck()
-*/
- // area for OBD module 0x0030 - 0x003F
- kEplObdIllegalPart = 0x0030, // unknown OD part
- kEplObdIndexNotExist = 0x0031, // object index does not exist in OD
- kEplObdSubindexNotExist = 0x0032, // subindex does not exist in object index
- kEplObdReadViolation = 0x0033, // read access to a write-only object
- kEplObdWriteViolation = 0x0034, // write access to a read-only object
- kEplObdAccessViolation = 0x0035, // access not allowed
- kEplObdUnknownObjectType = 0x0036, // object type not defined/known
- kEplObdVarEntryNotExist = 0x0037, // object does not contain VarEntry structure
- kEplObdValueTooLow = 0x0038, // value to write to an object is too low
- kEplObdValueTooHigh = 0x0039, // value to write to an object is too high
- kEplObdValueLengthError = 0x003A, // value to write is to long or to short
-// kEplObdIllegalFloat = 0x003B, // illegal float variable
-// kEplObdWrongOdBuilderKey = 0x003F, // OD was generated with demo version of tool ODBuilder
-
- // area for NMT module 0x0040 - 0x004F
- kEplNmtUnknownCommand = 0x0040, // unknown NMT command
- kEplNmtInvalidFramePointer = 0x0041, // pointer to the frame is not valid
- kEplNmtInvalidEvent = 0x0042, // invalid event send to NMT-modul
- kEplNmtInvalidState = 0x0043, // unknown state in NMT-State-Maschine
- kEplNmtInvalidParam = 0x0044, // invalid parameters specified
-
- // area for SDO/UDP module 0x0050 - 0x005F
- kEplSdoUdpMissCb = 0x0050, // missing callback-function pointer during inti of
- // module
- kEplSdoUdpNoSocket = 0x0051, // error during init of socket
- kEplSdoUdpSocketError = 0x0052, // error during usage of socket
- kEplSdoUdpThreadError = 0x0053, // error during start of listen thread
- kEplSdoUdpNoFreeHandle = 0x0054, // no free connection handle for Udp
- kEplSdoUdpSendError = 0x0055, // Error during send of frame
- kEplSdoUdpInvalidHdl = 0x0056, // the connection handle is invalid
-
- // area for SDO Sequence layer module 0x0060 - 0x006F
- kEplSdoSeqMissCb = 0x0060, // no callback-function assign
- kEplSdoSeqNoFreeHandle = 0x0061, // no free handle for connection
- kEplSdoSeqInvalidHdl = 0x0062, // invalid handle in SDO sequence layer
- kEplSdoSeqUnsupportedProt = 0x0063, // unsupported Protocol selected
- kEplSdoSeqNoFreeHistory = 0x0064, // no free entry in history
- kEplSdoSeqFrameSizeError = 0x0065, // the size of the frames is not correct
- kEplSdoSeqRequestAckNeeded = 0x0066, // indeicates that the history buffer is full
- // and a ack request is needed
- kEplSdoSeqInvalidFrame = 0x0067, // frame not valid
- kEplSdoSeqConnectionBusy = 0x0068, // connection is busy -> retry later
- kEplSdoSeqInvalidEvent = 0x0069, // invalid event received
-
- // area for SDO Command Layer Module 0x0070 - 0x007F
- kEplSdoComUnsupportedProt = 0x0070, // unsupported Protocol selected
- kEplSdoComNoFreeHandle = 0x0071, // no free handle for connection
- kEplSdoComInvalidServiceType = 0x0072, // invalid SDO service type specified
- kEplSdoComInvalidHandle = 0x0073, // handle invalid
- kEplSdoComInvalidSendType = 0x0074, // the stated to of frame to send is
- // not possible
- kEplSdoComNotResponsible = 0x0075, // internal error: command layer handle is
- // not responsible for this event from sequence layer
- kEplSdoComHandleExists = 0x0076, // handle to same node already exists
- kEplSdoComHandleBusy = 0x0077, // transfer via this handle is already running
- kEplSdoComInvalidParam = 0x0078, // invalid parameters passed to function
-
- // area for EPL Event-Modul 0x0080 - 0x008F
- kEplEventUnknownSink = 0x0080, // unknown sink for event
- kEplEventPostError = 0x0081, // error during post of event
-
- // area for EPL Timer Modul 0x0090 - 0x009F
- kEplTimerInvalidHandle = 0x0090, // invalid handle for timer
- kEplTimerNoTimerCreated = 0x0091, // no timer was created caused by
- // an error
-
- // area for EPL SDO/Asnd Module 0x00A0 - 0x0AF
- kEplSdoAsndInvalidNodeId = 0x00A0, //0 node id is invalid
- kEplSdoAsndNoFreeHandle = 0x00A1, // no free handle for connection
- kEplSdoAsndInvalidHandle = 0x00A2, // handle for connection is invalid
-
- // area for PDO module 0x00B0 - 0x00BF
- kEplPdoNotExist = 0x00B0, // selected PDO does not exist
- kEplPdoLengthExceeded = 0x00B1, // length of PDO mapping exceedes 64 bis
- kEplPdoGranularityMismatch = 0x00B2, // configured PDO granularity is not equal to supported granularity
- kEplPdoInitError = 0x00B3, // error during initialisation of PDO module
- kEplPdoErrorPdoEncode = 0x00B4, // error during encoding a PDO
- kEplPdoErrorPdoDecode = 0x00B5, // error during decoding a PDO
- kEplPdoErrorSend = 0x00B6, // error during sending a PDO
- kEplPdoErrorSyncWin = 0x00B7, // the SYNC window runs out during sending SYNC-PDOs
- kEplPdoErrorMapp = 0x00B8, // invalid PDO mapping
- kEplPdoVarNotFound = 0x00B9, // variable was not found in function PdoSignalVar()
- kEplPdoErrorEmcyPdoLen = 0x00BA, // the length of a received PDO is unequal to the expected value
- kEplPdoWriteConstObject = 0x00BB, // constant object can not be written
- // (only TxType, Inhibit-, Event Time for CANopen Kit)
-
- // area for LSS slave module
-/* kEplLsssResetNode = 0x0080, // NMT command "reset node" has to be processed after LSS configuration
- // new of NodeId
- kEplLsssInvalidNodeId = 0x0081, // no valid NodeId is configured -> wait until it is configured with
- // LSS service before calling CcmConnectToNet()
-*/
- // area for emergency consumer module 0x0090 - 0x009F
-/* kEplEmccNoFreeProducerEntry = 0x0090, // no free entry to add a Emergency Producer
- kEplEmccNodeIdNotExist = 0x0091, // selected NodeId was never added
- kEplEmccNodeIdInvalid = 0x0092, // selected NodeId is outside of range (0x01 until 0x7F)
- kEplEmccNodeIdExist = 0x0093, // selected NodeId already exist
-*/
- // area for dynamic OD 0x00A0 - 0x00AF
-/* kEplDynNoMemory = 0x00A0, // no memory available
- kEplDynInvalidConfig = 0x00A1, // invalid configuration in segment container
-*/
- // area for hertbeat consumer module 0x00B0 - 0x00BF
-/* kEplHbcEntryNotExist = 0x00B0, // Heartbeat Producer node not configured
- kEplHbcEntryAlreadyExist = 0x00B1, // NodeId was already defined in heartbeat consumer table (object 0x1016)
-*/
- // Configuration manager module 0x00C0 - 0x00CF
- kEplCfgMaConfigError = 0x00C0, // error in configuration manager
- kEplCfgMaSdocTimeOutError = 0x00C1, // error in configuration manager, Sdo timeout
- kEplCfgMaInvalidDcf = 0x00C2, // configration file not valid
- kEplCfgMaUnsupportedDcf = 0x00C3, // unsupported Dcf format
- kEplCfgMaConfigWithErrors = 0x00C4, // configuration finished with errors
- kEplCfgMaNoFreeConfig = 0x00C5, // no free configuration entry
- kEplCfgMaNoConfigData = 0x00C6, // no configuration data present
- kEplCfgMaUnsuppDatatypeDcf = 0x00C7, // unsupported datatype found in dcf
- // -> this entry was not configured
-
- // area for LSS master module 0x00D0 - 0x00DF
-/* kEplLssmIllegalMode = 0x00D0, // illegal LSS mode (operation / configuration)
- kEplLssmIllegalState = 0x00D1, // function was called in illegal state of LSS master
- kEplLssmBusy = 0x00D2, // LSS process is busy with an previous service
- kEplLssmIllegalCmd = 0x00D3, // illegal command code was set for function LssmInquireIdentity()
- kEplLssmTimeout = 0x00D4, // LSS slave did not answer a LSS service
- kEplLssmErrorInConfirm = 0x00D5, // LSS slave replied an error code for a LSS service
-*/
- // area for CCM modules 0x00E0 - 0xEF
-/* kEplCcmStoreUnvalidState = 0x00E0, // memory device not available due device state
- kEplCcmStoreHwError = 0x00E1, // hw error due device access
-*/
- // area for SRDO module 0x0100 - 0x011F
-/* kEplSrdoNotExist = 0x0100, // selected SRDO does not exist
- kEplSrdoGranularityMismatch = 0x0101, // configured SRDO granularity is not equal to supported granularity
- kEplSrdoCfgTimingError = 0x0102, // configuration is not ok (Timing)
- kEplSrdoCfgIdError = 0x0103, // configuration is not ok (CobIds)
- kEplSrdoCfgCrcError = 0x0104, // configuration is not ok (CRC)
- kEplSrdoNmtError = 0x0105, // an action was tried in a wrong NMT state
- kEplSrdoInvalidCfg = 0x0106, // an action was tried with an invald SRDO configuration
- kEplSrdoInvalid = 0x0107, // an action was tried with an invald SRDO
- kEplSrdoRxTxConflict = 0x0108, // an transmission was tried with an receive SRDO (or the other way)
- kEplSrdoIllegalCanId = 0x0109, // the CanId is invalid
- kEplSrdoCanIdAlreadyInUse = 0x010A, // the CanId is already in use
- kEplSrdoNotInOrder = 0x010B, // the two messages of a SRDO are not in order
- kEplSrdoSctTimeout = 0x010C, // timeout of SCT
- kEplSrdoSrvtTimeout = 0x010D, // timeout of SRVT
- kEplSrdoCanIdNotValid = 0x010E, // one of received CAN-IDs are not equal to configured one
- kEplSrdoDlcNotValid = 0x010F, // one of received CAN-DLC are not equal to configured one
- kEplSrdoErrorMapp = 0x0110, // wrong values in mapping found
- kEplSrdoDataError = 0x0111, // data of CAN messages are not invers
- kEplSrdoLengthExceeded = 0x0112, // length of SRDO mapping exceedes 64 bit per CAN-message
- kEplSrdoNotHandledInApp = 0x0113, // the SRDO error was not handled in AppSrdoError()
- kEplSrdoOverrun = 0x0114 // a RxSRDO was received but the pevious one was not else processed
-*/
-
- kEplApiTaskDeferred = 0x0140, // EPL performs task in background and informs the application (or vice-versa), when it is finished
- kEplApiInvalidParam = 0x0142, // passed invalid parameters to a function (e.g. invalid node id)
-
- // area untill 0x07FF is reserved
- // area for user application from 0x0800 to 0x7FFF
-
-} tEplKernel;
-
-#endif
-//EOF
-
-// Die letzte Zeile muß unbedingt eine leere Zeile sein, weil manche Compiler
-// damit ein Problem haben, wenn das nicht so ist (z.B. GNU oder Borland C++ Builder).
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for error handler 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: EplErrorHandlerk.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.9 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/10/02 d.k.: start of the implementation
-
-****************************************************************************/
-
-#include "kernel/EplErrorHandlerk.h"
-#include "EplNmt.h"
-#include "kernel/EplEventk.h"
-#include "kernel/EplObdk.h" // function prototyps of the EplOBD-Modul
-#include "kernel/EplDllk.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) == 0)
-#error "EPL ErrorHandler module needs EPL module OBDK!"
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- u32 m_dwCumulativeCnt; // subindex 1
- u32 m_dwThresholdCnt; // subindex 2
- u32 m_dwThreshold; // subindex 3
-
-} tEplErrorHandlerkErrorCounter;
-
-typedef struct {
- tEplErrorHandlerkErrorCounter m_CnLossSoc; // object 0x1C0B
- tEplErrorHandlerkErrorCounter m_CnLossPreq; // object 0x1C0D
- tEplErrorHandlerkErrorCounter m_CnCrcErr; // object 0x1C0F
- unsigned long m_ulDllErrorEvents;
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- tEplErrorHandlerkErrorCounter m_MnCrcErr; // object 0x1C00
- tEplErrorHandlerkErrorCounter m_MnCycTimeExceed; // object 0x1C02
- u32 m_adwMnCnLossPresCumCnt[254]; // object 0x1C07
- u32 m_adwMnCnLossPresThrCnt[254]; // object 0x1C08
- u32 m_adwMnCnLossPresThreshold[254]; // object 0x1C09
- BOOL m_afMnCnLossPresEvent[254];
-#endif
-
-} tEplErrorHandlerkInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static tEplErrorHandlerkInstance EplErrorHandlerkInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static tEplKernel EplErrorHandlerkLinkErrorCounter(tEplErrorHandlerkErrorCounter
- * pErrorCounter_p,
- unsigned int uiIndex_p);
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-static tEplKernel EplErrorHandlerkLinkArray(u32 * pdwValue_p,
- unsigned int uiValueCount_p,
- unsigned int uiIndex_p);
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <Epl-Kernelspace-Error-Handler> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplErrorHandlerkInit
-//
-// Description: function initialize the first instance
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplErrorHandlerkInit(void)
-{
- tEplKernel Ret;
-
- Ret = EplErrorHandlerkAddInstance();
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplErrorHandlerkAddInstance
-//
-// Description: function add one more instance
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplErrorHandlerkAddInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // reset only event variable,
- // all other instance members are reset by OD or may keep their current value
- // d.k.: this is necessary for the cumulative counters, which shall not be reset
- EplErrorHandlerkInstance_g.m_ulDllErrorEvents = 0;
-
- // link counters to OD
- // $$$ d.k. if OD resides in userspace, fetch pointer to shared memory,
- // which shall have the same structure as the instance (needs to be declared globally).
- // Other idea: error counter shall belong to the process image
- // (reset of counters by SDO write are a little bit tricky).
-
- Ret =
- EplErrorHandlerkLinkErrorCounter(&EplErrorHandlerkInstance_g.
- m_CnLossSoc, 0x1C0B);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret =
- EplErrorHandlerkLinkErrorCounter(&EplErrorHandlerkInstance_g.
- m_CnLossPreq, 0x1C0D);
- // ignore return code, because object 0x1C0D is conditional
-
- Ret =
- EplErrorHandlerkLinkErrorCounter(&EplErrorHandlerkInstance_g.
- m_CnCrcErr, 0x1C0F);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- Ret =
- EplErrorHandlerkLinkErrorCounter(&EplErrorHandlerkInstance_g.
- m_MnCrcErr, 0x1C00);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret =
- EplErrorHandlerkLinkErrorCounter(&EplErrorHandlerkInstance_g.
- m_MnCycTimeExceed, 0x1C02);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret =
- EplErrorHandlerkLinkArray(EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresCumCnt,
- tabentries(EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresCumCnt),
- 0x1C07);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret =
- EplErrorHandlerkLinkArray(EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThrCnt,
- tabentries(EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThrCnt),
- 0x1C08);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret =
- EplErrorHandlerkLinkArray(EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThreshold,
- tabentries(EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThreshold),
- 0x1C09);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplErrorHandlerkDelInstance
-//
-// Description: function delete instance an free the bufferstructure
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplErrorHandlerkDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplErrorHandlerkProcess
-//
-// Description: processes error events from DLL
-//
-//
-//
-// Parameters: pEvent_p = pointer to event-structur from buffer
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplErrorHandlerkProcess(tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
- unsigned long ulDllErrorEvents;
- tEplEvent Event;
- tEplNmtEvent NmtEvent;
-
- Ret = kEplSuccessful;
-
- // check m_EventType
- switch (pEvent_p->m_EventType) {
- case kEplEventTypeDllError:
- {
- tEplErrorHandlerkEvent *pErrHandlerEvent =
- (tEplErrorHandlerkEvent *) pEvent_p->m_pArg;
-
- ulDllErrorEvents = pErrHandlerEvent->m_ulDllErrorEvents;
-
- // check the several error events
- if ((EplErrorHandlerkInstance_g.m_CnLossSoc.
- m_dwThreshold > 0)
- && ((ulDllErrorEvents & EPL_DLL_ERR_CN_LOSS_SOC) != 0)) { // loss of SoC event occured
- // increment cumulative counter by 1
- EplErrorHandlerkInstance_g.m_CnLossSoc.
- m_dwCumulativeCnt++;
- // increment threshold counter by 8
- EplErrorHandlerkInstance_g.m_CnLossSoc.
- m_dwThresholdCnt += 8;
- if (EplErrorHandlerkInstance_g.m_CnLossSoc.m_dwThresholdCnt >= EplErrorHandlerkInstance_g.m_CnLossSoc.m_dwThreshold) { // threshold is reached
- // $$$ d.k.: generate error history entry E_DLL_LOSS_SOC_TH
-
- // post event to NMT state machine
- NmtEvent = kEplNmtEventNmtCycleError;
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType =
- kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent;
- Event.m_uiSize = sizeof(NmtEvent);
- Ret = EplEventkPost(&Event);
- }
- EplErrorHandlerkInstance_g.m_ulDllErrorEvents |=
- EPL_DLL_ERR_CN_LOSS_SOC;
- }
-
- if ((EplErrorHandlerkInstance_g.m_CnLossPreq.
- m_dwThreshold > 0)
- && ((ulDllErrorEvents & EPL_DLL_ERR_CN_LOSS_PREQ) != 0)) { // loss of PReq event occured
- // increment cumulative counter by 1
- EplErrorHandlerkInstance_g.m_CnLossPreq.
- m_dwCumulativeCnt++;
- // increment threshold counter by 8
- EplErrorHandlerkInstance_g.m_CnLossPreq.
- m_dwThresholdCnt += 8;
- if (EplErrorHandlerkInstance_g.m_CnLossPreq.m_dwThresholdCnt >= EplErrorHandlerkInstance_g.m_CnLossPreq.m_dwThreshold) { // threshold is reached
- // $$$ d.k.: generate error history entry E_DLL_LOSS_PREQ_TH
-
- // post event to NMT state machine
- NmtEvent = kEplNmtEventNmtCycleError;
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType =
- kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent;
- Event.m_uiSize = sizeof(NmtEvent);
- Ret = EplEventkPost(&Event);
- }
- }
-
- if ((EplErrorHandlerkInstance_g.m_CnLossPreq.
- m_dwThresholdCnt > 0)
- && ((ulDllErrorEvents & EPL_DLL_ERR_CN_RECVD_PREQ) != 0)) { // PReq correctly received
- // decrement threshold counter by 1
- EplErrorHandlerkInstance_g.m_CnLossPreq.
- m_dwThresholdCnt--;
- }
-
- if ((EplErrorHandlerkInstance_g.m_CnCrcErr.
- m_dwThreshold > 0)
- && ((ulDllErrorEvents & EPL_DLL_ERR_CN_CRC) != 0)) { // CRC error event occured
- // increment cumulative counter by 1
- EplErrorHandlerkInstance_g.m_CnCrcErr.
- m_dwCumulativeCnt++;
- // increment threshold counter by 8
- EplErrorHandlerkInstance_g.m_CnCrcErr.
- m_dwThresholdCnt += 8;
- if (EplErrorHandlerkInstance_g.m_CnCrcErr.m_dwThresholdCnt >= EplErrorHandlerkInstance_g.m_CnCrcErr.m_dwThreshold) { // threshold is reached
- // $$$ d.k.: generate error history entry E_DLL_CRC_TH
-
- // post event to NMT state machine
- NmtEvent = kEplNmtEventNmtCycleError;
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType =
- kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent;
- Event.m_uiSize = sizeof(NmtEvent);
- Ret = EplEventkPost(&Event);
- }
- EplErrorHandlerkInstance_g.m_ulDllErrorEvents |=
- EPL_DLL_ERR_CN_CRC;
- }
-
- if ((ulDllErrorEvents & EPL_DLL_ERR_INVALID_FORMAT) != 0) { // invalid format error occured (only direct reaction)
- // $$$ d.k.: generate error history entry E_DLL_INVALID_FORMAT
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if (pErrHandlerEvent->m_NmtState >= kEplNmtMsNotActive) { // MN is active
- if (pErrHandlerEvent->m_uiNodeId != 0) {
- tEplHeartbeatEvent
- HeartbeatEvent;
-
- // remove node from isochronous phase
- Ret =
- EplDllkDeleteNode
- (pErrHandlerEvent->
- m_uiNodeId);
-
- // inform NmtMnu module about state change, which shall send NMT command ResetNode to this CN
- HeartbeatEvent.m_uiNodeId =
- pErrHandlerEvent->
- m_uiNodeId;
- HeartbeatEvent.m_NmtState =
- kEplNmtCsNotActive;
- HeartbeatEvent.m_wErrorCode =
- EPL_E_DLL_INVALID_FORMAT;
- Event.m_EventSink =
- kEplEventSinkNmtMnu;
- Event.m_EventType =
- kEplEventTypeHeartbeat;
- Event.m_uiSize =
- sizeof(HeartbeatEvent);
- Event.m_pArg = &HeartbeatEvent;
- Ret = EplEventkPost(&Event);
- }
- // $$$ and else should lead to InternComError
- } else
-#endif
- { // CN is active
- // post event to NMT state machine
- NmtEvent = kEplNmtEventInternComError;
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType =
- kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent;
- Event.m_uiSize = sizeof(NmtEvent);
- Ret = EplEventkPost(&Event);
- }
- }
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if ((EplErrorHandlerkInstance_g.m_MnCrcErr.
- m_dwThreshold > 0)
- && ((ulDllErrorEvents & EPL_DLL_ERR_MN_CRC) != 0)) { // CRC error event occured
- // increment cumulative counter by 1
- EplErrorHandlerkInstance_g.m_MnCrcErr.
- m_dwCumulativeCnt++;
- // increment threshold counter by 8
- EplErrorHandlerkInstance_g.m_MnCrcErr.
- m_dwThresholdCnt += 8;
- if (EplErrorHandlerkInstance_g.m_MnCrcErr.m_dwThresholdCnt >= EplErrorHandlerkInstance_g.m_MnCrcErr.m_dwThreshold) { // threshold is reached
- // $$$ d.k.: generate error history entry E_DLL_CRC_TH
-
- // post event to NMT state machine
- NmtEvent = kEplNmtEventNmtCycleError;
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType =
- kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent;
- Event.m_uiSize = sizeof(NmtEvent);
- Ret = EplEventkPost(&Event);
- }
- EplErrorHandlerkInstance_g.m_ulDllErrorEvents |=
- EPL_DLL_ERR_MN_CRC;
- }
-
- if ((EplErrorHandlerkInstance_g.m_MnCycTimeExceed.
- m_dwThreshold > 0)
- && ((ulDllErrorEvents & EPL_DLL_ERR_MN_CYCTIMEEXCEED) != 0)) { // cycle time exceeded event occured
- // increment cumulative counter by 1
- EplErrorHandlerkInstance_g.m_MnCycTimeExceed.
- m_dwCumulativeCnt++;
- // increment threshold counter by 8
- EplErrorHandlerkInstance_g.m_MnCycTimeExceed.
- m_dwThresholdCnt += 8;
- if (EplErrorHandlerkInstance_g.m_MnCycTimeExceed.m_dwThresholdCnt >= EplErrorHandlerkInstance_g.m_MnCycTimeExceed.m_dwThreshold) { // threshold is reached
- // $$$ d.k.: generate error history entry E_DLL_CYCLE_EXCEED_TH
-
- // post event to NMT state machine
- NmtEvent = kEplNmtEventNmtCycleError;
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_EventType =
- kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent;
- Event.m_uiSize = sizeof(NmtEvent);
- Ret = EplEventkPost(&Event);
- }
- // $$$ d.k.: else generate error history entry E_DLL_CYCLE_EXCEED
- EplErrorHandlerkInstance_g.m_ulDllErrorEvents |=
- EPL_DLL_ERR_MN_CYCTIMEEXCEED;
- }
-
- if ((ulDllErrorEvents & EPL_DLL_ERR_MN_CN_LOSS_PRES) != 0) { // CN loss PRes event occured
- unsigned int uiNodeId;
-
- uiNodeId = pErrHandlerEvent->m_uiNodeId - 1;
- if ((uiNodeId <
- tabentries(EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresCumCnt))
- && (EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThreshold[uiNodeId] >
- 0)) {
- // increment cumulative counter by 1
- EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresCumCnt[uiNodeId]++;
- // increment threshold counter by 8
- EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThrCnt[uiNodeId] +=
- 8;
- if (EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThrCnt[uiNodeId]
- >= EplErrorHandlerkInstance_g.m_adwMnCnLossPresThreshold[uiNodeId]) { // threshold is reached
- tEplHeartbeatEvent
- HeartbeatEvent;
-
- // $$$ d.k.: generate error history entry E_DLL_LOSS_PRES_TH
-
- // remove node from isochronous phase
- Ret =
- EplDllkDeleteNode
- (pErrHandlerEvent->
- m_uiNodeId);
-
- // inform NmtMnu module about state change, which shall send NMT command ResetNode to this CN
- HeartbeatEvent.m_uiNodeId =
- pErrHandlerEvent->
- m_uiNodeId;
- HeartbeatEvent.m_NmtState =
- kEplNmtCsNotActive;
- HeartbeatEvent.m_wErrorCode =
- EPL_E_DLL_LOSS_PRES_TH;
- Event.m_EventSink =
- kEplEventSinkNmtMnu;
- Event.m_EventType =
- kEplEventTypeHeartbeat;
- Event.m_uiSize =
- sizeof(HeartbeatEvent);
- Event.m_pArg = &HeartbeatEvent;
- Ret = EplEventkPost(&Event);
- }
- EplErrorHandlerkInstance_g.
- m_afMnCnLossPresEvent[uiNodeId] =
- TRUE;
- }
- }
-#endif
-
- break;
- }
-
- // NMT event
- case kEplEventTypeNmtEvent:
- {
- if ((*(tEplNmtEvent *) pEvent_p->m_pArg) == kEplNmtEventDllCeSoa) { // SoA event of CN -> decrement threshold counters
-
- if ((EplErrorHandlerkInstance_g.m_ulDllErrorEvents & EPL_DLL_ERR_CN_LOSS_SOC) == 0) { // decrement loss of SoC threshold counter, because it didn't occur last cycle
- if (EplErrorHandlerkInstance_g.
- m_CnLossSoc.m_dwThresholdCnt > 0) {
- EplErrorHandlerkInstance_g.
- m_CnLossSoc.
- m_dwThresholdCnt--;
- }
- }
-
- if ((EplErrorHandlerkInstance_g.m_ulDllErrorEvents & EPL_DLL_ERR_CN_CRC) == 0) { // decrement CRC threshold counter, because it didn't occur last cycle
- if (EplErrorHandlerkInstance_g.
- m_CnCrcErr.m_dwThresholdCnt > 0) {
- EplErrorHandlerkInstance_g.
- m_CnCrcErr.
- m_dwThresholdCnt--;
- }
- }
- }
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- else if ((*(tEplNmtEvent *) pEvent_p->m_pArg) == kEplNmtEventDllMeSoaSent) { // SoA event of MN -> decrement threshold counters
- tEplDllkNodeInfo *pIntNodeInfo;
- unsigned int uiNodeId;
-
- Ret = EplDllkGetFirstNodeInfo(&pIntNodeInfo);
- if (Ret != kEplSuccessful) {
- break;
- }
- // iterate through node info structure list
- while (pIntNodeInfo != NULL) {
- uiNodeId = pIntNodeInfo->m_uiNodeId - 1;
- if (uiNodeId <
- tabentries
- (EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresCumCnt)) {
- if (EplErrorHandlerkInstance_g.
- m_afMnCnLossPresEvent
- [uiNodeId] == FALSE) {
- if (EplErrorHandlerkInstance_g.m_adwMnCnLossPresThrCnt[uiNodeId] > 0) {
- EplErrorHandlerkInstance_g.
- m_adwMnCnLossPresThrCnt
- [uiNodeId]--;
- }
- } else {
- EplErrorHandlerkInstance_g.
- m_afMnCnLossPresEvent
- [uiNodeId] = FALSE;
- }
- }
- pIntNodeInfo =
- pIntNodeInfo->m_pNextNodeInfo;
- }
-
- if ((EplErrorHandlerkInstance_g.m_ulDllErrorEvents & EPL_DLL_ERR_MN_CRC) == 0) { // decrement CRC threshold counter, because it didn't occur last cycle
- if (EplErrorHandlerkInstance_g.
- m_MnCrcErr.m_dwThresholdCnt > 0) {
- EplErrorHandlerkInstance_g.
- m_MnCrcErr.
- m_dwThresholdCnt--;
- }
- }
-
- if ((EplErrorHandlerkInstance_g.m_ulDllErrorEvents & EPL_DLL_ERR_MN_CYCTIMEEXCEED) == 0) { // decrement cycle exceed threshold counter, because it didn't occur last cycle
- if (EplErrorHandlerkInstance_g.
- m_MnCycTimeExceed.m_dwThresholdCnt >
- 0) {
- EplErrorHandlerkInstance_g.
- m_MnCycTimeExceed.
- m_dwThresholdCnt--;
- }
- }
- }
-#endif
-
- // reset error events
- EplErrorHandlerkInstance_g.m_ulDllErrorEvents = 0L;
-
- break;
- }
-
- // unknown type
- default:
- {
- }
-
- } // end of switch(pEvent_p->m_EventType)
-
- return Ret;
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplErrorHandlerkLinkErrorCounter
-//
-// Description: link specified error counter structure to OD entry
-//
-// Parameters: pErrorCounter_p = pointer to error counter structure
-// uiIndex_p = OD index
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplErrorHandlerkLinkErrorCounter(tEplErrorHandlerkErrorCounter
- * pErrorCounter_p,
- unsigned int uiIndex_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplVarParam VarParam;
-
- VarParam.m_pData = &pErrorCounter_p->m_dwCumulativeCnt;
- VarParam.m_Size = sizeof(u32);
- VarParam.m_uiIndex = uiIndex_p;
- VarParam.m_uiSubindex = 0x01;
- VarParam.m_ValidFlag = kVarValidAll;
- Ret = EplObdDefineVar(&VarParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- VarParam.m_pData = &pErrorCounter_p->m_dwThresholdCnt;
- VarParam.m_Size = sizeof(u32);
- VarParam.m_uiIndex = uiIndex_p;
- VarParam.m_uiSubindex = 0x02;
- VarParam.m_ValidFlag = kVarValidAll;
- Ret = EplObdDefineVar(&VarParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- VarParam.m_pData = &pErrorCounter_p->m_dwThreshold;
- VarParam.m_Size = sizeof(u32);
- VarParam.m_uiIndex = uiIndex_p;
- VarParam.m_uiSubindex = 0x03;
- VarParam.m_ValidFlag = kVarValidAll;
- Ret = EplObdDefineVar(&VarParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplErrorHandlerkLinkErrorCounter
-//
-// Description: link specified error counter structure to OD entry
-//
-// Parameters: pErrorCounter_p = pointer to error counter structure
-// uiIndex_p = OD index
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-static tEplKernel EplErrorHandlerkLinkArray(u32 * pdwValue_p,
- unsigned int uiValueCount_p,
- unsigned int uiIndex_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplVarParam VarParam;
- tEplObdSize EntrySize;
- u8 bIndexEntries;
-
- EntrySize = (tEplObdSize) sizeof(bIndexEntries);
- Ret = EplObdReadEntry(uiIndex_p,
- 0x00, (void *)&bIndexEntries, &EntrySize);
-
- if ((Ret != kEplSuccessful) || (bIndexEntries == 0x00)) {
- // Object doesn't exist or invalid entry number
- Ret = kEplObdIndexNotExist;
- goto Exit;
- }
-
- if (bIndexEntries < uiValueCount_p) {
- uiValueCount_p = bIndexEntries;
- }
-
- VarParam.m_Size = sizeof(u32);
- VarParam.m_uiIndex = uiIndex_p;
- VarParam.m_ValidFlag = kVarValidAll;
-
- for (VarParam.m_uiSubindex = 0x01;
- VarParam.m_uiSubindex <= uiValueCount_p; VarParam.m_uiSubindex++) {
- VarParam.m_pData = pdwValue_p;
- Ret = EplObdDefineVar(&VarParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- pdwValue_p++;
- }
-
- Exit:
- return Ret;
-}
-#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for event 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: EplEvent.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/11/17 16:40:39 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/12 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_EVENT_H_
-#define _EPL_EVENT_H_
-
-#include "EplInc.h"
-#include "EplNmt.h"
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// name and size of event queues
-#define EPL_EVENT_NAME_SHB_KERNEL_TO_USER "ShbKernelToUser"
-#ifndef EPL_EVENT_SIZE_SHB_KERNEL_TO_USER
-#define EPL_EVENT_SIZE_SHB_KERNEL_TO_USER 32768 // 32 kByte
-#endif
-
-#define EPL_EVENT_NAME_SHB_USER_TO_KERNEL "ShbUserToKernel"
-#ifndef EPL_EVENT_SIZE_SHB_USER_TO_KERNEL
-#define EPL_EVENT_SIZE_SHB_USER_TO_KERNEL 32768 // 32 kByte
-#endif
-
-// max size of event argument
-#ifndef EPL_MAX_EVENT_ARG_SIZE
-#define EPL_MAX_EVENT_ARG_SIZE 256 // because of PDO
-#endif
-
-#define EPL_DLL_ERR_MN_CRC 0x00000001L // object 0x1C00
-#define EPL_DLL_ERR_MN_COLLISION 0x00000002L // object 0x1C01
-#define EPL_DLL_ERR_MN_CYCTIMEEXCEED 0x00000004L // object 0x1C02
-#define EPL_DLL_ERR_MN_LOSS_LINK 0x00000008L // object 0x1C03
-#define EPL_DLL_ERR_MN_CN_LATE_PRES 0x00000010L // objects 0x1C04-0x1C06
-#define EPL_DLL_ERR_MN_CN_LOSS_PRES 0x00000080L // objects 0x1C07-0x1C09
-#define EPL_DLL_ERR_CN_COLLISION 0x00000400L // object 0x1C0A
-#define EPL_DLL_ERR_CN_LOSS_SOC 0x00000800L // object 0x1C0B
-#define EPL_DLL_ERR_CN_LOSS_SOA 0x00001000L // object 0x1C0C
-#define EPL_DLL_ERR_CN_LOSS_PREQ 0x00002000L // object 0x1C0D
-#define EPL_DLL_ERR_CN_RECVD_PREQ 0x00004000L // decrement object 0x1C0D/2
-#define EPL_DLL_ERR_CN_SOC_JITTER 0x00008000L // object 0x1C0E
-#define EPL_DLL_ERR_CN_CRC 0x00010000L // object 0x1C0F
-#define EPL_DLL_ERR_CN_LOSS_LINK 0x00020000L // object 0x1C10
-#define EPL_DLL_ERR_MN_LOSS_STATRES 0x00040000L // objects 0x1C15-0x1C17 (should be operated by NmtMnu module)
-#define EPL_DLL_ERR_BAD_PHYS_MODE 0x00080000L // no object
-#define EPL_DLL_ERR_MAC_BUFFER 0x00100000L // no object (NMT_GT6)
-#define EPL_DLL_ERR_INVALID_FORMAT 0x00200000L // no object (NMT_GT6)
-#define EPL_DLL_ERR_ADDRESS_CONFLICT 0x00400000L // no object (remove CN from configuration)
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-// EventType determines the argument of the event
-typedef enum {
- kEplEventTypeNmtEvent = 0x01, // NMT event
- // arg is pointer to tEplNmtEvent
- kEplEventTypePdoRx = 0x02, // PDO frame received event (PRes/PReq)
- // arg is pointer to tEplFrame
- kEplEventTypePdoTx = 0x03, // PDO frame transmitted event (PRes/PReq)
- // arg is pointer to tEplFrameInfo
- kEplEventTypePdoSoa = 0x04, // SoA frame received event (isochronous phase completed)
- // arg is pointer to nothing
- kEplEventTypeSync = 0x05, // Sync event (e.g. SoC or anticipated SoC)
- // arg is pointer to nothing
- kEplEventTypeTimer = 0x06, // Timer event
- // arg is pointer to tEplTimerEventArg
- kEplEventTypeHeartbeat = 0x07, // Heartbeat event
- // arg is pointer to tEplHeartbeatEvent
- kEplEventTypeDllkCreate = 0x08, // DLL kernel create event
- // arg is pointer to the new tEplNmtState
- kEplEventTypeDllkDestroy = 0x09, // DLL kernel destroy event
- // arg is pointer to the old tEplNmtState
- kEplEventTypeDllkFillTx = 0x0A, // DLL kernel fill TxBuffer event
- // arg is pointer to tEplDllAsyncReqPriority
- kEplEventTypeDllkPresReady = 0x0B, // DLL kernel PRes ready event
- // arg is pointer to nothing
- kEplEventTypeError = 0x0C, // Error event for API layer
- // arg is pointer to tEplEventError
- kEplEventTypeNmtStateChange = 0x0D, // indicate change of NMT-State
- // arg is pointer to tEplEventNmtStateChange
- kEplEventTypeDllError = 0x0E, // DLL error event for Error handler
- // arg is pointer to tEplErrorHandlerkEvent
- kEplEventTypeAsndRx = 0x0F, // received ASnd frame for DLL user module
- // arg is pointer to tEplFrame
- kEplEventTypeDllkServFilter = 0x10, // configure ServiceIdFilter
- // arg is pointer to tEplDllCalServiceIdFilter
- kEplEventTypeDllkIdentity = 0x11, // configure Identity
- // arg is pointer to tEplDllIdentParam
- kEplEventTypeDllkConfig = 0x12, // configure ConfigParam
- // arg is pointer to tEplDllConfigParam
- kEplEventTypeDllkIssueReq = 0x13, // issue Ident/Status request
- // arg is pointer to tEplDllCalIssueRequest
- kEplEventTypeDllkAddNode = 0x14, // add node to isochronous phase
- // arg is pointer to tEplDllNodeInfo
- kEplEventTypeDllkDelNode = 0x15, // remove node from isochronous phase
- // arg is pointer to unsigned int
- kEplEventTypeDllkSoftDelNode = 0x16, // remove node softly from isochronous phase
- // arg is pointer to unsigned int
- kEplEventTypeDllkStartReducedCycle = 0x17, // start reduced EPL cycle on MN
- // arg is pointer to nothing
- kEplEventTypeNmtMnuNmtCmdSent = 0x18, // NMT command was actually sent
- // arg is pointer to tEplFrame
-
-} tEplEventType;
-
-// EventSink determines the consumer of the event
-typedef enum {
- kEplEventSinkSync = 0x00, // Sync event for application or kernel EPL module
- kEplEventSinkNmtk = 0x01, // events for Nmtk module
- kEplEventSinkDllk = 0x02, // events for Dllk module
- kEplEventSinkDlluCal = 0x03, // events for DlluCal module
- kEplEventSinkDllkCal = 0x04, // events for DllkCal module
- kEplEventSinkPdok = 0x05, // events for Pdok module
- kEplEventSinkNmtu = 0x06, // events for Nmtu module
- kEplEventSinkErrk = 0x07, // events for Error handler module
- kEplEventSinkErru = 0x08, // events for Error signaling module
- kEplEventSinkSdoAsySeq = 0x09, // events for asyncronous SDO Sequence Layer module
- kEplEventSinkNmtMnu = 0x0A, // events for NmtMnu module
- kEplEventSinkLedu = 0x0B, // events for Ledu module
- kEplEventSinkApi = 0x0F, // events for API module
-
-} tEplEventSink;
-
-// EventSource determines the source of an errorevent
-typedef enum {
- // kernelspace modules
- kEplEventSourceDllk = 0x01, // Dllk module
- kEplEventSourceNmtk = 0x02, // Nmtk module
- kEplEventSourceObdk = 0x03, // Obdk module
- kEplEventSourcePdok = 0x04, // Pdok module
- kEplEventSourceTimerk = 0x05, // Timerk module
- kEplEventSourceEventk = 0x06, // Eventk module
- kEplEventSourceSyncCb = 0x07, // sync-Cb
- kEplEventSourceErrk = 0x08, // Error handler module
-
- // userspace modules
- kEplEventSourceDllu = 0x10, // Dllu module
- kEplEventSourceNmtu = 0x11, // Nmtu module
- kEplEventSourceNmtCnu = 0x12, // NmtCnu module
- kEplEventSourceNmtMnu = 0x13, // NmtMnu module
- kEplEventSourceObdu = 0x14, // Obdu module
- kEplEventSourceSdoUdp = 0x15, // Sdo/Udp module
- kEplEventSourceSdoAsnd = 0x16, // Sdo/Asnd module
- kEplEventSourceSdoAsySeq = 0x17, // Sdo asynchronus Sequence Layer module
- kEplEventSourceSdoCom = 0x18, // Sdo command layer module
- kEplEventSourceTimeru = 0x19, // Timeru module
- kEplEventSourceCfgMau = 0x1A, // CfgMau module
- kEplEventSourceEventu = 0x1B, // Eventu module
- kEplEventSourceEplApi = 0x1C, // Api module
- kEplEventSourceLedu = 0x1D, // Ledu module
-
-} tEplEventSource;
-
-// structure of EPL event (element order must not be changed!)
-typedef struct {
- tEplEventType m_EventType /*:28 */ ; // event type
- tEplEventSink m_EventSink /*:4 */ ; // event sink
- tEplNetTime m_NetTime; // timestamp
- unsigned int m_uiSize; // size of argument
- void *m_pArg; // argument of event
-
-} tEplEvent;
-
-// short structure of EPL event without argument and its size (element order must not be changed!)
-typedef struct {
- tEplEventType m_EventType /*:28 */ ; // event type
- tEplEventSink m_EventSink /*:4 */ ; // event sink
- tEplNetTime m_NetTime; // timestamp
-
-} tEplEventShort;
-
-typedef struct {
- unsigned int m_uiIndex;
- unsigned int m_uiSubIndex;
-
-} tEplEventObdError;
-
-// structure for kEplEventTypeError
-typedef struct {
- tEplEventSource m_EventSource; // module which posted this error event
- tEplKernel m_EplError; // EPL error which occured
- union {
- u8 m_bArg;
- u32 m_dwArg;
- tEplEventSource m_EventSource; // from Eventk/u module (originating error source)
- tEplEventObdError m_ObdError; // from Obd module
-// tEplErrHistoryEntry m_HistoryEntry; // from Nmtk/u module
-
- } m_Arg;
-
-} tEplEventError;
-
-// structure for kEplEventTypeDllError
-typedef struct {
- unsigned long m_ulDllErrorEvents; // EPL_DLL_ERR_*
- unsigned int m_uiNodeId;
- tEplNmtState m_NmtState;
-
-} tEplErrorHandlerkEvent;
-
-// callback function to get informed about sync event
-typedef tEplKernel(*tEplSyncCb) (void);
-
-// callback function for generic events
-typedef tEplKernel(*tEplProcessEventCb) (tEplEvent *pEplEvent_p);
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_EVENT_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for Epl-Kernelspace-Event-Modul
-
- 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: EplEventk.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.9 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/20 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "kernel/EplEventk.h"
-#include "kernel/EplNmtk.h"
-#include "kernel/EplDllk.h"
-#include "kernel/EplDllkCal.h"
-#include "kernel/EplErrorHandlerk.h"
-#include "Benchmark.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-#include "kernel/EplPdok.h"
-#include "kernel/EplPdokCal.h"
-#endif
-
-#ifdef EPL_NO_FIFO
-#include "user/EplEventu.h"
-#else
-#include "SharedBuff.h"
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 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)
-#endif
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
-#ifndef EPL_NO_FIFO
- tShbInstance m_pShbKernelToUserInstance;
- tShbInstance m_pShbUserToKernelInstance;
-#else
-
-#endif
- tEplSyncCb m_pfnCbSync;
- unsigned int m_uiUserToKernelFullCount;
-
-} tEplEventkInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-static tEplEventkInstance EplEventkInstance_g;
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-// callback function for incoming events
-#ifndef EPL_NO_FIFO
-static void EplEventkRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
- unsigned long ulDataSize_p);
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <Epl-Kernelspace-Event> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventkInit
-//
-// Description: function initializes the first instance
-//
-// Parameters: pfnCbSync_p = callback-function for sync event
-//
-// Returns: tEpKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplEventkInit(tEplSyncCb pfnCbSync_p)
-{
- tEplKernel Ret;
-
- Ret = EplEventkAddInstance(pfnCbSync_p);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventkAddInstance
-//
-// Description: function adds one more instance
-//
-// Parameters: pfnCbSync_p = callback-function for sync event
-//
-// Returns: tEpKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplEventkAddInstance(tEplSyncCb pfnCbSync_p)
-{
- tEplKernel Ret;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
- unsigned int fShbNewCreated;
-#endif
-
- Ret = kEplSuccessful;
-
- // init instance structure
- EplEventkInstance_g.m_uiUserToKernelFullCount = 0;
-
- // save cb-function
- EplEventkInstance_g.m_pfnCbSync = pfnCbSync_p;
-
-#ifndef EPL_NO_FIFO
- // init shared loop buffer
- // kernel -> user
- ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_KERNEL_TO_USER,
- EPL_EVENT_NAME_SHB_KERNEL_TO_USER,
- &EplEventkInstance_g.
- m_pShbKernelToUserInstance,
- &fShbNewCreated);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkAddInstance(): ShbCirAllocBuffer(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- goto Exit;
- }
- // user -> kernel
- ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_USER_TO_KERNEL,
- EPL_EVENT_NAME_SHB_USER_TO_KERNEL,
- &EplEventkInstance_g.
- m_pShbUserToKernelInstance,
- &fShbNewCreated);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkAddInstance(): ShbCirAllocBuffer(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- goto Exit;
- }
- // register eventhandler
- ShbError =
- ShbCirSetSignalHandlerNewData(EplEventkInstance_g.
- m_pShbUserToKernelInstance,
- EplEventkRxSignalHandlerCb,
- kshbPriorityHigh);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkAddInstance(): ShbCirSetSignalHandlerNewData(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- goto Exit;
- }
-
- Exit:
-#endif
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventkDelInstance
-//
-// Description: function deletes instance and frees the buffers
-//
-// Parameters: void
-//
-// Returns: tEpKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplEventkDelInstance(void)
-{
- tEplKernel Ret;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-#endif
-
- Ret = kEplSuccessful;
-
-#ifndef EPL_NO_FIFO
- // set eventhandler to NULL
- ShbError =
- ShbCirSetSignalHandlerNewData(EplEventkInstance_g.
- m_pShbUserToKernelInstance, NULL,
- kShbPriorityNormal);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkDelInstance(): ShbCirSetSignalHandlerNewData(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- }
- // free buffer User -> Kernel
- ShbError =
- ShbCirReleaseBuffer(EplEventkInstance_g.m_pShbUserToKernelInstance);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkDelInstance(): ShbCirReleaseBuffer(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- } else {
- EplEventkInstance_g.m_pShbUserToKernelInstance = NULL;
- }
-
- // free buffer Kernel -> User
- ShbError =
- ShbCirReleaseBuffer(EplEventkInstance_g.m_pShbKernelToUserInstance);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkDelInstance(): ShbCirReleaseBuffer(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- } else {
- EplEventkInstance_g.m_pShbKernelToUserInstance = NULL;
- }
-#endif
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventkProcess
-//
-// Description: Kernelthread that dispatches events in kernel part
-//
-// Parameters: pEvent_p = pointer to event-structure from buffer
-//
-// Returns: tEpKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplEventkProcess(tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
- tEplEventSource EventSource;
-
- Ret = kEplSuccessful;
-
- // error handling if event queue is full
- if (EplEventkInstance_g.m_uiUserToKernelFullCount > 0) { // UserToKernel event queue has run out of space -> kEplNmtEventInternComError
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
- tEplEvent Event;
- tEplNmtEvent NmtEvent;
-#endif
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-#endif
-
- // directly call NMTk process function, because event queue is full
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
- NmtEvent = kEplNmtEventInternComError;
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_NetTime.m_dwNanoSec = 0;
- Event.m_NetTime.m_dwSec = 0;
- Event.m_EventType = kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent;
- Event.m_uiSize = sizeof(NmtEvent);
- Ret = EplNmtkProcess(&Event);
-#endif
-
- // NMT state machine changed to reset (i.e. NMT_GS_RESET_COMMUNICATION)
- // now, it is safe to reset the counter and empty the event queue
-#ifndef EPL_NO_FIFO
- ShbError =
- ShbCirResetBuffer(EplEventkInstance_g.
- m_pShbUserToKernelInstance, 1000, NULL);
-#endif
-
- EplEventkInstance_g.m_uiUserToKernelFullCount = 0;
- TGT_DBG_SIGNAL_TRACE_POINT(22);
-
- // also discard the current event (it doesn't matter if we lose another event)
- goto Exit;
- }
- // check m_EventSink
- switch (pEvent_p->m_EventSink) {
- case kEplEventSinkSync:
- {
- if (EplEventkInstance_g.m_pfnCbSync != NULL) {
- Ret = EplEventkInstance_g.m_pfnCbSync();
- if (Ret == kEplSuccessful) {
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- // mark TPDOs as valid
- Ret = EplPdokCalSetTpdosValid(TRUE);
-#endif
- } else if ((Ret != kEplReject)
- && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceSyncCb;
-
- // Error event for API layer
- EplEventkPostError
- (kEplEventSourceEventk, Ret,
- sizeof(EventSource), &EventSource);
- }
- }
- break;
- }
-
- // NMT-Kernel-Modul
- case kEplEventSinkNmtk:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
- Ret = EplNmtkProcess(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceNmtk;
-
- // Error event for API layer
- EplEventkPostError(kEplEventSourceEventk,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
-#endif
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- if ((pEvent_p->m_EventType == kEplEventTypeNmtEvent)
- &&
- ((*((tEplNmtEvent *) pEvent_p->m_pArg) ==
- kEplNmtEventDllCeSoa)
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- || (*((tEplNmtEvent *) pEvent_p->m_pArg) ==
- kEplNmtEventDllMeSoaSent)
-#endif
- )) { // forward SoA event to error handler
- Ret = EplErrorHandlerkProcess(pEvent_p);
- if ((Ret != kEplSuccessful)
- && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceErrk;
-
- // Error event for API layer
- EplEventkPostError
- (kEplEventSourceEventk, Ret,
- sizeof(EventSource), &EventSource);
- }
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- // forward SoA event to PDO module
- pEvent_p->m_EventType = kEplEventTypePdoSoa;
- Ret = EplPdokProcess(pEvent_p);
- if ((Ret != kEplSuccessful)
- && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourcePdok;
-
- // Error event for API layer
- EplEventkPostError
- (kEplEventSourceEventk, Ret,
- sizeof(EventSource), &EventSource);
- }
-#endif
-
- }
- break;
-#endif
- }
-
- // events for Dllk module
- case kEplEventSinkDllk:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- Ret = EplDllkProcess(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceDllk;
-
- // Error event for API layer
- EplEventkPostError(kEplEventSourceEventk,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
-#endif
- break;
- }
-
- // events for DllkCal module
- case kEplEventSinkDllkCal:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- Ret = EplDllkCalProcess(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceDllk;
-
- // Error event for API layer
- EplEventkPostError(kEplEventSourceEventk,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
-#endif
- break;
- }
-
- //
- case kEplEventSinkPdok:
- {
- // PDO-Module
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
- Ret = EplPdokProcess(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourcePdok;
-
- // Error event for API layer
- EplEventkPostError(kEplEventSourceEventk,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
-#endif
- break;
- }
-
- // events for Error handler module
- case kEplEventSinkErrk:
- {
- // only call error handler if DLL is present
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- Ret = EplErrorHandlerkProcess(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceErrk;
-
- // Error event for API layer
- EplEventkPostError(kEplEventSourceEventk,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
- break;
-#endif
- }
-
- // unknown sink
- default:
- {
- Ret = kEplEventUnknownSink;
- }
-
- } // end of switch(pEvent_p->m_EventSink)
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventkPost
-//
-// Description: post events from kernel part
-//
-// Parameters: pEvent_p = pointer to event-structure from buffer
-//
-// Returns: tEpKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplEventkPost(tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
- tShbCirChunk ShbCirChunk;
- unsigned long ulDataSize;
- unsigned int fBufferCompleted;
-#endif
-
- Ret = kEplSuccessful;
-
- // the event must be posted by using the abBuffer
- // it is neede because the Argument must by copied
- // to the buffer too and not only the pointer
-
-#ifndef EPL_NO_FIFO
- // 2006/08/03 d.k.: Event and argument are posted as separate chunks to the event queue.
- ulDataSize =
- sizeof(tEplEvent) +
- ((pEvent_p->m_pArg != NULL) ? pEvent_p->m_uiSize : 0);
-#endif
-
- // decide in which buffer the event have to write
- switch (pEvent_p->m_EventSink) {
- // kernelspace modules
- case kEplEventSinkSync:
- case kEplEventSinkNmtk:
- case kEplEventSinkDllk:
- case kEplEventSinkDllkCal:
- case kEplEventSinkPdok:
- case kEplEventSinkErrk:
- {
-#ifndef EPL_NO_FIFO
- // post message
- BENCHMARK_MOD_27_SET(2);
- ShbError =
- ShbCirAllocDataBlock(EplEventkInstance_g.
- m_pShbUserToKernelInstance,
- &ShbCirChunk, ulDataSize);
- switch (ShbError) {
- case kShbOk:
- break;
-
- case kShbBufferFull:
- {
- EplEventkInstance_g.
- m_uiUserToKernelFullCount++;
- Ret = kEplEventPostError;
- goto Exit;
- }
-
- default:
- {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkPost(): ShbCirAllocDataBlock(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- }
- ShbError =
- ShbCirWriteDataChunk(EplEventkInstance_g.
- m_pShbUserToKernelInstance,
- &ShbCirChunk, pEvent_p,
- sizeof(tEplEvent),
- &fBufferCompleted);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkPost(): ShbCirWriteDataChunk(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- if (fBufferCompleted == FALSE) {
- ShbError =
- ShbCirWriteDataChunk(EplEventkInstance_g.
- m_pShbUserToKernelInstance,
- &ShbCirChunk,
- pEvent_p->m_pArg,
- (unsigned long)
- pEvent_p->m_uiSize,
- &fBufferCompleted);
- if ((ShbError != kShbOk)
- || (fBufferCompleted == FALSE)) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkPost(): ShbCirWriteDataChunk2(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- }
- BENCHMARK_MOD_27_RESET(2);
-
-#else
- Ret = EplEventkProcess(pEvent_p);
-#endif
-
- break;
- }
-
- // userspace modules
- case kEplEventSinkNmtu:
- case kEplEventSinkNmtMnu:
- case kEplEventSinkSdoAsySeq:
- case kEplEventSinkApi:
- case kEplEventSinkDlluCal:
- case kEplEventSinkErru:
- {
-#ifndef EPL_NO_FIFO
- // post message
-// BENCHMARK_MOD_27_SET(3); // 74 µs until reset
- ShbError =
- ShbCirAllocDataBlock(EplEventkInstance_g.
- m_pShbKernelToUserInstance,
- &ShbCirChunk, ulDataSize);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkPost(): ShbCirAllocDataBlock(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- ShbError =
- ShbCirWriteDataChunk(EplEventkInstance_g.
- m_pShbKernelToUserInstance,
- &ShbCirChunk, pEvent_p,
- sizeof(tEplEvent),
- &fBufferCompleted);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkPost(): ShbCirWriteDataChunk(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- if (fBufferCompleted == FALSE) {
- ShbError =
- ShbCirWriteDataChunk(EplEventkInstance_g.
- m_pShbKernelToUserInstance,
- &ShbCirChunk,
- pEvent_p->m_pArg,
- (unsigned long)
- pEvent_p->m_uiSize,
- &fBufferCompleted);
- if ((ShbError != kShbOk)
- || (fBufferCompleted == FALSE)) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventkPost(): ShbCirWriteDataChunk2(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- }
-// BENCHMARK_MOD_27_RESET(3); // 82 µs until ShbCirGetReadDataSize() in EplEventu
-
-#else
- Ret = EplEventuProcess(pEvent_p);
-#endif
-
- break;
- }
-
- default:
- {
- Ret = kEplEventUnknownSink;
- }
-
- } // end of switch(pEvent_p->m_EventSink)
-
-#ifndef EPL_NO_FIFO
- Exit:
-#endif
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventkPostError
-//
-// Description: post error event from kernel part to API layer
-//
-// Parameters: EventSource_p = source-module of the error event
-// EplError_p = code of occured error
-// ArgSize_p = size of the argument
-// pArg_p = pointer to the argument
-//
-// Returns: tEpKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplEventkPostError(tEplEventSource EventSource_p,
- tEplKernel EplError_p,
- unsigned int uiArgSize_p, void *pArg_p)
-{
- tEplKernel Ret;
- u8 abBuffer[EPL_MAX_EVENT_ARG_SIZE];
- tEplEventError *pEventError = (tEplEventError *) abBuffer;
- tEplEvent EplEvent;
-
- Ret = kEplSuccessful;
-
- // create argument
- pEventError->m_EventSource = EventSource_p;
- pEventError->m_EplError = EplError_p;
- EPL_MEMCPY(&pEventError->m_Arg, pArg_p, uiArgSize_p);
-
- // create event
- EplEvent.m_EventType = kEplEventTypeError;
- EplEvent.m_EventSink = kEplEventSinkApi;
- EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(EplEvent.m_NetTime));
- EplEvent.m_uiSize =
- (sizeof(EventSource_p) + sizeof(EplError_p) + uiArgSize_p);
- EplEvent.m_pArg = &abBuffer[0];
-
- // post errorevent
- Ret = EplEventkPost(&EplEvent);
-
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventkRxSignalHandlerCb()
-//
-// Description: Callback-function for events from user and kernel part
-//
-// Parameters: pShbRxInstance_p = Instance-pointer of buffer
-// ulDataSize_p = size of data
-//
-// Returns: void
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#ifndef EPL_NO_FIFO
-static void EplEventkRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
- unsigned long ulDataSize_p)
-{
- tEplEvent *pEplEvent;
- tShbError ShbError;
-//unsigned long ulBlockCount;
-//unsigned long ulDataSize;
- u8 abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
- // d.k.: abDataBuffer contains the complete tEplEvent structure
- // and behind this the argument
-
- TGT_DBG_SIGNAL_TRACE_POINT(20);
-
- BENCHMARK_MOD_27_RESET(0);
- // copy data from event queue
- ShbError = ShbCirReadDataBlock(pShbRxInstance_p,
- &abDataBuffer[0],
- sizeof(abDataBuffer), &ulDataSize_p);
- if (ShbError != kShbOk) {
- // error goto exit
- goto Exit;
- }
- // resolve the pointer to the event structure
- pEplEvent = (tEplEvent *) abDataBuffer;
- // set Datasize
- pEplEvent->m_uiSize = (ulDataSize_p - sizeof(tEplEvent));
- if (pEplEvent->m_uiSize > 0) {
- // set pointer to argument
- pEplEvent->m_pArg = &abDataBuffer[sizeof(tEplEvent)];
- } else {
- //set pointer to NULL
- pEplEvent->m_pArg = NULL;
- }
-
- BENCHMARK_MOD_27_SET(0);
- // call processfunction
- EplEventkProcess(pEplEvent);
-
- Exit:
- return;
-}
-#endif
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for Epl-Userspace-Event-Modul
-
- 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: EplEventu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/11/17 16:40:39 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/20 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplEventu.h"
-#include "user/EplNmtu.h"
-#include "user/EplNmtMnu.h"
-#include "user/EplSdoAsySequ.h"
-#include "user/EplDlluCal.h"
-#include "user/EplLedu.h"
-#include "Benchmark.h"
-
-#ifdef EPL_NO_FIFO
-#include "kernel/EplEventk.h"
-#else
-#include "SharedBuff.h"
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 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)
-#endif
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
-#ifndef EPL_NO_FIFO
- tShbInstance m_pShbKernelToUserInstance;
- tShbInstance m_pShbUserToKernelInstance;
-#endif
- tEplProcessEventCb m_pfnApiProcessEventCb;
-
-} tEplEventuInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//#ifndef EPL_NO_FIFO
-static tEplEventuInstance EplEventuInstance_g;
-//#endif
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-#ifndef EPL_NO_FIFO
-// callback function for incomming events
-static void EplEventuRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
- unsigned long ulDataSize_p);
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <Epl-User-Event> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventuInit
-//
-// Description: function initialize the first instance
-//
-//
-//
-// Parameters: pfnApiProcessEventCb_p = function pointer for API event callback
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplEventuInit(tEplProcessEventCb pfnApiProcessEventCb_p)
-{
- tEplKernel Ret;
-
- Ret = EplEventuAddInstance(pfnApiProcessEventCb_p);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventuAddInstance
-//
-// Description: function add one more instance
-//
-//
-//
-// Parameters: pfnApiProcessEventCb_p = function pointer for API event callback
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplEventuAddInstance(tEplProcessEventCb pfnApiProcessEventCb_p)
-{
- tEplKernel Ret;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
- unsigned int fShbNewCreated;
-#endif
-
- Ret = kEplSuccessful;
-
- // init instance variables
- EplEventuInstance_g.m_pfnApiProcessEventCb = pfnApiProcessEventCb_p;
-
-#ifndef EPL_NO_FIFO
- // init shared loop buffer
- // kernel -> user
- ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_KERNEL_TO_USER,
- EPL_EVENT_NAME_SHB_KERNEL_TO_USER,
- &EplEventuInstance_g.
- m_pShbKernelToUserInstance,
- &fShbNewCreated);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuAddInstance(): ShbCirAllocBuffer(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- goto Exit;
- }
-
- // user -> kernel
- ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_USER_TO_KERNEL,
- EPL_EVENT_NAME_SHB_USER_TO_KERNEL,
- &EplEventuInstance_g.
- m_pShbUserToKernelInstance,
- &fShbNewCreated);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuAddInstance(): ShbCirAllocBuffer(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- goto Exit;
- }
- // register eventhandler
- ShbError =
- ShbCirSetSignalHandlerNewData(EplEventuInstance_g.
- m_pShbKernelToUserInstance,
- EplEventuRxSignalHandlerCb,
- kShbPriorityNormal);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuAddInstance(): ShbCirSetSignalHandlerNewData(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- goto Exit;
- }
-
- Exit:
-#endif
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventuDelInstance
-//
-// Description: function delete instance an free the bufferstructure
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplEventuDelInstance(void)
-{
- tEplKernel Ret;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
-#endif
-
- Ret = kEplSuccessful;
-
-#ifndef EPL_NO_FIFO
- // set eventhandler to NULL
- ShbError =
- ShbCirSetSignalHandlerNewData(EplEventuInstance_g.
- m_pShbKernelToUserInstance, NULL,
- kShbPriorityNormal);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuDelInstance(): ShbCirSetSignalHandlerNewData(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- }
- // free buffer User -> Kernel
- ShbError =
- ShbCirReleaseBuffer(EplEventuInstance_g.m_pShbUserToKernelInstance);
- if ((ShbError != kShbOk) && (ShbError != kShbMemUsedByOtherProcs)) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuDelInstance(): ShbCirReleaseBuffer(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- } else {
- EplEventuInstance_g.m_pShbUserToKernelInstance = NULL;
- }
-
- // free buffer Kernel -> User
- ShbError =
- ShbCirReleaseBuffer(EplEventuInstance_g.m_pShbKernelToUserInstance);
- if ((ShbError != kShbOk) && (ShbError != kShbMemUsedByOtherProcs)) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuDelInstance(): ShbCirReleaseBuffer(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplNoResource;
- } else {
- EplEventuInstance_g.m_pShbKernelToUserInstance = NULL;
- }
-
-#endif
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventuProcess
-//
-// Description: Kernelthread that dispatches events in kernelspace
-//
-//
-//
-// Parameters: pEvent_p = pointer to event-structur from buffer
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplEventuProcess(tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
- tEplEventSource EventSource;
-
- Ret = kEplSuccessful;
-
- // check m_EventSink
- switch (pEvent_p->m_EventSink) {
- // NMT-User-Module
- case kEplEventSinkNmtu:
- {
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret = EplNmtuProcessEvent(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceNmtu;
-
- // Error event for API layer
- EplEventuPostError(kEplEventSourceEventu,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
-#endif
- break;
- }
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // NMT-MN-User-Module
- case kEplEventSinkNmtMnu:
- {
- Ret = EplNmtMnuProcessEvent(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceNmtMnu;
-
- // Error event for API layer
- EplEventuPostError(kEplEventSourceEventu,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
- break;
- }
-#endif
-
-#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) \
- || (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0))
- // events for asynchronus SDO Sequence Layer
- case kEplEventSinkSdoAsySeq:
- {
- Ret = EplSdoAsySeqProcessEvent(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceSdoAsySeq;
-
- // Error event for API layer
- EplEventuPostError(kEplEventSourceEventu,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
- break;
- }
-#endif
-
- // LED user part module
- case kEplEventSinkLedu:
- {
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
- Ret = EplLeduProcessEvent(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceLedu;
-
- // Error event for API layer
- EplEventuPostError(kEplEventSourceEventu,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
-#endif
- break;
- }
-
- // event for EPL api
- case kEplEventSinkApi:
- {
- if (EplEventuInstance_g.m_pfnApiProcessEventCb != NULL) {
- Ret =
- EplEventuInstance_g.
- m_pfnApiProcessEventCb(pEvent_p);
- if ((Ret != kEplSuccessful)
- && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceEplApi;
-
- // Error event for API layer
- EplEventuPostError
- (kEplEventSourceEventu, Ret,
- sizeof(EventSource), &EventSource);
- }
- }
- break;
-
- }
-
- case kEplEventSinkDlluCal:
- {
- Ret = EplDlluCalProcess(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
- EventSource = kEplEventSourceDllu;
-
- // Error event for API layer
- EplEventuPostError(kEplEventSourceEventu,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
- break;
-
- }
-
- case kEplEventSinkErru:
- {
- /*
- Ret = EplErruProcess(pEvent_p);
- if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
- {
- EventSource = kEplEventSourceErru;
-
- // Error event for API layer
- EplEventuPostError(kEplEventSourceEventu,
- Ret,
- sizeof(EventSource),
- &EventSource);
- }
- */
- break;
-
- }
-
- // unknown sink
- default:
- {
- Ret = kEplEventUnknownSink;
- }
-
- } // end of switch(pEvent_p->m_EventSink)
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventuPost
-//
-// Description: post events from userspace
-//
-//
-//
-// Parameters: pEvent_p = pointer to event-structur from buffer
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplEventuPost(tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
-#ifndef EPL_NO_FIFO
- tShbError ShbError;
- tShbCirChunk ShbCirChunk;
- unsigned long ulDataSize;
- unsigned int fBufferCompleted;
-#endif
-
- Ret = kEplSuccessful;
-
-#ifndef EPL_NO_FIFO
- // 2006/08/03 d.k.: Event and argument are posted as separate chunks to the event queue.
- ulDataSize =
- sizeof(tEplEvent) +
- ((pEvent_p->m_pArg != NULL) ? pEvent_p->m_uiSize : 0);
-#endif
-
- // decide in which buffer the event have to write
- switch (pEvent_p->m_EventSink) {
- // kernelspace modules
- case kEplEventSinkSync:
- case kEplEventSinkNmtk:
- case kEplEventSinkDllk:
- case kEplEventSinkDllkCal:
- case kEplEventSinkPdok:
- case kEplEventSinkErrk:
- {
-#ifndef EPL_NO_FIFO
- // post message
- ShbError =
- ShbCirAllocDataBlock(EplEventuInstance_g.
- m_pShbUserToKernelInstance,
- &ShbCirChunk, ulDataSize);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuPost(): ShbCirAllocDataBlock(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- ShbError =
- ShbCirWriteDataChunk(EplEventuInstance_g.
- m_pShbUserToKernelInstance,
- &ShbCirChunk, pEvent_p,
- sizeof(tEplEvent),
- &fBufferCompleted);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuPost(): ShbCirWriteDataChunk(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- if (fBufferCompleted == FALSE) {
- ShbError =
- ShbCirWriteDataChunk(EplEventuInstance_g.
- m_pShbUserToKernelInstance,
- &ShbCirChunk,
- pEvent_p->m_pArg,
- (unsigned long)
- pEvent_p->m_uiSize,
- &fBufferCompleted);
- if ((ShbError != kShbOk)
- || (fBufferCompleted == FALSE)) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuPost(): ShbCirWriteDataChunk2(U2K) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- }
-#else
- Ret = EplEventkProcess(pEvent_p);
-#endif
-
- break;
- }
-
- // userspace modules
- case kEplEventSinkNmtMnu:
- case kEplEventSinkNmtu:
- case kEplEventSinkSdoAsySeq:
- case kEplEventSinkApi:
- case kEplEventSinkDlluCal:
- case kEplEventSinkErru:
- case kEplEventSinkLedu:
- {
-#ifndef EPL_NO_FIFO
- // post message
- ShbError =
- ShbCirAllocDataBlock(EplEventuInstance_g.
- m_pShbKernelToUserInstance,
- &ShbCirChunk, ulDataSize);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuPost(): ShbCirAllocDataBlock(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- ShbError =
- ShbCirWriteDataChunk(EplEventuInstance_g.
- m_pShbKernelToUserInstance,
- &ShbCirChunk, pEvent_p,
- sizeof(tEplEvent),
- &fBufferCompleted);
- if (ShbError != kShbOk) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuPost(): ShbCirWriteDataChunk(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- if (fBufferCompleted == FALSE) {
- ShbError =
- ShbCirWriteDataChunk(EplEventuInstance_g.
- m_pShbKernelToUserInstance,
- &ShbCirChunk,
- pEvent_p->m_pArg,
- (unsigned long)
- pEvent_p->m_uiSize,
- &fBufferCompleted);
- if ((ShbError != kShbOk)
- || (fBufferCompleted == FALSE)) {
- EPL_DBGLVL_EVENTK_TRACE1
- ("EplEventuPost(): ShbCirWriteDataChunk2(K2U) -> 0x%X\n",
- ShbError);
- Ret = kEplEventPostError;
- goto Exit;
- }
- }
-#else
- Ret = EplEventuProcess(pEvent_p);
-#endif
-
- break;
- }
-
- default:
- {
- Ret = kEplEventUnknownSink;
- }
-
- } // end of switch(pEvent_p->m_EventSink)
-
-#ifndef EPL_NO_FIFO
- Exit:
-#endif
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventuPostError
-//
-// Description: post errorevent from userspace
-//
-//
-//
-// Parameters: EventSource_p = source-module of the errorevent
-// EplError_p = code of occured error
-// uiArgSize_p = size of the argument
-// pArg_p = pointer to the argument
-//
-//
-// Returns: tEpKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplEventuPostError(tEplEventSource EventSource_p,
- tEplKernel EplError_p,
- unsigned int uiArgSize_p, void *pArg_p)
-{
- tEplKernel Ret;
- u8 abBuffer[EPL_MAX_EVENT_ARG_SIZE];
- tEplEventError *pEventError = (tEplEventError *) abBuffer;
- tEplEvent EplEvent;
-
- Ret = kEplSuccessful;
-
- // create argument
- pEventError->m_EventSource = EventSource_p;
- pEventError->m_EplError = EplError_p;
- EPL_MEMCPY(&pEventError->m_Arg, pArg_p, uiArgSize_p);
-
- // create event
- EplEvent.m_EventType = kEplEventTypeError;
- EplEvent.m_EventSink = kEplEventSinkApi;
- EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(EplEvent.m_NetTime));
- EplEvent.m_uiSize =
- (sizeof(EventSource_p) + sizeof(EplError_p) + uiArgSize_p);
- EplEvent.m_pArg = &abBuffer[0];
-
- // post errorevent
- Ret = EplEventuPost(&EplEvent);
-
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEventuRxSignalHandlerCb()
-//
-// Description: Callback-function for evets from kernelspace
-//
-//
-//
-// Parameters: pShbRxInstance_p = Instance-pointer for buffer
-// ulDataSize_p = size of data
-//
-//
-// Returns: void
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#ifndef EPL_NO_FIFO
-static void EplEventuRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
- unsigned long ulDataSize_p)
-{
- tEplEvent *pEplEvent;
- tShbError ShbError;
-//unsigned long ulBlockCount;
-//unsigned long ulDataSize;
- u8 abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
- // d.k.: abDataBuffer contains the complete tEplEvent structure
- // and behind this the argument
-
- TGT_DBG_SIGNAL_TRACE_POINT(21);
-
-// d.k. not needed because it is already done in SharedBuff
-/* do
- {
- BENCHMARK_MOD_28_SET(1); // 4 µs until reset
- // get messagesize
- ShbError = ShbCirGetReadDataSize (pShbRxInstance_p, &ulDataSize);
- if(ShbError != kShbOk)
- {
- // error goto exit
- goto Exit;
- }
-
- BENCHMARK_MOD_28_RESET(1); // 14 µs until set
-*/
- // copy data from event queue
- ShbError = ShbCirReadDataBlock(pShbRxInstance_p,
- &abDataBuffer[0],
- sizeof(abDataBuffer), &ulDataSize_p);
- if (ShbError != kShbOk) {
- // error goto exit
- goto Exit;
- }
- // resolve the pointer to the event structure
- pEplEvent = (tEplEvent *) abDataBuffer;
- // set Datasize
- pEplEvent->m_uiSize = (ulDataSize_p - sizeof(tEplEvent));
- if (pEplEvent->m_uiSize > 0) {
- // set pointer to argument
- pEplEvent->m_pArg = &abDataBuffer[sizeof(tEplEvent)];
- } else {
- //set pointer to NULL
- pEplEvent->m_pArg = NULL;
- }
-
- BENCHMARK_MOD_28_SET(1);
- // call processfunction
- EplEventuProcess(pEplEvent);
-
- BENCHMARK_MOD_28_RESET(1);
- // read number of left messages to process
-// d.k. not needed because it is already done in SharedBuff
-/* ShbError = ShbCirGetReadBlockCount (pShbRxInstance_p, &ulBlockCount);
- if (ShbError != kShbOk)
- {
- // error goto exit
- goto Exit;
- }
- } while (ulBlockCount > 0);
-*/
- Exit:
- return;
-}
-#endif
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for EPL frames
-
- 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: EplFrame.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/06/23 14:56:33 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/05/22 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_FRAME_H_
-#define _EPL_FRAME_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// defines for EplFrame.m_wFlag
-#define EPL_FRAME_FLAG1_RD 0x01 // ready (PReq, PRes)
-#define EPL_FRAME_FLAG1_ER 0x02 // exception reset (error signalling) (SoA)
-#define EPL_FRAME_FLAG1_EA 0x04 // exception acknowledge (error signalling) (PReq, SoA)
-#define EPL_FRAME_FLAG1_EC 0x08 // exception clear (error signalling) (StatusRes)
-#define EPL_FRAME_FLAG1_EN 0x10 // exception new (error signalling) (PRes, StatusRes)
-#define EPL_FRAME_FLAG1_MS 0x20 // multiplexed slot (PReq)
-#define EPL_FRAME_FLAG1_PS 0x40 // prescaled slot (SoC)
-#define EPL_FRAME_FLAG1_MC 0x80 // multiplexed cycle completed (SoC)
-#define EPL_FRAME_FLAG2_RS 0x07 // number of pending requests to send (PRes, StatusRes, IdentRes)
-#define EPL_FRAME_FLAG2_PR 0x38 // priority of requested asynch. frame (PRes, StatusRes, IdentRes)
-#define EPL_FRAME_FLAG2_PR_SHIFT 3 // shift of priority of requested asynch. frame
-
-// error history/status entry types
-#define EPL_ERR_ENTRYTYPE_STATUS 0x8000
-#define EPL_ERR_ENTRYTYPE_HISTORY 0x0000
-#define EPL_ERR_ENTRYTYPE_EMCY 0x4000
-#define EPL_ERR_ENTRYTYPE_MODE_ACTIVE 0x1000
-#define EPL_ERR_ENTRYTYPE_MODE_CLEARED 0x2000
-#define EPL_ERR_ENTRYTYPE_MODE_OCCURRED 0x3000
-#define EPL_ERR_ENTRYTYPE_MODE_MASK 0x3000
-#define EPL_ERR_ENTRYTYPE_PROF_VENDOR 0x0001
-#define EPL_ERR_ENTRYTYPE_PROF_EPL 0x0002
-#define EPL_ERR_ENTRYTYPE_PROF_MASK 0x0FFF
-
-// defines for EPL version / PDO version
-#define EPL_VERSION_SUB 0x0F // sub version
-#define EPL_VERSION_MAIN 0xF0 // main version
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-// $$$ d.k.: move this definition to global.h
-// byte-align structures
-#ifdef _MSC_VER
-# pragma pack( push, packing )
-# pragma pack( 1 )
-# define PACK_STRUCT
-#elif defined( __GNUC__ )
-# define PACK_STRUCT __attribute__((packed))
-#else
-# error you must byte-align these structures with the appropriate compiler directives
-#endif
-
-typedef struct {
- // Offset 17
- u8 m_le_bRes1; // reserved
- // Offset 18
- u8 m_le_bFlag1; // Flags: MC, PS
- // Offset 19
- u8 m_le_bFlag2; // Flags: res
- // Offset 20
- tEplNetTime m_le_NetTime; // supported if D_NMT_NetTimeIsRealTime_BOOL is set
- // Offset 28
- u64 m_le_RelativeTime; // in us (supported if D_NMT_RelativeTime_BOOL is set)
-
-} PACK_STRUCT tEplSocFrame;
-
-typedef struct {
- // Offset 17
- u8 m_le_bRes1; // reserved
- // Offset 18
- u8 m_le_bFlag1; // Flags: MS, EA, RD
- // Offset 19
- u8 m_le_bFlag2; // Flags: res
- // Offset 20
- u8 m_le_bPdoVersion;
- // Offset 21
- u8 m_le_bRes2; // reserved
- // Offset 22
- u16 m_le_wSize;
- // Offset 24
- u8 m_le_abPayload[256 /*D_NMT_IsochrRxMaxPayload_U16 */ ];
-
-} PACK_STRUCT tEplPreqFrame;
-
-typedef struct {
- // Offset 17
- u8 m_le_bNmtStatus; // NMT state
- // Offset 18
- u8 m_le_bFlag1; // Flags: MS, EN, RD
- // Offset 19
- u8 m_le_bFlag2; // Flags: PR, RS
- // Offset 20
- u8 m_le_bPdoVersion;
- // Offset 21
- u8 m_le_bRes2; // reserved
- // Offset 22
- u16 m_le_wSize;
- // Offset 24
- u8 m_le_abPayload[256 /*D_NMT_IsochrRxMaxPayload_U16
- / D_NMT_IsochrTxMaxPayload_U16 */ ];
-
-} PACK_STRUCT tEplPresFrame;
-
-typedef struct {
- // Offset 17
- u8 m_le_bNmtStatus; // NMT state
- // Offset 18
- u8 m_le_bFlag1; // Flags: EA, ER
- // Offset 19
- u8 m_le_bFlag2; // Flags: res
- // Offset 20
- u8 m_le_bReqServiceId;
- // Offset 21
- u8 m_le_bReqServiceTarget;
- // Offset 22
- u8 m_le_bEplVersion;
-
-} PACK_STRUCT tEplSoaFrame;
-
-typedef struct {
- u16 m_wEntryType;
- u16 m_wErrorCode;
- tEplNetTime m_TimeStamp;
- u8 m_abAddInfo[8];
-
-} PACK_STRUCT tEplErrHistoryEntry;
-
-typedef struct {
- // Offset 18
- u8 m_le_bFlag1; // Flags: EN, EC
- u8 m_le_bFlag2; // Flags: PR, RS
- u8 m_le_bNmtStatus; // NMT state
- u8 m_le_bRes1[3];
- u64 m_le_qwStaticError; // static error bit field
- tEplErrHistoryEntry m_le_aErrHistoryEntry[14];
-
-} PACK_STRUCT tEplStatusResponse;
-
-typedef struct {
- // Offset 18
- u8 m_le_bFlag1; // Flags: res
- u8 m_le_bFlag2; // Flags: PR, RS
- u8 m_le_bNmtStatus; // NMT state
- u8 m_le_bIdentRespFlags; // Flags: FW
- u8 m_le_bEplProfileVersion;
- u8 m_le_bRes1;
- u32 m_le_dwFeatureFlags; // NMT_FeatureFlags_U32
- u16 m_le_wMtu; // NMT_CycleTiming_REC.AsyncMTU_U16: C_IP_MIN_MTU - C_IP_MAX_MTU
- u16 m_le_wPollInSize; // NMT_CycleTiming_REC.PReqActPayload_U16
- u16 m_le_wPollOutSize; // NMT_CycleTiming_REC.PResActPayload_U16
- u32 m_le_dwResponseTime; // NMT_CycleTiming_REC.PResMaxLatency_U32
- u16 m_le_wRes2;
- u32 m_le_dwDeviceType; // NMT_DeviceType_U32
- u32 m_le_dwVendorId; // NMT_IdentityObject_REC.VendorId_U32
- u32 m_le_dwProductCode; // NMT_IdentityObject_REC.ProductCode_U32
- u32 m_le_dwRevisionNumber; // NMT_IdentityObject_REC.RevisionNo_U32
- u32 m_le_dwSerialNumber; // NMT_IdentityObject_REC.SerialNo_U32
- u64 m_le_qwVendorSpecificExt1;
- u32 m_le_dwVerifyConfigurationDate; // CFM_VerifyConfiguration_REC.ConfDate_U32
- u32 m_le_dwVerifyConfigurationTime; // CFM_VerifyConfiguration_REC.ConfTime_U32
- u32 m_le_dwApplicationSwDate; // PDL_LocVerApplSw_REC.ApplSwDate_U32 on programmable device or date portion of NMT_ManufactSwVers_VS on non-programmable device
- u32 m_le_dwApplicationSwTime; // PDL_LocVerApplSw_REC.ApplSwTime_U32 on programmable device or time portion of NMT_ManufactSwVers_VS on non-programmable device
- u32 m_le_dwIpAddress;
- u32 m_le_dwSubnetMask;
- u32 m_le_dwDefaultGateway;
- u8 m_le_sHostname[32];
- u8 m_le_abVendorSpecificExt2[48];
-
-} PACK_STRUCT tEplIdentResponse;
-
-typedef struct {
- // Offset 18
- u8 m_le_bNmtCommandId;
- u8 m_le_bRes1;
- u8 m_le_abNmtCommandData[32];
-
-} PACK_STRUCT tEplNmtCommandService;
-
-typedef struct {
- u8 m_le_bReserved;
- u8 m_le_bTransactionId;
- u8 m_le_bFlags;
- u8 m_le_bCommandId;
- u16 m_le_wSegmentSize;
- u16 m_le_wReserved;
- u8 m_le_abCommandData[8]; // just reserve a minimum number of bytes as a placeholder
-
-} PACK_STRUCT tEplAsySdoCom;
-
-// asynchronous SDO Sequence Header
-typedef struct {
- u8 m_le_bRecSeqNumCon;
- u8 m_le_bSendSeqNumCon;
- u8 m_le_abReserved[2];
- tEplAsySdoCom m_le_abSdoSeqPayload;
-
-} PACK_STRUCT tEplAsySdoSeq;
-
-typedef struct {
- // Offset 18
- u8 m_le_bNmtCommandId;
- u8 m_le_bTargetNodeId;
- u8 m_le_abNmtCommandData[32];
-
-} PACK_STRUCT tEplNmtRequestService;
-
-typedef union {
- // Offset 18
- tEplStatusResponse m_StatusResponse;
- tEplIdentResponse m_IdentResponse;
- tEplNmtCommandService m_NmtCommandService;
- tEplNmtRequestService m_NmtRequestService;
- tEplAsySdoSeq m_SdoSequenceFrame;
- u8 m_le_abPayload[256 /*D_NMT_ASndTxMaxPayload_U16
- / D_NMT_ASndRxMaxPayload_U16 */ ];
-
-} tEplAsndPayload;
-
-typedef struct {
- // Offset 17
- u8 m_le_bServiceId;
- // Offset 18
- tEplAsndPayload m_Payload;
-
-} PACK_STRUCT tEplAsndFrame;
-
-typedef union {
- // Offset 17
- tEplSocFrame m_Soc;
- tEplPreqFrame m_Preq;
- tEplPresFrame m_Pres;
- tEplSoaFrame m_Soa;
- tEplAsndFrame m_Asnd;
-
-} tEplFrameData;
-
-typedef struct {
- // Offset 0
- u8 m_be_abDstMac[6]; // MAC address of the addressed nodes
- // Offset 6
- u8 m_be_abSrcMac[6]; // MAC address of the transmitting node
- // Offset 12
- u16 m_be_wEtherType; // Ethernet message type (big endian)
- // Offset 14
- u8 m_le_bMessageType; // EPL message type
- // Offset 15
- u8 m_le_bDstNodeId; // EPL node ID of the addressed nodes
- // Offset 16
- u8 m_le_bSrcNodeId; // EPL node ID of the transmitting node
- // Offset 17
- tEplFrameData m_Data;
-
-} PACK_STRUCT tEplFrame;
-
-// un-byte-align structures
-#ifdef _MSC_VER
-# pragma pack( pop, packing )
-#endif
-
-typedef enum {
- kEplMsgTypeNonEpl = 0x00,
- kEplMsgTypeSoc = 0x01,
- kEplMsgTypePreq = 0x03,
- kEplMsgTypePres = 0x04,
- kEplMsgTypeSoa = 0x05,
- kEplMsgTypeAsnd = 0x06,
-
-} tEplMsgType;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_FRAME_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for Identu-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: EplIdentu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/11/21 09:00:38 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/11/15 d.k.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplIdentu.h"
-#include "user/EplDlluCal.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <xxxxx> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- tEplIdentResponse *m_apIdentResponse[254]; // the IdentResponse are managed dynamically
- tEplIdentuCbResponse m_apfnCbResponse[254];
-
-} tEplIdentuInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-static tEplIdentuInstance EplIdentuInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static tEplKernel EplIdentuCbIdentResponse(tEplFrameInfo *pFrameInfo_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuInit
-//
-// Description: init first instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplIdentuInit(void)
-{
- tEplKernel Ret;
-
- Ret = EplIdentuAddInstance();
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuAddInstance
-//
-// Description: init other instances of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplIdentuAddInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // reset instance structure
- EPL_MEMSET(&EplIdentuInstance_g, 0, sizeof(EplIdentuInstance_g));
-
- // register IdentResponse callback function
- Ret =
- EplDlluCalRegAsndService(kEplDllAsndIdentResponse,
- EplIdentuCbIdentResponse,
- kEplDllAsndFilterAny);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuDelInstance
-//
-// Description: delete instance
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplIdentuDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // deregister IdentResponse callback function
- Ret =
- EplDlluCalRegAsndService(kEplDllAsndIdentResponse, NULL,
- kEplDllAsndFilterNone);
-
- Ret = EplIdentuReset();
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuReset
-//
-// Description: resets this instance
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplIdentuReset(void)
-{
- tEplKernel Ret;
- int iIndex;
-
- Ret = kEplSuccessful;
-
- for (iIndex = 0;
- iIndex < tabentries(EplIdentuInstance_g.m_apIdentResponse);
- iIndex++) {
- if (EplIdentuInstance_g.m_apIdentResponse[iIndex] != NULL) { // free memory
- EPL_FREE(EplIdentuInstance_g.m_apIdentResponse[iIndex]);
- }
- }
-
- EPL_MEMSET(&EplIdentuInstance_g, 0, sizeof(EplIdentuInstance_g));
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuGetIdentResponse
-//
-// Description: returns the IdentResponse for the specified node.
-//
-// Parameters: uiNodeId_p = IN: node ID
-// ppIdentResponse_p = OUT: pointer to pointer of IdentResponse
-// equals NULL, if no IdentResponse available
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplIdentuGetIdentResponse(unsigned int uiNodeId_p,
- tEplIdentResponse **ppIdentResponse_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // decrement node ID, because array is zero based
- uiNodeId_p--;
- if (uiNodeId_p < tabentries(EplIdentuInstance_g.m_apIdentResponse)) {
- *ppIdentResponse_p =
- EplIdentuInstance_g.m_apIdentResponse[uiNodeId_p];
- } else { // invalid node ID specified
- *ppIdentResponse_p = NULL;
- Ret = kEplInvalidNodeId;
- }
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuRequestIdentResponse
-//
-// Description: returns the IdentResponse for the specified node.
-//
-// Parameters: uiNodeId_p = IN: node ID
-// pfnCbResponse_p = IN: function pointer to callback function
-// which will be called if IdentResponse is received
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplIdentuRequestIdentResponse(unsigned int uiNodeId_p,
- tEplIdentuCbResponse pfnCbResponse_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // decrement node ID, because array is zero based
- uiNodeId_p--;
- if (uiNodeId_p < tabentries(EplIdentuInstance_g.m_apfnCbResponse)) {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if (EplIdentuInstance_g.m_apfnCbResponse[uiNodeId_p] != NULL) { // request already issued (maybe by someone else)
- Ret = kEplInvalidOperation;
- } else {
- EplIdentuInstance_g.m_apfnCbResponse[uiNodeId_p] =
- pfnCbResponse_p;
- Ret =
- EplDlluCalIssueRequest(kEplDllReqServiceIdent,
- (uiNodeId_p + 1), 0xFF);
- }
-#else
- Ret = kEplInvalidOperation;
-#endif
- } else { // invalid node ID specified
- Ret = kEplInvalidNodeId;
- }
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuGetRunningRequests
-//
-// Description: returns a bit field with the running requests for node-ID 1-32
-// just for debugging purposes
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-u32 EplIdentuGetRunningRequests(void)
-{
- u32 dwReqs = 0;
- unsigned int uiIndex;
-
- for (uiIndex = 0; uiIndex < 32; uiIndex++) {
- if (EplIdentuInstance_g.m_apfnCbResponse[uiIndex] != NULL) {
- dwReqs |= (1 << uiIndex);
- }
- }
-
- return dwReqs;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplIdentuCbIdentResponse
-//
-// Description: callback funktion for IdentResponse
-//
-//
-//
-// Parameters: pFrameInfo_p = Frame with the IdentResponse
-//
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplIdentuCbIdentResponse(tEplFrameInfo *pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiNodeId;
- unsigned int uiIndex;
- tEplIdentuCbResponse pfnCbResponse;
-
- uiNodeId = AmiGetByteFromLe(&pFrameInfo_p->m_pFrame->m_le_bSrcNodeId);
-
- uiIndex = uiNodeId - 1;
-
- if (uiIndex < tabentries(EplIdentuInstance_g.m_apfnCbResponse)) {
- // memorize pointer to callback function
- pfnCbResponse = EplIdentuInstance_g.m_apfnCbResponse[uiIndex];
- // reset callback function pointer so that caller may issue next request immediately
- EplIdentuInstance_g.m_apfnCbResponse[uiIndex] = NULL;
-
- if (pFrameInfo_p->m_uiFrameSize < EPL_C_DLL_MINSIZE_IDENTRES) { // IdentResponse not received or it has invalid size
- if (pfnCbResponse == NULL) { // response was not requested
- goto Exit;
- }
- Ret = pfnCbResponse(uiNodeId, NULL);
- } else { // IdentResponse received
- if (EplIdentuInstance_g.m_apIdentResponse[uiIndex] == NULL) { // memory for IdentResponse must be allocated
- EplIdentuInstance_g.m_apIdentResponse[uiIndex] =
- EPL_MALLOC(sizeof(tEplIdentResponse));
- if (EplIdentuInstance_g.m_apIdentResponse[uiIndex] == NULL) { // malloc failed
- if (pfnCbResponse == NULL) { // response was not requested
- goto Exit;
- }
- Ret =
- pfnCbResponse(uiNodeId,
- &pFrameInfo_p->
- m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_IdentResponse);
- goto Exit;
- }
- }
- // copy IdentResponse to instance structure
- EPL_MEMCPY(EplIdentuInstance_g.
- m_apIdentResponse[uiIndex],
- &pFrameInfo_p->m_pFrame->m_Data.m_Asnd.
- m_Payload.m_IdentResponse,
- sizeof(tEplIdentResponse));
- if (pfnCbResponse == NULL) { // response was not requested
- goto Exit;
- }
- Ret =
- pfnCbResponse(uiNodeId,
- EplIdentuInstance_g.
- m_apIdentResponse[uiIndex]);
- }
- }
-
- Exit:
- return Ret;
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: basic include file for internal EPL stack modules
-
- 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: EplInc.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/11/17 16:40:39 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/05/22 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_INC_H_
-#define _EPL_INC_H_
-
-// ============================================================================
-// include files
-// ============================================================================
-#if defined(WIN32) || defined(_WIN32)
-
-#ifdef UNDER_RTSS
- // RTX header
-#include <windows.h>
-#include <process.h>
-#include <rtapi.h>
-
-#elif __BORLANDC__
- // borland C header
-#include <windows.h>
-#include <process.h>
-
-#elif WINCE
-#include <windows.h>
-
-#else
- // MSVC needs to include windows.h at first
- // the following defines ar necessary for function prototypes for waitable timers
-#define _WIN32_WINDOWS 0x0401
-#define _WIN32_WINNT 0x0400
-#include <windows.h>
-#include <process.h>
-#endif
-
-#endif
-
-// defines for module integration
-// possible other include file needed
-// These constants defines modules which can be included in the Epl application.
-// Use this constants for define EPL_MODULE_INTEGRATION in file EplCfg.h.
-#define EPL_MODULE_OBDK 0x00000001L // OBD kernel part module
-#define EPL_MODULE_PDOK 0x00000002L // PDO kernel part module
-#define EPL_MODULE_NMT_MN 0x00000004L // NMT MN module
-#define EPL_MODULE_SDOS 0x00000008L // SDO Server module
-#define EPL_MODULE_SDOC 0x00000010L // SDO Client module
-#define EPL_MODULE_SDO_ASND 0x00000020L // SDO over Asnd module
-#define EPL_MODULE_SDO_UDP 0x00000040L // SDO over UDP module
-#define EPL_MODULE_SDO_PDO 0x00000080L // SDO in PDO module
-#define EPL_MODULE_NMT_CN 0x00000100L // NMT CN module
-#define EPL_MODULE_NMTU 0x00000200L // NMT user part module
-#define EPL_MODULE_NMTK 0x00000400L // NMT kernel part module
-#define EPL_MODULE_DLLK 0x00000800L // DLL kernel part module
-#define EPL_MODULE_DLLU 0x00001000L // DLL user part module
-#define EPL_MODULE_OBDU 0x00002000L // OBD user part module
-#define EPL_MODULE_CFGMA 0x00004000L // Configuartioan Manager module
-#define EPL_MODULE_VETH 0x00008000L // virtual ethernet driver module
-#define EPL_MODULE_PDOU 0x00010000L // PDO user part module
-#define EPL_MODULE_LEDU 0x00020000L // LED user part module
-
-#include "EplCfg.h" // EPL configuration file (configuration from application)
-
-#include "global.h" // global definitions
-
-#include "EplDef.h" // EPL configuration file (default configuration)
-#include "EplInstDef.h" // defines macros for instance types and table
-#include "Debug.h" // debug definitions
-
-#include "EplErrDef.h" // EPL error codes for API funtions
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-// IEEE 1588 conformant net time structure
-typedef struct {
- u32 m_dwSec;
- u32 m_dwNanoSec;
-
-} tEplNetTime;
-
-#include "EplTarget.h" // target specific functions and definitions
-
-#include "EplAmi.h"
-
-// -------------------------------------------------------------------------
-// macros
-// -------------------------------------------------------------------------
-
-#define EPL_SPEC_VERSION 0x20 // ETHERNET Powerlink V. 2.0
-#define EPL_STACK_VERSION(ver,rev,rel) ((((u32)(ver)) & 0xFF)|((((u32)(rev))&0xFF)<<8)|(((u32)(rel))<<16))
-#define EPL_OBJ1018_VERSION(ver,rev,rel) ((((u32)(ver))<<16) |(((u32)(rev))&0xFFFF))
-#define EPL_STRING_VERSION(ver,rev,rel) "V" #ver "." #rev " r" #rel
-
-#include "EplVersion.h"
-
-// defines for EPL FeatureFlags
-#define EPL_FEATURE_ISOCHR 0x00000001
-#define EPL_FEATURE_SDO_UDP 0x00000002
-#define EPL_FEATURE_SDO_ASND 0x00000004
-#define EPL_FEATURE_SDO_PDO 0x00000008
-#define EPL_FEATURE_NMT_INFO 0x00000010
-#define EPL_FEATURE_NMT_EXT 0x00000020
-#define EPL_FEATURE_PDO_DYN 0x00000040
-#define EPL_FEATURE_NMT_UDP 0x00000080
-#define EPL_FEATURE_CFGMA 0x00000100
-#define EPL_FEATURE_DLL_MULTIPLEX 0x00000200
-#define EPL_FEATURE_NODEID_SW 0x00000400
-#define EPL_FEATURE_NMT_BASICETH 0x00000800
-#define EPL_FEATURE_RT1 0x00001000
-#define EPL_FEATURE_RT2 0x00002000
-
-// generate EPL NMT_FeatureFlags_U32
-#ifndef EPL_DEF_FEATURE_ISOCHR
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-#define EPL_DEF_FEATURE_ISOCHR (EPL_FEATURE_ISOCHR)
-#else
-#define EPL_DEF_FEATURE_ISOCHR 0
-#endif
-#endif
-
-#ifndef EPL_DEF_FEATURE_SDO_ASND
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
-#define EPL_DEF_FEATURE_SDO_ASND (EPL_FEATURE_SDO_ASND)
-#else
-#define EPL_DEF_FEATURE_SDO_ASND 0
-#endif
-#endif
-
-#ifndef EPL_DEF_FEATURE_SDO_UDP
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
-#define EPL_DEF_FEATURE_SDO_UDP (EPL_FEATURE_SDO_UDP)
-#else
-#define EPL_DEF_FEATURE_SDO_UDP 0
-#endif
-#endif
-
-#ifndef EPL_DEF_FEATURE_SDO_PDO
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_PDO)) != 0)
-#define EPL_DEF_FEATURE_SDO_PDO (EPL_FEATURE_SDO_PDO)
-#else
-#define EPL_DEF_FEATURE_SDO_PDO 0
-#endif
-#endif
-
-#ifndef EPL_DEF_FEATURE_PDO_DYN
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-#define EPL_DEF_FEATURE_PDO_DYN (EPL_FEATURE_PDO_DYN)
-#else
-#define EPL_DEF_FEATURE_PDO_DYN 0
-#endif
-#endif
-
-#ifndef EPL_DEF_FEATURE_CFGMA
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_CFGMA)) != 0)
-#define EPL_DEF_FEATURE_CFGMA (EPL_FEATURE_CFGMA)
-#else
-#define EPL_DEF_FEATURE_CFGMA 0
-#endif
-#endif
-
-#define EPL_DEF_FEATURE_FLAGS (EPL_DEF_FEATURE_ISOCHR \
- | EPL_DEF_FEATURE_SDO_ASND \
- | EPL_DEF_FEATURE_SDO_UDP \
- | EPL_DEF_FEATURE_SDO_PDO \
- | EPL_DEF_FEATURE_PDO_DYN \
- | EPL_DEF_FEATURE_CFGMA)
-
-#ifndef tabentries
-#define tabentries(a) (sizeof(a)/sizeof(*(a)))
-#endif
-
-// ============================================================================
-// common debug macros
-// ============================================================================
-// for using macro DEBUG_TRACEx()
-//
-// Example:
-// DEBUG_TRACE1 (EPL_DBGLVL_OBD, "Value is %d\n" , wObjectIndex);
-//
-// This message only will be printed if:
-// - NDEBUG is not defined AND !!!
-// - flag 0x00000004L is set in DEF_DEBUG_LVL (can be defined in copcfg.h)
-//
-// default level is defined in copdef.h
-
-// debug-level and TRACE-macros // standard-level // flags for DEF_DEBUG_LVL
-#define EPL_DBGLVL_EDRV DEBUG_LVL_01 // 0x00000001L
-#define EPL_DBGLVL_EDRV_TRACE0 DEBUG_LVL_01_TRACE0
-#define EPL_DBGLVL_EDRV_TRACE1 DEBUG_LVL_01_TRACE1
-#define EPL_DBGLVL_EDRV_TRACE2 DEBUG_LVL_01_TRACE2
-#define EPL_DBGLVL_EDRV_TRACE3 DEBUG_LVL_01_TRACE3
-#define EPL_DBGLVL_EDRV_TRACE4 DEBUG_LVL_01_TRACE4
-
-#define EPL_DBGLVL_DLL DEBUG_LVL_02 // 0x00000002L
-#define EPL_DBGLVL_DLL_TRACE0 DEBUG_LVL_02_TRACE0
-#define EPL_DBGLVL_DLL_TRACE1 DEBUG_LVL_02_TRACE1
-#define EPL_DBGLVL_DLL_TRACE2 DEBUG_LVL_02_TRACE2
-#define EPL_DBGLVL_DLL_TRACE3 DEBUG_LVL_02_TRACE3
-#define EPL_DBGLVL_DLL_TRACE4 DEBUG_LVL_02_TRACE4
-
-#define EPL_DBGLVL_OBD DEBUG_LVL_03 // 0x00000004L
-#define EPL_DBGLVL_OBD_TRACE0 DEBUG_LVL_03_TRACE0
-#define EPL_DBGLVL_OBD_TRACE1 DEBUG_LVL_03_TRACE1
-#define EPL_DBGLVL_OBD_TRACE2 DEBUG_LVL_03_TRACE2
-#define EPL_DBGLVL_OBD_TRACE3 DEBUG_LVL_03_TRACE3
-#define EPL_DBGLVL_OBD_TRACE4 DEBUG_LVL_03_TRACE4
-
-#define EPL_DBGLVL_NMTK DEBUG_LVL_04 // 0x00000008L
-#define EPL_DBGLVL_NMTK_TRACE0 DEBUG_LVL_04_TRACE0
-#define EPL_DBGLVL_NMTK_TRACE1 DEBUG_LVL_04_TRACE1
-#define EPL_DBGLVL_NMTK_TRACE2 DEBUG_LVL_04_TRACE2
-#define EPL_DBGLVL_NMTK_TRACE3 DEBUG_LVL_04_TRACE3
-#define EPL_DBGLVL_NMTK_TRACE4 DEBUG_LVL_04_TRACE4
-
-#define EPL_DBGLVL_NMTCN DEBUG_LVL_05 // 0x00000010L
-#define EPL_DBGLVL_NMTCN_TRACE0 DEBUG_LVL_05_TRACE0
-#define EPL_DBGLVL_NMTCN_TRACE1 DEBUG_LVL_05_TRACE1
-#define EPL_DBGLVL_NMTCN_TRACE2 DEBUG_LVL_05_TRACE2
-#define EPL_DBGLVL_NMTCN_TRACE3 DEBUG_LVL_05_TRACE3
-#define EPL_DBGLVL_NMTCN_TRACE4 DEBUG_LVL_05_TRACE4
-
-#define EPL_DBGLVL_NMTU DEBUG_LVL_06 // 0x00000020L
-#define EPL_DBGLVL_NMTU_TRACE0 DEBUG_LVL_06_TRACE0
-#define EPL_DBGLVL_NMTU_TRACE1 DEBUG_LVL_06_TRACE1
-#define EPL_DBGLVL_NMTU_TRACE2 DEBUG_LVL_06_TRACE2
-#define EPL_DBGLVL_NMTU_TRACE3 DEBUG_LVL_06_TRACE3
-#define EPL_DBGLVL_NMTU_TRACE4 DEBUG_LVL_06_TRACE4
-
-#define EPL_DBGLVL_NMTMN DEBUG_LVL_07 // 0x00000040L
-#define EPL_DBGLVL_NMTMN_TRACE0 DEBUG_LVL_07_TRACE0
-#define EPL_DBGLVL_NMTMN_TRACE1 DEBUG_LVL_07_TRACE1
-#define EPL_DBGLVL_NMTMN_TRACE2 DEBUG_LVL_07_TRACE2
-#define EPL_DBGLVL_NMTMN_TRACE3 DEBUG_LVL_07_TRACE3
-#define EPL_DBGLVL_NMTMN_TRACE4 DEBUG_LVL_07_TRACE4
-
-//...
-
-#define EPL_DBGLVL_SDO DEBUG_LVL_25 // 0x01000000
-#define EPL_DBGLVL_SDO_TRACE0 DEBUG_LVL_25_TRACE0
-#define EPL_DBGLVL_SDO_TRACE1 DEBUG_LVL_25_TRACE1
-#define EPL_DBGLVL_SDO_TRACE2 DEBUG_LVL_25_TRACE2
-#define EPL_DBGLVL_SDO_TRACE3 DEBUG_LVL_25_TRACE3
-#define EPL_DBGLVL_SDO_TRACE4 DEBUG_LVL_25_TRACE4
-
-#define EPL_DBGLVL_VETH DEBUG_LVL_26 // 0x02000000
-#define EPL_DBGLVL_VETH_TRACE0 DEBUG_LVL_26_TRACE0
-#define EPL_DBGLVL_VETH_TRACE1 DEBUG_LVL_26_TRACE1
-#define EPL_DBGLVL_VETH_TRACE2 DEBUG_LVL_26_TRACE2
-#define EPL_DBGLVL_VETH_TRACE3 DEBUG_LVL_26_TRACE3
-#define EPL_DBGLVL_VETH_TRACE4 DEBUG_LVL_26_TRACE4
-
-#define EPL_DBGLVL_EVENTK DEBUG_LVL_27 // 0x04000000
-#define EPL_DBGLVL_EVENTK_TRACE0 DEBUG_LVL_27_TRACE0
-#define EPL_DBGLVL_EVENTK_TRACE1 DEBUG_LVL_27_TRACE1
-#define EPL_DBGLVL_EVENTK_TRACE2 DEBUG_LVL_27_TRACE2
-#define EPL_DBGLVL_EVENTK_TRACE3 DEBUG_LVL_27_TRACE3
-#define EPL_DBGLVL_EVENTK_TRACE4 DEBUG_LVL_27_TRACE4
-
-#define EPL_DBGLVL_EVENTU DEBUG_LVL_28 // 0x08000000
-#define EPL_DBGLVL_EVENTU_TRACE0 DEBUG_LVL_28_TRACE0
-#define EPL_DBGLVL_EVENTU_TRACE1 DEBUG_LVL_28_TRACE1
-#define EPL_DBGLVL_EVENTU_TRACE2 DEBUG_LVL_28_TRACE2
-#define EPL_DBGLVL_EVENTU_TRACE3 DEBUG_LVL_28_TRACE3
-#define EPL_DBGLVL_EVENTU_TRACE4 DEBUG_LVL_28_TRACE4
-
-// SharedBuff
-#define EPL_DBGLVL_SHB DEBUG_LVL_29 // 0x10000000
-#define EPL_DBGLVL_SHB_TRACE0 DEBUG_LVL_29_TRACE0
-#define EPL_DBGLVL_SHB_TRACE1 DEBUG_LVL_29_TRACE1
-#define EPL_DBGLVL_SHB_TRACE2 DEBUG_LVL_29_TRACE2
-#define EPL_DBGLVL_SHB_TRACE3 DEBUG_LVL_29_TRACE3
-#define EPL_DBGLVL_SHB_TRACE4 DEBUG_LVL_29_TRACE4
-
-#define EPL_DBGLVL_ASSERT DEBUG_LVL_ASSERT // 0x20000000L
-#define EPL_DBGLVL_ASSERT_TRACE0 DEBUG_LVL_ASSERT_TRACE0
-#define EPL_DBGLVL_ASSERT_TRACE1 DEBUG_LVL_ASSERT_TRACE1
-#define EPL_DBGLVL_ASSERT_TRACE2 DEBUG_LVL_ASSERT_TRACE2
-#define EPL_DBGLVL_ASSERT_TRACE3 DEBUG_LVL_ASSERT_TRACE3
-#define EPL_DBGLVL_ASSERT_TRACE4 DEBUG_LVL_ASSERT_TRACE4
-
-#define EPL_DBGLVL_ERROR DEBUG_LVL_ERROR // 0x40000000L
-#define EPL_DBGLVL_ERROR_TRACE0 DEBUG_LVL_ERROR_TRACE0
-#define EPL_DBGLVL_ERROR_TRACE1 DEBUG_LVL_ERROR_TRACE1
-#define EPL_DBGLVL_ERROR_TRACE2 DEBUG_LVL_ERROR_TRACE2
-#define EPL_DBGLVL_ERROR_TRACE3 DEBUG_LVL_ERROR_TRACE3
-#define EPL_DBGLVL_ERROR_TRACE4 DEBUG_LVL_ERROR_TRACE4
-
-#define EPL_DBGLVL_ALWAYS DEBUG_LVL_ALWAYS // 0x80000000L
-#define EPL_DBGLVL_ALWAYS_TRACE0 DEBUG_LVL_ALWAYS_TRACE0
-#define EPL_DBGLVL_ALWAYS_TRACE1 DEBUG_LVL_ALWAYS_TRACE1
-#define EPL_DBGLVL_ALWAYS_TRACE2 DEBUG_LVL_ALWAYS_TRACE2
-#define EPL_DBGLVL_ALWAYS_TRACE3 DEBUG_LVL_ALWAYS_TRACE3
-#define EPL_DBGLVL_ALWAYS_TRACE4 DEBUG_LVL_ALWAYS_TRACE4
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_INC_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: definitions for generating instances
-
- 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: EplInstDef.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- ...
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- r.d.: first implementation
-
-****************************************************************************/
-
-#ifndef _EPLINSTDEF_H_
-#define _EPLINSTDEF_H_
-
-#include <linux/kernel.h>
-
-// =========================================================================
-// types and macros for generating instances
-// =========================================================================
-
-typedef enum {
- kStateUnused = 0,
- kStateDeleted = 1,
- kStateUsed = 0xFF
-} tInstState;
-
-//------------------------------------------------------------------------------------------
-
-typedef void *tEplPtrInstance;
-typedef u8 tEplInstanceHdl;
-
-// define const for illegale values
-#define CCM_ILLINSTANCE NULL
-#define CCM_ILLINSTANCE_HDL 0xFF
-
-//------------------------------------------------------------------------------------------
-// if more than one instance then use this macros
-#if (EPL_MAX_INSTANCES > 1)
-
- //--------------------------------------------------------------------------------------
- // macro definition for instance table definition
- //--------------------------------------------------------------------------------------
-
- // memory attributes for instance table
-#define STATIC // prevent warnings for variables with same name
-
-#define INSTANCE_TYPE_BEGIN typedef struct {
-#define INSTANCE_TYPE_END } tEplInstanceInfo;
-
- //--------------------------------------------------------------------------------------
- // macro definition for API interface
- //--------------------------------------------------------------------------------------
-
- // declaration:
-
- // macros for declaration within function header or prototype of API functions
-#define CCM_DECL_INSTANCE_HDL tEplInstanceHdl InstanceHandle
-#define CCM_DECL_INSTANCE_HDL_ tEplInstanceHdl InstanceHandle,
-
- // macros for declaration of pointer to instance handle within function header or prototype of API functions
-#define CCM_DECL_PTR_INSTANCE_HDL tEplInstanceHdl *pInstanceHandle
-#define CCM_DECL_PTR_INSTANCE_HDL_ tEplInstanceHdl *pInstanceHandle,
-
- // macros for declaration instance as lokacl variable within functions
-#define CCM_DECL_INSTANCE_PTR_LOCAL tCcmInstanceInfo *pInstance;
-#define CCM_DECL_PTR_INSTANCE_HDL_LOCAL tEplInstanceHdl *pInstanceHandle;
-
- // reference:
-
- // macros for reference of instance handle for function parameters
-#define CCM_INSTANCE_HDL InstanceHandle
-#define CCM_INSTANCE_HDL_ InstanceHandle,
-
- // macros for reference of instance parameter for function parameters
-#define CCM_INSTANCE_PARAM(par) par
-#define CCM_INSTANCE_PARAM_(par) par,
-
- // macros for reference of instance parameter for writing or reading values
-#define CCM_INST_ENTRY (*((tEplPtrInstance)pInstance))
-
- // processing:
-
- // macros for process instance handle
-#define CCM_CHECK_INSTANCE_HDL() if (InstanceHandle >= EPL_MAX_INSTANCES) \
- {return (kEplIllegalInstance);}
-
- // macros for process pointer to instance handle
-#define CCM_CHECK_PTR_INSTANCE_HDL() if (pInstanceHandle == NULL) \
- {return (kEplInvalidInstanceParam);}
-
- // This macro returned the handle and pointer to next free instance.
-#define CCM_GET_FREE_INSTANCE_AND_HDL() pInstance = CcmGetFreeInstanceAndHandle (pInstanceHandle); \
- ASSERT (*pInstanceHandle != CCM_ILLINSTANCE_HDL);
-
-#define CCM_CHECK_INSTANCE_PTR() if (pInstance == CCM_ILLINSTANCE) \
- {return (kEplNoFreeInstance);}
-
-#define CCM_GET_INSTANCE_PTR() pInstance = CcmGetInstancePtr (InstanceHandle);
-#define CCM_GET_FREE_INSTANCE_PTR() pInstance = GetFreeInstance (); \
- ASSERT (pInstance != CCM_ILLINSTANCE);
-
- //--------------------------------------------------------------------------------------
- // macro definition for stack interface
- //--------------------------------------------------------------------------------------
-
- // macros for declaration within the function header, prototype or local var list
- // Declaration of pointers within function paramater list must defined as void *
- // pointer.
-#define EPL_MCO_DECL_INSTANCE_PTR void *pInstance
-#define EPL_MCO_DECL_INSTANCE_PTR_ void *pInstance,
-#define EPL_MCO_DECL_INSTANCE_PTR_LOCAL tEplPtrInstance pInstance;
-
- // macros for reference of pointer to instance
- // These macros are used for parameter passing to called function.
-#define EPL_MCO_INSTANCE_PTR pInstance
-#define EPL_MCO_INSTANCE_PTR_ pInstance,
-#define EPL_MCO_ADDR_INSTANCE_PTR_ &pInstance,
-
- // macro for access of struct members of one instance
- // An access to a member of instance table must be casted by the local
- // defined type of instance table.
-#define EPL_MCO_INST_ENTRY (*(tEplPtrInstance)pInstance)
-#define EPL_MCO_GLB_VAR(var) (((tEplPtrInstance)pInstance)->var)
-
- // macros for process pointer to instance
-#define EPL_MCO_GET_INSTANCE_PTR() pInstance = (tEplPtrInstance) GetInstancePtr (InstanceHandle);
-#define EPL_MCO_GET_FREE_INSTANCE_PTR() pInstance = (tEplPtrInstance) GetFreeInstance (); \
- ASSERT (pInstance != CCM_ILLINSTANCE);
-
- // This macro should be used to check the passed pointer to an public function
-#define EPL_MCO_CHECK_INSTANCE_STATE() ASSERT (pInstance != NULL); \
- ASSERT (((tEplPtrInstance)pInstance)->m_InstState == kStateUsed);
-
- // macros for declaration of pointer to instance pointer
-#define EPL_MCO_DECL_PTR_INSTANCE_PTR void **pInstancePtr
-#define EPL_MCO_DECL_PTR_INSTANCE_PTR_ void **pInstancePtr,
-
- // macros for reference of pointer to instance pointer
- // These macros are used for parameter passing to called function.
-#define EPL_MCO_PTR_INSTANCE_PTR pInstancePtr
-#define EPL_MCO_PTR_INSTANCE_PTR_ pInstancePtr,
-
- // macros for process pointer to instance pointer
-#define EPL_MCO_CHECK_PTR_INSTANCE_PTR() ASSERT (pInstancePtr != NULL);
-#define EPL_MCO_SET_PTR_INSTANCE_PTR() (*pInstancePtr = pInstance);
-
-#define EPL_MCO_INSTANCE_PARAM(a) (a)
-#define EPL_MCO_INSTANCE_PARAM_(a) (a),
-#define EPL_MCO_INSTANCE_PARAM_IDX_() EPL_MCO_INSTANCE_PARAM_ (EPL_MCO_GLB_VAR (m_bInstIndex))
-#define EPL_MCO_INSTANCE_PARAM_IDX() EPL_MCO_INSTANCE_PARAM (EPL_MCO_GLB_VAR (m_bInstIndex))
-#define EPL_MCO_WRITE_INSTANCE_STATE(a) EPL_MCO_GLB_VAR (m_InstState) = a;
-
- // this macro deletes all instance entries as unused
-#define EPL_MCO_DELETE_INSTANCE_TABLE() \
- { \
- tEplInstanceInfo * pInstance = &aEplInstanceTable_g[0]; \
- tFastByte InstNumber = 0; \
- tFastByte i = EPL_MAX_INSTANCES; \
- do { \
- pInstance->m_InstState = (u8) kStateUnused; \
- pInstance->m_bInstIndex = (u8) InstNumber; \
- pInstance++; InstNumber++; i--; \
- } while (i != 0); \
- }
-
- // definition of functions which has to be defined in each module of CANopen stack
-#define EPL_MCO_DEFINE_INSTANCE_FCT() \
- static tEplPtrInstance GetInstancePtr (tEplInstanceHdl InstHandle_p); \
- static tEplPtrInstance GetFreeInstance (void);
-#define EPL_MCO_DECL_INSTANCE_FCT() \
- static tEplPtrInstance GetInstancePtr (tEplInstanceHdl InstHandle_p) { \
- return &aEplInstanceTable_g[InstHandle_p]; } \
- static tEplPtrInstance GetFreeInstance (void) { \
- tEplInstanceInfo *pInstance = &aEplInstanceTable_g[0]; \
- tFastByte i = EPL_MAX_INSTANCES; \
- do { if (pInstance->m_InstState != kStateUsed) { \
- return (tEplPtrInstance) pInstance; } \
- pInstance++; i--; } \
- while (i != 0); \
- return CCM_ILLINSTANCE; }
-
- // this macro defines the instance table. Each entry is reserved for an instance of CANopen.
-#define EPL_MCO_DECL_INSTANCE_VAR() \
- static tEplInstanceInfo aEplInstanceTable_g [EPL_MAX_INSTANCES];
-
- // this macro defines member variables in instance table which are needed in
- // all modules of Epl stack
-#define EPL_MCO_DECL_INSTANCE_MEMBER() \
- STATIC u8 m_InstState; \
- STATIC u8 m_bInstIndex;
-
-#define EPL_MCO_INSTANCE_PARAM_IDX_() EPL_MCO_INSTANCE_PARAM_ (EPL_MCO_GLB_VAR (m_bInstIndex))
-#define EPL_MCO_INSTANCE_PARAM_IDX() EPL_MCO_INSTANCE_PARAM (EPL_MCO_GLB_VAR (m_bInstIndex))
-
-#else // only one instance is used
-
- // Memory attributes for instance table.
-#define STATIC static // prevent warnings for variables with same name
-
-#define INSTANCE_TYPE_BEGIN
-#define INSTANCE_TYPE_END
-
-// macros for declaration, initializing and member access for instance handle
-// This class of macros are used by API function to inform CCM-modul which
-// instance is to be used.
-
- // macros for reference of instance handle
- // These macros are used for parameter passing to CANopen API function.
-#define CCM_INSTANCE_HDL
-#define CCM_INSTANCE_HDL_
-
-#define CCM_DECL_INSTANCE_PTR_LOCAL
-
- // macros for declaration within the function header or prototype
-#define CCM_DECL_INSTANCE_HDL void
-#define CCM_DECL_INSTANCE_HDL_
-
- // macros for process instance handle
-#define CCM_CHECK_INSTANCE_HDL()
-
- // macros for declaration of pointer to instance handle
-#define CCM_DECL_PTR_INSTANCE_HDL void
-#define CCM_DECL_PTR_INSTANCE_HDL_
-
- // macros for process pointer to instance handle
-#define CCM_CHECK_PTR_INSTANCE_HDL()
-
- // This macro returned the handle and pointer to next free instance.
-#define CCM_GET_FREE_INSTANCE_AND_HDL()
-
-#define CCM_CHECK_INSTANCE_PTR()
-
-#define CCM_GET_INSTANCE_PTR()
-#define CCM_GET_FREE_INSTANCE_PTR()
-
-#define CCM_INSTANCE_PARAM(par)
-#define CCM_INSTANCE_PARAM_(par)
-
-#define CCM_INST_ENTRY aCcmInstanceTable_g[0]
-
-// macros for declaration, initializing and member access for instance pointer
-// This class of macros are used by CANopen internal function to point to one instance.
-
- // macros for declaration within the function header, prototype or local var list
-#define EPL_MCO_DECL_INSTANCE_PTR void
-#define EPL_MCO_DECL_INSTANCE_PTR_
-#define EPL_MCO_DECL_INSTANCE_PTR_LOCAL
-
- // macros for reference of pointer to instance
- // These macros are used for parameter passing to called function.
-#define EPL_MCO_INSTANCE_PTR
-#define EPL_MCO_INSTANCE_PTR_
-#define EPL_MCO_ADDR_INSTANCE_PTR_
-
- // macros for process pointer to instance
-#define EPL_MCO_GET_INSTANCE_PTR()
-#define EPL_MCO_GET_FREE_INSTANCE_PTR()
-
- // This macro should be used to check the passed pointer to an public function
-#define EPL_MCO_CHECK_INSTANCE_STATE()
-
- // macros for declaration of pointer to instance pointer
-#define EPL_MCO_DECL_PTR_INSTANCE_PTR void
-#define EPL_MCO_DECL_PTR_INSTANCE_PTR_
-
- // macros for reference of pointer to instance pointer
- // These macros are used for parameter passing to called function.
-#define EPL_MCO_PTR_INSTANCE_PTR
-#define EPL_MCO_PTR_INSTANCE_PTR_
-
- // macros for process pointer to instance pointer
-#define EPL_MCO_CHECK_PTR_INSTANCE_PTR()
-#define EPL_MCO_SET_PTR_INSTANCE_PTR()
-
-#define EPL_MCO_INSTANCE_PARAM(a)
-#define EPL_MCO_INSTANCE_PARAM_(a)
-#define EPL_MCO_INSTANCE_PARAM_IDX_()
-#define EPL_MCO_INSTANCE_PARAM_IDX()
-
- // macro for access of struct members of one instance
-#define EPL_MCO_INST_ENTRY aEplInstanceTable_g[0]
-#define EPL_MCO_GLB_VAR(var) (var)
-#define EPL_MCO_WRITE_INSTANCE_STATE(a)
-
- // this macro deletes all instance entries as unused
-#define EPL_MCO_DELETE_INSTANCE_TABLE()
-
- // definition of functions which has to be defined in each module of CANopen stack
-#define EPL_MCO_DEFINE_INSTANCE_FCT()
-#define EPL_MCO_DECL_INSTANCE_FCT()
-
- // this macro defines the instance table. Each entry is reserved for an instance of CANopen.
-#define EPL_MCO_DECL_INSTANCE_VAR()
-
- // this macro defines member variables in instance table which are needed in
- // all modules of CANopen stack
-#define EPL_MCO_DECL_INSTANCE_MEMBER()
-
-#endif
-
-#endif // _EPLINSTDEF_H_
-
-// Die letzte Zeile muß unbedingt eine leere Zeile sein, weil manche Compiler
-// damit ein Problem haben, wenn das nicht so ist (z.B. GNU oder Borland C++ Builder).
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for status and error LED
-
- 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: EplLed.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.1 $ $Date: 2008/11/17 16:40:39 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2008/11/17 d.k.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLLED_H_
-#define _EPLLED_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef enum {
- kEplLedTypeStatus = 0x00,
- kEplLedTypeError = 0x01,
-
-} tEplLedType;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPLLED_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: global include file for EPL-NMT-Modules
-
- 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: EplNmt.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/11/17 16:40:39 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLNMT_H_
-#define _EPLNMT_H_
-
-#include "EplInc.h"
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// define super-states and masks to identify a super-state
-#define EPL_NMT_GS_POWERED 0x0008 // super state
-#define EPL_NMT_GS_INITIALISATION 0x0009 // super state
-#define EPL_NMT_GS_COMMUNICATING 0x000C // super state
-#define EPL_NMT_CS_EPLMODE 0x000D // super state
-#define EPL_NMT_MS_EPLMODE 0x000D // super state
-
-#define EPL_NMT_SUPERSTATE_MASK 0x000F // mask to select state
-
-#define EPL_NMT_TYPE_UNDEFINED 0x0000 // type of NMT state is still undefined
-#define EPL_NMT_TYPE_CS 0x0100 // CS type of NMT state
-#define EPL_NMT_TYPE_MS 0x0200 // MS type of NMT state
-#define EPL_NMT_TYPE_MASK 0x0300 // mask to select type of NMT state (i.e. CS or MS)
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-// the lower Byte of the NMT-State is encoded
-// like the values in the EPL-Standard
-// the higher byte is used to encode MN
-// (Bit 1 of the higher byte = 1) or CN (Bit 0 of the
-// higher byte = 1)
-// the super-states are not mentioned in this
-// enum because they are no real states
-// --> there are masks defined to indentify the
-// super-states
-
-typedef enum {
- kEplNmtGsOff = 0x0000,
- kEplNmtGsInitialising = 0x0019,
- kEplNmtGsResetApplication = 0x0029,
- kEplNmtGsResetCommunication = 0x0039,
- kEplNmtGsResetConfiguration = 0x0079,
- kEplNmtCsNotActive = 0x011C,
- kEplNmtCsPreOperational1 = 0x011D,
- kEplNmtCsStopped = 0x014D,
- kEplNmtCsPreOperational2 = 0x015D,
- kEplNmtCsReadyToOperate = 0x016D,
- kEplNmtCsOperational = 0x01FD,
- kEplNmtCsBasicEthernet = 0x011E,
- kEplNmtMsNotActive = 0x021C,
- kEplNmtMsPreOperational1 = 0x021D,
- kEplNmtMsPreOperational2 = 0x025D,
- kEplNmtMsReadyToOperate = 0x026D,
- kEplNmtMsOperational = 0x02FD,
- kEplNmtMsBasicEthernet = 0x021E
-} tEplNmtState;
-
-// NMT-events
-typedef enum {
- // Events from DLL
- // Events defined by EPL V2 specification
- kEplNmtEventNoEvent = 0x00,
-// kEplNmtEventDllMePres = 0x01,
- kEplNmtEventDllMePresTimeout = 0x02,
-// kEplNmtEventDllMeAsnd = 0x03,
-// kEplNmtEventDllMeAsndTimeout = 0x04,
- kEplNmtEventDllMeSoaSent = 0x04,
- kEplNmtEventDllMeSocTrig = 0x05,
- kEplNmtEventDllMeSoaTrig = 0x06,
- kEplNmtEventDllCeSoc = 0x07,
- kEplNmtEventDllCePreq = 0x08,
- kEplNmtEventDllCePres = 0x09,
- kEplNmtEventDllCeSoa = 0x0A,
- kEplNmtEventDllCeAsnd = 0x0B,
- kEplNmtEventDllCeFrameTimeout = 0x0C,
-
- // Events triggered by NMT-Commands
- kEplNmtEventSwReset = 0x10, // NMT_GT1, NMT_GT2, NMT_GT8
- kEplNmtEventResetNode = 0x11,
- kEplNmtEventResetCom = 0x12,
- kEplNmtEventResetConfig = 0x13,
- kEplNmtEventEnterPreOperational2 = 0x14,
- kEplNmtEventEnableReadyToOperate = 0x15,
- kEplNmtEventStartNode = 0x16, // NMT_CT7
- kEplNmtEventStopNode = 0x17,
-
- // Events triggered by higher layer
- kEplNmtEventEnterResetApp = 0x20,
- kEplNmtEventEnterResetCom = 0x21,
- kEplNmtEventInternComError = 0x22, // NMT_GT6, internal communication error -> enter ResetCommunication
- kEplNmtEventEnterResetConfig = 0x23,
- kEplNmtEventEnterCsNotActive = 0x24,
- kEplNmtEventEnterMsNotActive = 0x25,
- kEplNmtEventTimerBasicEthernet = 0x26, // NMT_CT3; timer triggered state change (NotActive -> BasicEth)
- kEplNmtEventTimerMsPreOp1 = 0x27, // enter PreOp1 on MN (NotActive -> MsPreOp1)
- kEplNmtEventNmtCycleError = 0x28, // NMT_CT11, NMT_MT6; error during cycle -> enter PreOp1
- kEplNmtEventTimerMsPreOp2 = 0x29, // enter PreOp2 on MN (MsPreOp1 -> MsPreOp2 if kEplNmtEventAllMandatoryCNIdent)
- kEplNmtEventAllMandatoryCNIdent = 0x2A, // enter PreOp2 on MN if kEplNmtEventTimerMsPreOp2
- kEplNmtEventEnterReadyToOperate = 0x2B, // application ready for the state ReadyToOp
- kEplNmtEventEnterMsOperational = 0x2C, // enter Operational on MN
- kEplNmtEventSwitchOff = 0x2D, // enter state Off
- kEplNmtEventCriticalError = 0x2E, // enter state Off because of critical error
-
-} tEplNmtEvent;
-
-// type for argument of event kEplEventTypeNmtStateChange
-typedef struct {
- tEplNmtState m_NewNmtState;
- tEplNmtEvent m_NmtEvent;
-
-} tEplEventNmtStateChange;
-
-// structure for kEplEventTypeHeartbeat
-typedef struct {
- unsigned int m_uiNodeId; // NodeId
- tEplNmtState m_NmtState; // NMT state (remember distinguish between MN / CN)
- u16 m_wErrorCode; // EPL error code in case of NMT state NotActive
-
-} tEplHeartbeatEvent;
-
-typedef enum {
- kEplNmtNodeEventFound = 0x00,
- kEplNmtNodeEventUpdateSw = 0x01, // application shall update software on CN
- kEplNmtNodeEventCheckConf = 0x02, // application / Configuration Manager shall check and update configuration on CN
- kEplNmtNodeEventUpdateConf = 0x03, // application / Configuration Manager shall update configuration on CN (check was done by NmtMn module)
- kEplNmtNodeEventVerifyConf = 0x04, // application / Configuration Manager shall verify configuration of CN
- kEplNmtNodeEventReadyToStart = 0x05, // issued if EPL_NMTST_NO_STARTNODE set
- // application must call EplNmtMnuSendNmtCommand(kEplNmtCmdStartNode) manually
- kEplNmtNodeEventNmtState = 0x06,
- kEplNmtNodeEventError = 0x07, // NMT error of CN
-
-} tEplNmtNodeEvent;
-
-typedef enum {
- kEplNmtNodeCommandBoot = 0x01, // if EPL_NODEASSIGN_START_CN not set it must be issued after kEplNmtNodeEventFound
- kEplNmtNodeCommandSwOk = 0x02, // application updated software on CN successfully
- kEplNmtNodeCommandSwUpdated = 0x03, // application updated software on CN successfully
- kEplNmtNodeCommandConfOk = 0x04, // application / Configuration Manager has updated configuration on CN successfully
- kEplNmtNodeCommandConfReset = 0x05, // application / Configuration Manager has updated configuration on CN successfully
- // and CN needs ResetConf so that the configuration gets actived
- kEplNmtNodeCommandConfErr = 0x06, // application / Configuration Manager failed on updating configuration on CN
- kEplNmtNodeCommandStart = 0x07, // if EPL_NMTST_NO_STARTNODE set it must be issued after kEplNmtNodeEventReadyToStart
-
-} tEplNmtNodeCommand;
-
-typedef enum {
- kEplNmtBootEventBootStep1Finish = 0x00, // PreOp2 is possible
- kEplNmtBootEventBootStep2Finish = 0x01, // ReadyToOp is possible
- kEplNmtBootEventCheckComFinish = 0x02, // Operational is possible
- kEplNmtBootEventOperational = 0x03, // all mandatory CNs are Operational
- kEplNmtBootEventError = 0x04, // boot process halted because of an error
-
-} tEplNmtBootEvent;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPLNMT_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for NMT-CN-Userspace-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: EplNmtCnu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "EplInc.h"
-#include "user/EplNmtCnu.h"
-#include "user/EplDlluCal.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_CN)) != 0)
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- unsigned int m_uiNodeId;
- tEplNmtuCheckEventCallback m_pfnCheckEventCb;
-
-} tEplNmtCnuInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static tEplNmtCnuInstance EplNmtCnuInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static tEplNmtCommand EplNmtCnuGetNmtCommand(tEplFrameInfo * pFrameInfo_p);
-
-static BOOL EplNmtCnuNodeIdList(u8 * pbNmtCommandDate_p);
-
-static tEplKernel EplNmtCnuCommandCb(tEplFrameInfo *pFrameInfo_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuInit
-//
-// Description: init the first instance of the module
-//
-//
-//
-// Parameters: uiNodeId_p = NodeId of the local node
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtCnuInit(unsigned int uiNodeId_p)
-{
- tEplKernel Ret;
-
- Ret = EplNmtCnuAddInstance(uiNodeId_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuAddInstance
-//
-// Description: init the add new instance of the module
-//
-//
-//
-// Parameters: uiNodeId_p = NodeId of the local node
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtCnuAddInstance(unsigned int uiNodeId_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // reset instance structure
- EPL_MEMSET(&EplNmtCnuInstance_g, 0, sizeof(EplNmtCnuInstance_g));
-
- // save nodeid
- EplNmtCnuInstance_g.m_uiNodeId = uiNodeId_p;
-
- // register callback-function for NMT-commands
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- Ret = EplDlluCalRegAsndService(kEplDllAsndNmtCommand,
- EplNmtCnuCommandCb,
- kEplDllAsndFilterLocal);
-#endif
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuDelInstance
-//
-// Description: delte instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtCnuDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- // deregister callback function from DLL
- Ret = EplDlluCalRegAsndService(kEplDllAsndNmtCommand,
- NULL, kEplDllAsndFilterNone);
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuSendNmtRequest
-//
-// Description: Send an NMT-Request to the MN
-//
-//
-//
-// Parameters: uiNodeId_p = NodeId of the local node
-// NmtCommand_p = requested NMT-Command
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtCnuSendNmtRequest(unsigned int uiNodeId_p,
- tEplNmtCommand NmtCommand_p)
-{
- tEplKernel Ret;
- tEplFrameInfo NmtRequestFrameInfo;
- tEplFrame NmtRequestFrame;
-
- Ret = kEplSuccessful;
-
- // build frame
- EPL_MEMSET(&NmtRequestFrame.m_be_abDstMac[0], 0x00, sizeof(NmtRequestFrame.m_be_abDstMac)); // set by DLL
- EPL_MEMSET(&NmtRequestFrame.m_be_abSrcMac[0], 0x00, sizeof(NmtRequestFrame.m_be_abSrcMac)); // set by DLL
- AmiSetWordToBe(&NmtRequestFrame.m_be_wEtherType,
- EPL_C_DLL_ETHERTYPE_EPL);
- AmiSetByteToLe(&NmtRequestFrame.m_le_bDstNodeId, (u8) EPL_C_ADR_MN_DEF_NODE_ID); // node id of the MN
- AmiSetByteToLe(&NmtRequestFrame.m_le_bMessageType,
- (u8) kEplMsgTypeAsnd);
- AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_le_bServiceId,
- (u8) kEplDllAsndNmtRequest);
- AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.
- m_NmtRequestService.m_le_bNmtCommandId,
- (u8) NmtCommand_p);
- AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.m_le_bTargetNodeId, (u8) uiNodeId_p); // target for the nmt command
- EPL_MEMSET(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.
- m_le_abNmtCommandData[0], 0x00,
- sizeof(NmtRequestFrame.m_Data.m_Asnd.m_Payload.
- m_NmtRequestService.m_le_abNmtCommandData));
-
- // build info-structure
- NmtRequestFrameInfo.m_NetTime.m_dwNanoSec = 0;
- NmtRequestFrameInfo.m_NetTime.m_dwSec = 0;
- NmtRequestFrameInfo.m_pFrame = &NmtRequestFrame;
- NmtRequestFrameInfo.m_uiFrameSize = EPL_C_DLL_MINSIZE_NMTREQ; // sizeof(NmtRequestFrame);
-
- // send NMT-Request
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- Ret = EplDlluCalAsyncSend(&NmtRequestFrameInfo, // pointer to frameinfo
- kEplDllAsyncReqPrioNmt); // priority
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuRegisterStateChangeCb
-//
-// Description: register Callback-function go get informed about a
-// NMT-Change-State-Event
-//
-//
-//
-// Parameters: pfnEplNmtStateChangeCb_p = functionpointer
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtCnuRegisterCheckEventCb(tEplNmtuCheckEventCallback pfnEplNmtCheckEventCb_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // save callback-function in modul global var
- EplNmtCnuInstance_g.m_pfnCheckEventCb = pfnEplNmtCheckEventCb_p;
-
- return Ret;
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuCommandCb
-//
-// Description: callback funktion for NMT-Commands
-//
-//
-//
-// Parameters: pFrameInfo_p = Frame with the NMT-Commando
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplNmtCnuCommandCb(tEplFrameInfo *pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplNmtCommand NmtCommand;
- BOOL fNodeIdInList;
- tEplNmtEvent NmtEvent = kEplNmtEventNoEvent;
-
- if (pFrameInfo_p == NULL) {
- Ret = kEplNmtInvalidFramePointer;
- goto Exit;
- }
-
- NmtCommand = EplNmtCnuGetNmtCommand(pFrameInfo_p);
-
- // check NMT-Command
- switch (NmtCommand) {
-
- //------------------------------------------------------------------------
- // plain NMT state commands
- case kEplNmtCmdStartNode:
- { // send NMT-Event to state maschine kEplNmtEventStartNode
- NmtEvent = kEplNmtEventStartNode;
- break;
- }
-
- case kEplNmtCmdStopNode:
- { // send NMT-Event to state maschine kEplNmtEventStopNode
- NmtEvent = kEplNmtEventStopNode;
- break;
- }
-
- case kEplNmtCmdEnterPreOperational2:
- { // send NMT-Event to state maschine kEplNmtEventEnterPreOperational2
- NmtEvent = kEplNmtEventEnterPreOperational2;
- break;
- }
-
- case kEplNmtCmdEnableReadyToOperate:
- { // send NMT-Event to state maschine kEplNmtEventEnableReadyToOperate
- NmtEvent = kEplNmtEventEnableReadyToOperate;
- break;
- }
-
- case kEplNmtCmdResetNode:
- { // send NMT-Event to state maschine kEplNmtEventResetNode
- NmtEvent = kEplNmtEventResetNode;
- break;
- }
-
- case kEplNmtCmdResetCommunication:
- { // send NMT-Event to state maschine kEplNmtEventResetCom
- NmtEvent = kEplNmtEventResetCom;
- break;
- }
-
- case kEplNmtCmdResetConfiguration:
- { // send NMT-Event to state maschine kEplNmtEventResetConfig
- NmtEvent = kEplNmtEventResetConfig;
- break;
- }
-
- case kEplNmtCmdSwReset:
- { // send NMT-Event to state maschine kEplNmtEventSwReset
- NmtEvent = kEplNmtEventSwReset;
- break;
- }
-
- //------------------------------------------------------------------------
- // extended NMT state commands
-
- case kEplNmtCmdStartNodeEx:
- {
- // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&
- (pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]));
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventStartNode;
- }
- break;
- }
-
- case kEplNmtCmdStopNodeEx:
- { // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]);
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventStopNode;
- }
- break;
- }
-
- case kEplNmtCmdEnterPreOperational2Ex:
- { // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]);
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventEnterPreOperational2;
- }
- break;
- }
-
- case kEplNmtCmdEnableReadyToOperateEx:
- { // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]);
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventEnableReadyToOperate;
- }
- break;
- }
-
- case kEplNmtCmdResetNodeEx:
- { // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]);
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventResetNode;
- }
- break;
- }
-
- case kEplNmtCmdResetCommunicationEx:
- { // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]);
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventResetCom;
- }
- break;
- }
-
- case kEplNmtCmdResetConfigurationEx:
- { // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]);
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventResetConfig;
- }
- break;
- }
-
- case kEplNmtCmdSwResetEx:
- { // check if own nodeid is in EPL node list
- fNodeIdInList =
- EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_abNmtCommandData[0]);
- if (fNodeIdInList != FALSE) { // own nodeid in list
- // send event to process command
- NmtEvent = kEplNmtEventSwReset;
- }
- break;
- }
-
- //------------------------------------------------------------------------
- // NMT managing commands
-
- // TODO: add functions to process managing command (optional)
-
- case kEplNmtCmdNetHostNameSet:
- {
- break;
- }
-
- case kEplNmtCmdFlushArpEntry:
- {
- break;
- }
-
- //------------------------------------------------------------------------
- // NMT info services
-
- // TODO: forward event with infos to the application (optional)
-
- case kEplNmtCmdPublishConfiguredCN:
- {
- break;
- }
-
- case kEplNmtCmdPublishActiveCN:
- {
- break;
- }
-
- case kEplNmtCmdPublishPreOperational1:
- {
- break;
- }
-
- case kEplNmtCmdPublishPreOperational2:
- {
- break;
- }
-
- case kEplNmtCmdPublishReadyToOperate:
- {
- break;
- }
-
- case kEplNmtCmdPublishOperational:
- {
- break;
- }
-
- case kEplNmtCmdPublishStopped:
- {
- break;
- }
-
- case kEplNmtCmdPublishEmergencyNew:
- {
- break;
- }
-
- case kEplNmtCmdPublishTime:
- {
- break;
- }
-
- //-----------------------------------------------------------------------
- // error from MN
- // -> requested command not supported by MN
- case kEplNmtCmdInvalidService:
- {
-
- // TODO: errorevent to application
- break;
- }
-
- //------------------------------------------------------------------------
- // default
- default:
- {
- Ret = kEplNmtUnknownCommand;
- goto Exit;
- }
-
- } // end of switch(NmtCommand)
-
- if (NmtEvent != kEplNmtEventNoEvent) {
- if (EplNmtCnuInstance_g.m_pfnCheckEventCb != NULL) {
- Ret = EplNmtCnuInstance_g.m_pfnCheckEventCb(NmtEvent);
- if (Ret == kEplReject) {
- Ret = kEplSuccessful;
- goto Exit;
- } else if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
- Ret = EplNmtuNmtEvent(NmtEvent);
-#endif
- }
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuGetNmtCommand()
-//
-// Description: returns the NMT-Command from the frame
-//
-//
-//
-// Parameters: pFrameInfo_p = pointer to the Frame
-// with the NMT-Command
-//
-//
-// Returns: tEplNmtCommand = NMT-Command
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplNmtCommand EplNmtCnuGetNmtCommand(tEplFrameInfo * pFrameInfo_p)
-{
- tEplNmtCommand NmtCommand;
- tEplNmtCommandService *pNmtCommandService;
-
- pNmtCommandService =
- &pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.
- m_NmtCommandService;
-
- NmtCommand =
- (tEplNmtCommand) AmiGetByteFromLe(&pNmtCommandService->
- m_le_bNmtCommandId);
-
- return NmtCommand;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtCnuNodeIdList()
-//
-// Description: check if the own nodeid is set in EPL Node List
-//
-//
-//
-// Parameters: pbNmtCommandDate_p = pointer to the data of the NMT Command
-//
-//
-// Returns: BOOL = TRUE if nodeid is set in EPL Node List
-// FALSE if nodeid not set in EPL Node List
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static BOOL EplNmtCnuNodeIdList(u8 * pbNmtCommandDate_p)
-{
- BOOL fNodeIdInList;
- unsigned int uiByteOffset;
- u8 bBitOffset;
- u8 bNodeListByte;
-
- // get byte-offset of the own nodeid in NodeIdList
- // devide though 8
- uiByteOffset = (unsigned int)(EplNmtCnuInstance_g.m_uiNodeId >> 3);
- // get bitoffset
- bBitOffset = (u8) EplNmtCnuInstance_g.m_uiNodeId % 8;
-
- bNodeListByte = AmiGetByteFromLe(&pbNmtCommandDate_p[uiByteOffset]);
- if ((bNodeListByte & bBitOffset) == 0) {
- fNodeIdInList = FALSE;
- } else {
- fNodeIdInList = TRUE;
- }
-
- return fNodeIdInList;
-}
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_CN)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for NMT-MN-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: EplNmtMnu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.18 $ $Date: 2008/11/19 09:52:24 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplNmtMnu.h"
-#include "user/EplTimeru.h"
-#include "user/EplIdentu.h"
-#include "user/EplStatusu.h"
-#include "user/EplObdu.h"
-#include "user/EplDlluCal.h"
-#include "Benchmark.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0) && (EPL_OBD_USE_KERNEL == FALSE)
-#error "EPL NmtMnu module needs EPL module OBDU or OBDK!"
-#endif
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 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)
-#endif
-#define EPL_NMTMNU_DBG_POST_TRACE_VALUE(Event_p, uiNodeId_p, wErrorCode_p) \
- TGT_DBG_POST_TRACE_VALUE((kEplEventSinkNmtMnu << 28) | (Event_p << 24) \
- | (uiNodeId_p << 16) | wErrorCode_p)
-
-// defines for flags in node info structure
-#define EPL_NMTMNU_NODE_FLAG_ISOCHRON 0x0001 // CN is being accessed isochronously
-#define EPL_NMTMNU_NODE_FLAG_NOT_SCANNED 0x0002 // CN was not scanned once -> decrement SignalCounter and reset flag
-#define EPL_NMTMNU_NODE_FLAG_HALTED 0x0004 // boot process for this CN is halted
-#define EPL_NMTMNU_NODE_FLAG_NMT_CMD_ISSUED 0x0008 // NMT command was just issued, wrong NMT states will be tolerated
-#define EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ 0x0300 // counter for StatusRequest timer handle
-#define EPL_NMTMNU_NODE_FLAG_COUNT_LONGER 0x0C00 // counter for longer timeouts timer handle
-#define EPL_NMTMNU_NODE_FLAG_INC_STATREQ 0x0100 // increment for StatusRequest timer handle
-#define EPL_NMTMNU_NODE_FLAG_INC_LONGER 0x0400 // increment for longer timeouts timer handle
- // These counters will be incremented at every timer start
- // and copied to timerarg. When the timer event occures
- // both will be compared and if unequal the timer event
- // will be discarded, because it is an old one.
-
-// defines for timer arguments to draw a distinction between serveral events
-#define EPL_NMTMNU_TIMERARG_NODE_MASK 0x000000FFL // mask that contains the node-ID
-#define EPL_NMTMNU_TIMERARG_IDENTREQ 0x00010000L // timer event is for IdentRequest
-#define EPL_NMTMNU_TIMERARG_STATREQ 0x00020000L // timer event is for StatusRequest
-#define EPL_NMTMNU_TIMERARG_LONGER 0x00040000L // timer event is for longer timeouts
-#define EPL_NMTMNU_TIMERARG_STATE_MON 0x00080000L // timer event for StatusRequest to monitor execution of NMT state changes
-#define EPL_NMTMNU_TIMERARG_COUNT_SR 0x00000300L // counter for StatusRequest
-#define EPL_NMTMNU_TIMERARG_COUNT_LO 0x00000C00L // counter for longer timeouts
- // The counters must have the same position as in the node flags above.
-
-#define EPL_NMTMNU_SET_FLAGS_TIMERARG_STATREQ(pNodeInfo_p, uiNodeId_p, TimerArg_p) \
- pNodeInfo_p->m_wFlags = \
- ((pNodeInfo_p->m_wFlags + EPL_NMTMNU_NODE_FLAG_INC_STATREQ) \
- & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) \
- | (pNodeInfo_p->m_wFlags & ~EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ); \
- TimerArg_p.m_ulArg = EPL_NMTMNU_TIMERARG_STATREQ | uiNodeId_p | \
- (pNodeInfo_p->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ); \
- TimerArg_p.m_EventSink = kEplEventSinkNmtMnu;
-
-#define EPL_NMTMNU_SET_FLAGS_TIMERARG_IDENTREQ(pNodeInfo_p, uiNodeId_p, TimerArg_p) \
- pNodeInfo_p->m_wFlags = \
- ((pNodeInfo_p->m_wFlags + EPL_NMTMNU_NODE_FLAG_INC_STATREQ) \
- & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) \
- | (pNodeInfo_p->m_wFlags & ~EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ); \
- TimerArg_p.m_ulArg = EPL_NMTMNU_TIMERARG_IDENTREQ | uiNodeId_p | \
- (pNodeInfo_p->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ); \
- TimerArg_p.m_EventSink = kEplEventSinkNmtMnu;
-
-#define EPL_NMTMNU_SET_FLAGS_TIMERARG_LONGER(pNodeInfo_p, uiNodeId_p, TimerArg_p) \
- pNodeInfo_p->m_wFlags = \
- ((pNodeInfo_p->m_wFlags + EPL_NMTMNU_NODE_FLAG_INC_LONGER) \
- & EPL_NMTMNU_NODE_FLAG_COUNT_LONGER) \
- | (pNodeInfo_p->m_wFlags & ~EPL_NMTMNU_NODE_FLAG_COUNT_LONGER); \
- TimerArg_p.m_ulArg = EPL_NMTMNU_TIMERARG_LONGER | uiNodeId_p | \
- (pNodeInfo_p->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_LONGER); \
- TimerArg_p.m_EventSink = kEplEventSinkNmtMnu;
-
-#define EPL_NMTMNU_SET_FLAGS_TIMERARG_STATE_MON(pNodeInfo_p, uiNodeId_p, TimerArg_p) \
- pNodeInfo_p->m_wFlags = \
- ((pNodeInfo_p->m_wFlags + EPL_NMTMNU_NODE_FLAG_INC_STATREQ) \
- & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) \
- | (pNodeInfo_p->m_wFlags & ~EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ); \
- TimerArg_p.m_ulArg = EPL_NMTMNU_TIMERARG_STATE_MON | uiNodeId_p | \
- (pNodeInfo_p->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ); \
- TimerArg_p.m_EventSink = kEplEventSinkNmtMnu;
-
-// defines for global flags
-#define EPL_NMTMNU_FLAG_HALTED 0x0001 // boot process is halted
-#define EPL_NMTMNU_FLAG_APP_INFORMED 0x0002 // application was informed about possible NMT state change
-
-// return pointer to node info structure for specified node ID
-// d.k. may be replaced by special (hash) function if node ID array is smaller than 254
-#define EPL_NMTMNU_GET_NODEINFO(uiNodeId_p) (&EplNmtMnuInstance_g.m_aNodeInfo[uiNodeId_p - 1])
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef enum {
- kEplNmtMnuIntNodeEventNoIdentResponse = 0x00,
- kEplNmtMnuIntNodeEventIdentResponse = 0x01,
- kEplNmtMnuIntNodeEventBoot = 0x02,
- kEplNmtMnuIntNodeEventExecReset = 0x03,
- kEplNmtMnuIntNodeEventConfigured = 0x04,
- kEplNmtMnuIntNodeEventNoStatusResponse = 0x05,
- kEplNmtMnuIntNodeEventStatusResponse = 0x06,
- kEplNmtMnuIntNodeEventHeartbeat = 0x07,
- kEplNmtMnuIntNodeEventNmtCmdSent = 0x08,
- kEplNmtMnuIntNodeEventTimerIdentReq = 0x09,
- kEplNmtMnuIntNodeEventTimerStatReq = 0x0A,
- kEplNmtMnuIntNodeEventTimerStateMon = 0x0B,
- kEplNmtMnuIntNodeEventTimerLonger = 0x0C,
- kEplNmtMnuIntNodeEventError = 0x0D,
-
-} tEplNmtMnuIntNodeEvent;
-
-typedef enum {
- kEplNmtMnuNodeStateUnknown = 0x00,
- kEplNmtMnuNodeStateIdentified = 0x01,
- kEplNmtMnuNodeStateResetConf = 0x02, // CN reset after configuration update
- kEplNmtMnuNodeStateConfigured = 0x03, // BootStep1 completed
- kEplNmtMnuNodeStateReadyToOp = 0x04, // BootStep2 completed
- kEplNmtMnuNodeStateComChecked = 0x05, // Communication checked successfully
- kEplNmtMnuNodeStateOperational = 0x06, // CN is in NMT state OPERATIONAL
-
-} tEplNmtMnuNodeState;
-
-typedef struct {
- tEplTimerHdl m_TimerHdlStatReq; // timer to delay StatusRequests and IdentRequests
- tEplTimerHdl m_TimerHdlLonger; // 2nd timer for NMT command EnableReadyToOp and CheckCommunication
- tEplNmtMnuNodeState m_NodeState; // internal node state (kind of sub state of NMT state)
- u32 m_dwNodeCfg; // subindex from 0x1F81
- u16 m_wFlags; // flags: CN is being accessed isochronously
-
-} tEplNmtMnuNodeInfo;
-
-typedef struct {
- tEplNmtMnuNodeInfo m_aNodeInfo[EPL_NMT_MAX_NODE_ID];
- tEplTimerHdl m_TimerHdlNmtState; // timeout for stay in NMT state
- unsigned int m_uiMandatorySlaveCount;
- unsigned int m_uiSignalSlaveCount;
- unsigned long m_ulStatusRequestDelay; // in [ms] (object 0x1006 * EPL_C_NMT_STATREQ_CYCLE)
- unsigned long m_ulTimeoutReadyToOp; // in [ms] (object 0x1F89/5)
- unsigned long m_ulTimeoutCheckCom; // in [ms] (object 0x1006 * MultiplexedCycleCount)
- u16 m_wFlags; // global flags
- u32 m_dwNmtStartup; // object 0x1F80 NMT_StartUp_U32
- tEplNmtMnuCbNodeEvent m_pfnCbNodeEvent;
- tEplNmtMnuCbBootEvent m_pfnCbBootEvent;
-
-} tEplNmtMnuInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-static tEplNmtMnuInstance EplNmtMnuInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuCbNmtRequest(tEplFrameInfo *pFrameInfo_p);
-
-static tEplKernel EplNmtMnuCbIdentResponse(unsigned int uiNodeId_p,
- tEplIdentResponse *pIdentResponse_p);
-
-static tEplKernel EplNmtMnuCbStatusResponse(unsigned int uiNodeId_p,
- tEplStatusResponse *pStatusResponse_p);
-
-static tEplKernel EplNmtMnuCheckNmtState(unsigned int uiNodeId_p,
- tEplNmtMnuNodeInfo * pNodeInfo_p,
- tEplNmtState NodeNmtState_p,
- u16 wErrorCode_p,
- tEplNmtState LocalNmtState_p);
-
-static tEplKernel EplNmtMnuStartBootStep1(void);
-
-static tEplKernel EplNmtMnuStartBootStep2(void);
-
-static tEplKernel EplNmtMnuStartCheckCom(void);
-
-static tEplKernel EplNmtMnuNodeBootStep2(unsigned int uiNodeId_p,
- tEplNmtMnuNodeInfo * pNodeInfo_p);
-
-static tEplKernel EplNmtMnuNodeCheckCom(unsigned int uiNodeId_p,
- tEplNmtMnuNodeInfo * pNodeInfo_p);
-
-static tEplKernel EplNmtMnuStartNodes(void);
-
-static tEplKernel EplNmtMnuProcessInternalEvent(unsigned int uiNodeId_p,
- tEplNmtState NodeNmtState_p,
- u16 wErrorCode_p,
- tEplNmtMnuIntNodeEvent
- NodeEvent_p);
-
-static tEplKernel EplNmtMnuReset(void);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuInit
-//
-// Description: init first instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuInit(tEplNmtMnuCbNodeEvent pfnCbNodeEvent_p,
- tEplNmtMnuCbBootEvent pfnCbBootEvent_p)
-{
- tEplKernel Ret;
-
- Ret = EplNmtMnuAddInstance(pfnCbNodeEvent_p, pfnCbBootEvent_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuAddInstance
-//
-// Description: init other instances of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuAddInstance(tEplNmtMnuCbNodeEvent pfnCbNodeEvent_p,
- tEplNmtMnuCbBootEvent pfnCbBootEvent_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // reset instance structure
- EPL_MEMSET(&EplNmtMnuInstance_g, 0, sizeof(EplNmtMnuInstance_g));
-
- if ((pfnCbNodeEvent_p == NULL) || (pfnCbBootEvent_p == NULL)) {
- Ret = kEplNmtInvalidParam;
- goto Exit;
- }
- EplNmtMnuInstance_g.m_pfnCbNodeEvent = pfnCbNodeEvent_p;
- EplNmtMnuInstance_g.m_pfnCbBootEvent = pfnCbBootEvent_p;
-
- // initialize StatusRequest delay
- EplNmtMnuInstance_g.m_ulStatusRequestDelay = 5000L;
-
- // register NmtMnResponse callback function
- Ret =
- EplDlluCalRegAsndService(kEplDllAsndNmtRequest,
- EplNmtMnuCbNmtRequest,
- kEplDllAsndFilterLocal);
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuDelInstance
-//
-// Description: delete instance
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // deregister NmtMnResponse callback function
- Ret =
- EplDlluCalRegAsndService(kEplDllAsndNmtRequest, NULL,
- kEplDllAsndFilterNone);
-
- Ret = EplNmtMnuReset();
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuSendNmtCommandEx
-//
-// Description: sends the specified NMT command to the specified node.
-//
-// Parameters: uiNodeId_p = node ID to which the NMT command will be sent
-// NmtCommand_p = NMT command
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuSendNmtCommandEx(unsigned int uiNodeId_p,
- tEplNmtCommand NmtCommand_p,
- void *pNmtCommandData_p,
- unsigned int uiDataSize_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplFrameInfo FrameInfo;
- u8 abBuffer[EPL_C_DLL_MINSIZE_NMTCMDEXT];
- tEplFrame *pFrame = (tEplFrame *) abBuffer;
- BOOL fSoftDeleteNode = FALSE;
-
- if ((uiNodeId_p == 0) || (uiNodeId_p > EPL_C_ADR_BROADCAST)) { // invalid node ID specified
- Ret = kEplInvalidNodeId;
- goto Exit;
- }
-
- if ((pNmtCommandData_p != NULL)
- && (uiDataSize_p >
- (EPL_C_DLL_MINSIZE_NMTCMDEXT - EPL_C_DLL_MINSIZE_NMTCMD))) {
- Ret = kEplNmtInvalidParam;
- goto Exit;
- }
- // $$$ d.k. may be check in future versions if the caller wants to perform prohibited state transitions
- // the CN should not perform these transitions, but the expected NMT state will be changed and never fullfilled.
-
- // build frame
- EPL_MEMSET(pFrame, 0x00, sizeof(abBuffer));
- AmiSetByteToLe(&pFrame->m_le_bDstNodeId, (u8) uiNodeId_p);
- AmiSetByteToLe(&pFrame->m_Data.m_Asnd.m_le_bServiceId,
- (u8) kEplDllAsndNmtCommand);
- AmiSetByteToLe(&pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.
- m_le_bNmtCommandId, (u8) NmtCommand_p);
- if ((pNmtCommandData_p != NULL) && (uiDataSize_p > 0)) { // copy command data to frame
- EPL_MEMCPY(&pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.
- m_le_abNmtCommandData[0], pNmtCommandData_p,
- uiDataSize_p);
- }
- // build info structure
- FrameInfo.m_NetTime.m_dwNanoSec = 0;
- FrameInfo.m_NetTime.m_dwSec = 0;
- FrameInfo.m_pFrame = pFrame;
- FrameInfo.m_uiFrameSize = sizeof(abBuffer);
-
- // send NMT-Request
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- Ret = EplDlluCalAsyncSend(&FrameInfo, // pointer to frameinfo
- kEplDllAsyncReqPrioNmt); // priority
-#endif
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- EPL_DBGLVL_NMTMN_TRACE2("NMTCmd(%02X->%02X)\n", NmtCommand_p,
- uiNodeId_p);
-
- switch (NmtCommand_p) {
- case kEplNmtCmdStartNode:
- case kEplNmtCmdEnterPreOperational2:
- case kEplNmtCmdEnableReadyToOperate:
- {
- // nothing left to do,
- // because any further processing is done
- // when the NMT command is actually sent
- goto Exit;
- }
-
- case kEplNmtCmdStopNode:
- {
- fSoftDeleteNode = TRUE;
- break;
- }
-
- case kEplNmtCmdResetNode:
- case kEplNmtCmdResetCommunication:
- case kEplNmtCmdResetConfiguration:
- case kEplNmtCmdSwReset:
- {
- break;
- }
-
- default:
- goto Exit;
- }
-
- // remove CN from isochronous phase;
- // This must be done here and not when NMT command is actually sent
- // because it will be too late and may cause unwanted errors
- if (uiNodeId_p != EPL_C_ADR_BROADCAST) {
- if (fSoftDeleteNode == FALSE) { // remove CN immediately from isochronous phase
- Ret = EplDlluCalDeleteNode(uiNodeId_p);
- } else { // remove CN from isochronous phase softly
- Ret = EplDlluCalSoftDeleteNode(uiNodeId_p);
- }
- } else { // do it for all active CNs
- for (uiNodeId_p = 1;
- uiNodeId_p <= tabentries(EplNmtMnuInstance_g.m_aNodeInfo);
- uiNodeId_p++) {
- if ((EPL_NMTMNU_GET_NODEINFO(uiNodeId_p)->
- m_dwNodeCfg & (EPL_NODEASSIGN_NODE_IS_CN |
- EPL_NODEASSIGN_NODE_EXISTS)) != 0) {
- if (fSoftDeleteNode == FALSE) { // remove CN immediately from isochronous phase
- Ret = EplDlluCalDeleteNode(uiNodeId_p);
- } else { // remove CN from isochronous phase softly
- Ret =
- EplDlluCalSoftDeleteNode
- (uiNodeId_p);
- }
- }
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuSendNmtCommand
-//
-// Description: sends the specified NMT command to the specified node.
-//
-// Parameters: uiNodeId_p = node ID to which the NMT command will be sent
-// NmtCommand_p = NMT command
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuSendNmtCommand(unsigned int uiNodeId_p,
- tEplNmtCommand NmtCommand_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- Ret = EplNmtMnuSendNmtCommandEx(uiNodeId_p, NmtCommand_p, NULL, 0);
-
-//Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuTriggerStateChange
-//
-// Description: triggers the specified node command for the specified node.
-//
-// Parameters: uiNodeId_p = node ID for which the node command will be executed
-// NodeCommand_p = node command
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuTriggerStateChange(unsigned int uiNodeId_p,
- tEplNmtNodeCommand NodeCommand_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplNmtMnuIntNodeEvent NodeEvent;
- tEplObdSize ObdSize;
- u8 bNmtState;
- u16 wErrorCode = EPL_E_NO_ERROR;
-
- if ((uiNodeId_p == 0) || (uiNodeId_p >= EPL_C_ADR_BROADCAST)) {
- Ret = kEplInvalidNodeId;
- goto Exit;
- }
-
- switch (NodeCommand_p) {
- case kEplNmtNodeCommandBoot:
- {
- NodeEvent = kEplNmtMnuIntNodeEventBoot;
- break;
- }
-
- case kEplNmtNodeCommandConfOk:
- {
- NodeEvent = kEplNmtMnuIntNodeEventConfigured;
- break;
- }
-
- case kEplNmtNodeCommandConfErr:
- {
- NodeEvent = kEplNmtMnuIntNodeEventError;
- wErrorCode = EPL_E_NMT_BPO1_CF_VERIFY;
- break;
- }
-
- case kEplNmtNodeCommandConfReset:
- {
- NodeEvent = kEplNmtMnuIntNodeEventExecReset;
- break;
- }
-
- default:
- { // invalid node command
- goto Exit;
- }
- }
-
- // fetch current NMT state
- ObdSize = 1;
- Ret = EplObduReadEntry(0x1F8E, uiNodeId_p, &bNmtState, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret = EplNmtMnuProcessInternalEvent(uiNodeId_p,
- (tEplNmtState) (bNmtState |
- EPL_NMT_TYPE_CS),
- wErrorCode, NodeEvent);
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuCbNmtStateChange
-//
-// Description: callback function for NMT state changes
-//
-// Parameters: NmtStateChange_p = NMT state change event
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuCbNmtStateChange(tEplEventNmtStateChange NmtStateChange_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // do work which must be done in that state
- switch (NmtStateChange_p.m_NewNmtState) {
- // EPL stack is not running
-/* case kEplNmtGsOff:
- break;
-
- // first init of the hardware
- case kEplNmtGsInitialising:
- break;
-
- // init of the manufacturer-specific profile area and the
- // standardised device profile area
- case kEplNmtGsResetApplication:
- {
- break;
- }
-
- // init of the communication profile area
- case kEplNmtGsResetCommunication:
- {
- break;
- }
-*/
- // build the configuration with infos from OD
- case kEplNmtGsResetConfiguration:
- {
- u32 dwTimeout;
- tEplObdSize ObdSize;
-
- // read object 0x1F80 NMT_StartUp_U32
- ObdSize = 4;
- Ret =
- EplObduReadEntry(0x1F80, 0,
- &EplNmtMnuInstance_g.
- m_dwNmtStartup, &ObdSize);
- if (Ret != kEplSuccessful) {
- break;
- }
- // compute StatusReqDelay = object 0x1006 * EPL_C_NMT_STATREQ_CYCLE
- ObdSize = sizeof(dwTimeout);
- Ret = EplObduReadEntry(0x1006, 0, &dwTimeout, &ObdSize);
- if (Ret != kEplSuccessful) {
- break;
- }
- if (dwTimeout != 0L) {
- EplNmtMnuInstance_g.m_ulStatusRequestDelay =
- dwTimeout * EPL_C_NMT_STATREQ_CYCLE / 1000L;
- if (EplNmtMnuInstance_g.
- m_ulStatusRequestDelay == 0L) {
- EplNmtMnuInstance_g.m_ulStatusRequestDelay = 1L; // at least 1 ms
- }
- // $$$ fetch and use MultiplexedCycleCount from OD
- EplNmtMnuInstance_g.m_ulTimeoutCheckCom =
- dwTimeout * EPL_C_NMT_STATREQ_CYCLE / 1000L;
- if (EplNmtMnuInstance_g.m_ulTimeoutCheckCom ==
- 0L) {
- EplNmtMnuInstance_g.m_ulTimeoutCheckCom = 1L; // at least 1 ms
- }
- }
- // fetch ReadyToOp Timeout from OD
- ObdSize = sizeof(dwTimeout);
- Ret = EplObduReadEntry(0x1F89, 5, &dwTimeout, &ObdSize);
- if (Ret != kEplSuccessful) {
- break;
- }
- if (dwTimeout != 0L) {
- // convert [us] to [ms]
- dwTimeout /= 1000L;
- if (dwTimeout == 0L) {
- dwTimeout = 1L; // at least 1 ms
- }
- EplNmtMnuInstance_g.m_ulTimeoutReadyToOp =
- dwTimeout;
- } else {
- EplNmtMnuInstance_g.m_ulTimeoutReadyToOp = 0L;
- }
- break;
- }
-/*
- //-----------------------------------------------------------
- // CN part of the state machine
-
- // node liste for EPL-Frames and check timeout
- case kEplNmtCsNotActive:
- {
- break;
- }
-
- // node process only async frames
- case kEplNmtCsPreOperational1:
- {
- break;
- }
-
- // node process isochronus and asynchronus frames
- case kEplNmtCsPreOperational2:
- {
- break;
- }
-
- // node should be configured und application is ready
- case kEplNmtCsReadyToOperate:
- {
- break;
- }
-
- // normal work state
- case kEplNmtCsOperational:
- {
- break;
- }
-
- // node stopped by MN
- // -> only process asynchronus frames
- case kEplNmtCsStopped:
- {
- break;
- }
-
- // no EPL cycle
- // -> normal ethernet communication
- case kEplNmtCsBasicEthernet:
- {
- break;
- }
-*/
- //-----------------------------------------------------------
- // MN part of the state machine
-
- // node listens for EPL-Frames and check timeout
- case kEplNmtMsNotActive:
- {
- break;
- }
-
- // node processes only async frames
- case kEplNmtMsPreOperational1:
- {
- u32 dwTimeout;
- tEplTimerArg TimerArg;
- tEplObdSize ObdSize;
- tEplEvent Event;
-
- // clear global flags, e.g. reenable boot process
- EplNmtMnuInstance_g.m_wFlags = 0;
-
- // reset IdentResponses and running IdentRequests and StatusRequests
- Ret = EplIdentuReset();
- Ret = EplStatusuReset();
-
- // reset timers
- Ret = EplNmtMnuReset();
-
- // 2008/11/18 d.k. reset internal node info is not necessary,
- // because timer flags are important and other
- // things are reset by EplNmtMnuStartBootStep1().
-/*
- EPL_MEMSET(EplNmtMnuInstance_g.m_aNodeInfo,
- 0,
- sizeof (EplNmtMnuInstance_g.m_aNodeInfo));
-*/
-
- // inform DLL about NMT state change,
- // so that it can clear the asynchonous queues and start the reduced cycle
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkStartReducedCycle;
- EPL_MEMSET(&Event.m_NetTime, 0x00,
- sizeof(Event.m_NetTime));
- Event.m_pArg = NULL;
- Event.m_uiSize = 0;
- Ret = EplEventuPost(&Event);
- if (Ret != kEplSuccessful) {
- break;
- }
- // reset all nodes
- // d.k.: skip this step if was just done before, e.g. because of a ResetNode command from a diagnostic node
- if (NmtStateChange_p.m_NmtEvent ==
- kEplNmtEventTimerMsPreOp1) {
- BENCHMARK_MOD_07_TOGGLE(9);
-
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(0,
- EPL_C_ADR_BROADCAST,
- kEplNmtCmdResetNode);
-
- Ret =
- EplNmtMnuSendNmtCommand(EPL_C_ADR_BROADCAST,
- kEplNmtCmdResetNode);
- if (Ret != kEplSuccessful) {
- break;
- }
- }
- // start network scan
- Ret = EplNmtMnuStartBootStep1();
-
- // start timer for 0x1F89/2 MNTimeoutPreOp1_U32
- ObdSize = sizeof(dwTimeout);
- Ret = EplObduReadEntry(0x1F89, 2, &dwTimeout, &ObdSize);
- if (Ret != kEplSuccessful) {
- break;
- }
- if (dwTimeout != 0L) {
- dwTimeout /= 1000L;
- if (dwTimeout == 0L) {
- dwTimeout = 1L; // at least 1 ms
- }
- TimerArg.m_EventSink = kEplEventSinkNmtMnu;
- TimerArg.m_ulArg = 0;
- Ret =
- EplTimeruModifyTimerMs(&EplNmtMnuInstance_g.
- m_TimerHdlNmtState,
- dwTimeout, TimerArg);
- }
- break;
- }
-
- // node processes isochronous and asynchronous frames
- case kEplNmtMsPreOperational2:
- {
- // add identified CNs to isochronous phase
- // send EnableReadyToOp to all identified CNs
- Ret = EplNmtMnuStartBootStep2();
-
- // wait for NMT state change of CNs
- break;
- }
-
- // node should be configured und application is ready
- case kEplNmtMsReadyToOperate:
- {
- // check if PRes of CNs are OK
- // d.k. that means wait CycleLength * MultiplexCycleCount (i.e. start timer)
- // because Dllk checks PRes of CNs automatically in ReadyToOp
- Ret = EplNmtMnuStartCheckCom();
- break;
- }
-
- // normal work state
- case kEplNmtMsOperational:
- {
- // send StartNode to CNs
- // wait for NMT state change of CNs
- Ret = EplNmtMnuStartNodes();
- break;
- }
-
- // no EPL cycle
- // -> normal ethernet communication
- case kEplNmtMsBasicEthernet:
- {
- break;
- }
-
- default:
- {
-// TRACE0("EplNmtMnuCbNmtStateChange(): unhandled NMT state\n");
- }
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuCbCheckEvent
-//
-// Description: callback funktion for NMT events before they are actually executed.
-// The EPL API layer must forward NMT events from NmtCnu module.
-// This module will reject some NMT commands while MN.
-//
-// Parameters: NmtEvent_p = outstanding NMT event for approval
-//
-// Returns: tEplKernel = error code
-// kEplReject = reject the NMT event
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuCbCheckEvent(tEplNmtEvent NmtEvent_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuProcessEvent
-//
-// Description: processes events from event queue
-//
-// Parameters: pEvent_p = pointer to event
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuProcessEvent(tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // process event
- switch (pEvent_p->m_EventType) {
- // timer event
- case kEplEventTypeTimer:
- {
- tEplTimerEventArg *pTimerEventArg =
- (tEplTimerEventArg *) pEvent_p->m_pArg;
- unsigned int uiNodeId;
-
- uiNodeId =
- (unsigned int)(pTimerEventArg->
- m_ulArg &
- EPL_NMTMNU_TIMERARG_NODE_MASK);
- if (uiNodeId != 0) {
- tEplObdSize ObdSize;
- u8 bNmtState;
- tEplNmtMnuNodeInfo *pNodeInfo;
-
- pNodeInfo = EPL_NMTMNU_GET_NODEINFO(uiNodeId);
-
- ObdSize = 1;
- Ret =
- EplObduReadEntry(0x1F8E, uiNodeId,
- &bNmtState, &ObdSize);
- if (Ret != kEplSuccessful) {
- break;
- }
-
- if ((pTimerEventArg->
- m_ulArg & EPL_NMTMNU_TIMERARG_IDENTREQ) !=
- 0L) {
- if ((pNodeInfo->
- m_wFlags &
- EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ)
- != (pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR)) { // this is an old (already deleted or modified) timer
- // but not the current timer
- // so discard it
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (kEplNmtMnuIntNodeEventTimerIdentReq,
- uiNodeId,
- ((pNodeInfo->
- m_NodeState << 8)
- | 0xFF));
-
- break;
- }
-/*
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(kEplNmtMnuIntNodeEventTimerIdentReq,
- uiNodeId,
- ((pNodeInfo->m_NodeState << 8)
- | 0x80
- | ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) >> 6)
- | ((pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR) >> 8)));
-*/
- Ret =
- EplNmtMnuProcessInternalEvent
- (uiNodeId,
- (tEplNmtState) (bNmtState |
- EPL_NMT_TYPE_CS),
- EPL_E_NO_ERROR,
- kEplNmtMnuIntNodeEventTimerIdentReq);
- }
-
- else if ((pTimerEventArg->
- m_ulArg & EPL_NMTMNU_TIMERARG_STATREQ)
- != 0L) {
- if ((pNodeInfo->
- m_wFlags &
- EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ)
- != (pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR)) { // this is an old (already deleted or modified) timer
- // but not the current timer
- // so discard it
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (kEplNmtMnuIntNodeEventTimerStatReq,
- uiNodeId,
- ((pNodeInfo->
- m_NodeState << 8)
- | 0xFF));
-
- break;
- }
-/*
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(kEplNmtMnuIntNodeEventTimerStatReq,
- uiNodeId,
- ((pNodeInfo->m_NodeState << 8)
- | 0x80
- | ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) >> 6)
- | ((pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR) >> 8)));
-*/
- Ret =
- EplNmtMnuProcessInternalEvent
- (uiNodeId,
- (tEplNmtState) (bNmtState |
- EPL_NMT_TYPE_CS),
- EPL_E_NO_ERROR,
- kEplNmtMnuIntNodeEventTimerStatReq);
- }
-
- else if ((pTimerEventArg->
- m_ulArg &
- EPL_NMTMNU_TIMERARG_STATE_MON) !=
- 0L) {
- if ((pNodeInfo->
- m_wFlags &
- EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ)
- != (pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR)) { // this is an old (already deleted or modified) timer
- // but not the current timer
- // so discard it
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (kEplNmtMnuIntNodeEventTimerStateMon,
- uiNodeId,
- ((pNodeInfo->
- m_NodeState << 8)
- | 0xFF));
-
- break;
- }
-/*
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(kEplNmtMnuIntNodeEventTimerStatReq,
- uiNodeId,
- ((pNodeInfo->m_NodeState << 8)
- | 0x80
- | ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) >> 6)
- | ((pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR) >> 8)));
-*/
- Ret =
- EplNmtMnuProcessInternalEvent
- (uiNodeId,
- (tEplNmtState) (bNmtState |
- EPL_NMT_TYPE_CS),
- EPL_E_NO_ERROR,
- kEplNmtMnuIntNodeEventTimerStateMon);
- }
-
- else if ((pTimerEventArg->
- m_ulArg & EPL_NMTMNU_TIMERARG_LONGER)
- != 0L) {
- if ((pNodeInfo->
- m_wFlags &
- EPL_NMTMNU_NODE_FLAG_COUNT_LONGER)
- != (pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_LO)) { // this is an old (already deleted or modified) timer
- // but not the current timer
- // so discard it
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (kEplNmtMnuIntNodeEventTimerLonger,
- uiNodeId,
- ((pNodeInfo->
- m_NodeState << 8)
- | 0xFF));
-
- break;
- }
-/*
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(kEplNmtMnuIntNodeEventTimerLonger,
- uiNodeId,
- ((pNodeInfo->m_NodeState << 8)
- | 0x80
- | ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_LONGER) >> 6)
- | ((pTimerEventArg->m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_LO) >> 8)));
-*/
- Ret =
- EplNmtMnuProcessInternalEvent
- (uiNodeId,
- (tEplNmtState) (bNmtState |
- EPL_NMT_TYPE_CS),
- EPL_E_NO_ERROR,
- kEplNmtMnuIntNodeEventTimerLonger);
- }
-
- } else { // global timer event
- }
- break;
- }
-
- case kEplEventTypeHeartbeat:
- {
- tEplHeartbeatEvent *pHeartbeatEvent =
- (tEplHeartbeatEvent *) pEvent_p->m_pArg;
-
- Ret =
- EplNmtMnuProcessInternalEvent(pHeartbeatEvent->
- m_uiNodeId,
- pHeartbeatEvent->
- m_NmtState,
- pHeartbeatEvent->
- m_wErrorCode,
- kEplNmtMnuIntNodeEventHeartbeat);
- break;
- }
-
- case kEplEventTypeNmtMnuNmtCmdSent:
- {
- tEplFrame *pFrame = (tEplFrame *) pEvent_p->m_pArg;
- unsigned int uiNodeId;
- tEplNmtCommand NmtCommand;
- u8 bNmtState;
-
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bDstNodeId);
- NmtCommand =
- (tEplNmtCommand) AmiGetByteFromLe(&pFrame->m_Data.
- m_Asnd.m_Payload.
- m_NmtCommandService.
- m_le_bNmtCommandId);
-
- switch (NmtCommand) {
- case kEplNmtCmdStartNode:
- bNmtState =
- (u8) (kEplNmtCsOperational & 0xFF);
- break;
-
- case kEplNmtCmdStopNode:
- bNmtState = (u8) (kEplNmtCsStopped & 0xFF);
- break;
-
- case kEplNmtCmdEnterPreOperational2:
- bNmtState =
- (u8) (kEplNmtCsPreOperational2 & 0xFF);
- break;
-
- case kEplNmtCmdEnableReadyToOperate:
- // d.k. do not change expected node state, because of DS 1.0.0 7.3.1.2.1 Plain NMT State Command
- // and because node may not change NMT state within EPL_C_NMT_STATE_TOLERANCE
- bNmtState =
- (u8) (kEplNmtCsPreOperational2 & 0xFF);
- break;
-
- case kEplNmtCmdResetNode:
- case kEplNmtCmdResetCommunication:
- case kEplNmtCmdResetConfiguration:
- case kEplNmtCmdSwReset:
- bNmtState = (u8) (kEplNmtCsNotActive & 0xFF);
- // EplNmtMnuProcessInternalEvent() sets internal node state to kEplNmtMnuNodeStateUnknown
- // after next unresponded IdentRequest/StatusRequest
- break;
-
- default:
- goto Exit;
- }
-
- // process as internal event which update expected NMT state in OD
- if (uiNodeId != EPL_C_ADR_BROADCAST) {
- Ret = EplNmtMnuProcessInternalEvent(uiNodeId,
- (tEplNmtState)
- (bNmtState |
- EPL_NMT_TYPE_CS),
- 0,
- kEplNmtMnuIntNodeEventNmtCmdSent);
-
- } else { // process internal event for all active nodes (except myself)
-
- for (uiNodeId = 1;
- uiNodeId <=
- tabentries(EplNmtMnuInstance_g.
- m_aNodeInfo); uiNodeId++) {
- if ((EPL_NMTMNU_GET_NODEINFO(uiNodeId)->
- m_dwNodeCfg &
- (EPL_NODEASSIGN_NODE_IS_CN |
- EPL_NODEASSIGN_NODE_EXISTS)) !=
- 0) {
- Ret =
- EplNmtMnuProcessInternalEvent
- (uiNodeId,
- (tEplNmtState) (bNmtState |
- EPL_NMT_TYPE_CS),
- 0,
- kEplNmtMnuIntNodeEventNmtCmdSent);
-
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
- }
- }
-
- break;
- }
-
- default:
- {
- Ret = kEplNmtInvalidEvent;
- }
-
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuGetRunningTimerStatReq
-//
-// Description: returns a bit field with running StatReq timers
-// just for debugging purposes
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplNmtMnuGetDiagnosticInfo(unsigned int *puiMandatorySlaveCount_p,
- unsigned int *puiSignalSlaveCount_p,
- u16 *pwFlags_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if ((puiMandatorySlaveCount_p == NULL)
- || (puiSignalSlaveCount_p == NULL)
- || (pwFlags_p == NULL)) {
- Ret = kEplNmtInvalidParam;
- goto Exit;
- }
-
- *puiMandatorySlaveCount_p = EplNmtMnuInstance_g.m_uiMandatorySlaveCount;
- *puiSignalSlaveCount_p = EplNmtMnuInstance_g.m_uiSignalSlaveCount;
- *pwFlags_p = EplNmtMnuInstance_g.m_wFlags;
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuGetRunningTimerStatReq
-//
-// Description: returns a bit field with running StatReq timers
-// just for debugging purposes
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-/*
-u32 EplNmtMnuGetRunningTimerStatReq(void)
-{
-tEplKernel Ret = kEplSuccessful;
-unsigned int uiIndex;
-tEplNmtMnuNodeInfo* pNodeInfo;
-
- pNodeInfo = EplNmtMnuInstance_g.m_aNodeInfo;
- for (uiIndex = 1; uiIndex <= tabentries(EplNmtMnuInstance_g.m_aNodeInfo); uiIndex++, pNodeInfo++)
- {
- if (pNodeInfo->m_NodeState == kEplNmtMnuNodeStateConfigured)
- {
- // reset flag "scanned once"
- pNodeInfo->m_wFlags &= ~EPL_NMTMNU_NODE_FLAG_SCANNED;
-
- Ret = EplNmtMnuNodeBootStep2(uiIndex, pNodeInfo);
- if (Ret != kEplSuccessful)
- {
- goto Exit;
- }
- EplNmtMnuInstance_g.m_uiSignalSlaveCount++;
- // signal slave counter shall be decremented if StatusRequest was sent once to a CN
- // mandatory slave counter shall be decremented if mandatory CN is ReadyToOp
- }
- }
-
-Exit:
- return Ret;
-}
-*/
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuCbNmtRequest
-//
-// Description: callback funktion for NmtRequest
-//
-// Parameters: pFrameInfo_p = Frame with the NmtRequest
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuCbNmtRequest(tEplFrameInfo *pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // $$$ perform NMTRequest
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuCbIdentResponse
-//
-// Description: callback funktion for IdentResponse
-//
-// Parameters: uiNodeId_p = node ID for which IdentReponse was received
-// pIdentResponse_p = pointer to IdentResponse
-// is NULL if node did not answer
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuCbIdentResponse(unsigned int uiNodeId_p,
- tEplIdentResponse *pIdentResponse_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if (pIdentResponse_p == NULL) { // node did not answer
- Ret = EplNmtMnuProcessInternalEvent(uiNodeId_p, kEplNmtCsNotActive, EPL_E_NMT_NO_IDENT_RES, // was EPL_E_NO_ERROR
- kEplNmtMnuIntNodeEventNoIdentResponse);
- } else { // node answered IdentRequest
- tEplObdSize ObdSize;
- u32 dwDevType;
- u16 wErrorCode = EPL_E_NO_ERROR;
- tEplNmtState NmtState =
- (tEplNmtState) (AmiGetByteFromLe
- (&pIdentResponse_p->
- m_le_bNmtStatus) | EPL_NMT_TYPE_CS);
-
- // check IdentResponse $$$ move to ProcessIntern, because this function may be called also if CN
-
- // check DeviceType (0x1F84)
- ObdSize = 4;
- Ret =
- EplObduReadEntry(0x1F84, uiNodeId_p, &dwDevType, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- if (dwDevType != 0L) { // actually compare it with DeviceType from IdentResponse
- if (AmiGetDwordFromLe(&pIdentResponse_p->m_le_dwDeviceType) != dwDevType) { // wrong DeviceType
- NmtState = kEplNmtCsNotActive;
- wErrorCode = EPL_E_NMT_BPO1_DEVICE_TYPE;
- }
- }
-
- Ret = EplNmtMnuProcessInternalEvent(uiNodeId_p,
- NmtState,
- wErrorCode,
- kEplNmtMnuIntNodeEventIdentResponse);
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuCbStatusResponse
-//
-// Description: callback funktion for StatusResponse
-//
-// Parameters: uiNodeId_p = node ID for which IdentReponse was received
-// pIdentResponse_p = pointer to IdentResponse
-// is NULL if node did not answer
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuCbStatusResponse(unsigned int uiNodeId_p,
- tEplStatusResponse *pStatusResponse_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if (pStatusResponse_p == NULL) { // node did not answer
- Ret = EplNmtMnuProcessInternalEvent(uiNodeId_p, kEplNmtCsNotActive, EPL_E_NMT_NO_STATUS_RES, // was EPL_E_NO_ERROR
- kEplNmtMnuIntNodeEventNoStatusResponse);
- } else { // node answered StatusRequest
- Ret = EplNmtMnuProcessInternalEvent(uiNodeId_p,
- (tEplNmtState)
- (AmiGetByteFromLe
- (&pStatusResponse_p->
- m_le_bNmtStatus) |
- EPL_NMT_TYPE_CS),
- EPL_E_NO_ERROR,
- kEplNmtMnuIntNodeEventStatusResponse);
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuStartBootStep1
-//
-// Description: starts BootStep1
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuStartBootStep1(void)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiSubIndex;
- unsigned int uiLocalNodeId;
- u32 dwNodeCfg;
- tEplObdSize ObdSize;
-
- // $$$ d.k.: save current time for 0x1F89/2 MNTimeoutPreOp1_U32
-
- // start network scan
- EplNmtMnuInstance_g.m_uiMandatorySlaveCount = 0;
- EplNmtMnuInstance_g.m_uiSignalSlaveCount = 0;
- // check 0x1F81
- uiLocalNodeId = EplObduGetNodeId();
- for (uiSubIndex = 1; uiSubIndex <= 254; uiSubIndex++) {
- ObdSize = 4;
- Ret =
- EplObduReadEntry(0x1F81, uiSubIndex, &dwNodeCfg, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- if (uiSubIndex != uiLocalNodeId) {
- // reset flags "not scanned" and "isochronous"
- EPL_NMTMNU_GET_NODEINFO(uiSubIndex)->m_wFlags &=
- ~(EPL_NMTMNU_NODE_FLAG_ISOCHRON |
- EPL_NMTMNU_NODE_FLAG_NOT_SCANNED);
-
- if (uiSubIndex == EPL_C_ADR_DIAG_DEF_NODE_ID) { // diagnostic node must be scanned by MN in any case
- dwNodeCfg |=
- (EPL_NODEASSIGN_NODE_IS_CN |
- EPL_NODEASSIGN_NODE_EXISTS);
- // and it must be isochronously accessed
- dwNodeCfg &= ~EPL_NODEASSIGN_ASYNCONLY_NODE;
- }
- // save node config in local node info structure
- EPL_NMTMNU_GET_NODEINFO(uiSubIndex)->m_dwNodeCfg =
- dwNodeCfg;
- EPL_NMTMNU_GET_NODEINFO(uiSubIndex)->m_NodeState =
- kEplNmtMnuNodeStateUnknown;
-
- if ((dwNodeCfg & (EPL_NODEASSIGN_NODE_IS_CN | EPL_NODEASSIGN_NODE_EXISTS)) != 0) { // node is configured as CN
- // identify the node
- Ret =
- EplIdentuRequestIdentResponse(uiSubIndex,
- EplNmtMnuCbIdentResponse);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // set flag "not scanned"
- EPL_NMTMNU_GET_NODEINFO(uiSubIndex)->m_wFlags |=
- EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- EplNmtMnuInstance_g.m_uiSignalSlaveCount++;
- // signal slave counter shall be decremented if IdentRequest was sent once to a CN
-
- if ((dwNodeCfg & EPL_NODEASSIGN_MANDATORY_CN) != 0) { // node is a mandatory CN
- EplNmtMnuInstance_g.
- m_uiMandatorySlaveCount++;
- // mandatory slave counter shall be decremented if mandatory CN was configured successfully
- }
- }
- } else { // subindex of MN
- if ((dwNodeCfg & (EPL_NODEASSIGN_MN_PRES | EPL_NODEASSIGN_NODE_EXISTS)) != 0) { // MN shall send PRes
- tEplDllNodeInfo DllNodeInfo;
-
- EPL_MEMSET(&DllNodeInfo, 0,
- sizeof(DllNodeInfo));
- DllNodeInfo.m_uiNodeId = uiLocalNodeId;
-
- Ret = EplDlluCalAddNode(&DllNodeInfo);
- }
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuStartBootStep2
-//
-// Description: starts BootStep2.
-// That means add nodes to isochronous phase and send
-// NMT EnableReadyToOp.
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuStartBootStep2(void)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiIndex;
- tEplNmtMnuNodeInfo *pNodeInfo;
-
- if ((EplNmtMnuInstance_g.m_wFlags & EPL_NMTMNU_FLAG_HALTED) == 0) { // boot process is not halted
- // add nodes to isochronous phase and send NMT EnableReadyToOp
- EplNmtMnuInstance_g.m_uiMandatorySlaveCount = 0;
- EplNmtMnuInstance_g.m_uiSignalSlaveCount = 0;
- // reset flag that application was informed about possible state change
- EplNmtMnuInstance_g.m_wFlags &= ~EPL_NMTMNU_FLAG_APP_INFORMED;
-
- pNodeInfo = EplNmtMnuInstance_g.m_aNodeInfo;
- for (uiIndex = 1;
- uiIndex <= tabentries(EplNmtMnuInstance_g.m_aNodeInfo);
- uiIndex++, pNodeInfo++) {
- if (pNodeInfo->m_NodeState ==
- kEplNmtMnuNodeStateConfigured) {
- Ret =
- EplNmtMnuNodeBootStep2(uiIndex, pNodeInfo);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // set flag "not scanned"
- pNodeInfo->m_wFlags |=
- EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
-
- EplNmtMnuInstance_g.m_uiSignalSlaveCount++;
- // signal slave counter shall be decremented if StatusRequest was sent once to a CN
-
- if ((pNodeInfo->m_dwNodeCfg & EPL_NODEASSIGN_MANDATORY_CN) != 0) { // node is a mandatory CN
- EplNmtMnuInstance_g.
- m_uiMandatorySlaveCount++;
- }
- // mandatory slave counter shall be decremented if mandatory CN is ReadyToOp
- }
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuNodeBootStep2
-//
-// Description: starts BootStep2 for the specified node.
-// This means the CN is added to isochronous phase if not
-// async-only and it gets the NMT command EnableReadyToOp.
-// The CN must be in node state Configured, when it enters
-// BootStep2. When BootStep2 finishes, the CN is in node state
-// ReadyToOp.
-// If TimeoutReadyToOp in object 0x1F89/5 is configured,
-// TimerHdlLonger will be started with this timeout.
-//
-// Parameters: uiNodeId_p = node ID
-// pNodeInfo_p = pointer to internal node info structure
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuNodeBootStep2(unsigned int uiNodeId_p,
- tEplNmtMnuNodeInfo * pNodeInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplDllNodeInfo DllNodeInfo;
- u32 dwNodeCfg;
- tEplObdSize ObdSize;
- tEplTimerArg TimerArg;
-
- dwNodeCfg = pNodeInfo_p->m_dwNodeCfg;
- if ((dwNodeCfg & EPL_NODEASSIGN_ASYNCONLY_NODE) == 0) { // add node to isochronous phase
- DllNodeInfo.m_uiNodeId = uiNodeId_p;
- ObdSize = 4;
- Ret =
- EplObduReadEntry(0x1F92, uiNodeId_p,
- &DllNodeInfo.m_dwPresTimeout, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = 2;
- Ret =
- EplObduReadEntry(0x1F8B, uiNodeId_p,
- &DllNodeInfo.m_wPreqPayloadLimit,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = 2;
- Ret =
- EplObduReadEntry(0x1F8D, uiNodeId_p,
- &DllNodeInfo.m_wPresPayloadLimit,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- pNodeInfo_p->m_wFlags |= EPL_NMTMNU_NODE_FLAG_ISOCHRON;
-
- Ret = EplDlluCalAddNode(&DllNodeInfo);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- }
-
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(0,
- uiNodeId_p,
- kEplNmtCmdEnableReadyToOperate);
-
- Ret =
- EplNmtMnuSendNmtCommand(uiNodeId_p, kEplNmtCmdEnableReadyToOperate);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if (EplNmtMnuInstance_g.m_ulTimeoutReadyToOp != 0L) { // start timer
- // when the timer expires the CN must be ReadyToOp
- EPL_NMTMNU_SET_FLAGS_TIMERARG_LONGER(pNodeInfo_p, uiNodeId_p,
- TimerArg);
-// TimerArg.m_EventSink = kEplEventSinkNmtMnu;
-// TimerArg.m_ulArg = EPL_NMTMNU_TIMERARG_LONGER | uiNodeId_p;
- Ret =
- EplTimeruModifyTimerMs(&pNodeInfo_p->m_TimerHdlLonger,
- EplNmtMnuInstance_g.
- m_ulTimeoutReadyToOp, TimerArg);
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuStartCheckCom
-//
-// Description: starts CheckCommunication
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuStartCheckCom(void)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiIndex;
- tEplNmtMnuNodeInfo *pNodeInfo;
-
- if ((EplNmtMnuInstance_g.m_wFlags & EPL_NMTMNU_FLAG_HALTED) == 0) { // boot process is not halted
- // wait some time and check that no communication error occurs
- EplNmtMnuInstance_g.m_uiMandatorySlaveCount = 0;
- EplNmtMnuInstance_g.m_uiSignalSlaveCount = 0;
- // reset flag that application was informed about possible state change
- EplNmtMnuInstance_g.m_wFlags &= ~EPL_NMTMNU_FLAG_APP_INFORMED;
-
- pNodeInfo = EplNmtMnuInstance_g.m_aNodeInfo;
- for (uiIndex = 1;
- uiIndex <= tabentries(EplNmtMnuInstance_g.m_aNodeInfo);
- uiIndex++, pNodeInfo++) {
- if (pNodeInfo->m_NodeState ==
- kEplNmtMnuNodeStateReadyToOp) {
- Ret = EplNmtMnuNodeCheckCom(uiIndex, pNodeInfo);
- if (Ret == kEplReject) { // timer was started
- // wait until it expires
- if ((pNodeInfo->m_dwNodeCfg & EPL_NODEASSIGN_MANDATORY_CN) != 0) { // node is a mandatory CN
- EplNmtMnuInstance_g.
- m_uiMandatorySlaveCount++;
- }
- } else if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // set flag "not scanned"
- pNodeInfo->m_wFlags |=
- EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
-
- EplNmtMnuInstance_g.m_uiSignalSlaveCount++;
- // signal slave counter shall be decremented if timeout elapsed and regardless of an error
- // mandatory slave counter shall be decremented if timeout elapsed and no error occured
- }
- }
- }
-
- Ret = kEplSuccessful;
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuNodeCheckCom
-//
-// Description: checks communication of the specified node.
-// That means wait some time and if no error occured everything
-// is OK.
-//
-// Parameters: uiNodeId_p = node ID
-// pNodeInfo_p = pointer to internal node info structure
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuNodeCheckCom(unsigned int uiNodeId_p,
- tEplNmtMnuNodeInfo * pNodeInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- u32 dwNodeCfg;
- tEplTimerArg TimerArg;
-
- dwNodeCfg = pNodeInfo_p->m_dwNodeCfg;
- if (((dwNodeCfg & EPL_NODEASSIGN_ASYNCONLY_NODE) == 0)
- && (EplNmtMnuInstance_g.m_ulTimeoutCheckCom != 0L)) { // CN is not async-only and timeout for CheckCom was set
-
- // check communication,
- // that means wait some time and if no error occured everything is OK;
-
- // start timer (when the timer expires the CN must be still ReadyToOp)
- EPL_NMTMNU_SET_FLAGS_TIMERARG_LONGER(pNodeInfo_p, uiNodeId_p,
- TimerArg);
-// TimerArg.m_EventSink = kEplEventSinkNmtMnu;
-// TimerArg.m_ulArg = EPL_NMTMNU_TIMERARG_LONGER | uiNodeId_p;
- Ret =
- EplTimeruModifyTimerMs(&pNodeInfo_p->m_TimerHdlLonger,
- EplNmtMnuInstance_g.
- m_ulTimeoutCheckCom, TimerArg);
-
- // update mandatory slave counter, because timer was started
- if (Ret == kEplSuccessful) {
- Ret = kEplReject;
- }
- } else { // timer was not started
- // assume everything is OK
- pNodeInfo_p->m_NodeState = kEplNmtMnuNodeStateComChecked;
- }
-
-//Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuStartNodes
-//
-// Description: really starts all nodes which are ReadyToOp and CheckCom did not fail
-//
-// Parameters: (none)
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuStartNodes(void)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiIndex;
- tEplNmtMnuNodeInfo *pNodeInfo;
-
- if ((EplNmtMnuInstance_g.m_wFlags & EPL_NMTMNU_FLAG_HALTED) == 0) { // boot process is not halted
- // send NMT command Start Node
- EplNmtMnuInstance_g.m_uiMandatorySlaveCount = 0;
- EplNmtMnuInstance_g.m_uiSignalSlaveCount = 0;
- // reset flag that application was informed about possible state change
- EplNmtMnuInstance_g.m_wFlags &= ~EPL_NMTMNU_FLAG_APP_INFORMED;
-
- pNodeInfo = EplNmtMnuInstance_g.m_aNodeInfo;
- for (uiIndex = 1;
- uiIndex <= tabentries(EplNmtMnuInstance_g.m_aNodeInfo);
- uiIndex++, pNodeInfo++) {
- if (pNodeInfo->m_NodeState ==
- kEplNmtMnuNodeStateComChecked) {
- if ((EplNmtMnuInstance_g.
- m_dwNmtStartup & EPL_NMTST_STARTALLNODES)
- == 0) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(0,
- uiIndex,
- kEplNmtCmdStartNode);
-
- Ret =
- EplNmtMnuSendNmtCommand(uiIndex,
- kEplNmtCmdStartNode);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
-
- if ((pNodeInfo->m_dwNodeCfg & EPL_NODEASSIGN_MANDATORY_CN) != 0) { // node is a mandatory CN
- EplNmtMnuInstance_g.
- m_uiMandatorySlaveCount++;
- }
- // set flag "not scanned"
- pNodeInfo->m_wFlags |=
- EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
-
- EplNmtMnuInstance_g.m_uiSignalSlaveCount++;
- // signal slave counter shall be decremented if StatusRequest was sent once to a CN
- // mandatory slave counter shall be decremented if mandatory CN is OPERATIONAL
- }
- }
-
- // $$$ inform application if EPL_NMTST_NO_STARTNODE is set
-
- if ((EplNmtMnuInstance_g.
- m_dwNmtStartup & EPL_NMTST_STARTALLNODES) != 0) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(0, EPL_C_ADR_BROADCAST,
- kEplNmtCmdStartNode);
-
- Ret =
- EplNmtMnuSendNmtCommand(EPL_C_ADR_BROADCAST,
- kEplNmtCmdStartNode);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuProcessInternalEvent
-//
-// Description: processes internal node events
-//
-// Parameters: uiNodeId_p = node ID
-// NodeNmtState_p = NMT state of CN
-// NodeEvent_p = occured events
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuProcessInternalEvent(unsigned int uiNodeId_p,
- tEplNmtState NodeNmtState_p,
- u16 wErrorCode_p,
- tEplNmtMnuIntNodeEvent
- NodeEvent_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplNmtState NmtState;
- tEplNmtMnuNodeInfo *pNodeInfo;
- tEplTimerArg TimerArg;
-
- pNodeInfo = EPL_NMTMNU_GET_NODEINFO(uiNodeId_p);
- NmtState = EplNmtuGetNmtState();
- if (NmtState <= kEplNmtMsNotActive) { // MN is not active
- goto Exit;
- }
-
- switch (NodeEvent_p) {
- case kEplNmtMnuIntNodeEventIdentResponse:
- {
- u8 bNmtState;
-
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(NodeEvent_p,
- uiNodeId_p,
- pNodeInfo->m_NodeState);
-
- if (pNodeInfo->m_NodeState !=
- kEplNmtMnuNodeStateResetConf) {
- pNodeInfo->m_NodeState =
- kEplNmtMnuNodeStateIdentified;
- }
- // reset flags ISOCHRON and NMT_CMD_ISSUED
- pNodeInfo->m_wFlags &= ~(EPL_NMTMNU_NODE_FLAG_ISOCHRON
- |
- EPL_NMTMNU_NODE_FLAG_NMT_CMD_ISSUED);
-
- if ((NmtState == kEplNmtMsPreOperational1)
- &&
- ((pNodeInfo->
- m_wFlags & EPL_NMTMNU_NODE_FLAG_NOT_SCANNED) !=
- 0)) {
- // decrement only signal slave count
- EplNmtMnuInstance_g.m_uiSignalSlaveCount--;
- pNodeInfo->m_wFlags &=
- ~EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- }
- // update object 0x1F8F NMT_MNNodeExpState_AU8 to PreOp1 (even if local state >= PreOp2)
- bNmtState = (u8) (kEplNmtCsPreOperational1 & 0xFF);
- Ret =
- EplObduWriteEntry(0x1F8F, uiNodeId_p, &bNmtState,
- 1);
-
- // check NMT state of CN
- Ret =
- EplNmtMnuCheckNmtState(uiNodeId_p, pNodeInfo,
- NodeNmtState_p, wErrorCode_p,
- NmtState);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- Ret = kEplSuccessful;
- }
- break;
- }
- // request StatusResponse immediately,
- // because we want a fast boot-up of CNs
- Ret =
- EplStatusuRequestStatusResponse(uiNodeId_p,
- EplNmtMnuCbStatusResponse);
- if (Ret != kEplSuccessful) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(NodeEvent_p,
- uiNodeId_p,
- Ret);
-
- if (Ret == kEplInvalidOperation) { // the only situation when this should happen is, when
- // StatusResponse was already requested from within
- // the StatReq timer event.
- // so ignore this error.
- Ret = kEplSuccessful;
- } else {
- break;
- }
- }
-
- if (pNodeInfo->m_NodeState !=
- kEplNmtMnuNodeStateResetConf) {
- // inform application
- Ret =
- EplNmtMnuInstance_g.
- m_pfnCbNodeEvent(uiNodeId_p,
- kEplNmtNodeEventFound,
- NodeNmtState_p,
- EPL_E_NO_ERROR,
- (pNodeInfo->
- m_dwNodeCfg &
- EPL_NODEASSIGN_MANDATORY_CN)
- != 0);
- if (Ret == kEplReject) { // interrupt boot process on user request
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (NodeEvent_p, uiNodeId_p,
- ((pNodeInfo->m_NodeState << 8)
- | Ret));
-
- Ret = kEplSuccessful;
- break;
- } else if (Ret != kEplSuccessful) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (NodeEvent_p, uiNodeId_p,
- ((pNodeInfo->m_NodeState << 8)
- | Ret));
-
- break;
- }
- }
- // continue BootStep1
- }
-
- case kEplNmtMnuIntNodeEventBoot:
- {
-
- // $$$ check identification (vendor ID, product code, revision no, serial no)
-
- if (pNodeInfo->m_NodeState ==
- kEplNmtMnuNodeStateIdentified) {
- // $$$ check software
-
- // check/start configuration
- // inform application
- Ret =
- EplNmtMnuInstance_g.
- m_pfnCbNodeEvent(uiNodeId_p,
- kEplNmtNodeEventCheckConf,
- NodeNmtState_p,
- EPL_E_NO_ERROR,
- (pNodeInfo->
- m_dwNodeCfg &
- EPL_NODEASSIGN_MANDATORY_CN)
- != 0);
- if (Ret == kEplReject) { // interrupt boot process on user request
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (kEplNmtMnuIntNodeEventBoot,
- uiNodeId_p,
- ((pNodeInfo->m_NodeState << 8)
- | Ret));
-
- Ret = kEplSuccessful;
- break;
- } else if (Ret != kEplSuccessful) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (kEplNmtMnuIntNodeEventBoot,
- uiNodeId_p,
- ((pNodeInfo->m_NodeState << 8)
- | Ret));
-
- break;
- }
- } else if (pNodeInfo->m_NodeState != kEplNmtMnuNodeStateResetConf) { // wrong CN state
- // ignore event
- break;
- }
- // $$$ d.k.: currently we assume configuration is OK
-
- // continue BootStep1
- }
-
- case kEplNmtMnuIntNodeEventConfigured:
- {
- if ((pNodeInfo->m_NodeState !=
- kEplNmtMnuNodeStateIdentified)
- && (pNodeInfo->m_NodeState != kEplNmtMnuNodeStateResetConf)) { // wrong CN state
- // ignore event
- break;
- }
-
- pNodeInfo->m_NodeState = kEplNmtMnuNodeStateConfigured;
-
- if (NmtState == kEplNmtMsPreOperational1) {
- if ((pNodeInfo->m_dwNodeCfg & EPL_NODEASSIGN_MANDATORY_CN) != 0) { // decrement mandatory CN counter
- EplNmtMnuInstance_g.
- m_uiMandatorySlaveCount--;
- }
- } else {
- // put optional node to next step (BootStep2)
- Ret =
- EplNmtMnuNodeBootStep2(uiNodeId_p,
- pNodeInfo);
- }
- break;
- }
-
- case kEplNmtMnuIntNodeEventNoIdentResponse:
- {
- if ((NmtState == kEplNmtMsPreOperational1)
- &&
- ((pNodeInfo->
- m_wFlags & EPL_NMTMNU_NODE_FLAG_NOT_SCANNED) !=
- 0)) {
- // decrement only signal slave count
- EplNmtMnuInstance_g.m_uiSignalSlaveCount--;
- pNodeInfo->m_wFlags &=
- ~EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- }
-
- if (pNodeInfo->m_NodeState !=
- kEplNmtMnuNodeStateResetConf) {
- pNodeInfo->m_NodeState =
- kEplNmtMnuNodeStateUnknown;
- }
- // $$$ d.k. check start time for 0x1F89/2 MNTimeoutPreOp1_U32
- // $$$ d.k. check individual timeout 0x1F89/6 MNIdentificationTimeout_U32
- // if mandatory node and timeout elapsed -> halt boot procedure
- // trigger IdentRequest again (if >= PreOp2, after delay)
- if (NmtState >= kEplNmtMsPreOperational2) { // start timer
- EPL_NMTMNU_SET_FLAGS_TIMERARG_IDENTREQ
- (pNodeInfo, uiNodeId_p, TimerArg);
-// TimerArg.m_EventSink = kEplEventSinkNmtMnu;
-// TimerArg.m_ulArg = EPL_NMTMNU_TIMERARG_IDENTREQ | uiNodeId_p;
-/*
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(kEplNmtMnuIntNodeEventNoIdentResponse,
- uiNodeId_p,
- ((pNodeInfo->m_NodeState << 8)
- | 0x80
- | ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) >> 6)
- | ((TimerArg.m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR) >> 8)));
-*/
- Ret =
- EplTimeruModifyTimerMs(&pNodeInfo->
- m_TimerHdlStatReq,
- EplNmtMnuInstance_g.
- m_ulStatusRequestDelay,
- TimerArg);
- } else { // trigger IdentRequest immediately
- Ret =
- EplIdentuRequestIdentResponse(uiNodeId_p,
- EplNmtMnuCbIdentResponse);
- }
- break;
- }
-
- case kEplNmtMnuIntNodeEventStatusResponse:
- {
- if ((NmtState >= kEplNmtMsPreOperational2)
- &&
- ((pNodeInfo->
- m_wFlags & EPL_NMTMNU_NODE_FLAG_NOT_SCANNED) !=
- 0)) {
- // decrement only signal slave count if checked once for ReadyToOp, CheckCom, Operational
- EplNmtMnuInstance_g.m_uiSignalSlaveCount--;
- pNodeInfo->m_wFlags &=
- ~EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- }
- // check NMT state of CN
- Ret =
- EplNmtMnuCheckNmtState(uiNodeId_p, pNodeInfo,
- NodeNmtState_p, wErrorCode_p,
- NmtState);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- Ret = kEplSuccessful;
- }
- break;
- }
-
- if (NmtState == kEplNmtMsPreOperational1) {
- // request next StatusResponse immediately
- Ret =
- EplStatusuRequestStatusResponse(uiNodeId_p,
- EplNmtMnuCbStatusResponse);
- if (Ret != kEplSuccessful) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (NodeEvent_p, uiNodeId_p, Ret);
- }
-
- } else if ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_ISOCHRON) == 0) { // start timer
- // not isochronously accessed CN (e.g. async-only or stopped CN)
- EPL_NMTMNU_SET_FLAGS_TIMERARG_STATREQ(pNodeInfo,
- uiNodeId_p,
- TimerArg);
-// TimerArg.m_EventSink = kEplEventSinkNmtMnu;
-// TimerArg.m_ulArg = EPL_NMTMNU_TIMERARG_STATREQ | uiNodeId_p;
-/*
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(kEplNmtMnuIntNodeEventStatusResponse,
- uiNodeId_p,
- ((pNodeInfo->m_NodeState << 8)
- | 0x80
- | ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_COUNT_STATREQ) >> 6)
- | ((TimerArg.m_ulArg & EPL_NMTMNU_TIMERARG_COUNT_SR) >> 8)));
-*/
- Ret =
- EplTimeruModifyTimerMs(&pNodeInfo->
- m_TimerHdlStatReq,
- EplNmtMnuInstance_g.
- m_ulStatusRequestDelay,
- TimerArg);
- }
-
- break;
- }
-
- case kEplNmtMnuIntNodeEventNoStatusResponse:
- {
- // function CheckNmtState sets node state to unknown if necessary
-/*
- if ((NmtState >= kEplNmtMsPreOperational2)
- && ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_NOT_SCANNED) != 0))
- {
- // decrement only signal slave count if checked once for ReadyToOp, CheckCom, Operational
- EplNmtMnuInstance_g.m_uiSignalSlaveCount--;
- pNodeInfo->m_wFlags &= ~EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- }
-*/
- // check NMT state of CN
- Ret =
- EplNmtMnuCheckNmtState(uiNodeId_p, pNodeInfo,
- NodeNmtState_p, wErrorCode_p,
- NmtState);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- Ret = kEplSuccessful;
- }
- break;
- }
-
- break;
- }
-
- case kEplNmtMnuIntNodeEventError:
- { // currently only issued on kEplNmtNodeCommandConfErr
-
- if (pNodeInfo->m_NodeState != kEplNmtMnuNodeStateIdentified) { // wrong CN state
- // ignore event
- break;
- }
- // check NMT state of CN
- Ret =
- EplNmtMnuCheckNmtState(uiNodeId_p, pNodeInfo,
- kEplNmtCsNotActive,
- wErrorCode_p, NmtState);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- Ret = kEplSuccessful;
- }
- break;
- }
-
- break;
- }
-
- case kEplNmtMnuIntNodeEventExecReset:
- {
- if (pNodeInfo->m_NodeState != kEplNmtMnuNodeStateIdentified) { // wrong CN state
- // ignore event
- break;
- }
-
- pNodeInfo->m_NodeState = kEplNmtMnuNodeStateResetConf;
-
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(NodeEvent_p,
- uiNodeId_p,
- (((NodeNmtState_p &
- 0xFF) << 8)
- |
- kEplNmtCmdResetConfiguration));
-
- // send NMT reset configuration to CN for activation of configuration
- Ret =
- EplNmtMnuSendNmtCommand(uiNodeId_p,
- kEplNmtCmdResetConfiguration);
-
- break;
- }
-
- case kEplNmtMnuIntNodeEventHeartbeat:
- {
-/*
- if ((NmtState >= kEplNmtMsPreOperational2)
- && ((pNodeInfo->m_wFlags & EPL_NMTMNU_NODE_FLAG_NOT_SCANNED) != 0))
- {
- // decrement only signal slave count if checked once for ReadyToOp, CheckCom, Operational
- EplNmtMnuInstance_g.m_uiSignalSlaveCount--;
- pNodeInfo->m_wFlags &= ~EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- }
-*/
- // check NMT state of CN
- Ret =
- EplNmtMnuCheckNmtState(uiNodeId_p, pNodeInfo,
- NodeNmtState_p, wErrorCode_p,
- NmtState);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- Ret = kEplSuccessful;
- }
- break;
- }
-
- break;
- }
-
- case kEplNmtMnuIntNodeEventTimerIdentReq:
- {
- EPL_DBGLVL_NMTMN_TRACE1
- ("TimerStatReq->IdentReq(%02X)\n", uiNodeId_p);
- // trigger IdentRequest again
- Ret =
- EplIdentuRequestIdentResponse(uiNodeId_p,
- EplNmtMnuCbIdentResponse);
- if (Ret != kEplSuccessful) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(NodeEvent_p,
- uiNodeId_p,
- (((NodeNmtState_p & 0xFF) << 8)
- | Ret));
- if (Ret == kEplInvalidOperation) { // this can happen because of a bug in EplTimeruLinuxKernel.c
- // so ignore this error.
- Ret = kEplSuccessful;
- }
- }
-
- break;
- }
-
- case kEplNmtMnuIntNodeEventTimerStateMon:
- {
- // reset NMT state change flag
- // because from now on the CN must have the correct NMT state
- pNodeInfo->m_wFlags &=
- ~EPL_NMTMNU_NODE_FLAG_NMT_CMD_ISSUED;
-
- // continue with normal StatReq processing
- }
-
- case kEplNmtMnuIntNodeEventTimerStatReq:
- {
- EPL_DBGLVL_NMTMN_TRACE1("TimerStatReq->StatReq(%02X)\n",
- uiNodeId_p);
- // request next StatusResponse
- Ret =
- EplStatusuRequestStatusResponse(uiNodeId_p,
- EplNmtMnuCbStatusResponse);
- if (Ret != kEplSuccessful) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(NodeEvent_p,
- uiNodeId_p,
- (((NodeNmtState_p & 0xFF) << 8)
- | Ret));
- if (Ret == kEplInvalidOperation) { // the only situation when this should happen is, when
- // StatusResponse was already requested while processing
- // event IdentResponse.
- // so ignore this error.
- Ret = kEplSuccessful;
- }
- }
-
- break;
- }
-
- case kEplNmtMnuIntNodeEventTimerLonger:
- {
- switch (pNodeInfo->m_NodeState) {
- case kEplNmtMnuNodeStateConfigured:
- { // node should be ReadyToOp but it is not
-
- // check NMT state which shall be intentionally wrong, so that ERROR_TREATMENT will be started
- Ret =
- EplNmtMnuCheckNmtState(uiNodeId_p,
- pNodeInfo,
- kEplNmtCsNotActive,
- EPL_E_NMT_BPO2,
- NmtState);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- Ret = kEplSuccessful;
- }
- break;
- }
-
- break;
- }
-
- case kEplNmtMnuNodeStateReadyToOp:
- { // CheckCom finished successfully
-
- pNodeInfo->m_NodeState =
- kEplNmtMnuNodeStateComChecked;
-
- if ((pNodeInfo->
- m_wFlags &
- EPL_NMTMNU_NODE_FLAG_NOT_SCANNED)
- != 0) {
- // decrement only signal slave count if checked once for ReadyToOp, CheckCom, Operational
- EplNmtMnuInstance_g.
- m_uiSignalSlaveCount--;
- pNodeInfo->m_wFlags &=
- ~EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- }
-
- if ((pNodeInfo->
- m_dwNodeCfg &
- EPL_NODEASSIGN_MANDATORY_CN) !=
- 0) {
- // decrement mandatory slave counter
- EplNmtMnuInstance_g.
- m_uiMandatorySlaveCount--;
- }
- if (NmtState != kEplNmtMsReadyToOperate) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE
- (NodeEvent_p, uiNodeId_p,
- (((NodeNmtState_p & 0xFF)
- << 8)
- | kEplNmtCmdStartNode));
-
- // start optional CN
- Ret =
- EplNmtMnuSendNmtCommand
- (uiNodeId_p,
- kEplNmtCmdStartNode);
- }
- break;
- }
-
- default:
- {
- break;
- }
- }
- break;
- }
-
- case kEplNmtMnuIntNodeEventNmtCmdSent:
- {
- u8 bNmtState;
-
- // update expected NMT state with the one that results
- // from the sent NMT command
- bNmtState = (u8) (NodeNmtState_p & 0xFF);
-
- // write object 0x1F8F NMT_MNNodeExpState_AU8
- Ret =
- EplObduWriteEntry(0x1F8F, uiNodeId_p, &bNmtState,
- 1);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if (NodeNmtState_p == kEplNmtCsNotActive) { // restart processing with IdentRequest
- EPL_NMTMNU_SET_FLAGS_TIMERARG_IDENTREQ
- (pNodeInfo, uiNodeId_p, TimerArg);
- } else { // monitor NMT state change with StatusRequest after
- // the corresponding delay;
- // until then wrong NMT states will be ignored
- EPL_NMTMNU_SET_FLAGS_TIMERARG_STATE_MON
- (pNodeInfo, uiNodeId_p, TimerArg);
-
- // set NMT state change flag
- pNodeInfo->m_wFlags |=
- EPL_NMTMNU_NODE_FLAG_NMT_CMD_ISSUED;
- }
-
- Ret =
- EplTimeruModifyTimerMs(&pNodeInfo->
- m_TimerHdlStatReq,
- EplNmtMnuInstance_g.
- m_ulStatusRequestDelay,
- TimerArg);
-
- // finish processing, because NmtState_p is the expected and not the current state
- goto Exit;
- }
-
- default:
- {
- break;
- }
- }
-
- // check if network is ready to change local NMT state and this was not done before
- if ((EplNmtMnuInstance_g.m_wFlags & (EPL_NMTMNU_FLAG_HALTED | EPL_NMTMNU_FLAG_APP_INFORMED)) == 0) { // boot process is not halted
- switch (NmtState) {
- case kEplNmtMsPreOperational1:
- {
- if ((EplNmtMnuInstance_g.m_uiSignalSlaveCount ==
- 0)
- && (EplNmtMnuInstance_g.m_uiMandatorySlaveCount == 0)) { // all optional CNs scanned once and all mandatory CNs configured successfully
- EplNmtMnuInstance_g.m_wFlags |=
- EPL_NMTMNU_FLAG_APP_INFORMED;
- // inform application
- Ret =
- EplNmtMnuInstance_g.
- m_pfnCbBootEvent
- (kEplNmtBootEventBootStep1Finish,
- NmtState, EPL_E_NO_ERROR);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- // wait for application
- Ret = kEplSuccessful;
- }
- break;
- }
- // enter PreOp2
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventAllMandatoryCNIdent);
- }
- break;
- }
-
- case kEplNmtMsPreOperational2:
- {
- if ((EplNmtMnuInstance_g.m_uiSignalSlaveCount ==
- 0)
- && (EplNmtMnuInstance_g.m_uiMandatorySlaveCount == 0)) { // all optional CNs checked once for ReadyToOp and all mandatory CNs are ReadyToOp
- EplNmtMnuInstance_g.m_wFlags |=
- EPL_NMTMNU_FLAG_APP_INFORMED;
- // inform application
- Ret =
- EplNmtMnuInstance_g.
- m_pfnCbBootEvent
- (kEplNmtBootEventBootStep2Finish,
- NmtState, EPL_E_NO_ERROR);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- // wait for application
- Ret = kEplSuccessful;
- }
- break;
- }
- // enter ReadyToOp
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterReadyToOperate);
- }
- break;
- }
-
- case kEplNmtMsReadyToOperate:
- {
- if ((EplNmtMnuInstance_g.m_uiSignalSlaveCount ==
- 0)
- && (EplNmtMnuInstance_g.m_uiMandatorySlaveCount == 0)) { // all CNs checked for errorless communication
- EplNmtMnuInstance_g.m_wFlags |=
- EPL_NMTMNU_FLAG_APP_INFORMED;
- // inform application
- Ret =
- EplNmtMnuInstance_g.
- m_pfnCbBootEvent
- (kEplNmtBootEventCheckComFinish,
- NmtState, EPL_E_NO_ERROR);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- // wait for application
- Ret = kEplSuccessful;
- }
- break;
- }
- // enter Operational
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterMsOperational);
- }
- break;
- }
-
- case kEplNmtMsOperational:
- {
- if ((EplNmtMnuInstance_g.m_uiSignalSlaveCount ==
- 0)
- && (EplNmtMnuInstance_g.m_uiMandatorySlaveCount == 0)) { // all optional CNs scanned once and all mandatory CNs are OPERATIONAL
- EplNmtMnuInstance_g.m_wFlags |=
- EPL_NMTMNU_FLAG_APP_INFORMED;
- // inform application
- Ret =
- EplNmtMnuInstance_g.
- m_pfnCbBootEvent
- (kEplNmtBootEventOperational,
- NmtState, EPL_E_NO_ERROR);
- if (Ret != kEplSuccessful) {
- if (Ret == kEplReject) {
- // ignore error code
- Ret = kEplSuccessful;
- }
- break;
- }
- }
- break;
- }
-
- default:
- {
- break;
- }
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuCheckNmtState
-//
-// Description: checks the NMT state, i.e. evaluates it with object 0x1F8F
-// NMT_MNNodeExpState_AU8 and updates object 0x1F8E
-// NMT_MNNodeCurrState_AU8.
-// It manipulates m_NodeState in internal node info structure.
-//
-// Parameters: uiNodeId_p = node ID
-// NodeNmtState_p = NMT state of CN
-//
-// Returns: tEplKernel = error code
-// kEplReject = CN was in wrong state and has been reset
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuCheckNmtState(unsigned int uiNodeId_p,
- tEplNmtMnuNodeInfo * pNodeInfo_p,
- tEplNmtState NodeNmtState_p,
- u16 wErrorCode_p,
- tEplNmtState LocalNmtState_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplObdSize ObdSize;
- u8 bNmtState;
- u8 bNmtStatePrev;
- tEplNmtState ExpNmtState;
-
- ObdSize = 1;
- // read object 0x1F8F NMT_MNNodeExpState_AU8
- Ret = EplObduReadEntry(0x1F8F, uiNodeId_p, &bNmtState, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // compute expected NMT state
- ExpNmtState = (tEplNmtState) (bNmtState | EPL_NMT_TYPE_CS);
- // compute u8 of current NMT state
- bNmtState = ((u8) NodeNmtState_p & 0xFF);
-
- if (ExpNmtState == kEplNmtCsNotActive) { // ignore the current state, because the CN shall be not active
- Ret = kEplReject;
- goto Exit;
- } else if ((ExpNmtState == kEplNmtCsPreOperational2)
- && (NodeNmtState_p == kEplNmtCsReadyToOperate)) { // CN switched to ReadyToOp
- // delete timer for timeout handling
- Ret = EplTimeruDeleteTimer(&pNodeInfo_p->m_TimerHdlLonger);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- pNodeInfo_p->m_NodeState = kEplNmtMnuNodeStateReadyToOp;
-
- // update object 0x1F8F NMT_MNNodeExpState_AU8 to ReadyToOp
- Ret = EplObduWriteEntry(0x1F8F, uiNodeId_p, &bNmtState, 1);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if ((pNodeInfo_p->m_dwNodeCfg & EPL_NODEASSIGN_MANDATORY_CN) != 0) { // node is a mandatory CN -> decrement counter
- EplNmtMnuInstance_g.m_uiMandatorySlaveCount--;
- }
- if (LocalNmtState_p >= kEplNmtMsReadyToOperate) { // start procedure CheckCommunication for this node
- Ret = EplNmtMnuNodeCheckCom(uiNodeId_p, pNodeInfo_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if ((LocalNmtState_p == kEplNmtMsOperational)
- && (pNodeInfo_p->m_NodeState ==
- kEplNmtMnuNodeStateComChecked)) {
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(0, uiNodeId_p,
- (((NodeNmtState_p & 0xFF) << 8)
- |
- kEplNmtCmdStartNode));
-
- // immediately start optional CN, because communication is always OK (e.g. async-only CN)
- Ret =
- EplNmtMnuSendNmtCommand(uiNodeId_p,
- kEplNmtCmdStartNode);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
- }
-
- } else if ((ExpNmtState == kEplNmtCsReadyToOperate)
- && (NodeNmtState_p == kEplNmtCsOperational)) { // CN switched to OPERATIONAL
- pNodeInfo_p->m_NodeState = kEplNmtMnuNodeStateOperational;
-
- if ((pNodeInfo_p->m_dwNodeCfg & EPL_NODEASSIGN_MANDATORY_CN) != 0) { // node is a mandatory CN -> decrement counter
- EplNmtMnuInstance_g.m_uiMandatorySlaveCount--;
- }
-
- } else if ((ExpNmtState != NodeNmtState_p)
- && !((ExpNmtState == kEplNmtCsPreOperational1)
- && (NodeNmtState_p == kEplNmtCsPreOperational2))) { // CN is not in expected NMT state (without the exceptions above)
- u16 wbeErrorCode;
-
- if ((pNodeInfo_p->
- m_wFlags & EPL_NMTMNU_NODE_FLAG_NOT_SCANNED) != 0) {
- // decrement only signal slave count if checked once
- EplNmtMnuInstance_g.m_uiSignalSlaveCount--;
- pNodeInfo_p->m_wFlags &=
- ~EPL_NMTMNU_NODE_FLAG_NOT_SCANNED;
- }
-
- if (pNodeInfo_p->m_NodeState == kEplNmtMnuNodeStateUnknown) { // CN is already in state unknown, which means that it got
- // NMT reset command earlier
- goto Exit;
- }
- // -> CN is in wrong NMT state
- pNodeInfo_p->m_NodeState = kEplNmtMnuNodeStateUnknown;
-
- if (wErrorCode_p == 0) { // assume wrong NMT state error
- if ((pNodeInfo_p->m_wFlags & EPL_NMTMNU_NODE_FLAG_NMT_CMD_ISSUED) != 0) { // NMT command has been just issued;
- // ignore wrong NMT state until timer expires;
- // other errors like LOSS_PRES_TH are still processed
- goto Exit;
- }
-
- wErrorCode_p = EPL_E_NMT_WRONG_STATE;
- }
-
- BENCHMARK_MOD_07_TOGGLE(9);
-
- // $$$ start ERROR_TREATMENT and inform application
- Ret = EplNmtMnuInstance_g.m_pfnCbNodeEvent(uiNodeId_p,
- kEplNmtNodeEventError,
- NodeNmtState_p,
- wErrorCode_p,
- (pNodeInfo_p->
- m_dwNodeCfg &
- EPL_NODEASSIGN_MANDATORY_CN)
- != 0);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- EPL_NMTMNU_DBG_POST_TRACE_VALUE(0,
- uiNodeId_p,
- (((NodeNmtState_p & 0xFF) << 8)
- | kEplNmtCmdResetNode));
-
- // reset CN
- // store error code in NMT command data for diagnostic purpose
- AmiSetWordToLe(&wbeErrorCode, wErrorCode_p);
- Ret =
- EplNmtMnuSendNmtCommandEx(uiNodeId_p, kEplNmtCmdResetNode,
- &wbeErrorCode,
- sizeof(wbeErrorCode));
- if (Ret == kEplSuccessful) {
- Ret = kEplReject;
- }
-
- goto Exit;
- }
- // check if NMT_MNNodeCurrState_AU8 has to be changed
- ObdSize = 1;
- Ret = EplObduReadEntry(0x1F8E, uiNodeId_p, &bNmtStatePrev, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- if (bNmtState != bNmtStatePrev) {
- // update object 0x1F8E NMT_MNNodeCurrState_AU8
- Ret = EplObduWriteEntry(0x1F8E, uiNodeId_p, &bNmtState, 1);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- Ret = EplNmtMnuInstance_g.m_pfnCbNodeEvent(uiNodeId_p,
- kEplNmtNodeEventNmtState,
- NodeNmtState_p,
- wErrorCode_p,
- (pNodeInfo_p->
- m_dwNodeCfg &
- EPL_NODEASSIGN_MANDATORY_CN)
- != 0);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtMnuReset
-//
-// Description: reset internal structures, e.g. timers
-//
-// Parameters: void
-//
-// Returns: tEplKernel = error code
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplNmtMnuReset(void)
-{
- tEplKernel Ret;
- int iIndex;
-
- Ret = EplTimeruDeleteTimer(&EplNmtMnuInstance_g.m_TimerHdlNmtState);
-
- for (iIndex = 1; iIndex <= tabentries(EplNmtMnuInstance_g.m_aNodeInfo);
- iIndex++) {
- // delete timer handles
- Ret =
- EplTimeruDeleteTimer(&EPL_NMTMNU_GET_NODEINFO(iIndex)->
- m_TimerHdlStatReq);
- Ret =
- EplTimeruDeleteTimer(&EPL_NMTMNU_GET_NODEINFO(iIndex)->
- m_TimerHdlLonger);
- }
-
- return Ret;
-}
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for NMT-Kernelspace-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: EplNmtk.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.12 $ $Date: 2008/11/13 17:13:09 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "kernel/EplNmtk.h"
-#include "kernel/EplTimerk.h"
-
-#include "kernel/EplDllk.h" // for EplDllkProcess()
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 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)
-#endif
-#define EPL_NMTK_DBG_POST_TRACE_VALUE(NmtEvent_p, OldNmtState_p, NewNmtState_p) \
- TGT_DBG_POST_TRACE_VALUE((kEplEventSinkNmtk << 28) | (NmtEvent_p << 16) \
- | ((OldNmtState_p & 0xFF) << 8) \
- | (NewNmtState_p & 0xFF))
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-// struct for instance table
-INSTANCE_TYPE_BEGIN EPL_MCO_DECL_INSTANCE_MEMBER()
-
-STATIC volatile tEplNmtState m_NmtState;
-STATIC volatile BOOL m_fEnableReadyToOperate;
-STATIC volatile BOOL m_fAppReadyToOperate;
-STATIC volatile BOOL m_fTimerMsPreOp2;
-STATIC volatile BOOL m_fAllMandatoryCNIdent;
-STATIC volatile BOOL m_fFrozen;
-
-INSTANCE_TYPE_END
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-// This macro replace the unspecific pointer to an instance through
-// the modul specific type for the local instance table. This macro
-// must defined in each modul.
-//#define tEplPtrInstance tEplInstanceInfo*
-EPL_MCO_DECL_INSTANCE_VAR()
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-EPL_MCO_DEFINE_INSTANCE_FCT()
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <NMT_Kernel-Module> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description: This module realize the NMT-State-Machine of the EPL-Stack
-//
-//
-/***************************************************************************/
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtkInit
-//
-// Description: initializes the first instance
-//
-//
-//
-// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR = Instance pointer
-// uiNodeId_p = Node Id of the lokal node
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtkInit(EPL_MCO_DECL_PTR_INSTANCE_PTR)
-{
- tEplKernel Ret;
-
- Ret = EplNmtkAddInstance(EPL_MCO_PTR_INSTANCE_PTR);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtkAddInstance
-//
-// Description: adds a new instance
-//
-//
-//
-// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR = Instance pointer
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtkAddInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR)
-{
- EPL_MCO_DECL_INSTANCE_PTR_LOCAL tEplKernel Ret;
-//tEplEvent Event;
-//tEplEventNmtStateChange NmtStateChange;
-
- // check if pointer to instance pointer valid
- // get free instance and set the globale instance pointer
- // set also the instance addr to parameterlist
- EPL_MCO_CHECK_PTR_INSTANCE_PTR();
- EPL_MCO_GET_FREE_INSTANCE_PTR();
- EPL_MCO_SET_PTR_INSTANCE_PTR();
-
- // sign instance as used
- EPL_MCO_WRITE_INSTANCE_STATE(kStateUsed);
-
- Ret = kEplSuccessful;
-
- // initialize intern vaiables
- // 2006/07/31 d.k.: set NMT-State to kEplNmtGsOff
- EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsOff;
- // set NMT-State to kEplNmtGsInitialising
- //EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsInitialising;
-
- // set flags to FALSE
- EPL_MCO_GLB_VAR(m_fEnableReadyToOperate) = FALSE;
- EPL_MCO_GLB_VAR(m_fAppReadyToOperate) = FALSE;
- EPL_MCO_GLB_VAR(m_fTimerMsPreOp2) = FALSE;
- EPL_MCO_GLB_VAR(m_fAllMandatoryCNIdent) = FALSE;
- EPL_MCO_GLB_VAR(m_fFrozen) = FALSE;
-
-// EPL_MCO_GLB_VAR(m_TimerHdl) = 0;
-
- // inform higher layer about state change
- // 2006/07/31 d.k.: The EPL API layer/application has to start NMT state
- // machine via NmtEventSwReset after initialisation of
- // all modules has been completed. DLL has to be initialised
- // after NMTk because NMT state shall not be uninitialised
- // at that time.
-/* NmtStateChange.m_NewNmtState = EPL_MCO_GLB_VAR(m_NmtState);
- NmtStateChange.m_NmtEvent = kEplNmtEventNoEvent;
- Event.m_EventSink = kEplEventSinkNmtu;
- Event.m_EventType = kEplEventTypeNmtStateChange;
- EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
- Event.m_pArg = &NmtStateChange;
- Event.m_uiSize = sizeof(NmtStateChange);
- Ret = EplEventkPost(&Event);
-*/
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtkDelInstance
-//
-// Description: delete instance
-//
-//
-//
-// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR = Instance pointer
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if (EPL_USE_DELETEINST_FUNC != FALSE)
-tEplKernel EplNmtkDelInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR)
-{
- tEplKernel Ret = kEplSuccessful;
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- // set NMT-State to kEplNmtGsOff
- EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsOff;
-
- // sign instance as unused
- EPL_MCO_WRITE_INSTANCE_STATE(kStateUnused);
-
- // delete timer
-// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
-
- return Ret;
-}
-#endif // (EPL_USE_DELETEINST_FUNC != FALSE)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtkProcess
-//
-// Description: main process function
-// -> process NMT-State-Maschine und read NMT-Events from Queue
-//
-//
-//
-// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR_ = Instance pointer
-// pEvent_p = Epl-Event with NMT-event to process
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtkProcess(EPL_MCO_DECL_PTR_INSTANCE_PTR_ tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
- tEplNmtState OldNmtState;
- tEplNmtEvent NmtEvent;
- tEplEvent Event;
- tEplEventNmtStateChange NmtStateChange;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- Ret = kEplSuccessful;
-
- switch (pEvent_p->m_EventType) {
- case kEplEventTypeNmtEvent:
- {
- NmtEvent = *((tEplNmtEvent *) pEvent_p->m_pArg);
- break;
- }
-
- case kEplEventTypeTimer:
- {
- NmtEvent =
- (tEplNmtEvent) ((tEplTimerEventArg *) pEvent_p->
- m_pArg)->m_ulArg;
- break;
- }
- default:
- {
- Ret = kEplNmtInvalidEvent;
- goto Exit;
- }
- }
-
- // save NMT-State
- // needed for later comparison to
- // inform hgher layer about state change
- OldNmtState = EPL_MCO_GLB_VAR(m_NmtState);
-
- // NMT-State-Maschine
- switch (EPL_MCO_GLB_VAR(m_NmtState)) {
- //-----------------------------------------------------------
- // general part of the statemaschine
-
- // first init of the hardware
- case kEplNmtGsOff:
- {
- // leave this state only if higher layer says so
- if (NmtEvent == kEplNmtEventSwReset) { // new state kEplNmtGsInitialising
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- }
- break;
- }
-
- // first init of the hardware
- case kEplNmtGsInitialising:
- {
- // leave this state only if higher layer says so
-
- // check events
- switch (NmtEvent) {
- // 2006/07/31 d.k.: react also on NMT reset commands in ResetApp state
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // new state kEplNmtGsResetApplication
- case kEplNmtEventEnterResetApp:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- default:
- {
- break;
- }
- }
- break;
- }
-
- // init of the manufacturer-specific profile area and the
- // standardised device profile area
- case kEplNmtGsResetApplication:
- {
- // check events
- switch (NmtEvent) {
- // 2006/07/31 d.k.: react also on NMT reset commands in ResetApp state
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // leave this state only if higher layer
- // say so
- case kEplNmtEventEnterResetCom:
- {
- // new state kEplNmtGsResetCommunication
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- default:
- {
- break;
- }
- }
- break;
- }
-
- // init of the communication profile area
- case kEplNmtGsResetCommunication:
- {
- // check events
- switch (NmtEvent) {
- // 2006/07/31 d.k.: react also on NMT reset commands in ResetComm state
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // leave this state only if higher layer
- // say so
- case kEplNmtEventEnterResetConfig:
- {
- // new state kEplNmtGsResetCommunication
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- default:
- {
- break;
- }
- }
- break;
- }
-
- // build the configuration with infos from OD
- case kEplNmtGsResetConfiguration:
- {
- // reset flags
- EPL_MCO_GLB_VAR(m_fEnableReadyToOperate) = FALSE;
- EPL_MCO_GLB_VAR(m_fAppReadyToOperate) = FALSE;
- EPL_MCO_GLB_VAR(m_fFrozen) = FALSE;
-
- // check events
- switch (NmtEvent) {
- // 2006/07/31 d.k.: react also on NMT reset commands in ResetConf state
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- case kEplNmtEventResetCom:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // leave this state only if higher layer says so
- case kEplNmtEventEnterCsNotActive:
- { // Node should be CN
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsNotActive;
- break;
-
- }
-
- case kEplNmtEventEnterMsNotActive:
- { // Node should be CN
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) == 0)
- // no MN functionality
- // TODO: -create error E_NMT_BA1_NO_MN_SUPPORT
- EPL_MCO_GLB_VAR(m_fFrozen) = TRUE;
-#else
-
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsNotActive;
-#endif
- break;
-
- }
-
- default:
- {
- break;
- }
- }
- break;
- }
-
- //-----------------------------------------------------------
- // CN part of the statemaschine
-
- // node liste for EPL-Frames and check timeout
- case kEplNmtCsNotActive:
- {
-
- // check events
- switch (NmtEvent) {
- // 2006/07/31 d.k.: react also on NMT reset commands in NotActive state
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
-// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
-// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
-// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
- break;
- }
-
- // NMT Command Reset Configuration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
-// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
- break;
- }
-
- // see if SoA or SoC received
- // k.t. 20.07.2006: only SoA forces change of state
- // see EPL V2 DS 1.0.0 p.267
- // case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeSoa:
- { // new state PRE_OPERATIONAL1
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational1;
-// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
- break;
- }
- // timeout for SoA and Soc
- case kEplNmtEventTimerBasicEthernet:
- {
- // new state BASIC_ETHERNET
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsBasicEthernet;
- break;
- }
-
- default:
- {
- break;
- }
- } // end of switch(NmtEvent)
-
- break;
- }
-
- // node processes only async frames
- case kEplNmtCsPreOperational1:
- {
-
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command Reset Configuration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // NMT Command StopNode
- case kEplNmtEventStopNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsStopped;
- break;
- }
-
- // check if SoC received
- case kEplNmtEventDllCeSoc:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational2;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
-
- break;
- }
-
- // node processes isochronous and asynchronous frames
- case kEplNmtCsPreOperational2:
- {
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command Reset Configuration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // NMT Command StopNode
- case kEplNmtEventStopNode:
- {
- // reset flags
- EPL_MCO_GLB_VAR(m_fEnableReadyToOperate)
- = FALSE;
- EPL_MCO_GLB_VAR(m_fAppReadyToOperate) =
- FALSE;
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsStopped;
- break;
- }
-
- // error occured
- case kEplNmtEventNmtCycleError:
- {
- // reset flags
- EPL_MCO_GLB_VAR(m_fEnableReadyToOperate)
- = FALSE;
- EPL_MCO_GLB_VAR(m_fAppReadyToOperate) =
- FALSE;
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational1;
- break;
- }
-
- // check if application is ready to operate
- case kEplNmtEventEnterReadyToOperate:
- {
- // check if command NMTEnableReadyToOperate from MN was received
- if (EPL_MCO_GLB_VAR(m_fEnableReadyToOperate) == TRUE) { // reset flags
- EPL_MCO_GLB_VAR
- (m_fEnableReadyToOperate) =
- FALSE;
- EPL_MCO_GLB_VAR
- (m_fAppReadyToOperate) =
- FALSE;
- // change state
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsReadyToOperate;
- } else { // set Flag
- EPL_MCO_GLB_VAR
- (m_fAppReadyToOperate) =
- TRUE;
- }
- break;
- }
-
- // NMT Commando EnableReadyToOperate
- case kEplNmtEventEnableReadyToOperate:
- {
- // check if application is ready
- if (EPL_MCO_GLB_VAR(m_fAppReadyToOperate) == TRUE) { // reset flags
- EPL_MCO_GLB_VAR
- (m_fEnableReadyToOperate) =
- FALSE;
- EPL_MCO_GLB_VAR
- (m_fAppReadyToOperate) =
- FALSE;
- // change state
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsReadyToOperate;
- } else { // set Flag
- EPL_MCO_GLB_VAR
- (m_fEnableReadyToOperate) =
- TRUE;
- }
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
- break;
- }
-
- // node should be configured und application is ready
- case kEplNmtCsReadyToOperate:
- {
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // NMT Command StopNode
- case kEplNmtEventStopNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsStopped;
- break;
- }
-
- // error occured
- case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational1;
- break;
- }
-
- // NMT Command StartNode
- case kEplNmtEventStartNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsOperational;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
- break;
- }
-
- // normal work state
- case kEplNmtCsOperational:
- {
-
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // NMT Command StopNode
- case kEplNmtEventStopNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsStopped;
- break;
- }
-
- // NMT Command EnterPreOperational2
- case kEplNmtEventEnterPreOperational2:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational2;
- break;
- }
-
- // error occured
- case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational1;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
- break;
- }
-
- // node stopped by MN
- // -> only process asynchronous frames
- case kEplNmtCsStopped:
- {
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // NMT Command EnterPreOperational2
- case kEplNmtEventEnterPreOperational2:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational2;
- break;
- }
-
- // error occured
- case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational1;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
- break;
- }
-
- // no epl cycle
- // -> normal ethernet communication
- case kEplNmtCsBasicEthernet:
- {
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // error occured
- // d.k.: how does this error occur? on CRC errors
-/* case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtCsPreOperational1;
- break;
- }
-*/
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCePreq:
- case kEplNmtEventDllCePres:
- case kEplNmtEventDllCeSoa:
- { // Epl-Frame on net -> stop any communication
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtCsPreOperational1;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
-
- break;
- }
-
- //-----------------------------------------------------------
- // MN part of the statemaschine
-
- // MN listen to network
- // -> if no EPL traffic go to next state
- case kEplNmtMsNotActive:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) == 0)
- // no MN functionality
- // TODO: -create error E_NMT_BA1_NO_MN_SUPPORT
- EPL_MCO_GLB_VAR(m_fFrozen) = TRUE;
-#else
-
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // EPL frames received
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeSoa:
- { // other MN in network
- // $$$ d.k.: generate error history entry
- EPL_MCO_GLB_VAR(m_fFrozen) = TRUE;
- break;
- }
-
- // timeout event
- case kEplNmtEventTimerBasicEthernet:
- {
- if (EPL_MCO_GLB_VAR(m_fFrozen) == FALSE) { // new state BasicEthernet
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsBasicEthernet;
- }
- break;
- }
-
- // timeout event
- case kEplNmtEventTimerMsPreOp1:
- {
- if (EPL_MCO_GLB_VAR(m_fFrozen) == FALSE) { // new state PreOp1
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsPreOperational1;
- EPL_MCO_GLB_VAR
- (m_fTimerMsPreOp2) = FALSE;
- EPL_MCO_GLB_VAR
- (m_fAllMandatoryCNIdent) =
- FALSE;
-
- }
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
-
-#endif // ((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) == 0)
-
- break;
- }
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // MN process reduces epl cycle
- case kEplNmtMsPreOperational1:
- {
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // EPL frames received
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeSoa:
- { // other MN in network
- // $$$ d.k.: generate error history entry
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // error occured
- // d.k. MSPreOp1->CSPreOp1: nonsense -> keep state
- /*
- case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtCsPreOperational1;
- break;
- }
- */
-
- case kEplNmtEventAllMandatoryCNIdent:
- { // all mandatory CN identified
- if (EPL_MCO_GLB_VAR(m_fTimerMsPreOp2) !=
- FALSE) {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsPreOperational2;
- } else {
- EPL_MCO_GLB_VAR
- (m_fAllMandatoryCNIdent) =
- TRUE;
- }
- break;
- }
-
- case kEplNmtEventTimerMsPreOp2:
- { // residence time for PreOp1 is elapsed
- if (EPL_MCO_GLB_VAR
- (m_fAllMandatoryCNIdent) != FALSE) {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsPreOperational2;
- } else {
- EPL_MCO_GLB_VAR
- (m_fTimerMsPreOp2) = TRUE;
- }
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
- break;
- }
-
- // MN process full epl cycle
- case kEplNmtMsPreOperational2:
- {
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // EPL frames received
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeSoa:
- { // other MN in network
- // $$$ d.k.: generate error history entry
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // error occured
- case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsPreOperational1;
- break;
- }
-
- case kEplNmtEventEnterReadyToOperate:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsReadyToOperate;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
-
- break;
- }
-
- // all madatory nodes ready to operate
- // -> MN process full epl cycle
- case kEplNmtMsReadyToOperate:
- {
-
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // EPL frames received
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeSoa:
- { // other MN in network
- // $$$ d.k.: generate error history entry
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // error occured
- case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsPreOperational1;
- break;
- }
-
- case kEplNmtEventEnterMsOperational:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsOperational;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
-
- break;
- }
-
- // normal eplcycle processing
- case kEplNmtMsOperational:
- {
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // EPL frames received
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeSoa:
- { // other MN in network
- // $$$ d.k.: generate error history entry
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // error occured
- case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtMsPreOperational1;
- break;
- }
-
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
- break;
- }
-
- // normal ethernet traffic
- case kEplNmtMsBasicEthernet:
- {
-
- // check events
- switch (NmtEvent) {
- // NMT Command SwitchOff
- case kEplNmtEventCriticalError:
- case kEplNmtEventSwitchOff:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsOff;
- break;
- }
-
- // NMT Command SwReset
- case kEplNmtEventSwReset:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsInitialising;
- break;
- }
-
- // NMT Command ResetNode
- case kEplNmtEventResetNode:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetApplication;
- break;
- }
-
- // NMT Command ResetCommunication
- // or internal Communication error
- case kEplNmtEventResetCom:
- case kEplNmtEventInternComError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // NMT Command ResetConfiguration
- case kEplNmtEventResetConfig:
- {
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetConfiguration;
- break;
- }
-
- // EPL frames received
- case kEplNmtEventDllCeSoc:
- case kEplNmtEventDllCeSoa:
- { // other MN in network
- // $$$ d.k.: generate error history entry
- EPL_MCO_GLB_VAR(m_NmtState) =
- kEplNmtGsResetCommunication;
- break;
- }
-
- // error occured
- // d.k. BE->PreOp1 on cycle error? No
-/* case kEplNmtEventNmtCycleError:
- {
- EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtCsPreOperational1;
- break;
- }
-*/
- default:
- {
- break;
- }
-
- } // end of switch(NmtEvent)
- break;
- }
-#endif //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
- default:
- {
- //DEBUG_EPL_DBGLVL_NMTK_TRACE0(EPL_DBGLVL_NMT ,"Error in EplNmtProcess: Unknown NMT-State");
- //EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsResetApplication;
- Ret = kEplNmtInvalidState;
- goto Exit;
- }
-
- } // end of switch(NmtEvent)
-
- // inform higher layer about State-Change if needed
- if (OldNmtState != EPL_MCO_GLB_VAR(m_NmtState)) {
- EPL_NMTK_DBG_POST_TRACE_VALUE(NmtEvent, OldNmtState,
- EPL_MCO_GLB_VAR(m_NmtState));
-
- // d.k.: memorize NMT state before posting any events
- NmtStateChange.m_NewNmtState = EPL_MCO_GLB_VAR(m_NmtState);
-
- // inform DLL
- if ((OldNmtState > kEplNmtGsResetConfiguration)
- && (EPL_MCO_GLB_VAR(m_NmtState) <=
- kEplNmtGsResetConfiguration)) {
- // send DLL DEINIT
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkDestroy;
- EPL_MEMSET(&Event.m_NetTime, 0x00,
- sizeof(Event.m_NetTime));
- Event.m_pArg = &OldNmtState;
- Event.m_uiSize = sizeof(OldNmtState);
- // d.k.: directly call DLLk process function, because
- // 1. execution of process function is still synchonized and serialized,
- // 2. it is the same as without event queues (i.e. well tested),
- // 3. DLLk will get those necessary events even if event queue is full,
- // 4. event queue is very inefficient
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- Ret = EplDllkProcess(&Event);
-#else
- Ret = EplEventkPost(&Event);
-#endif
- } else if ((OldNmtState <= kEplNmtGsResetConfiguration)
- && (EPL_MCO_GLB_VAR(m_NmtState) >
- kEplNmtGsResetConfiguration)) {
- // send DLL INIT
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkCreate;
- EPL_MEMSET(&Event.m_NetTime, 0x00,
- sizeof(Event.m_NetTime));
- Event.m_pArg = &NmtStateChange.m_NewNmtState;
- Event.m_uiSize = sizeof(NmtStateChange.m_NewNmtState);
- // d.k.: directly call DLLk process function, because
- // 1. execution of process function is still synchonized and serialized,
- // 2. it is the same as without event queues (i.e. well tested),
- // 3. DLLk will get those necessary events even if event queue is full
- // 4. event queue is very inefficient
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- Ret = EplDllkProcess(&Event);
-#else
- Ret = EplEventkPost(&Event);
-#endif
- } else
- if ((EPL_MCO_GLB_VAR(m_NmtState) == kEplNmtCsBasicEthernet)
- || (EPL_MCO_GLB_VAR(m_NmtState) ==
- kEplNmtMsBasicEthernet)) {
- tEplDllAsyncReqPriority AsyncReqPriority;
-
- // send DLL Fill Async Tx Buffer, because state BasicEthernet was entered
- Event.m_EventSink = kEplEventSinkDllk;
- Event.m_EventType = kEplEventTypeDllkFillTx;
- EPL_MEMSET(&Event.m_NetTime, 0x00,
- sizeof(Event.m_NetTime));
- AsyncReqPriority = kEplDllAsyncReqPrioGeneric;
- Event.m_pArg = &AsyncReqPriority;
- Event.m_uiSize = sizeof(AsyncReqPriority);
- // d.k.: directly call DLLk process function, because
- // 1. execution of process function is still synchonized and serialized,
- // 2. it is the same as without event queues (i.e. well tested),
- // 3. DLLk will get those necessary events even if event queue is full
- // 4. event queue is very inefficient
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
- Ret = EplDllkProcess(&Event);
-#else
- Ret = EplEventkPost(&Event);
-#endif
- }
- // inform higher layer about state change
- NmtStateChange.m_NmtEvent = NmtEvent;
- Event.m_EventSink = kEplEventSinkNmtu;
- Event.m_EventType = kEplEventTypeNmtStateChange;
- EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
- Event.m_pArg = &NmtStateChange;
- Event.m_uiSize = sizeof(NmtStateChange);
- Ret = EplEventkPost(&Event);
- EPL_DBGLVL_NMTK_TRACE2
- ("EplNmtkProcess(NMT-Event = 0x%04X): New NMT-State = 0x%03X\n",
- NmtEvent, NmtStateChange.m_NewNmtState);
-
- }
-
- Exit:
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtkGetNmtState
-//
-// Description: return the actuell NMT-State and the bits
-// to for MN- or CN-mode
-//
-//
-//
-// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR_ = Instancepointer
-//
-//
-// Returns: tEplNmtState = NMT-State
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplNmtState EplNmtkGetNmtState(EPL_MCO_DECL_PTR_INSTANCE_PTR)
-{
- tEplNmtState NmtState;
-
- NmtState = EPL_MCO_GLB_VAR(m_NmtState);
-
- return NmtState;
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-EPL_MCO_DECL_INSTANCE_FCT()
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for communication abstraction layer of the
- NMT-Kernel-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: EplNmtkCal.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- KEIL uVision 2
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/16 -k.t.: start of the implementation
-
-****************************************************************************/
-
-// TODO: init function needed to prepare EplNmtkGetNmtState for
-// io-controll-call from EplNmtuCal-Modul
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for NMT-Userspace-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: EplNmtu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/11/10 17:17:42 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "EplInc.h"
-#include "user/EplNmtu.h"
-#include "user/EplObdu.h"
-#include "user/EplTimeru.h"
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
-#include "kernel/EplNmtk.h"
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- tEplNmtuStateChangeCallback m_pfnNmtChangeCb;
- tEplTimerHdl m_TimerHdl;
-
-} tEplNmtuInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static tEplNmtuInstance EplNmtuInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuInit
-//
-// Description: init first instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtuInit(void)
-{
- tEplKernel Ret;
-
- Ret = EplNmtuAddInstance();
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuAddInstance
-//
-// Description: init other instances of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtuAddInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- EplNmtuInstance_g.m_pfnNmtChangeCb = NULL;
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuDelInstance
-//
-// Description: delete instance
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtuDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- EplNmtuInstance_g.m_pfnNmtChangeCb = NULL;
-
- // delete timer
- Ret = EplTimeruDeleteTimer(&EplNmtuInstance_g.m_TimerHdl);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuNmtEvent
-//
-// Description: sends the NMT-Event to the NMT-State-Maschine
-//
-//
-//
-// Parameters: NmtEvent_p = NMT-Event to send
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtuNmtEvent(tEplNmtEvent NmtEvent_p)
-{
- tEplKernel Ret;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkNmtk;
- Event.m_NetTime.m_dwNanoSec = 0;
- Event.m_NetTime.m_dwSec = 0;
- Event.m_EventType = kEplEventTypeNmtEvent;
- Event.m_pArg = &NmtEvent_p;
- Event.m_uiSize = sizeof(NmtEvent_p);
-
- Ret = EplEventuPost(&Event);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuGetNmtState
-//
-// Description: returns the actuell NMT-State
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplNmtState = NMT-State
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplNmtState EplNmtuGetNmtState(void)
-{
- tEplNmtState NmtState;
-
- // $$$ call function of communication abstraction layer
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
- NmtState = EplNmtkGetNmtState();
-#else
- NmtState = 0;
-#endif
-
- return NmtState;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuProcessEvent
-//
-// Description: processes events from event queue
-//
-//
-//
-// Parameters: pEplEvent_p = pointer to event
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtuProcessEvent(tEplEvent *pEplEvent_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // process event
- switch (pEplEvent_p->m_EventType) {
- // state change of NMT-Module
- case kEplEventTypeNmtStateChange:
- {
- tEplEventNmtStateChange *pNmtStateChange;
-
- // delete timer
- Ret =
- EplTimeruDeleteTimer(&EplNmtuInstance_g.m_TimerHdl);
-
- pNmtStateChange =
- (tEplEventNmtStateChange *) pEplEvent_p->m_pArg;
-
- // call cb-functions to inform higher layer
- if (EplNmtuInstance_g.m_pfnNmtChangeCb != NULL) {
- Ret =
- EplNmtuInstance_g.
- m_pfnNmtChangeCb(*pNmtStateChange);
- }
-
- if (Ret == kEplSuccessful) { // everything is OK, so switch to next state if necessary
- switch (pNmtStateChange->m_NewNmtState) {
- // EPL stack is not running
- case kEplNmtGsOff:
- break;
-
- // first init of the hardware
- case kEplNmtGsInitialising:
- {
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterResetApp);
- break;
- }
-
- // init of the manufacturer-specific profile area and the
- // standardised device profile area
- case kEplNmtGsResetApplication:
- {
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterResetCom);
- break;
- }
-
- // init of the communication profile area
- case kEplNmtGsResetCommunication:
- {
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterResetConfig);
- break;
- }
-
- // build the configuration with infos from OD
- case kEplNmtGsResetConfiguration:
- {
- unsigned int uiNodeId;
-
- // get node ID from OD
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
- uiNodeId =
- EplObduGetNodeId
- (EPL_MCO_PTR_INSTANCE_PTR);
-#else
- uiNodeId = 0;
-#endif
- //check node ID if not should be master or slave
- if (uiNodeId == EPL_C_ADR_MN_DEF_NODE_ID) { // node shall be MN
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterMsNotActive);
-#else
- TRACE0
- ("EplNmtuProcess(): no MN functionality implemented\n");
-#endif
- } else { // node shall be CN
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterCsNotActive);
- }
- break;
- }
-
- //-----------------------------------------------------------
- // CN part of the state machine
-
- // node listens for EPL-Frames and check timeout
- case kEplNmtCsNotActive:
- {
- u32 dwBuffer;
- tEplObdSize ObdSize;
- tEplTimerArg TimerArg;
-
- // create timer to switch automatically to BasicEthernet if no MN available in network
-
- // read NMT_CNBasicEthernetTimerout_U32 from OD
- ObdSize = sizeof(dwBuffer);
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
- Ret =
- EplObduReadEntry
- (EPL_MCO_PTR_INSTANCE_PTR_
- 0x1F99, 0x00, &dwBuffer,
- &ObdSize);
-#else
- Ret = kEplObdIndexNotExist;
-#endif
- if (Ret != kEplSuccessful) {
- break;
- }
- if (dwBuffer != 0) { // BasicEthernet is enabled
- // convert us into ms
- dwBuffer =
- dwBuffer / 1000;
- if (dwBuffer == 0) { // timer was below one ms
- // set one ms
- dwBuffer = 1;
- }
- TimerArg.m_EventSink =
- kEplEventSinkNmtk;
- TimerArg.m_ulArg =
- (unsigned long)
- kEplNmtEventTimerBasicEthernet;
- Ret =
- EplTimeruModifyTimerMs
- (&EplNmtuInstance_g.
- m_TimerHdl,
- (unsigned long)
- dwBuffer,
- TimerArg);
- // potential error is forwarded to event queue which generates error event
- }
- break;
- }
-
- // node processes only async frames
- case kEplNmtCsPreOperational1:
- {
- break;
- }
-
- // node processes isochronous and asynchronous frames
- case kEplNmtCsPreOperational2:
- {
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventEnterReadyToOperate);
- break;
- }
-
- // node should be configured und application is ready
- case kEplNmtCsReadyToOperate:
- {
- break;
- }
-
- // normal work state
- case kEplNmtCsOperational:
- {
- break;
- }
-
- // node stopped by MN
- // -> only process asynchronous frames
- case kEplNmtCsStopped:
- {
- break;
- }
-
- // no EPL cycle
- // -> normal ethernet communication
- case kEplNmtCsBasicEthernet:
- {
- break;
- }
-
- //-----------------------------------------------------------
- // MN part of the state machine
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // node listens for EPL-Frames and check timeout
- case kEplNmtMsNotActive:
- {
- u32 dwBuffer;
- tEplObdSize ObdSize;
- tEplTimerArg TimerArg;
-
- // create timer to switch automatically to BasicEthernet/PreOp1 if no other MN active in network
-
- // check NMT_StartUp_U32.Bit13
- // read NMT_StartUp_U32 from OD
- ObdSize = sizeof(dwBuffer);
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
- Ret =
- EplObduReadEntry
- (EPL_MCO_PTR_INSTANCE_PTR_
- 0x1F80, 0x00, &dwBuffer,
- &ObdSize);
-#else
- Ret = kEplObdIndexNotExist;
-#endif
- if (Ret != kEplSuccessful) {
- break;
- }
-
- if ((dwBuffer & EPL_NMTST_BASICETHERNET) == 0) { // NMT_StartUp_U32.Bit13 == 0
- // new state PreOperational1
- TimerArg.m_ulArg =
- (unsigned long)
- kEplNmtEventTimerMsPreOp1;
- } else { // NMT_StartUp_U32.Bit13 == 1
- // new state BasicEthernet
- TimerArg.m_ulArg =
- (unsigned long)
- kEplNmtEventTimerBasicEthernet;
- }
-
- // read NMT_BootTime_REC.MNWaitNotAct_U32 from OD
- ObdSize = sizeof(dwBuffer);
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
- Ret =
- EplObduReadEntry
- (EPL_MCO_PTR_INSTANCE_PTR_
- 0x1F89, 0x01, &dwBuffer,
- &ObdSize);
-#else
- Ret = kEplObdIndexNotExist;
-#endif
- if (Ret != kEplSuccessful) {
- break;
- }
- // convert us into ms
- dwBuffer = dwBuffer / 1000;
- if (dwBuffer == 0) { // timer was below one ms
- // set one ms
- dwBuffer = 1;
- }
- TimerArg.m_EventSink =
- kEplEventSinkNmtk;
- Ret =
- EplTimeruModifyTimerMs
- (&EplNmtuInstance_g.
- m_TimerHdl,
- (unsigned long)dwBuffer,
- TimerArg);
- // potential error is forwarded to event queue which generates error event
- break;
- }
-
- // node processes only async frames
- case kEplNmtMsPreOperational1:
- {
- u32 dwBuffer = 0;
- tEplObdSize ObdSize;
- tEplTimerArg TimerArg;
-
- // create timer to switch automatically to PreOp2 if MN identified all mandatory CNs
-
- // read NMT_BootTime_REC.MNWaitPreOp1_U32 from OD
- ObdSize = sizeof(dwBuffer);
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
- Ret =
- EplObduReadEntry
- (EPL_MCO_PTR_INSTANCE_PTR_
- 0x1F89, 0x03, &dwBuffer,
- &ObdSize);
- if (Ret != kEplSuccessful) {
- // ignore error, because this timeout is optional
- dwBuffer = 0;
- }
-#endif
- if (dwBuffer == 0) { // delay is deactivated
- // immediately post timer event
- Ret =
- EplNmtuNmtEvent
- (kEplNmtEventTimerMsPreOp2);
- break;
- }
- // convert us into ms
- dwBuffer = dwBuffer / 1000;
- if (dwBuffer == 0) { // timer was below one ms
- // set one ms
- dwBuffer = 1;
- }
- TimerArg.m_EventSink =
- kEplEventSinkNmtk;
- TimerArg.m_ulArg =
- (unsigned long)
- kEplNmtEventTimerMsPreOp2;
- Ret =
- EplTimeruModifyTimerMs
- (&EplNmtuInstance_g.
- m_TimerHdl,
- (unsigned long)dwBuffer,
- TimerArg);
- // potential error is forwarded to event queue which generates error event
- break;
- }
-
- // node processes isochronous and asynchronous frames
- case kEplNmtMsPreOperational2:
- {
- break;
- }
-
- // node should be configured und application is ready
- case kEplNmtMsReadyToOperate:
- {
- break;
- }
-
- // normal work state
- case kEplNmtMsOperational:
- {
- break;
- }
-
- // no EPL cycle
- // -> normal ethernet communication
- case kEplNmtMsBasicEthernet:
- {
- break;
- }
-#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
- default:
- {
- TRACE1
- ("EplNmtuProcess(): unhandled NMT state 0x%X\n",
- pNmtStateChange->
- m_NewNmtState);
- }
- }
- } else if (Ret == kEplReject) { // application wants to change NMT state itself
- // it's OK
- Ret = kEplSuccessful;
- }
-
- EPL_DBGLVL_NMTU_TRACE0
- ("EplNmtuProcessEvent(): NMT-State-Maschine announce change of NMT State\n");
- break;
- }
-
- default:
- {
- Ret = kEplNmtInvalidEvent;
- }
-
- }
-
-//Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtuRegisterStateChangeCb
-//
-// Description: register Callback-function go get informed about a
-// NMT-Change-State-Event
-//
-//
-//
-// Parameters: pfnEplNmtStateChangeCb_p = functionpointer
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplNmtuRegisterStateChangeCb(tEplNmtuStateChangeCallback pfnEplNmtStateChangeCb_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // save callback-function in modul global var
- EplNmtuInstance_g.m_pfnNmtChangeCb = pfnEplNmtStateChangeCb_p;
-
- return Ret;
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for communication abstraction layer of the
- NMT-Userspace-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: EplNmtuCal.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- KEIL uVision 2
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/16 -k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplNmtuCal.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplNmtkCalGetNmtState
-//
-// Description: return current NMT-State
-// -> encapsulate access to kernelspace
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplNmtState = current NMT-State
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplNmtState EplNmtkCalGetNmtState(void)
-{
- tEplNmtState NmtState;
- // for test direkt call for EplNmtkGetNmtState()
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
- NmtState = EplNmtkGetNmtState();
-#else
- NmtState = 0;
-#endif
- return NmtState;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for api function of EplOBD-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: EplObd.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.12 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- Microsoft VC7
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/02 k.t.: start of the implementation, version 1.00
- ->based on CANopen OBD-Modul
-
-****************************************************************************/
-
-#include "EplInc.h"
-#include "kernel/EplObdk.h" // function prototyps of the EplOBD-Modul
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// float definitions and macros
-#define _SHIFTED_EXPONENT_MASK_SP 0xff
-#define _BIAS_SP 126
-#define T_SP 23
-#define EXPONENT_DENORM_SP (-_BIAS_SP)
-#define BASE_TO_THE_T_SP ((float) 8388608.0)
-#define GET_EXPONENT_SP(x) ((((x) >> T_SP) & _SHIFTED_EXPONENT_MASK_SP) - _BIAS_SP)
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-// struct for instance table
-INSTANCE_TYPE_BEGIN EPL_MCO_DECL_INSTANCE_MEMBER()
-
-STATIC tEplObdInitParam m_ObdInitParam;
-STATIC tEplObdStoreLoadObjCallback m_fpStoreLoadObjCallback;
-
-INSTANCE_TYPE_END
-// decomposition of float
-typedef union {
- tEplObdReal32 m_flRealPart;
- int m_nIntegerPart;
-
-} tEplObdRealParts;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-// This macro replace the unspecific pointer to an instance through
-// the modul specific type for the local instance table. This macro
-// must defined in each modul.
-//#define tEplPtrInstance tEplInstanceInfo *
-
-EPL_MCO_DECL_INSTANCE_VAR()
-
-u8 abEplObdTrashObject_g[8];
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-EPL_MCO_DEFINE_INSTANCE_FCT()
-
-static tEplKernel EplObdCallObjectCallback(EPL_MCO_DECL_INSTANCE_PTR_
- tEplObdCallback fpCallback_p,
- tEplObdCbParam *pCbParam_p);
-
-static tEplObdSize EplObdGetDataSizeIntern(tEplObdSubEntryPtr pSubIndexEntry_p);
-
-static tEplObdSize EplObdGetStrLen(void *pObjData_p,
- tEplObdSize ObjLen_p, tEplObdType ObjType_p);
-
-#if (EPL_OBD_CHECK_OBJECT_RANGE != FALSE)
-static tEplKernel EplObdCheckObjectRange(tEplObdSubEntryPtr pSubindexEntry_p,
- void *pData_p);
-#endif
-
-static tEplKernel EplObdGetVarEntry(tEplObdSubEntryPtr pSubindexEntry_p,
- tEplObdVarEntry **ppVarEntry_p);
-
-static tEplKernel EplObdGetEntry(EPL_MCO_DECL_INSTANCE_PTR_
- unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdEntryPtr * ppObdEntry_p,
- tEplObdSubEntryPtr * ppObdSubEntry_p);
-
-static tEplObdSize EplObdGetObjectSize(tEplObdSubEntryPtr pSubIndexEntry_p);
-
-static tEplKernel EplObdGetIndexIntern(tEplObdInitParam *pInitParam_p,
- unsigned int uiIndex_p,
- tEplObdEntryPtr * ppObdEntry_p);
-
-static tEplKernel EplObdGetSubindexIntern(tEplObdEntryPtr pObdEntry_p,
- unsigned int uiSubIndex_p,
- tEplObdSubEntryPtr * ppObdSubEntry_p);
-
-static tEplKernel EplObdAccessOdPartIntern(EPL_MCO_DECL_INSTANCE_PTR_
- tEplObdPart CurrentOdPart_p,
- tEplObdEntryPtr pObdEnty_p,
- tEplObdDir Direction_p);
-
-static void *EplObdGetObjectDefaultPtr(tEplObdSubEntryPtr pSubIndexEntry_p);
-static void *EplObdGetObjectCurrentPtr(tEplObdSubEntryPtr pSubIndexEntry_p);
-
-#if (EPL_OBD_USE_STORE_RESTORE != FALSE)
-
-static tEplKernel EplObdCallStoreCallback(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdCbStoreParam *pCbStoreParam_p);
-
-#endif // (EPL_OBD_USE_STORE_RESTORE != FALSE)
-
-static void EplObdCopyObjectData(void *pDstData_p,
- void *pSrcData_p,
- tEplObdSize ObjSize_p, tEplObdType ObjType_p);
-
-void *EplObdGetObjectDataPtrIntern(tEplObdSubEntryPtr pSubindexEntry_p);
-
-static tEplKernel EplObdIsNumericalIntern(tEplObdSubEntryPtr pObdSubEntry_p,
- BOOL * pfEntryNumerical_p);
-
-static tEplKernel EplObdWriteEntryPre(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p,
- void **ppDstData_p,
- tEplObdSize Size_p,
- tEplObdEntryPtr *ppObdEntry_p,
- tEplObdSubEntryPtr *ppSubEntry_p,
- tEplObdCbParam *pCbParam_p,
- tEplObdSize *pObdSize_p);
-
-static tEplKernel EplObdWriteEntryPost(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdEntryPtr pObdEntry_p,
- tEplObdSubEntryPtr pSubEntry_p,
- tEplObdCbParam *pCbParam_p,
- void *pSrcData_p,
- void *pDstData_p,
- tEplObdSize ObdSize_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdInit()
-//
-// Description: initializes the first instance
-//
-// Parameters: pInitParam_p = init parameter
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplObdInit(EPL_MCO_DECL_PTR_INSTANCE_PTR_ tEplObdInitParam *pInitParam_p)
-{
-
- tEplKernel Ret;
- EPL_MCO_DELETE_INSTANCE_TABLE();
-
- if (pInitParam_p == NULL) {
- Ret = kEplSuccessful;
- goto Exit;
- }
-
- Ret = EplObdAddInstance(EPL_MCO_PTR_INSTANCE_PTR_ pInitParam_p);
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdAddInstance()
-//
-// Description: adds a new instance
-//
-// Parameters: pInitParam_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplObdAddInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR_ tEplObdInitParam *pInitParam_p)
-{
-
- EPL_MCO_DECL_INSTANCE_PTR_LOCAL tEplKernel Ret;
-
- // check if pointer to instance pointer valid
- // get free instance and set the globale instance pointer
- // set also the instance addr to parameterlist
- EPL_MCO_CHECK_PTR_INSTANCE_PTR();
- EPL_MCO_GET_FREE_INSTANCE_PTR();
- EPL_MCO_SET_PTR_INSTANCE_PTR();
-
- // save init parameters
- EPL_MEMCPY(&EPL_MCO_GLB_VAR(m_ObdInitParam), pInitParam_p,
- sizeof(tEplObdInitParam));
-
- // clear callback function for command LOAD and STORE
- EPL_MCO_GLB_VAR(m_fpStoreLoadObjCallback) = NULL;
-
- // sign instance as used
- EPL_MCO_WRITE_INSTANCE_STATE(kStateUsed);
-
- // initialize object dictionary
- // so all all VarEntries will be initialized to trash object and default values will be set to current data
- Ret = EplObdAccessOdPart(EPL_MCO_INSTANCE_PTR_
- kEplObdPartAll, kEplObdDirInit);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdDeleteInstance()
-//
-// Description: delete instance
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if (EPL_USE_DELETEINST_FUNC != FALSE)
-tEplKernel EplObdDeleteInstance(EPL_MCO_DECL_INSTANCE_PTR)
-{
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- // sign instance as unused
- EPL_MCO_WRITE_INSTANCE_STATE(kStateUnused);
-
- return kEplSuccessful;
-
-}
-#endif // (EPL_USE_DELETEINST_FUNC != FALSE)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdWriteEntry()
-//
-// Description: Function writes data to an OBD entry. Strings
-// are stored with added '\0' character.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplObdWriteEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p)
-{
-
- tEplKernel Ret;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pSubEntry;
- tEplObdCbParam CbParam;
- void *pDstData;
- tEplObdSize ObdSize;
-
- Ret = EplObdWriteEntryPre(EPL_MCO_INSTANCE_PTR_
- uiIndex_p,
- uiSubIndex_p,
- pSrcData_p,
- &pDstData,
- Size_p,
- &pObdEntry, &pSubEntry, &CbParam, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret = EplObdWriteEntryPost(EPL_MCO_INSTANCE_PTR_
- pObdEntry,
- pSubEntry,
- &CbParam, pSrcData_p, pDstData, ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdReadEntry()
-//
-// Description: The function reads an object entry. The application
-// can always read the data even if attrib kEplObdAccRead
-// is not set. The attrib is only checked up for SDO transfer.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index oof the OD entry to read
-// uiSubIndex_p = Subindex to read
-// pDstData_p = pointer to the buffer for data
-// Offset_p = offset in data for read access
-// pSize_p = IN: Size of the buffer
-// OUT: number of readed Bytes
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplObdReadEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p, tEplObdSize *pSize_p)
-{
-
- tEplKernel Ret;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pSubEntry;
- tEplObdCbParam CbParam;
- void *pSrcData;
- tEplObdSize ObdSize;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- ASSERT(pDstData_p != NULL);
- ASSERT(pSize_p != NULL);
-
- // get address of index and subindex entry
- Ret = EplObdGetEntry(EPL_MCO_INSTANCE_PTR_
- uiIndex_p, uiSubIndex_p, &pObdEntry, &pSubEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get pointer to object data
- pSrcData = EplObdGetObjectDataPtrIntern(pSubEntry);
-
- // check source pointer
- if (pSrcData == NULL) {
- Ret = kEplObdReadViolation;
- goto Exit;
- }
- //------------------------------------------------------------------------
- // address of source data to structure of callback parameters
- // so callback function can change this data before reading
- CbParam.m_uiIndex = uiIndex_p;
- CbParam.m_uiSubIndex = uiSubIndex_p;
- CbParam.m_pArg = pSrcData;
- CbParam.m_ObdEvent = kEplObdEvPreRead;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry->m_fpCallback, &CbParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get size of data and check if application has reserved enough memory
- ObdSize = EplObdGetDataSizeIntern(pSubEntry);
- // check if offset given and calc correct number of bytes to read
- if (*pSize_p < ObdSize) {
- Ret = kEplObdValueLengthError;
- goto Exit;
- }
- // read value from object
- EPL_MEMCPY(pDstData_p, pSrcData, ObdSize);
- *pSize_p = ObdSize;
-
- // write address of destination data to structure of callback parameters
- // so callback function can change this data after reading
- CbParam.m_pArg = pDstData_p;
- CbParam.m_ObdEvent = kEplObdEvPostRead;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry->m_fpCallback, &CbParam);
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdAccessOdPart()
-//
-// Description: restores default values of one part of OD
-//
-// Parameters: ObdPart_p
-// Direction_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplObdAccessOdPart(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdPart ObdPart_p,
- tEplObdDir Direction_p)
-{
-
- tEplKernel Ret = kEplSuccessful;
- BOOL fPartFount;
- tEplObdEntryPtr pObdEntry;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- // part always has to be unequal to NULL
- pObdEntry = EPL_MCO_GLB_VAR(m_ObdInitParam.m_pPart);
- ASSERTMSG(pObdEntry != NULL,
- "EplObdAccessOdPart(): no OD part is defined!\n");
-
- // if ObdPart_p is not valid fPartFound keeps FALSE and function returns kEplObdIllegalPart
- fPartFount = FALSE;
-
- // access to part
- if ((ObdPart_p & kEplObdPartGen) != 0) {
- fPartFount = TRUE;
-
- Ret = EplObdAccessOdPartIntern(EPL_MCO_INSTANCE_PTR_
- kEplObdPartGen, pObdEntry,
- Direction_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
- // access to manufacturer part
- pObdEntry = EPL_MCO_GLB_VAR(m_ObdInitParam.m_pManufacturerPart);
-
- if (((ObdPart_p & kEplObdPartMan) != 0) && (pObdEntry != NULL)) {
- fPartFount = TRUE;
-
- Ret = EplObdAccessOdPartIntern(EPL_MCO_INSTANCE_PTR_
- kEplObdPartMan, pObdEntry,
- Direction_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
- // access to device part
- pObdEntry = EPL_MCO_GLB_VAR(m_ObdInitParam.m_pDevicePart);
-
- if (((ObdPart_p & kEplObdPartDev) != 0) && (pObdEntry != NULL)) {
- fPartFount = TRUE;
-
- Ret = EplObdAccessOdPartIntern(EPL_MCO_INSTANCE_PTR_
- kEplObdPartDev, pObdEntry,
- Direction_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
- {
- // access to user part
- pObdEntry = EPL_MCO_GLB_VAR(m_ObdInitParam.m_pUserPart);
-
- if (((ObdPart_p & kEplObdPartUsr) != 0) && (pObdEntry != NULL)) {
- fPartFount = TRUE;
-
- Ret = EplObdAccessOdPartIntern(EPL_MCO_INSTANCE_PTR_
- kEplObdPartUsr,
- pObdEntry, Direction_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
- }
-#endif
-
- // no access to an OD part was done? illegal OD part was specified!
- if (fPartFount == FALSE) {
- Ret = kEplObdIllegalPart;
- }
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdDefineVar()
-//
-// Description: defines a variable in OD
-//
-// Parameters: pEplVarParam_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplObdDefineVar(EPL_MCO_DECL_INSTANCE_PTR_ tEplVarParam *pVarParam_p)
-{
-
- tEplKernel Ret;
- tEplObdVarEntry *pVarEntry;
- tEplVarParamValid VarValid;
- tEplObdSubEntryPtr pSubindexEntry;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- ASSERT(pVarParam_p != NULL); // is not allowed to be NULL
-
- // get address of subindex entry
- Ret = EplObdGetEntry(EPL_MCO_INSTANCE_PTR_
- pVarParam_p->m_uiIndex,
- pVarParam_p->m_uiSubindex, NULL, &pSubindexEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get var entry
- Ret = EplObdGetVarEntry(pSubindexEntry, &pVarEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- VarValid = pVarParam_p->m_ValidFlag;
-
- // copy only this values, which valid flag is set
- if ((VarValid & kVarValidSize) != 0) {
- if (pSubindexEntry->m_Type != kEplObdTypDomain) {
- tEplObdSize DataSize;
-
- // check passed size parameter
- DataSize = EplObdGetObjectSize(pSubindexEntry);
- if (DataSize != pVarParam_p->m_Size) { // size of variable does not match
- Ret = kEplObdValueLengthError;
- goto Exit;
- }
- } else { // size can be set only for objects of type DOMAIN
- pVarEntry->m_Size = pVarParam_p->m_Size;
- }
- }
-
- if ((VarValid & kVarValidData) != 0) {
- pVarEntry->m_pData = pVarParam_p->m_pData;
- }
-/*
- #if (EPL_PDO_USE_STATIC_MAPPING == FALSE)
- {
- if ((VarValid & kVarValidCallback) != 0)
- {
- pVarEntry->m_fpCallback = pVarParam_p->m_fpCallback;
- }
-
- if ((VarValid & kVarValidArg) != 0)
- {
- pVarEntry->m_pArg = pVarParam_p->m_pArg;
- }
- }
- #endif
-*/
- // Ret is already set to kEplSuccessful from ObdGetVarIntern()
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetObjectDataPtr()
-//
-// Description: It returnes the current data pointer. But if object is an
-// constant object it returnes the default pointer.
-//
-// Parameters: uiIndex_p = Index of the entry
-// uiSubindex_p = Subindex of the entry
-//
-// Return: void * = pointer to object data
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-void *EplObdGetObjectDataPtr(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p)
-{
- tEplKernel Ret;
- void *pData;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pObdSubEntry;
-
- // get pointer to index structure
- Ret = EplObdGetIndexIntern(&EPL_MCO_GLB_VAR(m_ObdInitParam),
- uiIndex_p, &pObdEntry);
- if (Ret != kEplSuccessful) {
- pData = NULL;
- goto Exit;
- }
- // get pointer to subindex structure
- Ret = EplObdGetSubindexIntern(pObdEntry, uiSubIndex_p, &pObdSubEntry);
- if (Ret != kEplSuccessful) {
- pData = NULL;
- goto Exit;
- }
- // get Datapointer
- pData = EplObdGetObjectDataPtrIntern(pObdSubEntry);
-
- Exit:
- return pData;
-
-}
-
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdRegisterUserOd()
-//
-// Description: function registers the user OD
-//
-// Parameters: pUserOd_p =pointer to user ODd
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObdRegisterUserOd(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdEntryPtr pUserOd_p)
-{
-
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- EPL_MCO_GLB_VAR(m_ObdInitParam.m_pUserPart) = pUserOd_p;
-
- return kEplSuccessful;
-
-}
-
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdInitVarEntry()
-//
-// Description: function to initialize VarEntry dependened on object type
-//
-// Parameters: pVarEntry_p = pointer to var entry structure
-// Type_p = object type
-// ObdSize_p = size of object data
-//
-// Returns: none
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-void EplObdInitVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdVarEntry *pVarEntry_p,
- tEplObdType Type_p, tEplObdSize ObdSize_p)
-{
-/*
- #if (EPL_PDO_USE_STATIC_MAPPING == FALSE)
- {
- // reset pointer to VAR callback and argument
- pVarEntry_p->m_fpCallback = NULL;
- pVarEntry_p->m_pArg = NULL;
- }
- #endif
-*/
-
-// 10-dec-2004 r.d.: this function will not be used for strings
- if ((Type_p == kEplObdTypDomain))
-// (bType_p == kEplObdTypVString) /* ||
-// (bType_p == kEplObdTypOString) ||
-// (bType_p == kEplObdTypUString) */ )
- {
- // variables which are defined as DOMAIN or VSTRING should not point to
- // trash object, because this trash object contains only 8 bytes. DOMAINS or
- // STRINGS can be longer.
- pVarEntry_p->m_pData = NULL;
- pVarEntry_p->m_Size = 0;
- } else {
- // set address to variable data to trash object
- // This prevents an access violation if user forgets to call EplObdDefineVar()
- // for this variable but mappes it in a PDO.
- pVarEntry_p->m_pData = &abEplObdTrashObject_g[0];
- pVarEntry_p->m_Size = ObdSize_p;
- }
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetDataSize()
-//
-// Description: function to initialize VarEntry dependened on object type
-//
-// gets the data size of an object
-// for string objects it returnes the string length
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_ = Instancepointer
-// uiIndex_p = Index
-// uiSubIndex_p= Subindex
-//
-// Return: tEplObdSize
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplObdSize EplObdGetDataSize(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p)
-{
- tEplKernel Ret;
- tEplObdSize ObdSize;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pObdSubEntry;
-
- // get pointer to index structure
- Ret = EplObdGetIndexIntern(&EPL_MCO_GLB_VAR(m_ObdInitParam),
- uiIndex_p, &pObdEntry);
- if (Ret != kEplSuccessful) {
- ObdSize = 0;
- goto Exit;
- }
- // get pointer to subindex structure
- Ret = EplObdGetSubindexIntern(pObdEntry, uiSubIndex_p, &pObdSubEntry);
- if (Ret != kEplSuccessful) {
- ObdSize = 0;
- goto Exit;
- }
- // get size
- ObdSize = EplObdGetDataSizeIntern(pObdSubEntry);
- Exit:
- return ObdSize;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetNodeId()
-//
-// Description: function returns nodeid from entry 0x1F93
-//
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR = Instancepointer
-//
-// Return: unsigned int = Node Id
-//
-// State:
-//
-//---------------------------------------------------------------------------
-unsigned int EplObdGetNodeId(EPL_MCO_DECL_INSTANCE_PTR)
-{
- tEplKernel Ret;
- tEplObdSize ObdSize;
- u8 bNodeId;
-
- bNodeId = 0;
- ObdSize = sizeof(bNodeId);
- Ret = EplObdReadEntry(EPL_MCO_PTR_INSTANCE_PTR_
- EPL_OBD_NODE_ID_INDEX,
- EPL_OBD_NODE_ID_SUBINDEX, &bNodeId, &ObdSize);
- if (Ret != kEplSuccessful) {
- bNodeId = EPL_C_ADR_INVALID;
- goto Exit;
- }
-
- Exit:
- return (unsigned int)bNodeId;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdSetNodeId()
-//
-// Description: function sets nodeid in entry 0x1F93
-//
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_ = Instancepointer
-// uiNodeId_p = Node Id to set
-// NodeIdType_p= Type on which way the Node Id was set
-//
-// Return: tEplKernel = Errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObdSetNodeId(EPL_MCO_DECL_PTR_INSTANCE_PTR_ unsigned int uiNodeId_p,
- tEplObdNodeIdType NodeIdType_p)
-{
- tEplKernel Ret;
- tEplObdSize ObdSize;
- u8 fHwBool;
- u8 bNodeId;
-
- // check Node Id
- if (uiNodeId_p == EPL_C_ADR_INVALID) {
- Ret = kEplInvalidNodeId;
- goto Exit;
- }
- bNodeId = (u8) uiNodeId_p;
- ObdSize = sizeof(u8);
- // write NodeId to OD entry
- Ret = EplObdWriteEntry(EPL_MCO_PTR_INSTANCE_PTR_
- EPL_OBD_NODE_ID_INDEX,
- EPL_OBD_NODE_ID_SUBINDEX, &bNodeId, ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // set HWBOOL-Flag in Subindex EPL_OBD_NODE_ID_HWBOOL_SUBINDEX
- switch (NodeIdType_p) {
- // type unknown
- case kEplObdNodeIdUnknown:
- {
- fHwBool = OBD_FALSE;
- break;
- }
-
- case kEplObdNodeIdSoftware:
- {
- fHwBool = OBD_FALSE;
- break;
- }
-
- case kEplObdNodeIdHardware:
- {
- fHwBool = OBD_TRUE;
- break;
- }
-
- default:
- {
- fHwBool = OBD_FALSE;
- }
-
- } // end of switch (NodeIdType_p)
-
- // write flag
- ObdSize = sizeof(fHwBool);
- Ret = EplObdWriteEntry(EPL_MCO_PTR_INSTANCE_PTR
- EPL_OBD_NODE_ID_INDEX,
- EPL_OBD_NODE_ID_HWBOOL_SUBINDEX,
- &fHwBool, ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdIsNumerical()
-//
-// Description: function checks if a entry is numerical or not
-//
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_ = Instancepointer
-// uiIndex_p = Index
-// uiSubIndex_p = Subindex
-// pfEntryNumerical_p = pointer to BOOL for returnvalue
-// -> TRUE if entry a numerical value
-// -> FALSE if entry not a numerical value
-//
-// Return: tEplKernel = Errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObdIsNumerical(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- BOOL *pfEntryNumerical_p)
-{
- tEplKernel Ret;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pObdSubEntry;
-
- // get pointer to index structure
- Ret = EplObdGetIndexIntern(&EPL_MCO_GLB_VAR(m_ObdInitParam),
- uiIndex_p, &pObdEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get pointer to subindex structure
- Ret = EplObdGetSubindexIntern(pObdEntry, uiSubIndex_p, &pObdSubEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Ret = EplObdIsNumericalIntern(pObdSubEntry, pfEntryNumerical_p);
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdReadEntryToLe()
-//
-// Description: The function reads an object entry from the byteoder
-// of the system to the little endian byteorder for numerical values.
-// For other types a normal read will be processed. This is usefull for
-// the PDO and SDO module. The application
-// can always read the data even if attrib kEplObdAccRead
-// is not set. The attrib is only checked up for SDO transfer.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry to read
-// uiSubIndex_p = Subindex to read
-// pDstData_p = pointer to the buffer for data
-// Offset_p = offset in data for read access
-// pSize_p = IN: Size of the buffer
-// OUT: number of readed Bytes
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObdReadEntryToLe(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p, tEplObdSize *pSize_p)
-{
- tEplKernel Ret;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pSubEntry;
- tEplObdCbParam CbParam;
- void *pSrcData;
- tEplObdSize ObdSize;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- ASSERT(pDstData_p != NULL);
- ASSERT(pSize_p != NULL);
-
- // get address of index and subindex entry
- Ret = EplObdGetEntry(EPL_MCO_INSTANCE_PTR_
- uiIndex_p, uiSubIndex_p, &pObdEntry, &pSubEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get pointer to object data
- pSrcData = EplObdGetObjectDataPtrIntern(pSubEntry);
-
- // check source pointer
- if (pSrcData == NULL) {
- Ret = kEplObdReadViolation;
- goto Exit;
- }
- //------------------------------------------------------------------------
- // address of source data to structure of callback parameters
- // so callback function can change this data before reading
- CbParam.m_uiIndex = uiIndex_p;
- CbParam.m_uiSubIndex = uiSubIndex_p;
- CbParam.m_pArg = pSrcData;
- CbParam.m_ObdEvent = kEplObdEvPreRead;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry->m_fpCallback, &CbParam);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get size of data and check if application has reserved enough memory
- ObdSize = EplObdGetDataSizeIntern(pSubEntry);
- // check if offset given and calc correct number of bytes to read
- if (*pSize_p < ObdSize) {
- Ret = kEplObdValueLengthError;
- goto Exit;
- }
- // check if numerical type
- switch (pSubEntry->m_Type) {
- //-----------------------------------------------
- // types without ami
- case kEplObdTypVString:
- case kEplObdTypOString:
- case kEplObdTypDomain:
- default:
- {
- // read value from object
- EPL_MEMCPY(pDstData_p, pSrcData, ObdSize);
- break;
- }
-
- //-----------------------------------------------
- // numerical type which needs ami-write
- // 8 bit or smaller values
- case kEplObdTypBool:
- case kEplObdTypInt8:
- case kEplObdTypUInt8:
- {
- AmiSetByteToLe(pDstData_p, *((u8 *) pSrcData));
- break;
- }
-
- // 16 bit values
- case kEplObdTypInt16:
- case kEplObdTypUInt16:
- {
- AmiSetWordToLe(pDstData_p, *((u16 *) pSrcData));
- break;
- }
-
- // 24 bit values
- case kEplObdTypInt24:
- case kEplObdTypUInt24:
- {
- AmiSetDword24ToLe(pDstData_p, *((u32 *) pSrcData));
- break;
- }
-
- // 32 bit values
- case kEplObdTypInt32:
- case kEplObdTypUInt32:
- case kEplObdTypReal32:
- {
- AmiSetDwordToLe(pDstData_p, *((u32 *) pSrcData));
- break;
- }
-
- // 40 bit values
- case kEplObdTypInt40:
- case kEplObdTypUInt40:
- {
- AmiSetQword40ToLe(pDstData_p, *((u64 *) pSrcData));
- break;
- }
-
- // 48 bit values
- case kEplObdTypInt48:
- case kEplObdTypUInt48:
- {
- AmiSetQword48ToLe(pDstData_p, *((u64 *) pSrcData));
- break;
- }
-
- // 56 bit values
- case kEplObdTypInt56:
- case kEplObdTypUInt56:
- {
- AmiSetQword56ToLe(pDstData_p, *((u64 *) pSrcData));
- break;
- }
-
- // 64 bit values
- case kEplObdTypInt64:
- case kEplObdTypUInt64:
- case kEplObdTypReal64:
- {
- AmiSetQword64ToLe(pDstData_p, *((u64 *) pSrcData));
- break;
- }
-
- // time of day
- case kEplObdTypTimeOfDay:
- case kEplObdTypTimeDiff:
- {
- AmiSetTimeOfDay(pDstData_p, ((tTimeOfDay *) pSrcData));
- break;
- }
-
- } // end of switch(pSubEntry->m_Type)
-
- *pSize_p = ObdSize;
-
- // write address of destination data to structure of callback parameters
- // so callback function can change this data after reading
- CbParam.m_pArg = pDstData_p;
- CbParam.m_ObdEvent = kEplObdEvPostRead;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry->m_fpCallback, &CbParam);
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdWriteEntryFromLe()
-//
-// Description: Function writes data to an OBD entry from a source with
-// little endian byteorder to the od with system specuific
-// byteorder. Not numerical values will only by copied. Strings
-// are stored with added '\0' character.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObdWriteEntryFromLe(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p)
-{
- tEplKernel Ret;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pSubEntry;
- tEplObdCbParam CbParam;
- void *pDstData;
- tEplObdSize ObdSize;
- u64 qwBuffer;
- void *pBuffer = &qwBuffer;
-
- Ret = EplObdWriteEntryPre(EPL_MCO_INSTANCE_PTR_
- uiIndex_p,
- uiSubIndex_p,
- pSrcData_p,
- &pDstData,
- Size_p,
- &pObdEntry, &pSubEntry, &CbParam, &ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- // check if numerical type
- switch (pSubEntry->m_Type) {
- //-----------------------------------------------
- // types without ami
- default:
- { // do nothing, i.e. use the given source pointer
- pBuffer = pSrcData_p;
- break;
- }
-
- //-----------------------------------------------
- // numerical type which needs ami-write
- // 8 bit or smaller values
- case kEplObdTypBool:
- case kEplObdTypInt8:
- case kEplObdTypUInt8:
- {
- *((u8 *) pBuffer) = AmiGetByteFromLe(pSrcData_p);
- break;
- }
-
- // 16 bit values
- case kEplObdTypInt16:
- case kEplObdTypUInt16:
- {
- *((u16 *) pBuffer) = AmiGetWordFromLe(pSrcData_p);
- break;
- }
-
- // 24 bit values
- case kEplObdTypInt24:
- case kEplObdTypUInt24:
- {
- *((u32 *) pBuffer) = AmiGetDword24FromLe(pSrcData_p);
- break;
- }
-
- // 32 bit values
- case kEplObdTypInt32:
- case kEplObdTypUInt32:
- case kEplObdTypReal32:
- {
- *((u32 *) pBuffer) = AmiGetDwordFromLe(pSrcData_p);
- break;
- }
-
- // 40 bit values
- case kEplObdTypInt40:
- case kEplObdTypUInt40:
- {
- *((u64 *) pBuffer) = AmiGetQword40FromLe(pSrcData_p);
- break;
- }
-
- // 48 bit values
- case kEplObdTypInt48:
- case kEplObdTypUInt48:
- {
- *((u64 *) pBuffer) = AmiGetQword48FromLe(pSrcData_p);
- break;
- }
-
- // 56 bit values
- case kEplObdTypInt56:
- case kEplObdTypUInt56:
- {
- *((u64 *) pBuffer) = AmiGetQword56FromLe(pSrcData_p);
- break;
- }
-
- // 64 bit values
- case kEplObdTypInt64:
- case kEplObdTypUInt64:
- case kEplObdTypReal64:
- {
- *((u64 *) pBuffer) = AmiGetQword64FromLe(pSrcData_p);
- break;
- }
-
- // time of day
- case kEplObdTypTimeOfDay:
- case kEplObdTypTimeDiff:
- {
- AmiGetTimeOfDay(pBuffer, ((tTimeOfDay *) pSrcData_p));
- break;
- }
-
- } // end of switch(pSubEntry->m_Type)
-
- Ret = EplObdWriteEntryPost(EPL_MCO_INSTANCE_PTR_
- pObdEntry,
- pSubEntry,
- &CbParam, pBuffer, pDstData, ObdSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetAccessType()
-//
-// Description: Function returns accesstype of the entry
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pAccessTyp_p = pointer to buffer to store accesstype
-//
-// Return: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObdGetAccessType(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplObdAccess *pAccessTyp_p)
-{
- tEplKernel Ret;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pObdSubEntry;
-
- // get pointer to index structure
- Ret = EplObdGetIndexIntern(&EPL_MCO_GLB_VAR(m_ObdInitParam),
- uiIndex_p, &pObdEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get pointer to subindex structure
- Ret = EplObdGetSubindexIntern(pObdEntry, uiSubIndex_p, &pObdSubEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get accessType
- *pAccessTyp_p = pObdSubEntry->m_Access;
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdSearchVarEntry()
-//
-// Description: gets variable from OD
-//
-// Parameters: uiIndex_p = index of the var entry to search
-// uiSubindex_p = subindex of var entry to search
-// ppVarEntry_p = pointer to the pointer to the varentry
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplObdSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdVarEntry **ppVarEntry_p)
-{
-
- tEplKernel Ret;
- tEplObdSubEntryPtr pSubindexEntry;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- // get address of subindex entry
- Ret = EplObdGetEntry(EPL_MCO_INSTANCE_PTR_
- uiIndex_p, uiSubindex_p, NULL, &pSubindexEntry);
- if (Ret == kEplSuccessful) {
- // get var entry
- Ret = EplObdGetVarEntry(pSubindexEntry, ppVarEntry_p);
- }
-
- return Ret;
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-EPL_MCO_DECL_INSTANCE_FCT()
-//---------------------------------------------------------------------------
-//
-// Function: EplObdCallObjectCallback()
-//
-// Description: calls callback function of an object or of a variable
-//
-// Parameters: fpCallback_p
-// pCbParam_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplObdCallObjectCallback(EPL_MCO_DECL_INSTANCE_PTR_
- tEplObdCallback fpCallback_p,
- tEplObdCbParam *pCbParam_p)
-{
-
- tEplKernel Ret;
- tEplObdCallback fpCallback;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- ASSERT(pCbParam_p != NULL);
-
- Ret = kEplSuccessful;
-
- // check address of callback function before calling it
- if (fpCallback_p != NULL) {
- // KEIL C51 V6.01 has a bug.
- // Therefore the parameter fpCallback_p has to be copied in local variable fpCallback.
- fpCallback = fpCallback_p;
-
- // call callback function for this object
- Ret = fpCallback(EPL_MCO_INSTANCE_PARAM_IDX_()
- pCbParam_p);
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetDataSizeIntern()
-//
-// Description: gets the data size of an object
-// for string objects it returnes the string length
-//
-// Parameters: pSubIndexEntry_p
-//
-// Return: tEplObdSize
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplObdSize EplObdGetDataSizeIntern(tEplObdSubEntryPtr pSubIndexEntry_p)
-{
-
- tEplObdSize DataSize;
- void *pData;
-
- // If OD entry is defined by macro EPL_OBD_SUBINDEX_ROM_VSTRING
- // then the current pointer is always NULL. The function
- // returns the length of default string.
- DataSize = EplObdGetObjectSize(pSubIndexEntry_p);
-
- if (pSubIndexEntry_p->m_Type == kEplObdTypVString) {
- // The pointer to current value can be received from EplObdGetObjectCurrentPtr()
- pData = ((void *)EplObdGetObjectCurrentPtr(pSubIndexEntry_p));
- if (pData != NULL) {
- DataSize =
- EplObdGetStrLen((void *)pData, DataSize,
- pSubIndexEntry_p->m_Type);
- }
-
- }
-
- return DataSize;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetStrLen()
-//
-// Description: The function calculates the length of string. The '\0'
-// character is included!!
-//
-// Parameters: pObjData_p = pointer to string
-// ObjLen_p = max. length of objectr entry
-// bObjType_p = object type (VSTRING, ...)
-//
-// Returns: string length + 1
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplObdSize EplObdGetStrLen(void *pObjData_p,
- tEplObdSize ObjLen_p, tEplObdType ObjType_p)
-{
-
- tEplObdSize StrLen = 0;
- u8 *pbString;
-
- if (pObjData_p == NULL) {
- goto Exit;
- }
- //----------------------------------------
- // Visible String: data format byte
- if (ObjType_p == kEplObdTypVString) {
- pbString = pObjData_p;
-
- for (StrLen = 0; StrLen < ObjLen_p; StrLen++) {
- if (*pbString == '\0') {
- StrLen++;
- break;
- }
-
- pbString++;
- }
- }
- //----------------------------------------
- // other string types ...
-
- Exit:
- return (StrLen);
-
-}
-
-#if (EPL_OBD_CHECK_OBJECT_RANGE != FALSE)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdCheckObjectRange()
-//
-// Description: function to check value range of object data
-//
-// NOTICE: The pointer of data (pData_p) must point out to an even address,
-// if ObjType is unequal to kEplObdTypInt8 or kEplObdTypUInt8! But it is
-// always realiced because pointer m_pDefault points always to an
-// array of the SPECIFIED type.
-//
-// Parameters: pSubindexEntry_p
-// pData_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdCheckObjectRange(tEplObdSubEntryPtr pSubindexEntry_p,
- void *pData_p)
-{
-
- tEplKernel Ret;
- void *pRangeData;
-
- ASSERTMSG(pSubindexEntry_p != NULL,
- "EplObdCheckObjectRange(): no address to subindex struct!\n");
-
- Ret = kEplSuccessful;
-
- // check if data range has to be checked
- if ((pSubindexEntry_p->m_Access & kEplObdAccRange) == 0) {
- goto Exit;
- }
- // get address of default data
- pRangeData = pSubindexEntry_p->m_pDefault;
-
- // jump to called object type
- switch ((tEplObdType) pSubindexEntry_p->m_Type) {
- // -----------------------------------------------------------------
- // ObdType kEplObdTypBool will not be checked because there are only
- // two possible values 0 or 1.
-
- // -----------------------------------------------------------------
- // ObdTypes which has to be check up because numerical values
- case kEplObdTypInt8:
-
- // switch to lower limit
- pRangeData = ((tEplObdInteger8 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdInteger8 *) pData_p) <
- *((tEplObdInteger8 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdInteger8 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdInteger8 *) pData_p) >
- *((tEplObdInteger8 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- case kEplObdTypUInt8:
-
- // switch to lower limit
- pRangeData = ((tEplObdUnsigned8 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdUnsigned8 *) pData_p) <
- *((tEplObdUnsigned8 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdUnsigned8 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdUnsigned8 *) pData_p) >
- *((tEplObdUnsigned8 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- case kEplObdTypInt16:
-
- // switch to lower limit
- pRangeData = ((tEplObdInteger16 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdInteger16 *) pData_p) <
- *((tEplObdInteger16 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdInteger16 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdInteger16 *) pData_p) >
- *((tEplObdInteger16 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- case kEplObdTypUInt16:
-
- // switch to lower limit
- pRangeData = ((tEplObdUnsigned16 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdUnsigned16 *) pData_p) <
- *((tEplObdUnsigned16 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdUnsigned16 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdUnsigned16 *) pData_p) >
- *((tEplObdUnsigned16 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- case kEplObdTypInt32:
-
- // switch to lower limit
- pRangeData = ((tEplObdInteger32 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdInteger32 *) pData_p) <
- *((tEplObdInteger32 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdInteger32 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdInteger32 *) pData_p) >
- *((tEplObdInteger32 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- case kEplObdTypUInt32:
-
- // switch to lower limit
- pRangeData = ((tEplObdUnsigned32 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdUnsigned32 *) pData_p) <
- *((tEplObdUnsigned32 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdUnsigned32 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdUnsigned32 *) pData_p) >
- *((tEplObdUnsigned32 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- case kEplObdTypReal32:
-
- // switch to lower limit
- pRangeData = ((tEplObdReal32 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdReal32 *) pData_p) <
- *((tEplObdReal32 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdReal32 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdReal32 *) pData_p) >
- *((tEplObdReal32 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt40:
- case kEplObdTypInt48:
- case kEplObdTypInt56:
- case kEplObdTypInt64:
-
- // switch to lower limit
- pRangeData = ((signed u64 *)pRangeData) + 1;
-
- // check if value is to low
- if (*((signed u64 *)pData_p) < *((signed u64 *)pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((signed u64 *)pRangeData) + 1;
-
- // check if value is to high
- if (*((signed u64 *)pData_p) > *((signed u64 *)pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypUInt40:
- case kEplObdTypUInt48:
- case kEplObdTypUInt56:
- case kEplObdTypUInt64:
-
- // switch to lower limit
- pRangeData = ((unsigned u64 *)pRangeData) + 1;
-
- // check if value is to low
- if (*((unsigned u64 *)pData_p) <
- *((unsigned u64 *)pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((unsigned u64 *)pRangeData) + 1;
-
- // check if value is to high
- if (*((unsigned u64 *)pData_p) >
- *((unsigned u64 *)pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypReal64:
-
- // switch to lower limit
- pRangeData = ((tEplObdReal64 *) pRangeData) + 1;
-
- // check if value is to low
- if (*((tEplObdReal64 *) pData_p) <
- *((tEplObdReal64 *) pRangeData)) {
- Ret = kEplObdValueTooLow;
- break;
- }
- // switch to higher limit
- pRangeData = ((tEplObdReal64 *) pRangeData) + 1;
-
- // check if value is to high
- if (*((tEplObdReal64 *) pData_p) >
- *((tEplObdReal64 *) pRangeData)) {
- Ret = kEplObdValueTooHigh;
- }
-
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypTimeOfDay:
- case kEplObdTypTimeDiff:
- break;
-
- // -----------------------------------------------------------------
- // ObdTypes kEplObdTypXString and kEplObdTypDomain can not be checkt because
- // they have no numerical value.
- default:
-
- Ret = kEplObdUnknownObjectType;
- break;
- }
-
- Exit:
-
- return Ret;
-
-}
-#endif // (EPL_OBD_CHECK_OBJECT_RANGE != FALSE)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdWriteEntryPre()
-//
-// Description: Function prepares write of data to an OBD entry. Strings
-// are stored with added '\0' character.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdWriteEntryPre(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p,
- void **ppDstData_p,
- tEplObdSize Size_p,
- tEplObdEntryPtr *ppObdEntry_p,
- tEplObdSubEntryPtr *ppSubEntry_p,
- tEplObdCbParam *pCbParam_p,
- tEplObdSize *pObdSize_p)
-{
-
- tEplKernel Ret;
- tEplObdEntryPtr pObdEntry;
- tEplObdSubEntryPtr pSubEntry;
- tEplObdAccess Access;
- void *pDstData;
- tEplObdSize ObdSize;
- BOOL fEntryNumerical;
-
-#if (EPL_OBD_USE_STRING_DOMAIN_IN_RAM != FALSE)
- tEplObdVStringDomain MemVStringDomain;
- void *pCurrData;
-#endif
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- ASSERT(pSrcData_p != NULL); // should never be NULL
-
- //------------------------------------------------------------------------
- // get address of index and subindex entry
- Ret = EplObdGetEntry(EPL_MCO_INSTANCE_PTR_
- uiIndex_p, uiSubIndex_p, &pObdEntry, &pSubEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // get pointer to object data
- pDstData = (void *)EplObdGetObjectDataPtrIntern(pSubEntry);
-
- Access = (tEplObdAccess) pSubEntry->m_Access;
-
- // check access for write
- // access violation if adress to current value is NULL
- if (((Access & kEplObdAccConst) != 0) || (pDstData == NULL)) {
- Ret = kEplObdAccessViolation;
- goto Exit;
- }
- //------------------------------------------------------------------------
- // get size of object
- // -as ObdSize = ObdGetObjectSize (pSubEntry);
-
- //------------------------------------------------------------------------
- // To use the same callback function for ObdWriteEntry as well as for
- // an SDO download call at first (kEplObdEvPre...) the callback function
- // with the argument pointer to object size.
- pCbParam_p->m_uiIndex = uiIndex_p;
- pCbParam_p->m_uiSubIndex = uiSubIndex_p;
-
- // Because object size and object pointer are
- // adapted by user callback function, re-read
- // this values.
- ObdSize = EplObdGetObjectSize(pSubEntry);
- pDstData = (void *)EplObdGetObjectDataPtrIntern(pSubEntry);
-
- // 09-dec-2004 r.d.:
- // Function EplObdWriteEntry() calls new event kEplObdEvWrStringDomain
- // for String or Domain which lets called module directly change
- // the data pointer or size. This prevents a recursive call to
- // the callback function if it calls EplObdGetEntry().
-#if (EPL_OBD_USE_STRING_DOMAIN_IN_RAM != FALSE)
- if ((pSubEntry->m_Type == kEplObdTypVString) ||
- (pSubEntry->m_Type == kEplObdTypDomain) ||
- (pSubEntry->m_Type == kEplObdTypOString)) {
- if (pSubEntry->m_Type == kEplObdTypVString) {
- // reserve one byte for 0-termination
- // -as ObdSize -= 1;
- Size_p += 1;
- }
- // fill out new arg-struct
- MemVStringDomain.m_DownloadSize = Size_p;
- MemVStringDomain.m_ObjSize = ObdSize;
- MemVStringDomain.m_pData = pDstData;
-
- pCbParam_p->m_ObdEvent = kEplObdEvWrStringDomain;
- pCbParam_p->m_pArg = &MemVStringDomain;
- // call user callback
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry->m_fpCallback,
- pCbParam_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // write back new settings
- pCurrData = pSubEntry->m_pCurrent;
- if ((pSubEntry->m_Type == kEplObdTypVString)
- || (pSubEntry->m_Type == kEplObdTypOString)) {
- ((tEplObdVString *)pCurrData)->m_Size = MemVStringDomain.m_ObjSize;
- ((tEplObdVString *)pCurrData)->m_pString = MemVStringDomain.m_pData;
- } else // if (pSdosTableEntry_p->m_bObjType == kEplObdTypDomain)
- {
- ((tEplObdVarEntry *)pCurrData)->m_Size = MemVStringDomain.m_ObjSize;
- ((tEplObdVarEntry *)pCurrData)->m_pData = (void *)MemVStringDomain.m_pData;
- }
-
- // Because object size and object pointer are
- // adapted by user callback function, re-read
- // this values.
- ObdSize = MemVStringDomain.m_ObjSize;
- pDstData = (void *)MemVStringDomain.m_pData;
- }
-#endif //#if (OBD_USE_STRING_DOMAIN_IN_RAM != FALSE)
-
- // 07-dec-2004 r.d.: size from application is needed because callback function can change the object size
- // -as 16.11.04 CbParam.m_pArg = &ObdSize;
- // 09-dec-2004 r.d.: CbParam.m_pArg = &Size_p;
- pCbParam_p->m_pArg = &ObdSize;
- pCbParam_p->m_ObdEvent = kEplObdEvInitWrite;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry->m_fpCallback, pCbParam_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if (Size_p > ObdSize) {
- Ret = kEplObdValueLengthError;
- goto Exit;
- }
-
- if (pSubEntry->m_Type == kEplObdTypVString) {
- if (((char *)pSrcData_p)[Size_p - 1] == '\0') { // last byte of source string contains null character
-
- // reserve one byte in destination for 0-termination
- Size_p -= 1;
- } else if (Size_p >= ObdSize) { // source string is not 0-terminated
- // and destination buffer is too short
- Ret = kEplObdValueLengthError;
- goto Exit;
- }
- }
-
- Ret = EplObdIsNumericalIntern(pSubEntry, &fEntryNumerical);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if ((fEntryNumerical != FALSE)
- && (Size_p != ObdSize)) {
- // type is numerical, therefor size has to fit, but it does not.
- Ret = kEplObdValueLengthError;
- goto Exit;
- }
- // use given size, because non-numerical objects can be written with shorter values
- ObdSize = Size_p;
-
- // set output parameters
- *pObdSize_p = ObdSize;
- *ppObdEntry_p = pObdEntry;
- *ppSubEntry_p = pSubEntry;
- *ppDstData_p = pDstData;
-
- // all checks are done
- // the caller may now convert the numerial source value to platform byte order in a temporary buffer
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdWriteEntryPost()
-//
-// Description: Function finishes write of data to an OBD entry. Strings
-// are stored with added '\0' character.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdWriteEntryPost(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdEntryPtr pObdEntry_p,
- tEplObdSubEntryPtr pSubEntry_p,
- tEplObdCbParam *pCbParam_p,
- void *pSrcData_p,
- void *pDstData_p,
- tEplObdSize ObdSize_p)
-{
-
- tEplKernel Ret;
-
- // caller converted the source value to platform byte order
- // now the range of the value may be checked
-
-#if (EPL_OBD_CHECK_OBJECT_RANGE != FALSE)
- {
- // check data range
- Ret = EplObdCheckObjectRange(pSubEntry_p, pSrcData_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
-#endif
-
- // now call user callback function to check value
- // write address of source data to structure of callback parameters
- // so callback function can check this data
- pCbParam_p->m_pArg = pSrcData_p;
- pCbParam_p->m_ObdEvent = kEplObdEvPreWrite;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry_p->m_fpCallback, pCbParam_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // copy object data to OBD
- EPL_MEMCPY(pDstData_p, pSrcData_p, ObdSize_p);
-
- // terminate string with 0
- if (pSubEntry_p->m_Type == kEplObdTypVString) {
- ((char *)pDstData_p)[ObdSize_p] = '\0';
- }
- // write address of destination to structure of callback parameters
- // so callback function can change data subsequently
- pCbParam_p->m_pArg = pDstData_p;
- pCbParam_p->m_ObdEvent = kEplObdEvPostWrite;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry_p->m_fpCallback, pCbParam_p);
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetObjectSize()
-//
-// Description: function to get size of object
-// The function determines if an object type an fixed data type (u8, u16, ...)
-// or non fixed object (string, domain). This information is used to decide
-// if download data are stored temporary or not. For objects with fixed data length
-// and types a value range checking can process.
-// For strings the function returns the whole object size not the
-// length of string.
-//
-// Parameters: pSubIndexEntry_p
-//
-// Return: tEplObdSize
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplObdSize EplObdGetObjectSize(tEplObdSubEntryPtr pSubIndexEntry_p)
-{
-
- tEplObdSize DataSize = 0;
- void *pData;
-
- switch (pSubIndexEntry_p->m_Type) {
- // -----------------------------------------------------------------
- case kEplObdTypBool:
-
- DataSize = 1;
- break;
-
- // -----------------------------------------------------------------
- // ObdTypes which has to be check because numerical values
- case kEplObdTypInt8:
- DataSize = sizeof(tEplObdInteger8);
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypUInt8:
- DataSize = sizeof(tEplObdUnsigned8);
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt16:
- DataSize = sizeof(tEplObdInteger16);
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypUInt16:
- DataSize = sizeof(tEplObdUnsigned16);
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt32:
- DataSize = sizeof(tEplObdInteger32);
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypUInt32:
- DataSize = sizeof(tEplObdUnsigned32);
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypReal32:
- DataSize = sizeof(tEplObdReal32);
- break;
-
- // -----------------------------------------------------------------
- // ObdTypes which has to be not checked because not NUM values
- case kEplObdTypDomain:
-
- pData = (void *)pSubIndexEntry_p->m_pCurrent;
- if ((void *)pData != (void *)NULL) {
- DataSize = ((tEplObdVarEntry *) pData)->m_Size;
- }
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypVString:
- //case kEplObdTypUString:
-
- // If OD entry is defined by macro EPL_OBD_SUBINDEX_ROM_VSTRING
- // then the current pointer is always NULL. The function
- // returns the length of default string.
- pData = (void *)pSubIndexEntry_p->m_pCurrent;
- if ((void *)pData != (void *)NULL) {
- // The max. size of strings defined by STRING-Macro is stored in
- // tEplObdVString of current value.
- // (types tEplObdVString, tEplObdOString and tEplObdUString has the same members)
- DataSize = ((tEplObdVString *) pData)->m_Size;
- } else {
- // The current position is not decleared. The string
- // is located in ROM, therefor use default pointer.
- pData = (void *)pSubIndexEntry_p->m_pDefault;
- if ((const void *)pData != (const void *)NULL) {
- // The max. size of strings defined by STRING-Macro is stored in
- // tEplObdVString of default value.
- DataSize = ((const tEplObdVString *)pData)->m_Size;
- }
- }
-
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypOString:
-
- pData = (void *)pSubIndexEntry_p->m_pCurrent;
- if ((void *)pData != (void *)NULL) {
- // The max. size of strings defined by STRING-Macro is stored in
- // tEplObdVString of current value.
- // (types tEplObdVString, tEplObdOString and tEplObdUString has the same members)
- DataSize = ((tEplObdOString *) pData)->m_Size;
- } else {
- // The current position is not decleared. The string
- // is located in ROM, therefor use default pointer.
- pData = (void *)pSubIndexEntry_p->m_pDefault;
- if ((const void *)pData != (const void *)NULL) {
- // The max. size of strings defined by STRING-Macro is stored in
- // tEplObdVString of default value.
- DataSize = ((const tEplObdOString *)pData)->m_Size;
- }
- }
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt24:
- case kEplObdTypUInt24:
-
- DataSize = 3;
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt40:
- case kEplObdTypUInt40:
-
- DataSize = 5;
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt48:
- case kEplObdTypUInt48:
-
- DataSize = 6;
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt56:
- case kEplObdTypUInt56:
-
- DataSize = 7;
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypInt64:
- case kEplObdTypUInt64:
- case kEplObdTypReal64:
-
- DataSize = 8;
- break;
-
- // -----------------------------------------------------------------
- case kEplObdTypTimeOfDay:
- case kEplObdTypTimeDiff:
-
- DataSize = 6;
- break;
-
- // -----------------------------------------------------------------
- default:
- break;
- }
-
- return DataSize;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetObjectDefaultPtr()
-//
-// Description: function to get the default pointer (type specific)
-//
-// Parameters: pSubIndexEntry_p = pointer to subindex structure
-//
-// Returns: (void *) = pointer to default value
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static void *EplObdGetObjectDefaultPtr(tEplObdSubEntryPtr pSubIndexEntry_p)
-{
-
- void *pDefault;
- tEplObdType Type;
-
- ASSERTMSG(pSubIndexEntry_p != NULL,
- "EplObdGetObjectDefaultPtr(): pointer to SubEntry not valid!\n");
-
- // get address to default data from default pointer
- pDefault = pSubIndexEntry_p->m_pDefault;
- if (pDefault != NULL) {
- // there are some special types, whose default pointer always is NULL or has to get from other structure
- // get type from subindex structure
- Type = pSubIndexEntry_p->m_Type;
-
- // check if object type is a string value
- if ((Type == kEplObdTypVString) /* ||
- (Type == kEplObdTypUString) */ ) {
-
- // EPL_OBD_SUBINDEX_RAM_VSTRING
- // tEplObdSize m_Size; --> size of default string
- // char * m_pDefString; --> pointer to default string
- // char * m_pString; --> pointer to string in RAM
- //
- pDefault =
- (void *)((tEplObdVString *) pDefault)->m_pString;
- } else if (Type == kEplObdTypOString) {
- pDefault =
- (void *)((tEplObdOString *) pDefault)->m_pString;
- }
- }
-
- return pDefault;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetVarEntry()
-//
-// Description: gets a variable entry of an object
-//
-// Parameters: pSubindexEntry_p
-// ppVarEntry_p
-//
-// Return: tCopKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdGetVarEntry(tEplObdSubEntryPtr pSubindexEntry_p,
- tEplObdVarEntry **ppVarEntry_p)
-{
-
- tEplKernel Ret = kEplObdVarEntryNotExist;
-
- ASSERT(ppVarEntry_p != NULL); // is not allowed to be NULL
- ASSERT(pSubindexEntry_p != NULL);
-
- // check VAR-Flag - only this object points to variables
- if ((pSubindexEntry_p->m_Access & kEplObdAccVar) != 0) {
- // check if object is an array
- if ((pSubindexEntry_p->m_Access & kEplObdAccArray) != 0) {
- *ppVarEntry_p = &((tEplObdVarEntry *)pSubindexEntry_p->m_pCurrent)[pSubindexEntry_p->m_uiSubIndex - 1];
- } else {
- *ppVarEntry_p = (tEplObdVarEntry *)pSubindexEntry_p->m_pCurrent;
- }
-
- Ret = kEplSuccessful;
- }
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetEntry()
-//
-// Description: gets a index entry from OD
-//
-// Parameters: uiIndex_p = Index number
-// uiSubindex_p = Subindex number
-// ppObdEntry_p = pointer to the pointer to the entry
-// ppObdSubEntry_p = pointer to the pointer to the subentry
-//
-// Return: tEplKernel
-
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdGetEntry(EPL_MCO_DECL_INSTANCE_PTR_
- unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdEntryPtr * ppObdEntry_p,
- tEplObdSubEntryPtr * ppObdSubEntry_p)
-{
-
- tEplObdEntryPtr pObdEntry;
- tEplObdCbParam CbParam;
- tEplKernel Ret;
-
- // check for all API function if instance is valid
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- //------------------------------------------------------------------------
- // get address of entry of index
- Ret =
- EplObdGetIndexIntern(&EPL_MCO_GLB_VAR(m_ObdInitParam), uiIndex_p,
- &pObdEntry);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- //------------------------------------------------------------------------
- // get address of entry of subindex
- Ret = EplObdGetSubindexIntern(pObdEntry, uiSubindex_p, ppObdSubEntry_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- //------------------------------------------------------------------------
- // call callback function to inform user/stack that an object will be searched
- // if the called module returnes an error then we abort the searching with kEplObdIndexNotExist
- CbParam.m_uiIndex = uiIndex_p;
- CbParam.m_uiSubIndex = uiSubindex_p;
- CbParam.m_pArg = NULL;
- CbParam.m_ObdEvent = kEplObdEvCheckExist;
- Ret = EplObdCallObjectCallback(EPL_MCO_INSTANCE_PTR_
- pObdEntry->m_fpCallback, &CbParam);
- if (Ret != kEplSuccessful) {
- Ret = kEplObdIndexNotExist;
- goto Exit;
- }
- //------------------------------------------------------------------------
- // it is allowed to set ppObdEntry_p to NULL
- // if so, no address will be written to calling function
- if (ppObdEntry_p != NULL) {
- *ppObdEntry_p = pObdEntry;
- }
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetObjectCurrentPtr()
-//
-// Description: function to get Current pointer (type specific)
-//
-// Parameters: pSubIndexEntry_p
-//
-// Return: void *
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static void *EplObdGetObjectCurrentPtr(tEplObdSubEntryPtr pSubIndexEntry_p)
-{
-
- void *pData;
- unsigned int uiArrayIndex;
- tEplObdSize Size;
-
- pData = pSubIndexEntry_p->m_pCurrent;
-
- // check if constant object
- if (pData != NULL) {
- // check if object is an array
- if ((pSubIndexEntry_p->m_Access & kEplObdAccArray) != 0) {
- // calculate correct data pointer
- uiArrayIndex = pSubIndexEntry_p->m_uiSubIndex - 1;
- if ((pSubIndexEntry_p->m_Access & kEplObdAccVar) != 0) {
- Size = sizeof(tEplObdVarEntry);
- } else {
- Size = EplObdGetObjectSize(pSubIndexEntry_p);
- }
- pData = ((u8 *) pData) + (Size * uiArrayIndex);
- }
- // check if VarEntry
- if ((pSubIndexEntry_p->m_Access & kEplObdAccVar) != 0) {
- // The data pointer is stored in VarEntry->pData
- pData = ((tEplObdVarEntry *) pData)->m_pData;
- }
- // the default pointer is stored for strings in tEplObdVString
- else if ((pSubIndexEntry_p->m_Type == kEplObdTypVString) /* ||
- (pSubIndexEntry_p->m_Type == kEplObdTypUString) */
- ) {
- pData = (void *)((tEplObdVString *)pData)->m_pString;
- } else if (pSubIndexEntry_p->m_Type == kEplObdTypOString) {
- pData =
- (void *)((tEplObdOString *)pData)->m_pString;
- }
- }
-
- return pData;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetIndexIntern()
-//
-// Description: gets a index entry from OD
-//
-// Parameters: pInitParam_p
-// uiIndex_p
-// ppObdEntry_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdGetIndexIntern(tEplObdInitParam *pInitParam_p,
- unsigned int uiIndex_p,
- tEplObdEntryPtr * ppObdEntry_p)
-{
-
- tEplObdEntryPtr pObdEntry;
- tEplKernel Ret;
- unsigned int uiIndex;
-
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
-
- unsigned int nLoop;
-
- // if user OD is used then objekts also has to be searched in user OD
- // there is less code need if we do this in a loop
- nLoop = 2;
-
-#endif
-
- ASSERTMSG(ppObdEntry_p != NULL,
- "EplObdGetIndexIntern(): pointer to index entry is NULL!\n");
-
- Ret = kEplObdIndexNotExist;
-
- // get start address of OD part
- // start address depends on object index because
- // object dictionary is divided in 3 parts
- if ((uiIndex_p >= 0x1000) && (uiIndex_p < 0x2000)) {
- pObdEntry = pInitParam_p->m_pPart;
- } else if ((uiIndex_p >= 0x2000) && (uiIndex_p < 0x6000)) {
- pObdEntry = pInitParam_p->m_pManufacturerPart;
- }
- // index range 0xA000 to 0xFFFF is reserved for DSP-405
- // DS-301 defines that range 0x6000 to 0x9FFF (!!!) is stored if "store" was written to 0x1010/3.
- // Therefore default configuration is OBD_INCLUDE_A000_TO_DEVICE_PART = FALSE.
- // But a CANopen Application which does not implement dynamic OD or user-OD but wants to use static objets 0xA000...
- // should set OBD_INCLUDE_A000_TO_DEVICE_PART to TRUE.
-
-#if (EPL_OBD_INCLUDE_A000_TO_DEVICE_PART == FALSE)
- else if ((uiIndex_p >= 0x6000) && (uiIndex_p < 0x9FFF))
-#else
- else if ((uiIndex_p >= 0x6000) && (uiIndex_p < 0xFFFF))
-#endif
- {
- pObdEntry = pInitParam_p->m_pDevicePart;
- }
-
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
-
- // if index does not match in static OD then index only has to be searched in user OD
- else {
- // begin from first entry of user OD part
- pObdEntry = pInitParam_p->m_pUserPart;
-
- // no user OD is available
- if (pObdEntry == NULL) {
- goto Exit;
- }
- // loop must only run once
- nLoop = 1;
- }
-
- do {
-
-#else
-
- // no user OD is available
- // so other object can be found in OD
- else {
- Ret = kEplObdIllegalPart;
- goto Exit;
- }
-
-#endif
-
- // note:
- // The end of Index table is marked with m_uiIndex = 0xFFFF.
- // If this function will be called with wIndex_p = 0xFFFF, entry
- // should not be found. Therefor it is important to use
- // while{} instead of do{}while !!!
-
- // get first index of index table
- uiIndex = pObdEntry->m_uiIndex;
-
- // search Index in OD part
- while (uiIndex != EPL_OBD_TABLE_INDEX_END) {
- // go to the end of this function if index is found
- if (uiIndex_p == uiIndex) {
- // write address of OD entry to calling function
- *ppObdEntry_p = pObdEntry;
- Ret = kEplSuccessful;
- goto Exit;
- }
- // objects are sorted in OD
- // if the current index in OD is greater than the index which is to search then break loop
- // in this case user OD has to be search too
- if (uiIndex_p < uiIndex) {
- break;
- }
- // next entry in index table
- pObdEntry++;
-
- // get next index of index table
- uiIndex = pObdEntry->m_uiIndex;
- }
-
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
-
- // begin from first entry of user OD part
- pObdEntry = pInitParam_p->m_pUserPart;
-
- // no user OD is available
- if (pObdEntry == NULL) {
- goto Exit;
- }
- // switch next loop for user OD
- nLoop--;
-
-}
-
-while (nLoop > 0) ;
-
-#endif
-
- // in this line Index was not found
-
-Exit:
-
-return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetSubindexIntern()
-//
-// Description: gets a subindex entry from a index entry
-//
-// Parameters: pObdEntry_p
-// bSubIndex_p
-// ppObdSubEntry_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdGetSubindexIntern(tEplObdEntryPtr pObdEntry_p,
- unsigned int uiSubIndex_p,
- tEplObdSubEntryPtr * ppObdSubEntry_p)
-{
-
- tEplObdSubEntryPtr pSubEntry;
- unsigned int nSubIndexCount;
- tEplKernel Ret;
-
- ASSERTMSG(pObdEntry_p != NULL,
- "EplObdGetSubindexIntern(): pointer to index is NULL!\n");
- ASSERTMSG(ppObdSubEntry_p != NULL,
- "EplObdGetSubindexIntern(): pointer to subindex is NULL!\n");
-
- Ret = kEplObdSubindexNotExist;
-
- // get start address of subindex table and count of subindices
- pSubEntry = pObdEntry_p->m_pSubIndex;
- nSubIndexCount = pObdEntry_p->m_uiCount;
- ASSERTMSG((pSubEntry != NULL) && (nSubIndexCount > 0), "ObdGetSubindexIntern(): invalid subindex table within index table!\n"); // should never be NULL
-
- // search subindex in subindex table
- while (nSubIndexCount > 0) {
- // check if array is found
- if ((pSubEntry->m_Access & kEplObdAccArray) != 0) {
- // check if subindex is in range
- if (uiSubIndex_p < pObdEntry_p->m_uiCount) {
- // update subindex number (subindex entry of an array is always in RAM !!!)
- pSubEntry->m_uiSubIndex = uiSubIndex_p;
- *ppObdSubEntry_p = pSubEntry;
- Ret = kEplSuccessful;
- goto Exit;
- }
- }
- // go to the end of this function if subindex is found
- else if (uiSubIndex_p == pSubEntry->m_uiSubIndex) {
- *ppObdSubEntry_p = pSubEntry;
- Ret = kEplSuccessful;
- goto Exit;
- }
- // objects are sorted in OD
- // if the current subindex in OD is greater than the subindex which is to search then break loop
- // in this case user OD has to be search too
- if (uiSubIndex_p < pSubEntry->m_uiSubIndex) {
- break;
- }
-
- pSubEntry++;
- nSubIndexCount--;
- }
-
- // in this line SubIndex was not fount
-
- Exit:
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdSetStoreLoadObjCallback()
-//
-// Description: function set address to callbackfunction for command Store and Load
-//
-// Parameters: fpCallback_p
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if (EPL_OBD_USE_STORE_RESTORE != FALSE)
-tEplKernel EplObdSetStoreLoadObjCallback(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdStoreLoadObjCallback fpCallback_p)
-{
-
- EPL_MCO_CHECK_INSTANCE_STATE();
-
- // set new address of callback function
- EPL_MCO_GLB_VAR(m_fpStoreLoadObjCallback) = fpCallback_p;
-
- return kEplSuccessful;
-
-}
-#endif // (EPL_OBD_USE_STORE_RESTORE != FALSE)
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdAccessOdPartIntern()
-//
-// Description: runs through OD and executes a job
-//
-// Parameters: CurrentOdPart_p
-// pObdEnty_p
-// Direction_p = what is to do (load values from flash or EEPROM, store, ...)
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static tEplKernel EplObdAccessOdPartIntern(EPL_MCO_DECL_INSTANCE_PTR_
- tEplObdPart CurrentOdPart_p,
- tEplObdEntryPtr pObdEnty_p,
- tEplObdDir Direction_p)
-{
-
- tEplObdSubEntryPtr pSubIndex;
- unsigned int nSubIndexCount;
- tEplObdAccess Access;
- void *pDstData;
- void *pDefault;
- tEplObdSize ObjSize;
- tEplKernel Ret;
- tEplObdCbStoreParam CbStore;
- tEplObdVarEntry *pVarEntry;
-
- ASSERT(pObdEnty_p != NULL);
-
- Ret = kEplSuccessful;
-
- // prepare structure for STORE RESTORE callback function
- CbStore.m_bCurrentOdPart = (u8) CurrentOdPart_p;
- CbStore.m_pData = NULL;
- CbStore.m_ObjSize = 0;
-
- // command of first action depends on direction to access
-#if (EPL_OBD_USE_STORE_RESTORE != FALSE)
- if (Direction_p == kEplObdDirLoad) {
- CbStore.m_bCommand = (u8) kEplObdCommOpenRead;
-
- // call callback function for previous command
- Ret = EplObdCallStoreCallback(EPL_MCO_INSTANCE_PTR_ & CbStore);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // set command for index and subindex loop
- CbStore.m_bCommand = (u8) kEplObdCommReadObj;
- } else if (Direction_p == kEplObdDirStore) {
- CbStore.m_bCommand = (u8) kEplObdCommOpenWrite;
-
- // call callback function for previous command
- Ret = EplObdCallStoreCallback(EPL_MCO_INSTANCE_PTR_ & CbStore);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // set command for index and subindex loop
- CbStore.m_bCommand = (u8) kEplObdCommWriteObj;
- }
-#endif // (EPL_OBD_USE_STORE_RESTORE != FALSE)
-
- // we should not restore the OD values here
- // the next NMT command "Reset Node" or "Reset Communication" resets the OD data
- if (Direction_p != kEplObdDirRestore) {
- // walk through OD part till end is found
- while (pObdEnty_p->m_uiIndex != EPL_OBD_TABLE_INDEX_END) {
- // get address to subindex table and count of subindices
- pSubIndex = pObdEnty_p->m_pSubIndex;
- nSubIndexCount = pObdEnty_p->m_uiCount;
- ASSERT((pSubIndex != NULL) && (nSubIndexCount > 0)); // should never be NULL
-
- // walk through subindex table till all subinices were restored
- while (nSubIndexCount != 0) {
- Access = (tEplObdAccess) pSubIndex->m_Access;
-
- // get pointer to current and default data
- pDefault = EplObdGetObjectDefaultPtr(pSubIndex);
- pDstData = EplObdGetObjectCurrentPtr(pSubIndex);
-
- // NOTE (for kEplObdTypVString):
- // The function returnes the max. number of bytes for a
- // current string.
- // r.d.: For stings the default-size will be read in other lines following (kEplObdDirInit).
- ObjSize = EplObdGetObjectSize(pSubIndex);
-
- // switch direction of OD access
- switch (Direction_p) {
- // --------------------------------------------------------------------------
- // VarEntry structures has to be initialized
- case kEplObdDirInit:
-
- // If VAR-Flag is set, m_pCurrent means not address of data
- // but address of tEplObdVarEntry. Address of data has to be get from
- // this structure.
- if ((Access & kEplObdAccVar) != 0) {
- EplObdGetVarEntry(pSubIndex,
- &pVarEntry);
- EplObdInitVarEntry(pVarEntry,
- pSubIndex->
- m_Type,
- ObjSize);
-/*
- if ((Access & kEplObdAccArray) == 0)
- {
- EplObdInitVarEntry (pSubIndex->m_pCurrent, pSubIndex->m_Type, ObjSize);
- }
- else
- {
- EplObdInitVarEntry ((tEplObdVarEntry *) (((u8 *) pSubIndex->m_pCurrent) + (sizeof (tEplObdVarEntry) * pSubIndex->m_uiSubIndex)),
- pSubIndex->m_Type, ObjSize);
- }
-*/
- // at this time no application variable is defined !!!
- // therefore data can not be copied.
- break;
- } else if (pSubIndex->m_Type ==
- kEplObdTypVString) {
- // If pointer m_pCurrent is not equal to NULL then the
- // string was defined with EPL_OBD_SUBINDEX_RAM_VSTRING. The current
- // pointer points to struct tEplObdVString located in MEM.
- // The element size includes the max. number of
- // bytes. The element m_pString includes the pointer
- // to string in MEM. The memory location of default string
- // must be copied to memory location of current string.
-
- pDstData =
- pSubIndex->m_pCurrent;
- if (pDstData != NULL) {
- // 08-dec-2004: code optimization !!!
- // entries ((tEplObdVStringDef*) pSubIndex->m_pDefault)->m_pString
- // and ((tEplObdVStringDef*) pSubIndex->m_pDefault)->m_Size were read
- // twice. thats not necessary!
-
- // For copying data we have to set the destination pointer to the real RAM string. This
- // pointer to RAM string is located in default string info structure. (translated r.d.)
- pDstData = (void *)((tEplObdVStringDef*) pSubIndex->m_pDefault)->m_pString;
- ObjSize = ((tEplObdVStringDef *)pSubIndex->m_pDefault)->m_Size;
-
- ((tEplObdVString *)pSubIndex->m_pCurrent)->m_pString = pDstData;
- ((tEplObdVString *)pSubIndex->m_pCurrent)->m_Size = ObjSize;
- }
-
- } else if (pSubIndex->m_Type ==
- kEplObdTypOString) {
- pDstData =
- pSubIndex->m_pCurrent;
- if (pDstData != NULL) {
- // 08-dec-2004: code optimization !!!
- // entries ((tEplObdOStringDef*) pSubIndex->m_pDefault)->m_pString
- // and ((tEplObdOStringDef*) pSubIndex->m_pDefault)->m_Size were read
- // twice. thats not necessary!
-
- // For copying data we have to set the destination pointer to the real RAM string. This
- // pointer to RAM string is located in default string info structure. (translated r.d.)
- pDstData = (void *)((tEplObdOStringDef *) pSubIndex->m_pDefault)->m_pString;
- ObjSize = ((tEplObdOStringDef *)pSubIndex->m_pDefault)->m_Size;
-
- ((tEplObdOString *)pSubIndex->m_pCurrent)->m_pString = pDstData;
- ((tEplObdOString *)pSubIndex->m_pCurrent)->m_Size = ObjSize;
- }
-
- }
-
- // no break !! because copy of data has to done too.
-
- // --------------------------------------------------------------------------
- // all objects has to be restored with default values
- case kEplObdDirRestore:
-
- // 09-dec-2004 r.d.: optimization! the same code for kEplObdDirRestore and kEplObdDirLoad
- // is replaced to function ObdCopyObjectData() with a new parameter.
-
- // restore object data for init phase
- EplObdCopyObjectData(pDstData, pDefault,
- ObjSize,
- pSubIndex->m_Type);
- break;
-
- // --------------------------------------------------------------------------
- // objects with attribute kEplObdAccStore has to be load from EEPROM or from a file
- case kEplObdDirLoad:
-
- // restore object data for init phase
- EplObdCopyObjectData(pDstData, pDefault,
- ObjSize,
- pSubIndex->m_Type);
-
- // no break !! because callback function has to be called too.
-
- // --------------------------------------------------------------------------
- // objects with attribute kEplObdAccStore has to be stored in EEPROM or in a file
- case kEplObdDirStore:
-
- // when attribute kEplObdAccStore is set, then call callback function
-#if (EPL_OBD_USE_STORE_RESTORE != FALSE)
- if ((Access & kEplObdAccStore) != 0) {
- // fill out data pointer and size of data
- CbStore.m_pData = pDstData;
- CbStore.m_ObjSize = ObjSize;
-
- // call callback function for read or write object
- Ret =
- ObdCallStoreCallback
- (EPL_MCO_INSTANCE_PTR_ &
- CbStore);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- }
-#endif // (EPL_OBD_USE_STORE_RESTORE != FALSE)
- break;
-
- // --------------------------------------------------------------------------
- // if OD Builder key has to be checked no access to subindex and data should be made
- case kEplObdDirOBKCheck:
-
- // no break !! because we want to break the second loop too.
-
- // --------------------------------------------------------------------------
- // unknown Direction
- default:
-
- // so we can break the second loop earler
- nSubIndexCount = 1;
- break;
- }
-
- nSubIndexCount--;
-
- // next subindex entry
- if ((Access & kEplObdAccArray) == 0) {
- pSubIndex++;
- if ((nSubIndexCount > 0)
- &&
- ((pSubIndex->
- m_Access & kEplObdAccArray) !=
- 0)) {
- // next subindex points to an array
- // reset subindex number
- pSubIndex->m_uiSubIndex = 1;
- }
- } else {
- if (nSubIndexCount > 0) {
- // next subindex points to an array
- // increment subindex number
- pSubIndex->m_uiSubIndex++;
- }
- }
- }
-
- // next index entry
- pObdEnty_p++;
- }
- }
- // -----------------------------------------------------------------------------------------
- // command of last action depends on direction to access
- if (Direction_p == kEplObdDirOBKCheck) {
-
- goto Exit;
- }
-#if (EPL_OBD_USE_STORE_RESTORE != FALSE)
- else {
- if (Direction_p == kEplObdDirLoad) {
- CbStore.m_bCommand = (u8) kEplObdCommCloseRead;
- } else if (Direction_p == kEplObdDirStore) {
- CbStore.m_bCommand = (u8) kEplObdCommCloseWrite;
- } else if (Direction_p == kEplObdDirRestore) {
- CbStore.m_bCommand = (u8) kEplObdCommClear;
- } else {
- goto Exit;
- }
-
- // call callback function for last command
- Ret = EplObdCallStoreCallback(EPL_MCO_INSTANCE_PTR_ & CbStore);
- }
-#endif // (EPL_OBD_USE_STORE_RESTORE != FALSE)
-
-// goto Exit;
-
- Exit:
-
- return Ret;
-
-}
-
-// ----------------------------------------------------------------------------
-// Function: EplObdCopyObjectData()
-//
-// Description: checks pointers to object data and copy them from source to destination
-//
-// Parameters: pDstData_p = destination pointer
-// pSrcData_p = source pointer
-// ObjSize_p = size of object
-// ObjType_p =
-//
-// Returns: tEplKernel = error code
-// ----------------------------------------------------------------------------
-
-static void EplObdCopyObjectData(void *pDstData_p,
- void *pSrcData_p,
- tEplObdSize ObjSize_p, tEplObdType ObjType_p)
-{
-
- tEplObdSize StrSize = 0;
-
- // it is allowed to set default and current address to NULL (nothing to copy)
- if (pDstData_p != NULL) {
-
- if (ObjType_p == kEplObdTypVString) {
- // The function calculates the really number of characters of string. The
- // object entry size can be bigger as string size of default string.
- // The '\0'-termination is included. A string with no characters has a
- // size of 1.
- StrSize =
- EplObdGetStrLen((void *)pSrcData_p, ObjSize_p,
- kEplObdTypVString);
-
- // If the string length is greater than or equal to the entry size in OD then only copy
- // entry size - 1 and always set the '\0'-termination.
- if (StrSize >= ObjSize_p) {
- StrSize = ObjSize_p - 1;
- }
- }
-
- if (pSrcData_p != NULL) {
- // copy data
- EPL_MEMCPY(pDstData_p, pSrcData_p, ObjSize_p);
-
- if (ObjType_p == kEplObdTypVString) {
- ((char *)pDstData_p)[StrSize] = '\0';
- }
- }
- }
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdIsNumericalIntern()
-//
-// Description: function checks if a entry is numerical or not
-//
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_ = Instancepointer
-// uiIndex_p = Index
-// uiSubIndex_p = Subindex
-// pfEntryNumerical_p = pointer to BOOL for returnvalue
-// -> TRUE if entry a numerical value
-// -> FALSE if entry not a numerical value
-//
-// Return: tEplKernel = Errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplObdIsNumericalIntern(tEplObdSubEntryPtr pObdSubEntry_p,
- BOOL * pfEntryNumerical_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // get Type
- if ((pObdSubEntry_p->m_Type == kEplObdTypVString)
- || (pObdSubEntry_p->m_Type == kEplObdTypOString)
- || (pObdSubEntry_p->m_Type == kEplObdTypDomain)) { // not numerical types
- *pfEntryNumerical_p = FALSE;
- } else { // numerical types
- *pfEntryNumerical_p = TRUE;
- }
-
- return Ret;
-
-}
-
-// -------------------------------------------------------------------------
-// function to classify object type (fixed/non fixed)
-// -------------------------------------------------------------------------
-
-// ----------------------------------------------------------------------------
-// Function: EplObdCallStoreCallback()
-//
-// Description: checks address to callback function and calles it when unequal
-// to NULL
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_ = (instance pointer)
-// pCbStoreParam_p = address to callback parameters
-//
-// Returns: tEplKernel = error code
-// ----------------------------------------------------------------------------
-#if (EPL_OBD_USE_STORE_RESTORE != FALSE)
-static tEplKernel EplObdCallStoreCallback(EPL_MCO_DECL_INSTANCE_PTR_
- tEplObdCbStoreParam *
- pCbStoreParam_p)
-{
-
- tEplKernel Ret = kEplSuccessful;
-
- ASSERT(pCbStoreParam_p != NULL);
-
- // check if function pointer is NULL - if so, no callback should be called
- if (EPL_MCO_GLB_VAR(m_fpStoreLoadObjCallback) != NULL) {
- Ret =
- EPL_MCO_GLB_VAR(m_fpStoreLoadObjCallback)
- (EPL_MCO_INSTANCE_PARAM_IDX_()
- pCbStoreParam_p);
- }
-
- return Ret;
-
-}
-#endif // (EPL_OBD_USE_STORE_RESTORE != FALSE)
-//---------------------------------------------------------------------------
-//
-// Function: EplObdGetObjectDataPtrIntern()
-//
-// Description: Function gets the data pointer of an object.
-// It returnes the current data pointer. But if object is an
-// constant object it returnes the default pointer.
-//
-// Parameters: pSubindexEntry_p = pointer to subindex entry
-//
-// Return: void * = pointer to object data
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-void *EplObdGetObjectDataPtrIntern(tEplObdSubEntryPtr pSubindexEntry_p)
-{
-
- void *pData;
- tEplObdAccess Access;
-
- ASSERTMSG(pSubindexEntry_p != NULL,
- "EplObdGetObjectDataPtrIntern(): pointer to SubEntry not valid!\n");
-
- // there are are some objects whose data pointer has to get from other structure
- // get access type for this object
- Access = pSubindexEntry_p->m_Access;
-
- // If object has access type = const,
- // for data only exists default values.
- if ((Access & kEplObdAccConst) != 0) {
- // The pointer to defualt value can be received from ObdGetObjectDefaultPtr()
- pData = ((void *)EplObdGetObjectDefaultPtr(pSubindexEntry_p));
- } else {
- // The pointer to current value can be received from ObdGetObjectCurrentPtr()
- pData = ((void *)EplObdGetObjectCurrentPtr(pSubindexEntry_p));
- }
-
- return pData;
-
-}
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for api function of EplOBD-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: EplObd.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- Microsoft VC7
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/02 k.t.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPLOBD_H_
-#define _EPLOBD_H_
-
-#include "EplInc.h"
-
-// ============================================================================
-// defines
-// ============================================================================
-
-#define EPL_OBD_TABLE_INDEX_END 0xFFFF
-
-// for the usage of BOOLEAN in OD
-#define OBD_TRUE 0x01
-#define OBD_FALSE 0x00
-
-// default OD index for Node id
-#define EPL_OBD_NODE_ID_INDEX 0x1F93
-// default subindex for NodeId in OD
-#define EPL_OBD_NODE_ID_SUBINDEX 0x01
-// default subindex for NodeIDByHW_BOOL
-#define EPL_OBD_NODE_ID_HWBOOL_SUBINDEX 0x02
-
-// ============================================================================
-// enums
-// ============================================================================
-
-// directions for access to object dictionary
-typedef enum {
- kEplObdDirInit = 0x00, // initialising after power on
- kEplObdDirStore = 0x01, // store all object values to non volatile memory
- kEplObdDirLoad = 0x02, // load all object values from non volatile memory
- kEplObdDirRestore = 0x03, // deletes non volatile memory (restore)
- kEplObdDirOBKCheck = 0xFF // reserved
-} tEplObdDir;
-
-// commands for store
-typedef enum {
- kEplObdCommNothing = 0x00,
- kEplObdCommOpenWrite = 0x01,
- kEplObdCommWriteObj = 0x02,
- kEplObdCommCloseWrite = 0x03,
- kEplObdCommOpenRead = 0x04,
- kEplObdCommReadObj = 0x05,
- kEplObdCommCloseRead = 0x06,
- kEplObdCommClear = 0x07,
- kEplObdCommUnknown = 0xFF
-} tEplObdCommand;
-
-//-----------------------------------------------------------------------------------------------------------
-// events of object callback function
-typedef enum {
-// m_pArg points to
-// ---------------------
- kEplObdEvCheckExist = 0x06, // checking if object does exist (reading and writing) NULL
- kEplObdEvPreRead = 0x00, // before reading an object source data buffer in OD
- kEplObdEvPostRead = 0x01, // after reading an object destination data buffer from caller
- kEplObdEvWrStringDomain = 0x07, // event for changing string/domain data pointer or size struct tEplObdVStringDomain in RAM
- kEplObdEvInitWrite = 0x04, // initializes writing an object (checking object size) size of object in OD (tEplObdSize)
- kEplObdEvPreWrite = 0x02, // before writing an object source data buffer from caller
- kEplObdEvPostWrite = 0x03, // after writing an object destination data buffer in OD
-// kEplObdEvAbortSdo = 0x05 // after an abort of an SDO transfer
-
-} tEplObdEvent;
-
-// part of OD (bit oriented)
-typedef unsigned int tEplObdPart;
-
-#define kEplObdPartNo 0x00 // nothing
-#define kEplObdPartGen 0x01 // part (0x1000 - 0x1FFF)
-#define kEplObdPartMan 0x02 // manufacturer part (0x2000 - 0x5FFF)
-#define kEplObdPartDev 0x04 // device part (0x6000 - 0x9FFF)
-#define kEplObdPartUsr 0x08 // dynamic part e.g. for ICE61131-3
-
-// combinations
-#define kEplObdPartApp ( kEplObdPartMan | kEplObdPartDev | kEplObdPartUsr) // manufacturer and device part (0x2000 - 0x9FFF) and user OD
-#define kEplObdPartAll (kEplObdPartGen | kEplObdPartMan | kEplObdPartDev | kEplObdPartUsr) // whole OD
-
-//-----------------------------------------------------------------------------------------------------------
-// access types for objects
-// must be a difine because bit-flags
-typedef unsigned int tEplObdAccess;
-
-#define kEplObdAccRead 0x01 // object can be read
-#define kEplObdAccWrite 0x02 // object can be written
-#define kEplObdAccConst 0x04 // object contains a constant value
-#define kEplObdAccPdo 0x08 // object can be mapped in a PDO
-#define kEplObdAccArray 0x10 // object contains an array of numerical values
-#define kEplObdAccRange 0x20 // object contains lower and upper limit
-#define kEplObdAccVar 0x40 // object data is placed in application
-#define kEplObdAccStore 0x80 // object data can be stored to non volatile memory
-
-// combinations (not all combinations are required)
-#define kEplObdAccR (0 | 0 | 0 | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccW (0 | 0 | 0 | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccRW (0 | 0 | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccCR (0 | 0 | 0 | 0 | kEplObdAccConst | 0 | kEplObdAccRead)
-#define kEplObdAccGR (0 | 0 | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccGW (0 | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccGRW (0 | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccVR (0 | kEplObdAccVar | 0 | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccVW (0 | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccVRW (0 | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccVPR (0 | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccVPW (0 | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccVPRW (0 | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccVGR (0 | kEplObdAccVar | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccVGW (0 | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccVGRW (0 | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccVGPR (0 | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccVGPW (0 | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccVGPRW (0 | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccSR (kEplObdAccStore | 0 | 0 | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccSW (kEplObdAccStore | 0 | 0 | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccSRW (kEplObdAccStore | 0 | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccSCR (kEplObdAccStore | 0 | 0 | 0 | kEplObdAccConst | 0 | kEplObdAccRead)
-#define kEplObdAccSGR (kEplObdAccStore | 0 | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccSGW (kEplObdAccStore | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccSGRW (kEplObdAccStore | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccSVR (kEplObdAccStore | kEplObdAccVar | 0 | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccSVW (kEplObdAccStore | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccSVRW (kEplObdAccStore | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccSVPR (kEplObdAccStore | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccSVPW (kEplObdAccStore | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccSVPRW (kEplObdAccStore | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccSVGR (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccSVGW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccSVGRW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
-#define kEplObdAccSVGPR (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
-#define kEplObdAccSVGPW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
-#define kEplObdAccSVGPRW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
-
-typedef unsigned int tEplObdSize; // For all objects as objects size are used an unsigned int.
-
-// -------------------------------------------------------------------------
-// types for data types defined in DS301
-// -------------------------------------------------------------------------
-
-// types of objects in object dictionary
-// DS-301 defines these types as u16
-typedef enum {
-// types which are always supported
- kEplObdTypBool = 0x0001,
-
- kEplObdTypInt8 = 0x0002,
- kEplObdTypInt16 = 0x0003,
- kEplObdTypInt32 = 0x0004,
- kEplObdTypUInt8 = 0x0005,
- kEplObdTypUInt16 = 0x0006,
- kEplObdTypUInt32 = 0x0007,
- kEplObdTypReal32 = 0x0008,
- kEplObdTypVString = 0x0009,
- kEplObdTypOString = 0x000A,
- kEplObdTypDomain = 0x000F,
-
- kEplObdTypInt24 = 0x0010,
- kEplObdTypUInt24 = 0x0016,
-
- kEplObdTypReal64 = 0x0011,
- kEplObdTypInt40 = 0x0012,
- kEplObdTypInt48 = 0x0013,
- kEplObdTypInt56 = 0x0014,
- kEplObdTypInt64 = 0x0015,
- kEplObdTypUInt40 = 0x0018,
- kEplObdTypUInt48 = 0x0019,
- kEplObdTypUInt56 = 0x001A,
- kEplObdTypUInt64 = 0x001B,
- kEplObdTypTimeOfDay = 0x000C,
- kEplObdTypTimeDiff = 0x000D
-} tEplObdType;
-// other types are not supported in this version
-
-// -------------------------------------------------------------------------
-// types for data types defined in DS301
-// -------------------------------------------------------------------------
-
-typedef unsigned char tEplObdBoolean; // 0001
-typedef signed char tEplObdInteger8; // 0002
-typedef signed short int tEplObdInteger16; // 0003
-typedef signed long tEplObdInteger32; // 0004
-typedef unsigned char tEplObdUnsigned8; // 0005
-typedef unsigned short int tEplObdUnsigned16; // 0006
-typedef unsigned long tEplObdUnsigned32; // 0007
-typedef float tEplObdReal32; // 0008
-typedef unsigned char tEplObdDomain; // 000F
-typedef signed long tEplObdInteger24; // 0010
-typedef unsigned long tEplObdUnsigned24; // 0016
-
-typedef s64 tEplObdInteger40; // 0012
-typedef s64 tEplObdInteger48; // 0013
-typedef s64 tEplObdInteger56; // 0014
-typedef s64 tEplObdInteger64; // 0015
-
-typedef u64 tEplObdUnsigned40; // 0018
-typedef u64 tEplObdUnsigned48; // 0019
-typedef u64 tEplObdUnsigned56; // 001A
-typedef u64 tEplObdUnsigned64; // 001B
-
-typedef double tEplObdReal64; // 0011
-
-typedef tTimeOfDay tEplObdTimeOfDay; // 000C
-typedef tTimeOfDay tEplObdTimeDifference; // 000D
-
-// -------------------------------------------------------------------------
-// structur for defining a variable
-// -------------------------------------------------------------------------
-// -------------------------------------------------------------------------
-typedef enum {
- kVarValidSize = 0x01,
- kVarValidData = 0x02,
-// kVarValidCallback = 0x04,
-// kVarValidArg = 0x08,
-
- kVarValidAll = 0x03 // currently only size and data are implemented and used
-} tEplVarParamValid;
-
-typedef tEplKernel(*tEplVarCallback) (CCM_DECL_INSTANCE_HDL_ void *pParam_p);
-
-typedef struct {
- tEplVarParamValid m_ValidFlag;
- unsigned int m_uiIndex;
- unsigned int m_uiSubindex;
- tEplObdSize m_Size;
- void *m_pData;
-// tEplVarCallback m_fpCallback;
-// void * m_pArg;
-
-} tEplVarParam;
-
-typedef struct {
- void *m_pData;
- tEplObdSize m_Size;
-/*
- #if (EPL_PDO_USE_STATIC_MAPPING == FALSE)
- tEplVarCallback m_fpCallback;
- void * m_pArg;
- #endif
-*/
-} tEplObdVarEntry;
-
-typedef struct {
- tEplObdSize m_Size;
- u8 *m_pString;
-
-} tEplObdOString; // 000C
-
-typedef struct {
- tEplObdSize m_Size;
- char *m_pString;
-} tEplObdVString; // 000D
-
-typedef struct {
- tEplObdSize m_Size;
- char *m_pDefString; // $$$ d.k. it is unused, so we could delete it
- char *m_pString;
-
-} tEplObdVStringDef;
-
-typedef struct {
- tEplObdSize m_Size;
- u8 *m_pDefString; // $$$ d.k. it is unused, so we could delete it
- u8 *m_pString;
-
-} tEplObdOStringDef;
-
-//r.d. parameter struct for changing object size and/or pointer to data of Strings or Domains
-typedef struct {
- tEplObdSize m_DownloadSize; // download size from SDO or APP
- tEplObdSize m_ObjSize; // current object size from OD - should be changed from callback function
- void *m_pData; // current object ptr from OD - should be changed from callback function
-
-} tEplObdVStringDomain; // 000D
-
-// ============================================================================
-// types
-// ============================================================================
-// -------------------------------------------------------------------------
-// subindexstruct
-// -------------------------------------------------------------------------
-
-// Change not the order for this struct!!!
-typedef struct {
- unsigned int m_uiSubIndex;
- tEplObdType m_Type;
- tEplObdAccess m_Access;
- void *m_pDefault;
- void *m_pCurrent; // points always to RAM
-
-} tEplObdSubEntry;
-
-// r.d.: has always to be because new OBD-Macros for arrays
-typedef tEplObdSubEntry *tEplObdSubEntryPtr;
-
-// -------------------------------------------------------------------------
-// callback function for objdictionary modul
-// -------------------------------------------------------------------------
-
-// parameters for callback function
-typedef struct {
- tEplObdEvent m_ObdEvent;
- unsigned int m_uiIndex;
- unsigned int m_uiSubIndex;
- void *m_pArg;
- u32 m_dwAbortCode;
-
-} tEplObdCbParam;
-
-// define type for callback function: pParam_p points to tEplObdCbParam
-typedef tEplKernel(*tEplObdCallback) (CCM_DECL_INSTANCE_HDL_ tEplObdCbParam *pParam_p);
-
-// do not change the order for this struct!!!
-
-typedef struct {
- unsigned int m_uiIndex;
- tEplObdSubEntryPtr m_pSubIndex;
- unsigned int m_uiCount;
- tEplObdCallback m_fpCallback; // function is called back if object access
-
-} tEplObdEntry;
-
-// allways pointer
-typedef tEplObdEntry *tEplObdEntryPtr;
-
-// -------------------------------------------------------------------------
-// structur to initialize OBD module
-// -------------------------------------------------------------------------
-
-typedef struct {
- tEplObdEntryPtr m_pPart;
- tEplObdEntryPtr m_pManufacturerPart;
- tEplObdEntryPtr m_pDevicePart;
-
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
-
- tEplObdEntryPtr m_pUserPart;
-
-#endif
-
-} tEplObdInitParam;
-
-// -------------------------------------------------------------------------
-// structur for parameters of STORE RESTORE command
-// -------------------------------------------------------------------------
-
-typedef struct {
- tEplObdCommand m_bCommand;
- tEplObdPart m_bCurrentOdPart;
- void *m_pData;
- tEplObdSize m_ObjSize;
-
-} tEplObdCbStoreParam;
-
-typedef tEplKernel(*tInitTabEntryCallback) (void *pTabEntry_p, unsigned int uiObjIndex_p);
-
-typedef tEplKernel(*tEplObdStoreLoadObjCallback) (CCM_DECL_INSTANCE_HDL_ tEplObdCbStoreParam *pCbStoreParam_p);
-
-// -------------------------------------------------------------------------
-// this stucture is used for parameters for function ObdInitModuleTab()
-// -------------------------------------------------------------------------
-typedef struct {
- unsigned int m_uiLowerObjIndex; // lower limit of ObjIndex
- unsigned int m_uiUpperObjIndex; // upper limit of ObjIndex
- tInitTabEntryCallback m_fpInitTabEntry; // will be called if ObjIndex was found
- void *m_pTabBase; // base address of table
- unsigned int m_uiEntrySize; // size of table entry // 25-feb-2005 r.d.: expansion from u8 to u16 necessary for PDO bit mapping
- unsigned int m_uiMaxEntries; // max. tabel entries
-
-} tEplObdModulTabParam;
-
-//-------------------------------------------------------------------
-// enum for function EplObdSetNodeId
-//-------------------------------------------------------------------
-typedef enum {
- kEplObdNodeIdUnknown = 0x00, // unknown how the node id was set
- kEplObdNodeIdSoftware = 0x01, // node id set by software
- kEplObdNodeIdHardware = 0x02 // node id set by hardware
-} tEplObdNodeIdType;
-
-// ============================================================================
-// global variables
-// ============================================================================
-
-// ============================================================================
-// public functions
-// ============================================================================
-
-#endif // #ifndef _EPLOBD_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for macros of EplOBD-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: EplObdMacro.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/05 k.t.: start of the implementation
- -> based on CANopen ObdMacro.h
-
-****************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#if defined (EPL_OBD_DEFINE_MACRO)
-
- //-------------------------------------------------------------------------------------------
-#if defined (EPL_OBD_CREATE_ROM_DATA)
-
-// #pragma message ("EPL_OBD_CREATE_ROM_DATA")
-
-#define EPL_OBD_BEGIN() static u32 dwObd_OBK_g = 0x0000;
-#define EPL_OBD_END()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_PART_GENERIC()
-#define EPL_OBD_BEGIN_PART_MANUFACTURER()
-#define EPL_OBD_BEGIN_PART_DEVICE()
-#define EPL_OBD_END_PART()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_INDEX_RAM(ind,cnt,call)
-#define EPL_OBD_END_INDEX(ind)
-#define EPL_OBD_RAM_INDEX_RAM_ARRAY(ind,cnt,call,typ,acc,dtyp,name,def) static tEplObdUnsigned8 xDef##ind##_0x00_g = (cnt); \
- static dtyp xDef##ind##_0x01_g = (def);
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY(ind,cnt,call,typ,acc,dtyp,name,def) static tEplObdUnsigned8 xDef##ind##_0x00_g = (cnt); \
- static dtyp xDef##ind##_0x01_g = (def);
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(ind,cnt,call,typ,acc,dtyp,name) static tEplObdUnsigned8 xDef##ind##_0x00_g = (cnt);
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_SUBINDEX_RAM_VAR(ind,sub,typ,acc,dtyp,name,val) static dtyp xDef##ind##_##sub##_g = val;
-#define EPL_OBD_SUBINDEX_RAM_VAR_RG(ind,sub,typ,acc,dtyp,name,val,low,high) static dtyp xDef##ind##_##sub##_g[3] = {val,low,high};
-#define EPL_OBD_SUBINDEX_RAM_VAR_NOINIT(ind,sub,typ,acc,dtyp,name)
-#define EPL_OBD_SUBINDEX_RAM_VSTRING(ind,sub,acc,name,size,val) static char szCur##ind##_##sub##_g[size+1]; \
- static tEplObdVStringDef xDef##ind##_##sub##_g = {size, val, szCur##ind##_##sub##_g};
-
-#define EPL_OBD_SUBINDEX_RAM_OSTRING(ind,sub,acc,name,size) static u8 bCur##ind##_##sub##_g[size]; \
- static tEplObdOStringDef xDef##ind##_##sub##_g = {size, ((u8*)""), bCur##ind##_##sub##_g};
-#define EPL_OBD_SUBINDEX_RAM_DOMAIN(ind,sub,acc,name)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF(ind,sub,typ,acc,dtyp,name,val) static dtyp xDef##ind##_##sub##_g = val;
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_RG(ind,sub,typ,acc,dtyp,name,val,low,high) static dtyp xDef##ind##_##sub##_g[3] = {val,low,high};
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT(ind,sub,typ,acc,dtyp,name)
-
-//-------------------------------------------------------------------------------------------
-#elif defined (EPL_OBD_CREATE_RAM_DATA)
-
-// #pragma message ("EPL_OBD_CREATE_RAM_DATA")
-
-#define EPL_OBD_BEGIN()
-#define EPL_OBD_END()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_PART_GENERIC()
-#define EPL_OBD_BEGIN_PART_MANUFACTURER()
-#define EPL_OBD_BEGIN_PART_DEVICE()
-#define EPL_OBD_END_PART()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_INDEX_RAM(ind,cnt,call)
-#define EPL_OBD_END_INDEX(ind)
-#define EPL_OBD_RAM_INDEX_RAM_ARRAY(ind,cnt,call,typ,acc,dtyp,name,def) static dtyp axCur##ind##_g[cnt];
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY(ind,cnt,call,typ,acc,dtyp,name,def) static tEplObdVarEntry aVarEntry##ind##_g[cnt];
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(ind,cnt,call,typ,acc,dtyp,name) static tEplObdVarEntry aVarEntry##ind##_g[cnt];
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_SUBINDEX_RAM_VAR(ind,sub,typ,acc,dtyp,name,val) static dtyp xCur##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_VAR_RG(ind,sub,typ,acc,dtyp,name,val,low,high) static dtyp xCur##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_VSTRING(ind,sub,acc,name,size,val) static tEplObdVString xCur##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_OSTRING(ind,sub,acc,name,size) static tEplObdOString xCur##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_VAR_NOINIT(ind,sub,typ,acc,dtyp,name) static dtyp xCur##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_DOMAIN(ind,sub,acc,name) static tEplObdVarEntry VarEntry##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_USERDEF(ind,sub,typ,acc,dtyp,name,val) static tEplObdVarEntry VarEntry##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_RG(ind,sub,typ,acc,dtyp,name,val,low,high) static tEplObdVarEntry VarEntry##ind##_##sub##_g;
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT(ind,sub,typ,acc,dtyp,name) static tEplObdVarEntry VarEntry##ind##_##sub##_g;
-
- //-------------------------------------------------------------------------------------------
-#elif defined (EPL_OBD_CREATE_SUBINDEX_TAB)
-
-// #pragma message ("EPL_OBD_CREATE_SUBINDEX_TAB")
-
-#define EPL_OBD_BEGIN()
-#define EPL_OBD_END()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_PART_GENERIC()
-#define EPL_OBD_BEGIN_PART_MANUFACTURER()
-#define EPL_OBD_BEGIN_PART_DEVICE()
-#define EPL_OBD_END_PART()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_INDEX_RAM(ind,cnt,call) static tEplObdSubEntry aObdSubEntry##ind##Ram_g[cnt]= {
-#define EPL_OBD_END_INDEX(ind) EPL_OBD_END_SUBINDEX()};
-#define EPL_OBD_RAM_INDEX_RAM_ARRAY(ind,cnt,call,typ,acc,dtyp,name,def) static tEplObdSubEntry aObdSubEntry##ind##Ram_g[]= { \
- {0, kEplObdTypUInt8, kEplObdAccCR, &xDef##ind##_0x00_g, NULL}, \
- {1, typ, (acc)|kEplObdAccArray, &xDef##ind##_0x01_g, &axCur##ind##_g[0]}, \
- EPL_OBD_END_SUBINDEX()};
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY(ind,cnt,call,typ,acc,dtyp,name,def) static tEplObdSubEntry aObdSubEntry##ind##Ram_g[]= { \
- {0, kEplObdTypUInt8, kEplObdAccCR, &xDef##ind##_0x00_g, NULL}, \
- {1, typ, (acc)|kEplObdAccArray|kEplObdAccVar, &xDef##ind##_0x01_g, &aVarEntry##ind##_g[0]}, \
- EPL_OBD_END_SUBINDEX()};
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(ind,cnt,call,typ,acc,dtyp,name) static tEplObdSubEntry aObdSubEntry##ind##Ram_g[]= { \
- {0, kEplObdTypUInt8, kEplObdAccCR, &xDef##ind##_0x00_g, NULL}, \
- {1, typ, (acc)|kEplObdAccArray|kEplObdAccVar, NULL, &aVarEntry##ind##_g[0]}, \
- EPL_OBD_END_SUBINDEX()};
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_SUBINDEX_RAM_VAR(ind,sub,typ,acc,dtyp,name,val) {sub,typ, (acc), &xDef##ind##_##sub##_g, &xCur##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_VAR_RG(ind,sub,typ,acc,dtyp,name,val,low,high) {sub,typ, (acc)|kEplObdAccRange, &xDef##ind##_##sub##_g[0],&xCur##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_VAR_NOINIT(ind,sub,typ,acc,dtyp,name) {sub,typ, (acc), NULL, &xCur##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_VSTRING(ind,sub,acc,name,size,val) {sub,kEplObdTypVString,(acc)/*|kEplObdAccVar*/, &xDef##ind##_##sub##_g, &xCur##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_OSTRING(ind,sub,acc,name,size) {sub,kEplObdTypOString,(acc)/*|kEplObdAccVar*/, &xDef##ind##_##sub##_g, &xCur##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_DOMAIN(ind,sub,acc,name) {sub,kEplObdTypDomain, (acc)|kEplObdAccVar, NULL, &VarEntry##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_USERDEF(ind,sub,typ,acc,dtyp,name,val) {sub,typ, (acc)|kEplObdAccVar, &xDef##ind##_##sub##_g, &VarEntry##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_RG(ind,sub,typ,acc,dtyp,name,val,low,high) {sub,typ, (acc)|kEplObdAccVar|kEplObdAccRange,&xDef##ind##_##sub##_g[0],&VarEntry##ind##_##sub##_g},
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT(ind,sub,typ,acc,dtyp,name) {sub,typ, (acc)|kEplObdAccVar, NULL, &VarEntry##ind##_##sub##_g},
-
- //-------------------------------------------------------------------------------------------
-#elif defined (EPL_OBD_CREATE_INDEX_TAB)
-
-// #pragma message ("EPL_OBD_CREATE_INDEX_TAB")
-
-#define EPL_OBD_BEGIN()
-#define EPL_OBD_END()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_PART_GENERIC() static tEplObdEntry aObdTab_g[] = {
-#define EPL_OBD_BEGIN_PART_MANUFACTURER() static tEplObdEntry aObdTabManufacturer_g[] = {
-#define EPL_OBD_BEGIN_PART_DEVICE() static tEplObdEntry aObdTabDevice_g[] = {
-#define EPL_OBD_END_PART() {EPL_OBD_TABLE_INDEX_END,(tEplObdSubEntryPtr)&dwObd_OBK_g,0,NULL}};
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_INDEX_RAM(ind,cnt,call) {ind,(tEplObdSubEntryPtr)&aObdSubEntry##ind##Ram_g[0],cnt,(tEplObdCallback)call},
-#define EPL_OBD_END_INDEX(ind)
-#define EPL_OBD_RAM_INDEX_RAM_ARRAY(ind,cnt,call,typ,acc,dtyp,name,def) {ind,(tEplObdSubEntryPtr)&aObdSubEntry##ind##Ram_g[0],(cnt)+1,(tEplObdCallback)call},
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY(ind,cnt,call,typ,acc,dtyp,name,def) {ind,(tEplObdSubEntryPtr)&aObdSubEntry##ind##Ram_g[0],(cnt)+1,(tEplObdCallback)call},
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(ind,cnt,call,typ,acc,dtyp,name) {ind,(tEplObdSubEntryPtr)&aObdSubEntry##ind##Ram_g[0],(cnt)+1,(tEplObdCallback)call},
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_SUBINDEX_RAM_VAR(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_VAR_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_VSTRING(ind,sub,acc,name,size,val)
-#define EPL_OBD_SUBINDEX_RAM_OSTRING(ind,sub,acc,name,size)
-#define EPL_OBD_SUBINDEX_RAM_VAR_NOINIT(ind,sub,typ,acc,dtyp,name)
-#define EPL_OBD_SUBINDEX_RAM_DOMAIN(ind,sub,acc,name)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT(ind,sub,typ,acc,dtyp,name)
-
- //-------------------------------------------------------------------------------------------
-#elif defined (EPL_OBD_CREATE_INIT_FUNCTION)
-
-// #pragma message ("EPL_OBD_CREATE_INIT_FUNCTION")
-
-#define EPL_OBD_BEGIN()
-#define EPL_OBD_END()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_PART_GENERIC() pInitParam->m_pPart = (tEplObdEntryPtr) &aObdTab_g[0];
-#define EPL_OBD_BEGIN_PART_MANUFACTURER() pInitParam->m_pManufacturerPart = (tEplObdEntryPtr) &aObdTabManufacturer_g[0];
-#define EPL_OBD_BEGIN_PART_DEVICE() pInitParam->m_pDevicePart = (tEplObdEntryPtr) &aObdTabDevice_g[0];
-#define EPL_OBD_END_PART()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_INDEX_RAM(ind,cnt,call)
-#define EPL_OBD_END_INDEX(ind)
-#define EPL_OBD_RAM_INDEX_RAM_ARRAY(ind,cnt,call,typ,acc,dtyp,name,def)
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY(ind,cnt,call,typ,acc,dtyp,name,def)
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(ind,cnt,call,typ,acc,dtyp,name)
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_SUBINDEX_RAM_VAR(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_VAR_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_VSTRING(ind,sub,acc,name,size,val)
-#define EPL_OBD_SUBINDEX_RAM_OSTRING(ind,sub,acc,name,size)
-#define EPL_OBD_SUBINDEX_RAM_VAR_NOINIT(ind,sub,typ,acc,dtyp,name)
-#define EPL_OBD_SUBINDEX_RAM_DOMAIN(ind,sub,acc,name)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT(ind,sub,typ,acc,dtyp,name)
-
- //-------------------------------------------------------------------------------------------
-#elif defined (EPL_OBD_CREATE_INIT_SUBINDEX)
-
-// #pragma message ("EPL_OBD_CREATE_INIT_SUBINDEX")
-
-#define EPL_OBD_BEGIN()
-#define EPL_OBD_END()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_PART_GENERIC()
-#define EPL_OBD_BEGIN_PART_MANUFACTURER()
-#define EPL_OBD_BEGIN_PART_DEVICE()
-#define EPL_OBD_END_PART()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_INDEX_RAM(ind,cnt,call) //CCM_SUBINDEX_RAM_ONLY (EPL_MEMCPY (&aObdSubEntry##ind##Ram_g[0],&aObdSubEntry##ind##Rom_g[0],sizeof(aObdSubEntry##ind##Ram_g)));
-#define EPL_OBD_END_INDEX(ind)
-#define EPL_OBD_RAM_INDEX_RAM_ARRAY(ind,cnt,call,typ,acc,dtyp,name,def) //EPL_MEMCPY (&aObdSubEntry##ind##Ram_g[0],&aObdSubEntry##ind##Rom_g[0],sizeof(aObdSubEntry##ind##Ram_g));
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY(ind,cnt,call,typ,acc,dtyp,name,def) //EPL_MEMCPY (&aObdSubEntry##ind##Ram_g[0],&aObdSubEntry##ind##Rom_g[0],sizeof(aObdSubEntry##ind##Ram_g));
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(ind,cnt,call,typ,acc,dtyp,name) //EPL_MEMCPY (&aObdSubEntry##ind##Ram_g[0],&aObdSubEntry##ind##Rom_g[0],sizeof(aObdSubEntry##ind##Ram_g));
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_SUBINDEX_RAM_VAR(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_VAR_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_VSTRING(ind,sub,acc,name,size,val)
-#define EPL_OBD_SUBINDEX_RAM_OSTRING(ind,sub,acc,name,size)
-#define EPL_OBD_SUBINDEX_RAM_VAR_NOINIT(ind,sub,typ,acc,dtyp,name)
-#define EPL_OBD_SUBINDEX_RAM_DOMAIN(ind,sub,acc,name)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT(ind,sub,typ,acc,dtyp,name)
-
- //-------------------------------------------------------------------------------------------
-#else
-
-// #pragma message ("ELSE OF DEFINE")
-
-#define EPL_OBD_BEGIN()
-#define EPL_OBD_END()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_PART_GENERIC()
-#define EPL_OBD_BEGIN_PART_MANUFACTURER()
-#define EPL_OBD_BEGIN_PART_DEVICE()
-#define EPL_OBD_END_PART()
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_BEGIN_INDEX_RAM(ind,cnt,call)
-#define EPL_OBD_END_INDEX(ind)
-#define EPL_OBD_RAM_INDEX_RAM_ARRAY(ind,cnt,call,typ,acc,dtyp,name,def)
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY(ind,cnt,call,typ,acc,dtyp,name,def)
-#define EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT(ind,cnt,call,typ,acc,dtyp,name)
-
- //---------------------------------------------------------------------------------------
-#define EPL_OBD_SUBINDEX_RAM_VAR(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_VAR_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_VSTRING(ind,sub,acc,name,sizes,val)
-#define EPL_OBD_SUBINDEX_RAM_OSTRING(ind,sub,acc,name,size)
-#define EPL_OBD_SUBINDEX_RAM_VAR_NOINIT(ind,sub,typ,acc,dtyp,name)
-#define EPL_OBD_SUBINDEX_RAM_DOMAIN(ind,sub,acc,name)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF(ind,sub,typ,acc,dtyp,name,val)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_RG(ind,sub,typ,acc,dtyp,name,val,low,high)
-#define EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT(ind,sub,typ,acc,dtyp,name)
-
-#endif
-
- //-------------------------------------------------------------------------------------------
-#elif defined (EPL_OBD_UNDEFINE_MACRO)
-
-// #pragma message ("EPL_OBD_UNDEFINE_MACRO")
-
-#undef EPL_OBD_BEGIN
-#undef EPL_OBD_END
-
- //---------------------------------------------------------------------------------------
-#undef EPL_OBD_BEGIN_PART_GENERIC
-#undef EPL_OBD_BEGIN_PART_MANUFACTURER
-#undef EPL_OBD_BEGIN_PART_DEVICE
-#undef EPL_OBD_END_PART
-
- //---------------------------------------------------------------------------------------
-#undef EPL_OBD_BEGIN_INDEX_RAM
-#undef EPL_OBD_END_INDEX
-#undef EPL_OBD_RAM_INDEX_RAM_ARRAY
-#undef EPL_OBD_RAM_INDEX_RAM_VARARRAY
-#undef EPL_OBD_RAM_INDEX_RAM_VARARRAY_NOINIT
-
- //---------------------------------------------------------------------------------------
-#undef EPL_OBD_SUBINDEX_RAM_VAR
-#undef EPL_OBD_SUBINDEX_RAM_VAR_RG
-#undef EPL_OBD_SUBINDEX_RAM_VSTRING
-#undef EPL_OBD_SUBINDEX_RAM_OSTRING
-#undef EPL_OBD_SUBINDEX_RAM_VAR_NOINIT
-#undef EPL_OBD_SUBINDEX_RAM_DOMAIN
-#undef EPL_OBD_SUBINDEX_RAM_USERDEF
-#undef EPL_OBD_SUBINDEX_RAM_USERDEF_RG
-#undef EPL_OBD_SUBINDEX_RAM_USERDEF_NOINIT
-
-#else
-
-#error "nothing defined"
-
-#endif
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for communication abstraction layer
- for the Epl-Obd-Kernelspace-Modul
-
- 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: EplObdkCal.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- KEIL uVision 2
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/19 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "EplInc.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for Epl-Obd-Userspace-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: EplObdu.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/06/19 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "EplInc.h"
-#include "user/EplObdu.h"
-#include "user/EplObduCal.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduWriteEntry()
-//
-// Description: Function writes data to an OBD entry. Strings
-// are stored with added '\0' character.
-//
-// Parameters: uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduWriteEntry(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p)
-{
- tEplKernel Ret;
-
- Ret = EplObduCalWriteEntry(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduReadEntry()
-//
-// Description: The function reads an object entry. The application
-// can always read the data even if attrib kEplObdAccRead
-// is not set. The attrib is only checked up for SDO transfer.
-//
-// Parameters: uiIndex_p = Index oof the OD entry to read
-// uiSubIndex_p = Subindex to read
-// pDstData_p = pointer to the buffer for data
-// Offset_p = offset in data for read access
-// pSize_p = IN: Size of the buffer
-// OUT: number of readed Bytes
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduReadEntry(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p,
- tEplObdSize *pSize_p)
-{
- tEplKernel Ret;
-
- Ret = EplObduCalReadEntry(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdAccessOdPart()
-//
-// Description: restores default values of one part of OD
-//
-// Parameters: ObdPart_p = od-part to reset
-// Direction_p = directory flag for
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduAccessOdPart(tEplObdPart ObdPart_p, tEplObdDir Direction_p)
-{
- tEplKernel Ret;
-
- Ret = EplObduCalAccessOdPart(ObdPart_p, Direction_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduDefineVar()
-//
-// Description: defines a variable in OD
-//
-// Parameters: pEplVarParam_p = varentry
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduDefineVar(tEplVarParam *pVarParam_p)
-{
- tEplKernel Ret;
-
- Ret = EplObduCalDefineVar(pVarParam_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduGetObjectDataPtr()
-//
-// Description: It returnes the current data pointer. But if object is an
-// constant object it returnes the default pointer.
-//
-// Parameters: uiIndex_p = Index of the entry
-// uiSubindex_p = Subindex of the entry
-//
-// Return: void * = pointer to object data
-//
-// State:
-//
-//---------------------------------------------------------------------------
-void *EplObduGetObjectDataPtr(unsigned int uiIndex_p, unsigned int uiSubIndex_p)
-{
- void *pData;
-
- pData = EplObduCalGetObjectDataPtr(uiIndex_p, uiSubIndex_p);
-
- return pData;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduRegisterUserOd()
-//
-// Description: function registers the user OD
-//
-// Parameters: pUserOd_p =pointer to user ODd
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
-tEplKernel EplObduRegisterUserOd(tEplObdEntryPtr pUserOd_p)
-{
- tEplKernel Ret;
-
- Ret = EplObduCalRegisterUserOd(pUserOd_p);
-
- return Ret;
-
-}
-#endif
-//---------------------------------------------------------------------------
-//
-// Function: EplObduInitVarEntry()
-//
-// Description: function to initialize VarEntry dependened on object type
-//
-// Parameters: pVarEntry_p = pointer to var entry structure
-// bType_p = object type
-// ObdSize_p = size of object data
-//
-// Returns: none
-//
-// State:
-//
-//---------------------------------------------------------------------------
-void EplObduInitVarEntry(tEplObdVarEntry *pVarEntry_p, u8 bType_p, tEplObdSize ObdSize_p)
-{
- EplObduCalInitVarEntry(pVarEntry_p, bType_p, ObdSize_p);
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduGetDataSize()
-//
-// Description: function to initialize VarEntry dependened on object type
-//
-// gets the data size of an object
-// for string objects it returnes the string length
-//
-// Parameters: uiIndex_p = Index
-// uiSubIndex_p= Subindex
-//
-// Return: tEplObdSize
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplObdSize EplObduGetDataSize(unsigned int uiIndex_p, unsigned int uiSubIndex_p)
-{
- tEplObdSize Size;
-
- Size = EplObduCalGetDataSize(uiIndex_p, uiSubIndex_p);
-
- return Size;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduGetNodeId()
-//
-// Description: function returns nodeid from entry 0x1F93
-//
-//
-// Parameters:
-//
-// Return: unsigned int = Node Id
-//
-// State:
-//
-//---------------------------------------------------------------------------
-unsigned int EplObduGetNodeId(void)
-{
- unsigned int uiNodeId;
-
- uiNodeId = EplObduCalGetNodeId();
-
- return uiNodeId;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduSetNodeId()
-//
-// Description: function sets nodeid in entry 0x1F93
-//
-//
-// Parameters: uiNodeId_p = Node Id to set
-// NodeIdType_p= Type on which way the Node Id was set
-//
-// Return: tEplKernel = Errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduSetNodeId(unsigned int uiNodeId_p, tEplObdNodeIdType NodeIdType_p)
-{
- tEplKernel Ret;
-
- Ret = EplObduCalSetNodeId(uiNodeId_p, NodeIdType_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduGetAccessType()
-//
-// Description: Function returns accesstype of the entry
-//
-// Parameters: uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pAccessTyp_p = pointer to buffer to store accesstyp
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduGetAccessType(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplObdAccess *pAccessTyp_p)
-{
- tEplObdAccess AccessType;
-
- AccessType =
- EplObduCalGetAccessType(uiIndex_p, uiSubIndex_p, pAccessTyp_p);
-
- return AccessType;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObdReaduEntryToLe()
-//
-// Description: The function reads an object entry from the byteoder
-// of the system to the little endian byteorder for numeric values.
-// For other types a normal read will be processed. This is usefull for
-// the PDO and SDO module. The application
-// can always read the data even if attrib kEplObdAccRead
-// is not set. The attrib is only checked up for SDO transfer.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry to read
-// uiSubIndex_p = Subindex to read
-// pDstData_p = pointer to the buffer for data
-// Offset_p = offset in data for read access
-// pSize_p = IN: Size of the buffer
-// OUT: number of readed Bytes
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduReadEntryToLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p,
- tEplObdSize *pSize_p)
-{
- tEplKernel Ret;
-
- Ret =
- EplObduCalReadEntryToLe(uiIndex_p, uiSubIndex_p, pDstData_p,
- pSize_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduWriteEntryFromLe()
-//
-// Description: Function writes data to an OBD entry from a source with
-// little endian byteorder to the od with system specuific
-// byteorder. Not numeric values will only by copied. Strings
-// are stored with added '\0' character.
-//
-// Parameters: EPL_MCO_DECL_INSTANCE_PTR_
-// uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduWriteEntryFromLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p,
- tEplObdSize Size_p)
-{
- tEplKernel Ret;
-
- Ret =
- EplObduCalWriteEntryFromLe(uiIndex_p, uiSubIndex_p, pSrcData_p,
- Size_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduSearchVarEntry()
-//
-// Description: gets variable from OD
-//
-// Parameters: uiIndex_p = index of the var entry to search
-// uiSubindex_p = subindex of var entry to search
-// ppVarEntry_p = pointer to the pointer to the varentry
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdVarEntry **ppVarEntry_p)
-{
- tEplKernel Ret;
-
- Ret = EplObduCalSearchVarEntry(uiIndex_p, uiSubindex_p, ppVarEntry_p);
-
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for communication abstraction layer
- for the Epl-Obd-Userspace-Modul
-
- 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: EplObduCal.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/19 k.t.: start of the implementation
-
-****************************************************************************/
-#include "EplInc.h"
-#include "user/EplObduCal.h"
-#include "kernel/EplObdk.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) && (EPL_OBD_USE_KERNEL != FALSE)
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalWriteEntry()
-//
-// Description: Function encapsulate access of function EplObdWriteEntry
-//
-// Parameters: uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalWriteEntry(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdWriteEntry(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalReadEntry()
-//
-// Description: Function encapsulate access of function EplObdReadEntry
-//
-// Parameters: uiIndex_p = Index oof the OD entry to read
-// uiSubIndex_p = Subindex to read
-// pDstData_p = pointer to the buffer for data
-// Offset_p = offset in data for read access
-// pSize_p = IN: Size of the buffer
-// OUT: number of readed Bytes
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalReadEntry(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p, tEplObdSize *pSize_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdReadEntry(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalAccessOdPart()
-//
-// Description: Function encapsulate access of function EplObdAccessOdPart
-//
-// Parameters: ObdPart_p = od-part to reset
-// Direction_p = directory flag for
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalAccessOdPart(tEplObdPart ObdPart_p, tEplObdDir Direction_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdAccessOdPart(ObdPart_p, Direction_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalDefineVar()
-//
-// Description: Function encapsulate access of function EplObdDefineVar
-//
-// Parameters: pEplVarParam_p = varentry
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalDefineVar(tEplVarParam *pVarParam_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdDefineVar(pVarParam_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalGetObjectDataPtr()
-//
-// Description: Function encapsulate access of function EplObdGetObjectDataPtr
-//
-// Parameters: uiIndex_p = Index of the entry
-// uiSubindex_p = Subindex of the entry
-//
-// Return: void * = pointer to object data
-//
-// State:
-//
-//---------------------------------------------------------------------------
-void *EplObduCalGetObjectDataPtr(unsigned int uiIndex_p, unsigned int uiSubIndex_p)
-{
- void *pData;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- pData = EplObdGetObjectDataPtr(uiIndex_p, uiSubIndex_p);
-#else
- pData = NULL;
-#endif
-
- return pData;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalRegisterUserOd()
-//
-// Description: Function encapsulate access of function EplObdRegisterUserOd
-//
-// Parameters: pUserOd_p = pointer to user OD
-//
-// Return: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
-tEplKernel EplObduCalRegisterUserOd(tEplObdEntryPtr pUserOd_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdRegisterUserOd(pUserOd_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-
-}
-#endif
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalInitVarEntry()
-//
-// Description: Function encapsulate access of function EplObdInitVarEntry
-//
-// Parameters: pVarEntry_p = pointer to var entry structure
-// bType_p = object type
-// ObdSize_p = size of object data
-//
-// Returns: none
-//
-// State:
-//
-//---------------------------------------------------------------------------
-void EplObduCalInitVarEntry(tEplObdVarEntry *pVarEntry_p, u8 bType_p,
- tEplObdSize ObdSize_p)
-{
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- EplObdInitVarEntry(pVarEntry_p, bType_p, ObdSize_p);
-#endif
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalGetDataSize()
-//
-// Description: Function encapsulate access of function EplObdGetDataSize
-//
-// gets the data size of an object
-// for string objects it returnes the string length
-//
-// Parameters: uiIndex_p = Index
-// uiSubIndex_p= Subindex
-//
-// Return: tEplObdSize
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplObdSize EplObduCalGetDataSize(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p)
-{
- tEplObdSize Size;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Size = EplObdGetDataSize(uiIndex_p, uiSubIndex_p);
-#else
- Size = 0;
-#endif
-
- return Size;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalGetNodeId()
-//
-// Description: Function encapsulate access of function EplObdGetNodeId
-//
-//
-// Parameters:
-//
-// Return: unsigned int = Node Id
-//
-// State:
-//
-//---------------------------------------------------------------------------
-unsigned int EplObduCalGetNodeId(void)
-{
- unsigned int uiNodeId;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- uiNodeId = EplObdGetNodeId();
-#else
- uiNodeId = 0;
-#endif
-
- return uiNodeId;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalSetNodeId()
-//
-// Description: Function encapsulate access of function EplObdSetNodeId
-//
-//
-// Parameters: uiNodeId_p = Node Id to set
-// NodeIdType_p= Type on which way the Node Id was set
-//
-// Return: tEplKernel = Errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalSetNodeId(unsigned int uiNodeId_p,
- tEplObdNodeIdType NodeIdType_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdSetNodeId(uiNodeId_p, NodeIdType_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalGetAccessType()
-//
-// Description: Function encapsulate access of function EplObdGetAccessType
-//
-// Parameters: uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pAccessTyp_p = pointer to buffer to store accesstype
-//
-// Return: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalGetAccessType(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplObdAccess *pAccessTyp_p)
-{
- tEplObdAccess AccesType;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- AccesType = EplObdGetAccessType(uiIndex_p, uiSubIndex_p, pAccessTyp_p);
-#else
- AccesType = 0;
-#endif
-
- return AccesType;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalReadEntryToLe()
-//
-// Description: Function encapsulate access of function EplObdReadEntryToLe
-//
-// Parameters: uiIndex_p = Index of the OD entry to read
-// uiSubIndex_p = Subindex to read
-// pDstData_p = pointer to the buffer for data
-// Offset_p = offset in data for read access
-// pSize_p = IN: Size of the buffer
-// OUT: number of readed Bytes
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalReadEntryToLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p,
- tEplObdSize *pSize_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdReadEntryToLe(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
-#else
- Ret = kEplSuccessful;
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalWriteEntryFromLe()
-//
-// Description: Function encapsulate access of function EplObdWriteEntryFromLe
-//
-// Parameters: uiIndex_p = Index of the OD entry
-// uiSubIndex_p = Subindex of the OD Entry
-// pSrcData_p = Pointer to the data to write
-// Size_p = Size of the data in Byte
-//
-// Return: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalWriteEntryFromLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret =
- EplObdWriteEntryFromLe(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
-#else
- Ret = kEplSuccessful;
-#endif
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplObduCalSearchVarEntry()
-//
-// Description: gets variable from OD
-//
-// Parameters: uiIndex_p = index of the var entry to search
-// uiSubindex_p = subindex of var entry to search
-// ppVarEntry_p = pointer to the pointer to the varentry
-//
-// Return: tEplKernel
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdVarEntry **ppVarEntry_p)
-{
- tEplKernel Ret;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
- Ret = EplObdSearchVarEntry(uiIndex_p, uiSubindex_p, ppVarEntry_p);
-#else
- Ret = kEplSuccessful;
-#endif
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for PDO 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: EplPdo.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/05/22 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_PDO_H_
-#define _EPL_PDO_H_
-
-#include "EplInc.h"
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// invalid PDO-NodeId
-#define EPL_PDO_INVALID_NODE_ID 0xFF
-// NodeId for PReq RPDO
-#define EPL_PDO_PREQ_NODE_ID 0x00
-// NodeId for PRes TPDO
-#define EPL_PDO_PRES_NODE_ID 0x00
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef struct {
- void *m_pVar;
- u16 m_wOffset; // in Bits
- u16 m_wSize; // in Bits
- BOOL m_fNumeric; // numeric value -> use AMI functions
-
-} tEplPdoMapping;
-
-typedef struct {
- unsigned int m_uiSizeOfStruct;
- unsigned int m_uiPdoId;
- unsigned int m_uiNodeId;
- // 0xFF=invalid, RPDO: 0x00=PReq, localNodeId=PRes, remoteNodeId=PRes
- // TPDO: 0x00=PRes, MN: CnNodeId=PReq
-
- BOOL m_fTxRx;
- u8 m_bMappingVersion;
- unsigned int m_uiMaxMappingEntries; // maximum number of mapping entries, i.e. size of m_aPdoMapping
- tEplPdoMapping m_aPdoMapping[1];
-
-} tEplPdoParam;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPL_PDO_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for kernel PDO 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: EplPdok.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $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 "kernel/EplPdok.h"
-#include "kernel/EplPdokCal.h"
-#include "kernel/EplEventk.h"
-#include "kernel/EplObdk.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) == 0)
-
-#error 'ERROR: Missing DLLk-Modul!'
-
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) == 0)
-
-#error 'ERROR: Missing OBDk-Modul!'
-
-#endif
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#define EPL_PDOK_OBD_IDX_RX_COMM_PARAM 0x1400
-#define EPL_PDOK_OBD_IDX_RX_MAPP_PARAM 0x1600
-#define EPL_PDOK_OBD_IDX_TX_COMM_PARAM 0x1800
-#define EPL_PDOK_OBD_IDX_TX_MAPP_PARAM 0x1A00
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S EplPdok */
-/* */
-/* */
-/***************************************************************************/
-//
-// 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
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokAddInstance()
-//
-// Description: add and initialize new instance of EPL stack
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokAddInstance(void)
-{
-
- return kEplSuccessful;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokDelInstance()
-//
-// Description: deletes an instance of EPL stack
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokDelInstance(void)
-{
-
- return kEplSuccessful;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokCbPdoReceived
-//
-// Description: This function is called by DLL if PRes or PReq frame was
-// received. It posts the frame to the event queue.
-// It is called in states NMT_CS_READY_TO_OPERATE and NMT_CS_OPERATIONAL.
-// The passed PDO needs not to be valid.
-//
-// Parameters: pFrameInfo_p = pointer to frame info structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokCbPdoReceived(tEplFrameInfo * pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkPdok;
- Event.m_EventType = kEplEventTypePdoRx;
- // limit copied data to size of PDO (because from some CNs the frame is larger than necessary)
- Event.m_uiSize = AmiGetWordFromLe(&pFrameInfo_p->m_pFrame->m_Data.m_Pres.m_le_wSize) + 24; // pFrameInfo_p->m_uiFrameSize;
- Event.m_pArg = pFrameInfo_p->m_pFrame;
- Ret = EplEventkPost(&Event);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokCbPdoTransmitted
-//
-// Description: This function is called by DLL if PRes or PReq frame was
-// sent. It posts the pointer to the frame to the event queue.
-// It is called in NMT_CS_PRE_OPERATIONAL_2,
-// NMT_CS_READY_TO_OPERATE and NMT_CS_OPERATIONAL.
-//
-// Parameters: pFrameInfo_p = pointer to frame info structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokCbPdoTransmitted(tEplFrameInfo * pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkPdok;
- Event.m_EventType = kEplEventTypePdoTx;
- Event.m_uiSize = sizeof(tEplFrameInfo);
- Event.m_pArg = pFrameInfo_p;
- Ret = EplEventkPost(&Event);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokCbSoa
-//
-// Description: This function is called by DLL if SoA frame was
-// received resp. sent. It posts this event to the event queue.
-//
-// Parameters: pFrameInfo_p = pointer to frame info structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokCbSoa(tEplFrameInfo * pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplEvent Event;
-
- Event.m_EventSink = kEplEventSinkPdok;
- Event.m_EventType = kEplEventTypePdoSoa;
- Event.m_uiSize = 0;
- Event.m_pArg = NULL;
- Ret = EplEventkPost(&Event);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokProcess
-//
-// Description: This function processes all received and transmitted PDOs.
-// This function must not be interrupted by any other task
-// except ISRs (like the ethernet driver ISR, which may call
-// EplPdokCbFrameReceived() or EplPdokCbFrameTransmitted()).
-//
-// Parameters: pEvent_p = pointer to event structure
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokProcess(tEplEvent * pEvent_p)
-{
- tEplKernel Ret = kEplSuccessful;
- u16 wPdoSize;
- u16 wBitOffset;
- u16 wBitSize;
- u16 wVarSize;
- u64 qwObjectMapping;
- u8 bMappSubindex;
- u8 bObdSubindex;
- u16 wObdMappIndex;
- u16 wObdCommIndex;
- u16 wPdoId;
- u8 bObdData;
- u8 bObjectCount;
- u8 bFrameData;
- BOOL fValid;
- tEplObdSize ObdSize;
- tEplFrame *pFrame;
- tEplFrameInfo *pFrameInfo;
- unsigned int uiNodeId;
- tEplMsgType MsgType;
-
- // 0xFF=invalid, RPDO: 0x00=PReq, localNodeId=PRes, remoteNodeId=PRes
- // TPDO: 0x00=PRes, MN: CnNodeId=PReq
-
- switch (pEvent_p->m_EventType) {
- case kEplEventTypePdoRx: // RPDO received
- pFrame = (tEplFrame *) pEvent_p->m_pArg;
-
- // check if received RPDO is valid
- bFrameData =
- AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
- if ((bFrameData & EPL_FRAME_FLAG1_RD) == 0) { // RPDO invalid
- goto Exit;
- }
- // retrieve EPL message type
- MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
- if (MsgType == kEplMsgTypePreq) { // RPDO is PReq frame
- uiNodeId = EPL_PDO_PREQ_NODE_ID; // 0x00
- } else { // RPDO is PRes frame
- // retrieve node ID
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
- }
-
- // search for appropriate valid RPDO in OD
- wObdMappIndex = EPL_PDOK_OBD_IDX_RX_MAPP_PARAM;
- for (wObdCommIndex = EPL_PDOK_OBD_IDX_RX_COMM_PARAM;
- wObdCommIndex < (EPL_PDOK_OBD_IDX_RX_COMM_PARAM + 0x00FF);
- wObdCommIndex++, wObdMappIndex++) {
- ObdSize = 1;
- // read node ID from OD
- Ret =
- EplObdReadEntry(wObdCommIndex, 0x01, &bObdData,
- &ObdSize);
- if ((Ret == kEplObdIndexNotExist)
- || (Ret == kEplObdSubindexNotExist)
- || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
- Ret = kEplSuccessful;
- goto Exit;
- } else if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // entry read successfully
- if (bObdData != uiNodeId) { // node ID does not equal - wrong PDO, try next PDO in OD
- continue;
- }
- ObdSize = 1;
- // read number of mapped objects from OD; this indicates if the PDO is valid
- Ret =
- EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount,
- &ObdSize);
- if ((Ret == kEplObdIndexNotExist)
- || (Ret == kEplObdSubindexNotExist)
- || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
- Ret = kEplSuccessful;
- goto Exit;
- } else if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // entry read successfully
- if (bObjectCount == 0) { // PDO in OD not valid, try next PDO in OD
- continue;
- }
-
- ObdSize = 1;
- // check PDO mapping version
- Ret =
- EplObdReadEntry(wObdCommIndex, 0x02, &bObdData,
- &ObdSize);
- if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // entry read successfully
- // retrieve PDO version from frame
- bFrameData =
- AmiGetByteFromLe(&pFrame->m_Data.m_Pres.
- m_le_bPdoVersion);
- if ((bObdData & EPL_VERSION_MAIN) != (bFrameData & EPL_VERSION_MAIN)) { // PDO versions do not match
- // $$$ raise PDO error
- // termiate processing of this RPDO
- goto Exit;
- }
- // valid RPDO found
-
- // retrieve PDO size
- wPdoSize =
- AmiGetWordFromLe(&pFrame->m_Data.m_Pres.m_le_wSize);
-
- // process mapping
- for (bMappSubindex = 1; bMappSubindex <= bObjectCount;
- bMappSubindex++) {
- ObdSize = 8; // u64
- // read object mapping from OD
- Ret =
- EplObdReadEntry(wObdMappIndex,
- bMappSubindex,
- &qwObjectMapping, &ObdSize);
- if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
- if (qwObjectMapping == 0) { // invalid entry, continue with next entry
- continue;
- }
- // decode object mapping
- wObdCommIndex =
- (u16) (qwObjectMapping &
- 0x000000000000FFFFLL);
- bObdSubindex =
- (u8) ((qwObjectMapping &
- 0x0000000000FF0000LL) >> 16);
- wBitOffset =
- (u16) ((qwObjectMapping &
- 0x0000FFFF00000000LL) >> 32);
- wBitSize =
- (u16) ((qwObjectMapping &
- 0xFFFF000000000000LL) >> 48);
-
- // check if object exceeds PDO size
- if (((wBitOffset + wBitSize) >> 3) > wPdoSize) { // wrong object mapping; PDO size is too low
- // $$$ raise PDO error
- // terminate processing of this RPDO
- goto Exit;
- }
- // copy object from RPDO to process/OD variable
- ObdSize = wBitSize >> 3;
- Ret =
- EplObdWriteEntryFromLe(wObdCommIndex,
- bObdSubindex,
- &pFrame->m_Data.
- m_Pres.
- m_le_abPayload[(wBitOffset >> 3)], ObdSize);
- if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
-
- }
-
- // processing finished successfully
- goto Exit;
- }
- break;
-
- case kEplEventTypePdoTx: // TPDO transmitted
- pFrameInfo = (tEplFrameInfo *) pEvent_p->m_pArg;
- pFrame = pFrameInfo->m_pFrame;
-
- // set TPDO invalid, so that only fully processed TPDOs are sent as valid
- bFrameData =
- AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
- AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bFlag1,
- (bFrameData & ~EPL_FRAME_FLAG1_RD));
-
- // retrieve EPL message type
- MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
- if (MsgType == kEplMsgTypePres) { // TPDO is PRes frame
- uiNodeId = EPL_PDO_PRES_NODE_ID; // 0x00
- } else { // TPDO is PReq frame
- // retrieve node ID
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bDstNodeId);
- }
-
- // search for appropriate valid TPDO in OD
- wObdMappIndex = EPL_PDOK_OBD_IDX_TX_MAPP_PARAM;
- wObdCommIndex = EPL_PDOK_OBD_IDX_TX_COMM_PARAM;
- for (wPdoId = 0;; wPdoId++, wObdCommIndex++, wObdMappIndex++) {
- ObdSize = 1;
- // read node ID from OD
- Ret =
- EplObdReadEntry(wObdCommIndex, 0x01, &bObdData,
- &ObdSize);
- if ((Ret == kEplObdIndexNotExist)
- || (Ret == kEplObdSubindexNotExist)
- || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
- Ret = kEplSuccessful;
- goto Exit;
- } else if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // entry read successfully
- if (bObdData != uiNodeId) { // node ID does not equal - wrong PDO, try next PDO in OD
- continue;
- }
- ObdSize = 1;
- // read number of mapped objects from OD; this indicates if the PDO is valid
- Ret =
- EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount,
- &ObdSize);
- if ((Ret == kEplObdIndexNotExist)
- || (Ret == kEplObdSubindexNotExist)
- || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
- Ret = kEplSuccessful;
- goto Exit;
- } else if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // entry read successfully
- if (bObjectCount == 0) { // PDO in OD not valid, try next PDO in OD
- continue;
- }
- // valid TPDO found
-
- ObdSize = 1;
- // get PDO mapping version from OD
- Ret =
- EplObdReadEntry(wObdCommIndex, 0x02, &bObdData,
- &ObdSize);
- if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // entry read successfully
- // set PDO version in frame
- AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bPdoVersion,
- bObdData);
-
- // calculate PDO size
- wPdoSize = 0;
-
- // process mapping
- for (bMappSubindex = 1; bMappSubindex <= bObjectCount;
- bMappSubindex++) {
- ObdSize = 8; // u64
- // read object mapping from OD
- Ret =
- EplObdReadEntry(wObdMappIndex,
- bMappSubindex,
- &qwObjectMapping, &ObdSize);
- if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
- // check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
- if (qwObjectMapping == 0) { // invalid entry, continue with next entry
- continue;
- }
- // decode object mapping
- wObdCommIndex =
- (u16) (qwObjectMapping &
- 0x000000000000FFFFLL);
- bObdSubindex =
- (u8) ((qwObjectMapping &
- 0x0000000000FF0000LL) >> 16);
- wBitOffset =
- (u16) ((qwObjectMapping &
- 0x0000FFFF00000000LL) >> 32);
- wBitSize =
- (u16) ((qwObjectMapping &
- 0xFFFF000000000000LL) >> 48);
-
- // calculate max PDO size
- ObdSize = wBitSize >> 3;
- wVarSize = (wBitOffset >> 3) + (u16) ObdSize;
- if ((unsigned int)(wVarSize + 24) > pFrameInfo->m_uiFrameSize) { // TPDO is too short
- // $$$ raise PDO error, set Ret
- goto Exit;
- }
- if (wVarSize > wPdoSize) { // memorize new PDO size
- wPdoSize = wVarSize;
- }
- // copy object from process/OD variable to TPDO
- Ret =
- EplObdReadEntryToLe(wObdCommIndex,
- bObdSubindex,
- &pFrame->m_Data.m_Pres.
- m_le_abPayload[(wBitOffset >> 3)], &ObdSize);
- if (Ret != kEplSuccessful) { // other fatal error occured
- goto Exit;
- }
-
- }
-
- // set PDO size in frame
- AmiSetWordToLe(&pFrame->m_Data.m_Pres.m_le_wSize,
- wPdoSize);
-
- Ret = EplPdokCalAreTpdosValid(&fValid);
- if (fValid != FALSE) {
- // set TPDO valid
- bFrameData =
- AmiGetByteFromLe(&pFrame->m_Data.m_Pres.
- m_le_bFlag1);
- AmiSetByteToLe(&pFrame->m_Data.m_Pres.
- m_le_bFlag1,
- (bFrameData |
- EPL_FRAME_FLAG1_RD));
- }
- // processing finished successfully
-
- goto Exit;
- }
- break;
-
- case kEplEventTypePdoSoa: // SoA received
-
- // invalidate TPDOs
- Ret = EplPdokCalSetTpdosValid(FALSE);
- break;
-
- default:
- {
- ASSERTMSG(FALSE,
- "EplPdokProcess(): unhandled event type!\n");
- }
- }
-
- Exit:
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for kernel PDO 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: EplPdokCal.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/27 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#include "kernel/EplPdokCal.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S EplPdokCal */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- BOOL m_fTpdosValid;
-
-} tEplPdokCalInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-static tEplPdokCalInstance EplPdokCalInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokCalAddInstance()
-//
-// Description: add and initialize new instance of EPL stack
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokCalAddInstance(void)
-{
-
- EPL_MEMSET(&EplPdokCalInstance_g, 0, sizeof(EplPdokCalInstance_g));
-
- return kEplSuccessful;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokCalDelInstance()
-//
-// Description: deletes an instance of EPL stack
-//
-// Parameters: none
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokCalDelInstance(void)
-{
-
- return kEplSuccessful;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokCalSetTpdosValid()
-//
-// Description: This function sets the validity flag for TPDOs to the
-// specified value.
-//
-// Parameters: fValid_p = validity flag
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokCalSetTpdosValid(BOOL fValid_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- EplPdokCalInstance_g.m_fTpdosValid = fValid_p;
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplPdokCalAreTpdosValid()
-//
-// Description: This function returns the validity flag for TPDOs.
-//
-// Parameters: pfValid_p = OUT: validity flag
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplPdokCalAreTpdosValid(BOOL * pfValid_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- *pfValid_p = EplPdokCalInstance_g.m_fTpdosValid;
-
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-#endif
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (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
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for api function of the sdo 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: EplSdo.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "EplInc.h"
-#include "EplFrame.h"
-#include "EplSdoAc.h"
-
-#ifndef _EPLSDO_H_
-#define _EPLSDO_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-// global defines
-#ifndef EPL_SDO_MAX_PAYLOAD
-#define EPL_SDO_MAX_PAYLOAD 256
-#endif
-
-// handle between Protocol Abstraction Layer and asynchronous SDO Sequence Layer
-#define EPL_SDO_UDP_HANDLE 0x8000
-#define EPL_SDO_ASND_HANDLE 0x4000
-#define EPL_SDO_ASY_HANDLE_MASK 0xC000
-#define EPL_SDO_ASY_INVALID_HDL 0x3FFF
-
-// handle between SDO Sequence Layer and sdo command layer
-#define EPL_SDO_ASY_HANDLE 0x8000
-#define EPL_SDO_PDO_HANDLE 0x4000
-#define EPL_SDO_SEQ_HANDLE_MASK 0xC000
-#define EPL_SDO_SEQ_INVALID_HDL 0x3FFF
-
-#define EPL_ASND_HEADER_SIZE 4
-//#define EPL_SEQ_HEADER_SIZE 4
-#define EPL_ETHERNET_HEADER_SIZE 14
-
-#define EPL_SEQ_NUM_MASK 0xFC
-
-// size for send buffer and history
-#define EPL_MAX_SDO_FRAME_SIZE EPL_C_IP_MIN_MTU
-// size for receive frame
-// -> needed because SND-Kit sends up to 1518 Byte
-// without Sdo-Command: Maximum Segment Size
-#define EPL_MAX_SDO_REC_FRAME_SIZE EPL_C_IP_MAX_MTU
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-// handle between Protocol Abstraction Layer and asynchronuus SDO Sequence Layer
-typedef unsigned int tEplSdoConHdl;
-
-// callback function pointer for Protocol Abstraction Layer to call
-// asynchronuus SDO Sequence Layer
-typedef tEplKernel(*tEplSequLayerReceiveCb) (tEplSdoConHdl ConHdl_p,
- tEplAsySdoSeq *pSdoSeqData_p,
- unsigned int uiDataSize_p);
-
-// handle between asynchronuus SDO Sequence Layer and SDO Command layer
-typedef unsigned int tEplSdoSeqConHdl;
-
-// callback function pointer for asynchronuus SDO Sequence Layer to call
-// SDO Command layer for received data
-typedef tEplKernel(* tEplSdoComReceiveCb) (tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplAsySdoCom *pAsySdoCom_p,
- unsigned int uiDataSize_p);
-
-// status of connection
-typedef enum {
- kAsySdoConStateConnected = 0x00,
- kAsySdoConStateInitError = 0x01,
- kAsySdoConStateConClosed = 0x02,
- kAsySdoConStateAckReceived = 0x03,
- kAsySdoConStateFrameSended = 0x04,
- kAsySdoConStateTimeout = 0x05
-} tEplAsySdoConState;
-
-// callback function pointer for asynchronuus SDO Sequence Layer to call
-// SDO Command layer for connection status
-typedef tEplKernel(* tEplSdoComConCb) (tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplAsySdoConState AsySdoConState_p);
-
-// handle between SDO Command layer and application
-typedef unsigned int tEplSdoComConHdl;
-
-// status of connection
-typedef enum {
- kEplSdoComTransferNotActive = 0x00,
- kEplSdoComTransferRunning = 0x01,
- kEplSdoComTransferTxAborted = 0x02,
- kEplSdoComTransferRxAborted = 0x03,
- kEplSdoComTransferFinished = 0x04,
- kEplSdoComTransferLowerLayerAbort = 0x05
-} tEplSdoComConState;
-
-// SDO Services and Command-Ids from DS 1.0.0 p.152
-typedef enum {
- kEplSdoServiceNIL = 0x00,
- kEplSdoServiceWriteByIndex = 0x01,
- kEplSdoServiceReadByIndex = 0x02
- //--------------------------------
- // the following services are optional and
- // not supported now
-/*
- kEplSdoServiceWriteAllByIndex = 0x03,
- kEplSdoServiceReadAllByIndex = 0x04,
- kEplSdoServiceWriteByName = 0x05,
- kEplSdoServiceReadByName = 0x06,
-
- kEplSdoServiceFileWrite = 0x20,
- kEplSdoServiceFileRead = 0x21,
-
- kEplSdoServiceWriteMultiByIndex = 0x31,
- kEplSdoServiceReadMultiByIndex = 0x32,
-
- kEplSdoServiceMaxSegSize = 0x70
-
- // 0x80 - 0xFF manufacturer specific
-
- */
-} tEplSdoServiceType;
-
-// describes if read or write access
-typedef enum {
- kEplSdoAccessTypeRead = 0x00,
- kEplSdoAccessTypeWrite = 0x01
-} tEplSdoAccessType;
-
-typedef enum {
- kEplSdoTypeAuto = 0x00,
- kEplSdoTypeUdp = 0x01,
- kEplSdoTypeAsnd = 0x02,
- kEplSdoTypePdo = 0x03
-} tEplSdoType;
-
-typedef enum {
- kEplSdoTransAuto = 0x00,
- kEplSdoTransExpedited = 0x01,
- kEplSdoTransSegmented = 0x02
-} tEplSdoTransType;
-
-// structure to inform application about finish of SDO transfer
-typedef struct {
- tEplSdoComConHdl m_SdoComConHdl;
- tEplSdoComConState m_SdoComConState;
- u32 m_dwAbortCode;
- tEplSdoAccessType m_SdoAccessType;
- unsigned int m_uiNodeId; // NodeId of the target
- unsigned int m_uiTargetIndex; // index which was accessed
- unsigned int m_uiTargetSubIndex; // subindex which was accessed
- unsigned int m_uiTransferredByte; // number of bytes transferred
- void *m_pUserArg; // user definable argument pointer
-
-} tEplSdoComFinished;
-
-// callback function pointer to inform application about connection
-typedef tEplKernel(* tEplSdoFinishedCb) (tEplSdoComFinished *pSdoComFinished_p);
-
-// structure to init SDO transfer to Read or Write by Index
-typedef struct {
- tEplSdoComConHdl m_SdoComConHdl;
- unsigned int m_uiIndex;
- unsigned int m_uiSubindex;
- void *m_pData;
- unsigned int m_uiDataSize;
- unsigned int m_uiTimeout; // not used in this version
- tEplSdoAccessType m_SdoAccessType;
- tEplSdoFinishedCb m_pfnSdoFinishedCb;
- void *m_pUserArg; // user definable argument pointer
-
-} tEplSdoComTransParamByIndex;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPLSDO_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: definitions for SDO Abort codes
-
- 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: EplSdoAc.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- ...
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/30 k.t.: first implementation
-
-****************************************************************************/
-
-#ifndef _EPLSDOAC_H_
-#define _EPLSDOAC_H_
-
-// =========================================================================
-// SDO abort codes
-// =========================================================================
-
-#define EPL_SDOAC_TIME_OUT 0x05040000L
-#define EPL_SDOAC_UNKNOWN_COMMAND_SPECIFIER 0x05040001L
-#define EPL_SDOAC_INVALID_BLOCK_SIZE 0x05040002L
-#define EPL_SDOAC_INVALID_SEQUENCE_NUMBER 0x05040003L
-#define EPL_SDOAC_OUT_OF_MEMORY 0x05040005L
-#define EPL_SDOAC_UNSUPPORTED_ACCESS 0x06010000L
-#define EPL_SDOAC_READ_TO_WRITE_ONLY_OBJ 0x06010001L
-#define EPL_SDOAC_WRITE_TO_READ_ONLY_OBJ 0x06010002L
-#define EPL_SDOAC_OBJECT_NOT_EXIST 0x06020000L
-#define EPL_SDOAC_OBJECT_NOT_MAPPABLE 0x06040041L
-#define EPL_SDOAC_PDO_LENGTH_EXCEEDED 0x06040042L
-#define EPL_SDOAC_GEN_PARAM_INCOMPATIBILITY 0x06040043L
-#define EPL_SDOAC_INVALID_HEARTBEAT_DEC 0x06040044L
-#define EPL_SDOAC_GEN_INTERNAL_INCOMPATIBILITY 0x06040047L
-#define EPL_SDOAC_ACCESS_FAILED_DUE_HW_ERROR 0x06060000L
-#define EPL_SDOAC_DATA_TYPE_LENGTH_NOT_MATCH 0x06070010L
-#define EPL_SDOAC_DATA_TYPE_LENGTH_TOO_HIGH 0x06070012L
-#define EPL_SDOAC_DATA_TYPE_LENGTH_TOO_LOW 0x06070013L
-#define EPL_SDOAC_SUB_INDEX_NOT_EXIST 0x06090011L
-#define EPL_SDOAC_VALUE_RANGE_EXCEEDED 0x06090030L
-#define EPL_SDOAC_VALUE_RANGE_TOO_HIGH 0x06090031L
-#define EPL_SDOAC_VALUE_RANGE_TOO_LOW 0x06090032L
-#define EPL_SDOAC_MAX_VALUE_LESS_MIN_VALUE 0x06090036L
-#define EPL_SDOAC_GENERAL_ERROR 0x08000000L
-#define EPL_SDOAC_DATA_NOT_TRANSF_OR_STORED 0x08000020L
-#define EPL_SDOAC_DATA_NOT_TRANSF_DUE_LOCAL_CONTROL 0x08000021L
-#define EPL_SDOAC_DATA_NOT_TRANSF_DUE_DEVICE_STATE 0x08000022L
-#define EPL_SDOAC_OBJECT_DICTIONARY_NOT_EXIST 0x08000023L
-#define EPL_SDOAC_CONFIG_DATA_EMPTY 0x08000024L
-
-#endif // _EPLSDOAC_H_
-
-// Die letzte Zeile muß unbedingt eine leere Zeile sein, weil manche Compiler
-// damit ein Problem haben, wenn das nicht so ist (z.B. GNU oder Borland C++ Builder).
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for SDO/Asnd-Protocolabstractionlayer 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: EplSdoAsndu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.7 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/07 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplSdoAsndu.h"
-#include "user/EplDlluCal.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef EPL_SDO_MAX_CONNECTION_ASND
-#define EPL_SDO_MAX_CONNECTION_ASND 5
-#endif
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-// instance table
-typedef struct {
- unsigned int m_auiSdoAsndConnection[EPL_SDO_MAX_CONNECTION_ASND];
- tEplSequLayerReceiveCb m_fpSdoAsySeqCb;
-
-} tEplSdoAsndInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static tEplSdoAsndInstance SdoAsndInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-tEplKernel EplSdoAsnduCb(tEplFrameInfo *pFrameInfo_p);
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <EPL SDO-Asnd Protocolabstraction layer> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description: EPL SDO-Asnd Protocolabstraction layer
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsnduInit
-//
-// Description: init first instance of the module
-//
-//
-//
-// Parameters: pReceiveCb_p = functionpointer to Sdo-Sequence layer
-// callback-function
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsnduInit(tEplSequLayerReceiveCb fpReceiveCb_p)
-{
- tEplKernel Ret;
-
- Ret = EplSdoAsnduAddInstance(fpReceiveCb_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsnduAddInstance
-//
-// Description: init additional instance of the module
-//
-//
-//
-// Parameters: pReceiveCb_p = functionpointer to Sdo-Sequence layer
-// callback-function
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsnduAddInstance(tEplSequLayerReceiveCb fpReceiveCb_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // init control structure
- EPL_MEMSET(&SdoAsndInstance_g, 0x00, sizeof(SdoAsndInstance_g));
-
- // save pointer to callback-function
- if (fpReceiveCb_p != NULL) {
- SdoAsndInstance_g.m_fpSdoAsySeqCb = fpReceiveCb_p;
- } else {
- Ret = kEplSdoUdpMissCb;
- }
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- Ret = EplDlluCalRegAsndService(kEplDllAsndSdo,
- EplSdoAsnduCb, kEplDllAsndFilterLocal);
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsnduDelInstance
-//
-// Description: del instance of the module
-// del socket and del Listen-Thread
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsnduDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- // deregister callback function from DLL
- Ret = EplDlluCalRegAsndService(kEplDllAsndSdo,
- NULL, kEplDllAsndFilterNone);
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsnduInitCon
-//
-// Description: init a new connect
-//
-//
-//
-// Parameters: pSdoConHandle_p = pointer for the new connection handle
-// uiTargetNodeId_p = NodeId of the target node
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsnduInitCon(tEplSdoConHdl *pSdoConHandle_p,
- unsigned int uiTargetNodeId_p)
-{
- tEplKernel Ret;
- unsigned int uiCount;
- unsigned int uiFreeCon;
- unsigned int *puiConnection;
-
- Ret = kEplSuccessful;
-
- if ((uiTargetNodeId_p == EPL_C_ADR_INVALID)
- || (uiTargetNodeId_p >= EPL_C_ADR_BROADCAST)) {
- Ret = kEplSdoAsndInvalidNodeId;
- goto Exit;
- }
- // get free entry in control structure
- uiCount = 0;
- uiFreeCon = EPL_SDO_MAX_CONNECTION_ASND;
- puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[0];
- while (uiCount < EPL_SDO_MAX_CONNECTION_ASND) {
- if (*puiConnection == uiTargetNodeId_p) { // existing connection to target node found
- // save handle for higher layer
- *pSdoConHandle_p = (uiCount | EPL_SDO_ASND_HANDLE);
-
- goto Exit;
- } else if (*puiConnection == 0) { // free entry-> save target nodeId
- uiFreeCon = uiCount;
- }
- uiCount++;
- puiConnection++;
- }
-
- if (uiFreeCon == EPL_SDO_MAX_CONNECTION_ASND) {
- // no free connection
- Ret = kEplSdoAsndNoFreeHandle;
- } else {
- puiConnection =
- &SdoAsndInstance_g.m_auiSdoAsndConnection[uiFreeCon];
- *puiConnection = uiTargetNodeId_p;
- // save handle for higher layer
- *pSdoConHandle_p = (uiFreeCon | EPL_SDO_ASND_HANDLE);
-
- goto Exit;
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsnduSendData
-//
-// Description: send data using exisiting connection
-//
-//
-//
-// Parameters: SdoConHandle_p = connection handle
-// pSrcData_p = pointer to data
-// dwDataSize_p = number of databyte
-// -> without asnd-header!!!
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsnduSendData(tEplSdoConHdl SdoConHandle_p,
- tEplFrame *pSrcData_p,
- u32 dwDataSize_p)
-{
- tEplKernel Ret;
- unsigned int uiArray;
- tEplFrameInfo FrameInfo;
-
- Ret = kEplSuccessful;
-
- uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
-
- if (uiArray > EPL_SDO_MAX_CONNECTION_ASND) {
- Ret = kEplSdoAsndInvalidHandle;
- goto Exit;
- }
- // fillout Asnd header
- // own node id not needed -> filled by DLL
-
- // set message type
- AmiSetByteToLe(&pSrcData_p->m_le_bMessageType, (u8) kEplMsgTypeAsnd); // ASnd == 0x06
- // target node id
- AmiSetByteToLe(&pSrcData_p->m_le_bDstNodeId,
- (u8) SdoAsndInstance_g.
- m_auiSdoAsndConnection[uiArray]);
- // set source-nodeid (filled by DLL 0)
- AmiSetByteToLe(&pSrcData_p->m_le_bSrcNodeId, 0x00);
-
- // calc size
- dwDataSize_p += EPL_ASND_HEADER_SIZE;
-
- // send function of DLL
- FrameInfo.m_uiFrameSize = dwDataSize_p;
- FrameInfo.m_pFrame = pSrcData_p;
- EPL_MEMSET(&FrameInfo.m_NetTime, 0x00, sizeof(tEplNetTime));
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
- Ret = EplDlluCalAsyncSend(&FrameInfo, kEplDllAsyncReqPrioGeneric);
-#endif
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsnduDelCon
-//
-// Description: delete connection from intern structure
-//
-//
-//
-// Parameters: SdoConHandle_p = connection handle
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsnduDelCon(tEplSdoConHdl SdoConHandle_p)
-{
- tEplKernel Ret;
- unsigned int uiArray;
-
- Ret = kEplSuccessful;
-
- uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
- // check parameter
- if (uiArray > EPL_SDO_MAX_CONNECTION_ASND) {
- Ret = kEplSdoAsndInvalidHandle;
- goto Exit;
- }
- // set target nodeId to 0
- SdoAsndInstance_g.m_auiSdoAsndConnection[uiArray] = 0;
-
- Exit:
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsnduCb
-//
-// Description: callback function for SDO ASnd frames
-//
-//
-//
-// Parameters: pFrameInfo_p = Frame with SDO payload
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsnduCb(tEplFrameInfo *pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiCount;
- unsigned int *puiConnection;
- unsigned int uiNodeId;
- unsigned int uiFreeEntry = 0xFFFF;
- tEplSdoConHdl SdoConHdl;
- tEplFrame *pFrame;
-
- pFrame = pFrameInfo_p->m_pFrame;
-
- uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
-
- // search corresponding entry in control structure
- uiCount = 0;
- puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[0];
- while (uiCount < EPL_SDO_MAX_CONNECTION_ASND) {
- if (uiNodeId == *puiConnection) {
- break;
- } else if ((*puiConnection == 0)
- && (uiFreeEntry == 0xFFFF)) { // free entry
- uiFreeEntry = uiCount;
- }
- uiCount++;
- puiConnection++;
- }
-
- if (uiCount == EPL_SDO_MAX_CONNECTION_ASND) {
- if (uiFreeEntry != 0xFFFF) {
- puiConnection =
- &SdoAsndInstance_g.
- m_auiSdoAsndConnection[uiFreeEntry];
- *puiConnection = uiNodeId;
- uiCount = uiFreeEntry;
- } else {
- EPL_DBGLVL_SDO_TRACE0
- ("EplSdoAsnduCb(): no free handle\n");
- goto Exit;
- }
- }
-// if (uiNodeId == *puiConnection)
- { // entry found or created
- SdoConHdl = (uiCount | EPL_SDO_ASND_HANDLE);
-
- SdoAsndInstance_g.m_fpSdoAsySeqCb(SdoConHdl,
- &pFrame->m_Data.m_Asnd.
- m_Payload.m_SdoSequenceFrame,
- (pFrameInfo_p->m_uiFrameSize -
- 18));
- }
-
- Exit:
- return Ret;
-
-}
-
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for asychronous SDO Sequence 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: EplSdoAsySequ.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.10 $ $Date: 2008/11/13 17:13:09 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplSdoAsySequ.h"
-
-#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) == 0) &&\
- (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) == 0) )
-
-#error 'ERROR: At least UDP or Asnd module needed!'
-
-#endif
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#define EPL_SDO_HISTORY_SIZE 5
-
-#ifndef EPL_MAX_SDO_SEQ_CON
-#define EPL_MAX_SDO_SEQ_CON 10
-#endif
-
-#define EPL_SEQ_DEFAULT_TIMEOUT 5000 // in [ms] => 5 sec
-
-#define EPL_SEQ_RETRY_COUNT 5 // => max. Timeout 30 sec
-
-#define EPL_SEQ_NUM_THRESHOLD 100 // threshold which distinguishes between old and new sequence numbers
-
-// define frame with size of Asnd-Header-, SDO Sequenze Header size, SDO Command header
-// and Ethernet-Header size
-#define EPL_SEQ_FRAME_SIZE 24
-// size of the header of the asynchronus SDO Sequence layer
-#define EPL_SEQ_HEADER_SIZE 4
-
-// buffersize for one frame in history
-#define EPL_SEQ_HISTROY_FRAME_SIZE EPL_MAX_SDO_FRAME_SIZE
-
-// mask to get scon and rcon
-#define EPL_ASY_SDO_CON_MASK 0x03
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-// events for processfunction
-typedef enum {
- kAsySdoSeqEventNoEvent = 0x00, // no Event
- kAsySdoSeqEventInitCon = 0x01, // init connection
- kAsySdoSeqEventFrameRec = 0x02, // frame received
- kAsySdoSeqEventFrameSend = 0x03, // frame to send
- kAsySdoSeqEventTimeout = 0x04, // Timeout for connection
- kAsySdoSeqEventCloseCon = 0x05 // higher layer close connection
-} tEplAsySdoSeqEvent;
-
-// structure for History-Buffer
-typedef struct {
- u8 m_bFreeEntries;
- u8 m_bWrite; // index of the next free buffer entry
- u8 m_bAck; // index of the next message which should become acknowledged
- u8 m_bRead; // index between m_bAck and m_bWrite to the next message for retransmission
- u8 m_aabHistoryFrame[EPL_SDO_HISTORY_SIZE]
- [EPL_SEQ_HISTROY_FRAME_SIZE];
- unsigned int m_auiFrameSize[EPL_SDO_HISTORY_SIZE];
-
-} tEplAsySdoConHistory;
-
-// state of the statemaschine
-typedef enum {
- kEplAsySdoStateIdle = 0x00,
- kEplAsySdoStateInit1 = 0x01,
- kEplAsySdoStateInit2 = 0x02,
- kEplAsySdoStateInit3 = 0x03,
- kEplAsySdoStateConnected = 0x04,
- kEplAsySdoStateWaitAck = 0x05
-} tEplAsySdoState;
-
-// connection control structure
-typedef struct {
- tEplSdoConHdl m_ConHandle;
- tEplAsySdoState m_SdoState;
- u8 m_bRecSeqNum; // name from view of the communication partner
- u8 m_bSendSeqNum; // name from view of the communication partner
- tEplAsySdoConHistory m_SdoConHistory;
- tEplTimerHdl m_EplTimerHdl;
- unsigned int m_uiRetryCount; // retry counter
- unsigned int m_uiUseCount; // one sequence layer connection may be used by
- // multiple command layer connections
-
-} tEplAsySdoSeqCon;
-
-// instance structure
-typedef struct {
- tEplAsySdoSeqCon m_AsySdoConnection[EPL_MAX_SDO_SEQ_CON];
- tEplSdoComReceiveCb m_fpSdoComReceiveCb;
- tEplSdoComConCb m_fpSdoComConCb;
-
-#if defined(WIN32) || defined(_WIN32)
- LPCRITICAL_SECTION m_pCriticalSection;
- CRITICAL_SECTION m_CriticalSection;
-
- LPCRITICAL_SECTION m_pCriticalSectionReceive;
- CRITICAL_SECTION m_CriticalSectionReceive;
-#endif
-
-} tEplAsySdoSequInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static tEplAsySdoSequInstance AsySdoSequInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static tEplKernel EplSdoAsySeqProcess(unsigned int uiHandle_p,
- unsigned int uiDataSize_p,
- tEplFrame * pData_p,
- tEplAsySdoSeq * pRecFrame_p,
- tEplAsySdoSeqEvent Event_p);
-
-static tEplKernel EplSdoAsySeqSendIntern(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- unsigned int uiDataSize_p,
- tEplFrame * pData_p,
- BOOL fFrameInHistory);
-
-static tEplKernel EplSdoAsySeqSendLowerLayer(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- unsigned int uiDataSize_p,
- tEplFrame * pEplFrame_p);
-
-tEplKernel EplSdoAsyReceiveCb(tEplSdoConHdl ConHdl_p,
- tEplAsySdoSeq *pSdoSeqData_p,
- unsigned int uiDataSize_p);
-
-static tEplKernel EplSdoAsyInitHistory(void);
-
-static tEplKernel EplSdoAsyAddFrameToHistory(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- tEplFrame * pFrame_p,
- unsigned int uiSize_p);
-
-static tEplKernel EplSdoAsyAckFrameToHistory(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- u8 bRecSeqNumber_p);
-
-static tEplKernel EplSdoAsyReadFromHistory(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- tEplFrame ** ppFrame_p,
- unsigned int *puiSize_p,
- BOOL fInitRead);
-
-static unsigned int EplSdoAsyGetFreeEntriesFromHistory(tEplAsySdoSeqCon *
- pAsySdoSeqCon_p);
-
-static tEplKernel EplSdoAsySeqSetTimer(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- unsigned long ulTimeout);
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <EPL asychronus SDO Sequence layer> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description: this module contains the asynchronus SDO Sequence Layer for
-// the EPL SDO service
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqInit
-//
-// Description: init first instance
-//
-//
-//
-// Parameters: fpSdoComCb_p = callback function to inform Command layer
-// about new frames
-// fpSdoComConCb_p = callback function to inform command layer
-// about connection state
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsySeqInit(tEplSdoComReceiveCb fpSdoComCb_p,
- tEplSdoComConCb fpSdoComConCb_p)
-{
- tEplKernel Ret;
-
- Ret = EplSdoAsySeqAddInstance(fpSdoComCb_p, fpSdoComConCb_p);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqAddInstance
-//
-// Description: init following instances
-//
-//
-//
-// Parameters: fpSdoComCb_p = callback function to inform Command layer
-// about new frames
-// fpSdoComConCb_p = callback function to inform command layer
-// about connection state
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsySeqAddInstance(tEplSdoComReceiveCb fpSdoComCb_p,
- tEplSdoComConCb fpSdoComConCb_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // check functionpointer
- if (fpSdoComCb_p == NULL) {
- Ret = kEplSdoSeqMissCb;
- goto Exit;
- } else {
- AsySdoSequInstance_g.m_fpSdoComReceiveCb = fpSdoComCb_p;
- }
-
- // check functionpointer
- if (fpSdoComConCb_p == NULL) {
- Ret = kEplSdoSeqMissCb;
- goto Exit;
- } else {
- AsySdoSequInstance_g.m_fpSdoComConCb = fpSdoComConCb_p;
- }
-
- // set controllstructure to 0
- EPL_MEMSET(&AsySdoSequInstance_g.m_AsySdoConnection[0], 0x00,
- sizeof(AsySdoSequInstance_g.m_AsySdoConnection));
-
- // init History
- Ret = EplSdoAsyInitHistory();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#if defined(WIN32) || defined(_WIN32)
- // create critical section for process function
- AsySdoSequInstance_g.m_pCriticalSection =
- &AsySdoSequInstance_g.m_CriticalSection;
- InitializeCriticalSection(AsySdoSequInstance_g.m_pCriticalSection);
-
- // init critical section for receive cb function
- AsySdoSequInstance_g.m_pCriticalSectionReceive =
- &AsySdoSequInstance_g.m_CriticalSectionReceive;
- InitializeCriticalSection(AsySdoSequInstance_g.
- m_pCriticalSectionReceive);
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- // init lower layer
- Ret = EplSdoUdpuAddInstance(EplSdoAsyReceiveCb);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
- // init lower layer
- Ret = EplSdoAsnduAddInstance(EplSdoAsyReceiveCb);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqDelInstance
-//
-// Description: delete instances
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsySeqDelInstance(void)
-{
- tEplKernel Ret;
- unsigned int uiCount;
- tEplAsySdoSeqCon *pAsySdoSeqCon;
-
- Ret = kEplSuccessful;
-
- // delete timer of open connections
- uiCount = 0;
- pAsySdoSeqCon = &AsySdoSequInstance_g.m_AsySdoConnection[0];
- while (uiCount < EPL_MAX_SDO_SEQ_CON) {
- if (pAsySdoSeqCon->m_ConHandle != 0) {
- EplTimeruDeleteTimer(&pAsySdoSeqCon->m_EplTimerHdl);
- }
- uiCount++;
- pAsySdoSeqCon++;
- }
-
-#if defined(WIN32) || defined(_WIN32)
- // delete critical section for process function
- DeleteCriticalSection(AsySdoSequInstance_g.m_pCriticalSection);
-#endif
-
- // set instance-table to 0
- EPL_MEMSET(&AsySdoSequInstance_g, 0x00, sizeof(AsySdoSequInstance_g));
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- // delete lower layer
- Ret = EplSdoUdpuDelInstance();
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
- // delete lower layer
- Ret = EplSdoAsnduDelInstance();
-#endif
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqInitCon
-//
-// Description: start initialization of a sequence layer connection.
-// It tries to reuse an existing connection to the same node.
-//
-//
-// Parameters: pSdoSeqConHdl_p = pointer to the variable for the connection handle
-// uiNodeId_p = Node Id of the target
-// SdoType = Type of the SDO connection
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsySeqInitCon(tEplSdoSeqConHdl *pSdoSeqConHdl_p,
- unsigned int uiNodeId_p,
- tEplSdoType SdoType)
-{
- tEplKernel Ret;
- unsigned int uiCount;
- unsigned int uiFreeCon;
- tEplSdoConHdl ConHandle;
- tEplAsySdoSeqCon *pAsySdoSeqCon;
- Ret = kEplSuccessful;
-
- // check SdoType
- // call init function of the protcol abstraction layer
- // which tries to find an existing connection to the same node
- switch (SdoType) {
- // SDO over UDP
- case kEplSdoTypeUdp:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- Ret = EplSdoUdpuInitCon(&ConHandle, uiNodeId_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#else
- Ret = kEplSdoSeqUnsupportedProt;
-#endif
- break;
- }
-
- // SDO over Asnd
- case kEplSdoTypeAsnd:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
- Ret = EplSdoAsnduInitCon(&ConHandle, uiNodeId_p);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#else
- Ret = kEplSdoSeqUnsupportedProt;
-#endif
- break;
- }
-
- // unsupported protocols
- // -> auto should be replaced by command layer
- case kEplSdoTypeAuto:
- case kEplSdoTypePdo:
- default:
- {
- Ret = kEplSdoSeqUnsupportedProt;
- goto Exit;
- }
-
- } // end of switch(SdoType)
-
- // find existing connection to the same node or find empty entry for connection
- uiCount = 0;
- uiFreeCon = EPL_MAX_SDO_SEQ_CON;
- pAsySdoSeqCon = &AsySdoSequInstance_g.m_AsySdoConnection[0];
-
- while (uiCount < EPL_MAX_SDO_SEQ_CON) {
- if (pAsySdoSeqCon->m_ConHandle == ConHandle) { // existing connection found
- break;
- }
- if (pAsySdoSeqCon->m_ConHandle == 0) {
- uiFreeCon = uiCount;
- }
- uiCount++;
- pAsySdoSeqCon++;
- }
-
- if (uiCount == EPL_MAX_SDO_SEQ_CON) {
- if (uiFreeCon == EPL_MAX_SDO_SEQ_CON) { // no free entry found
- switch (SdoType) {
- // SDO over UDP
- case kEplSdoTypeUdp:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- Ret = EplSdoUdpuDelCon(ConHandle);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
- break;
- }
-
- // SDO over Asnd
- case kEplSdoTypeAsnd:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
- Ret = EplSdoAsnduDelCon(ConHandle);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#endif
- break;
- }
-
- // unsupported protocols
- // -> auto should be replaced by command layer
- case kEplSdoTypeAuto:
- case kEplSdoTypePdo:
- default:
- {
- Ret = kEplSdoSeqUnsupportedProt;
- goto Exit;
- }
-
- } // end of switch(SdoType)
-
- Ret = kEplSdoSeqNoFreeHandle;
- goto Exit;
- } else { // free entry found
- pAsySdoSeqCon =
- &AsySdoSequInstance_g.m_AsySdoConnection[uiFreeCon];
- pAsySdoSeqCon->m_ConHandle = ConHandle;
- uiCount = uiFreeCon;
- }
- }
- // set handle
- *pSdoSeqConHdl_p = (uiCount | EPL_SDO_ASY_HANDLE);
-
- // increment use counter
- pAsySdoSeqCon->m_uiUseCount++;
-
- // call intern process function
- Ret = EplSdoAsySeqProcess(uiCount,
- 0, NULL, NULL, kAsySdoSeqEventInitCon);
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqSendData
-//
-// Description: send sata unsing a established connection
-//
-//
-//
-// Parameters: pSdoSeqConHdl_p = connection handle
-// uiDataSize_p = Size of Frame to send
-// -> wihtout SDO sequence layer header, Asnd header
-// and ethernetnet
-// ==> SDO Sequence layer payload
-// SdoType = Type of the SDO connection
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsySeqSendData(tEplSdoSeqConHdl SdoSeqConHdl_p,
- unsigned int uiDataSize_p,
- tEplFrame *pabData_p)
-{
- tEplKernel Ret;
- unsigned int uiHandle;
-
- uiHandle = (SdoSeqConHdl_p & ~EPL_SDO_SEQ_HANDLE_MASK);
-
- // check if connection ready
- if (AsySdoSequInstance_g.m_AsySdoConnection[uiHandle].m_SdoState ==
- kEplAsySdoStateIdle) {
- // no connection with this handle
- Ret = kEplSdoSeqInvalidHdl;
- goto Exit;
- } else if (AsySdoSequInstance_g.m_AsySdoConnection[uiHandle].
- m_SdoState != kEplAsySdoStateConnected) {
- Ret = kEplSdoSeqConnectionBusy;
- goto Exit;
- }
-
- Ret = EplSdoAsySeqProcess(uiHandle,
- uiDataSize_p,
- pabData_p, NULL, kAsySdoSeqEventFrameSend);
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqProcessEvent
-//
-// Description: function processes extern events
-// -> later needed for timeout controll with timer-module
-//
-//
-//
-// Parameters: pEvent_p = pointer to event
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsySeqProcessEvent(tEplEvent *pEvent_p)
-{
- tEplKernel Ret;
- tEplTimerEventArg *pTimerEventArg;
- tEplAsySdoSeqCon *pAsySdoSeqCon;
- tEplTimerHdl EplTimerHdl;
- unsigned int uiCount;
-
- Ret = kEplSuccessful;
- // check parameter
- if (pEvent_p == NULL) {
- Ret = kEplSdoSeqInvalidEvent;
- goto Exit;
- }
-
- if (pEvent_p->m_EventType != kEplEventTypeTimer) {
- Ret = kEplSdoSeqInvalidEvent;
- goto Exit;
- }
- // get timerhdl
- pTimerEventArg = (tEplTimerEventArg *) pEvent_p->m_pArg;
- EplTimerHdl = pTimerEventArg->m_TimerHdl;
-
- // get pointer to intern control structure of connection
- if (pTimerEventArg->m_ulArg == 0) {
- goto Exit;
- }
- pAsySdoSeqCon = (tEplAsySdoSeqCon *) pTimerEventArg->m_ulArg;
-
- // check if time is current
- if (EplTimerHdl != pAsySdoSeqCon->m_EplTimerHdl) {
- // delete timer
- EplTimeruDeleteTimer(&EplTimerHdl);
- goto Exit;
- }
- // delete timer
- EplTimeruDeleteTimer(&pAsySdoSeqCon->m_EplTimerHdl);
-
- // get indexnumber of control structure
- uiCount = 0;
- while ((&AsySdoSequInstance_g.m_AsySdoConnection[uiCount]) !=
- pAsySdoSeqCon) {
- uiCount++;
- if (uiCount > EPL_MAX_SDO_SEQ_CON) {
- goto Exit;
- }
- }
-
- // process event and call processfunction if needed
- Ret = EplSdoAsySeqProcess(uiCount,
- 0, NULL, NULL, kAsySdoSeqEventTimeout);
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqDelCon
-//
-// Description: del and close one connection
-//
-//
-//
-// Parameters: SdoSeqConHdl_p = handle of connection
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsySeqDelCon(tEplSdoSeqConHdl SdoSeqConHdl_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiHandle;
- tEplAsySdoSeqCon *pAsySdoSeqCon;
-
- uiHandle = (SdoSeqConHdl_p & ~EPL_SDO_SEQ_HANDLE_MASK);
-
- // check if handle invalid
- if (uiHandle >= EPL_MAX_SDO_SEQ_CON) {
- Ret = kEplSdoSeqInvalidHdl;
- goto Exit;
- }
- // get pointer to connection
- pAsySdoSeqCon = &AsySdoSequInstance_g.m_AsySdoConnection[uiHandle];
-
- // decrement use counter
- pAsySdoSeqCon->m_uiUseCount--;
-
- if (pAsySdoSeqCon->m_uiUseCount == 0) {
- // process close in processfunction
- Ret = EplSdoAsySeqProcess(uiHandle,
- 0,
- NULL, NULL, kAsySdoSeqEventCloseCon);
-
- //check protocol
- if ((pAsySdoSeqCon->m_ConHandle & EPL_SDO_ASY_HANDLE_MASK) ==
- EPL_SDO_UDP_HANDLE) {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- // call close function of lower layer
- EplSdoUdpuDelCon(pAsySdoSeqCon->m_ConHandle);
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- } else {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
- // call close function of lower layer
- EplSdoAsnduDelCon(pAsySdoSeqCon->m_ConHandle);
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
- }
-
- // delete timer
- EplTimeruDeleteTimer(&pAsySdoSeqCon->m_EplTimerHdl);
-
- // clean controllstructure
- EPL_MEMSET(pAsySdoSeqCon, 0x00, sizeof(tEplAsySdoSeqCon));
- pAsySdoSeqCon->m_SdoConHistory.m_bFreeEntries =
- EPL_SDO_HISTORY_SIZE;
- }
-
- Exit:
- return Ret;
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplEplSdoAsySeqProcess
-//
-// Description: intern function to process the asynchronus SDO Sequence Layer
-// state maschine
-//
-//
-//
-// Parameters: uiHandle_p = index of the control structure of the connection
-// uiDataSize_p = size of data frame to process (can be 0)
-// -> without size of sequence header and Asnd header!!!
-//
-// pData_p = pointer to frame to send (can be NULL)
-// pRecFrame_p = pointer to received frame (can be NULL)
-// Event_p = Event to process
-//
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsySeqProcess(unsigned int uiHandle_p,
- unsigned int uiDataSize_p,
- tEplFrame * pData_p,
- tEplAsySdoSeq * pRecFrame_p,
- tEplAsySdoSeqEvent Event_p)
-{
- tEplKernel Ret;
- unsigned int uiFrameSize;
- tEplFrame *pEplFrame;
- tEplAsySdoSeqCon *pAsySdoSeqCon;
- tEplSdoSeqConHdl SdoSeqConHdl;
- unsigned int uiFreeEntries;
-
-#if defined(WIN32) || defined(_WIN32)
- // enter critical section for process function
- EnterCriticalSection(AsySdoSequInstance_g.m_pCriticalSection);
-#endif
-
- Ret = kEplSuccessful;
-
- // get handle for hinger layer
- SdoSeqConHdl = uiHandle_p | EPL_SDO_ASY_HANDLE;
-
- // check if handle invalid
- if ((SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) ==
- EPL_SDO_SEQ_INVALID_HDL) {
- Ret = kEplSdoSeqInvalidHdl;
- goto Exit;
- }
- // get pointer to connection
- pAsySdoSeqCon = &AsySdoSequInstance_g.m_AsySdoConnection[uiHandle_p];
-
- // check size
- if ((pData_p == NULL) && (pRecFrame_p == NULL) && (uiDataSize_p != 0)) {
- Ret = kEplSdoSeqInvalidFrame;
- goto Exit;
- }
- // check state
- switch (pAsySdoSeqCon->m_SdoState) {
- // idle state
- case kEplAsySdoStateIdle:
- {
- // check event
- switch (Event_p) {
- // new connection
- // -> send init frame and change to
- // kEplAsySdoStateInit1
- case kAsySdoSeqEventInitCon:
- {
- // set sending scon to 1
- pAsySdoSeqCon->m_bRecSeqNum = 0x01;
- // set set send rcon to 0
- pAsySdoSeqCon->m_bSendSeqNum = 0x00;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL, FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // change state
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateInit1;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer(pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
-
- break;
- }
-
- // init con from extern
- // check rcon and scon
- // -> send answer
- case kAsySdoSeqEventFrameRec:
- {
-/*
- PRINTF3("%s scon=%u rcon=%u\n",
- __func__,
- pRecFrame_p->m_le_bSendSeqNumCon,
- pRecFrame_p->m_le_bRecSeqNumCon);
-*/
- // check if scon == 1 and rcon == 0
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) == 0x00)
- &&
- ((pRecFrame_p->
- m_le_bSendSeqNumCon &
- EPL_ASY_SDO_CON_MASK) == 0x01)) {
- // save sequence numbers
- pAsySdoSeqCon->m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
- // create answer and send answer
- // set rcon to 1 (in send direction own scon)
- pAsySdoSeqCon->m_bRecSeqNum++;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // change state to kEplAsySdoStateInit2
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateInit2;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
- } else { // error -> close
- // delete timer
- EplTimeruDeleteTimer
- (&pAsySdoSeqCon->
- m_EplTimerHdl);
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) !=
- 0x00)
- || ((pRecFrame_p->m_le_bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) != 0x00)) { // d.k. only answer with close message if the message sent was not a close message
- // save sequence numbers
- pAsySdoSeqCon->
- m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->
- m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
- // set rcon and scon to 0
- pAsySdoSeqCon->
- m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->
- m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0,
- NULL, FALSE);
- }
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateInitError);
- }
- break;
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(Event_p)
- break;
- }
-
- // init connection step 1
- // wait for frame with scon = 1
- // and rcon = 1
- case kEplAsySdoStateInit1:
- {
-// PRINTF0("EplSdoAsySequ: StateInit1\n");
-
- // check event
- switch (Event_p) {
- // frame received
- case kAsySdoSeqEventFrameRec:
- {
- // check scon == 1 and rcon == 1
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) == 0x01)
- && ((pRecFrame_p->m_le_bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) == 0x01)) { // create answer own scon = 2
- // save sequence numbers
- pAsySdoSeqCon->m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
-
- pAsySdoSeqCon->m_bRecSeqNum++;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // change state to kEplAsySdoStateInit3
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateInit3;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
-
- }
- // check if scon == 1 and rcon == 0, i.e. other side wants me to be server
- else if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) ==
- 0x00)
- &&
- ((pRecFrame_p->
- m_le_bSendSeqNumCon &
- EPL_ASY_SDO_CON_MASK) ==
- 0x01)) {
- // save sequence numbers
- pAsySdoSeqCon->m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
- // create answer and send answer
- // set rcon to 1 (in send direction own scon)
- pAsySdoSeqCon->m_bRecSeqNum++;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // change state to kEplAsySdoStateInit2
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateInit2;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
- } else { // error -> Close
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // delete timer
- EplTimeruDeleteTimer
- (&pAsySdoSeqCon->
- m_EplTimerHdl);
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) !=
- 0x00)
- || ((pRecFrame_p->m_le_bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) != 0x00)) { // d.k. only answer with close message if the message sent was not a close message
- // save sequence numbers
- pAsySdoSeqCon->
- m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->
- m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
-
- // set rcon and scon to 0
- pAsySdoSeqCon->
- m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->
- m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0,
- NULL, FALSE);
- }
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateInitError);
- }
- break;
- }
-
- // timeout
- case kAsySdoSeqEventTimeout:
- { // error -> Close
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
-
- // set rcon and scon to 0
- pAsySdoSeqCon->m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern(pAsySdoSeqCon,
- 0, NULL, FALSE);
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb(SdoSeqConHdl,
- kAsySdoConStateInitError);
- break;
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(Event_p)
- break;
- }
-
- // init connection step 2
- case kEplAsySdoStateInit2:
- {
-// PRINTF0("EplSdoAsySequ: StateInit2\n");
-
- // check event
- switch (Event_p) {
- // frame received
- case kAsySdoSeqEventFrameRec:
- {
- // check scon == 2 and rcon == 1
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) == 0x01)
- && ((pRecFrame_p->m_le_bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) == 0x02)) { // create answer own rcon = 2
- // save sequence numbers
- pAsySdoSeqCon->m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
-
- pAsySdoSeqCon->m_bRecSeqNum++;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // change state to kEplAsySdoStateConnected
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateConnected;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
-
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateConnected);
-
- }
- // check scon == 1 and rcon == 1, i.e. other side wants me to initiate the connection
- else if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) ==
- 0x01)
- &&
- ((pRecFrame_p->
- m_le_bSendSeqNumCon &
- EPL_ASY_SDO_CON_MASK) ==
- 0x01)) {
- // save sequence numbers
- pAsySdoSeqCon->m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
- // create answer and send answer
- // set rcon to 1 (in send direction own scon)
- pAsySdoSeqCon->m_bRecSeqNum++;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
- // change state to kEplAsySdoStateInit3
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateInit3;
-
- } else { // error -> Close
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // delete timer
- EplTimeruDeleteTimer
- (&pAsySdoSeqCon->
- m_EplTimerHdl);
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) !=
- 0x00)
- || ((pRecFrame_p->m_le_bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) != 0x00)) { // d.k. only answer with close message if the message sent was not a close message
- // save sequence numbers
- pAsySdoSeqCon->
- m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->
- m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
- // set rcon and scon to 0
- pAsySdoSeqCon->
- m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->
- m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0,
- NULL, FALSE);
- }
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateInitError);
- }
- break;
- }
-
- // timeout
- case kAsySdoSeqEventTimeout:
- { // error -> Close
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // set rcon and scon to 0
- pAsySdoSeqCon->m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern(pAsySdoSeqCon,
- 0, NULL, FALSE);
-
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb(SdoSeqConHdl,
- kAsySdoConStateInitError);
- break;
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(Event_p)
- break;
- }
-
- // init connection step 3
- case kEplAsySdoStateInit3:
- {
- // check event
- switch (Event_p) {
- // frame received
- case kAsySdoSeqEventFrameRec:
- {
- // check scon == 2 and rcon == 2
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) == 0x02)
- &&
- ((pRecFrame_p->
- m_le_bSendSeqNumCon &
- EPL_ASY_SDO_CON_MASK) == 0x02)) {
- // save sequence numbers
- pAsySdoSeqCon->m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
- // change state to kEplAsySdoStateConnected
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateConnected;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateConnected);
-
- }
- // check scon == 2 and rcon == 1
- else if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) ==
- 0x01)
- && ((pRecFrame_p->m_le_bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) == 0x02)) { // create answer own rcon = 2
- // save sequence numbers
- pAsySdoSeqCon->m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
-
- pAsySdoSeqCon->m_bRecSeqNum++;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // change state to kEplAsySdoStateConnected
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateConnected;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
-
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateConnected);
-
- } else { // error -> Close
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // delete timer
- EplTimeruDeleteTimer
- (&pAsySdoSeqCon->
- m_EplTimerHdl);
- if (((pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) !=
- 0x00)
- || ((pRecFrame_p->m_le_bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) != 0x00)) { // d.k. only answer with close message if the message sent was not a close message
- // save sequence numbers
- pAsySdoSeqCon->
- m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->
- m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
- // set rcon and scon to 0
- pAsySdoSeqCon->
- m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->
- m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0,
- NULL, FALSE);
- }
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateInitError);
- }
- break;
- }
-
- // timeout
- case kAsySdoSeqEventTimeout:
- { // error -> Close
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // set rcon and scon to 0
- pAsySdoSeqCon->m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern(pAsySdoSeqCon,
- 0, NULL, FALSE);
-
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb(SdoSeqConHdl,
- kAsySdoConStateInitError);
- break;
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(Event_p)
- break;
- }
-
- // connection established
- case kEplAsySdoStateConnected:
- {
- // check event
- switch (Event_p) {
-
- // frame to send
- case kAsySdoSeqEventFrameSend:
- {
- // set timer
- Ret =
- EplSdoAsySeqSetTimer(pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
- // check if data frame or ack
- if (pData_p == NULL) { // send ack
- // inc scon
- //pAsySdoSeqCon->m_bRecSeqNum += 4;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- } else { // send dataframe
- // increment send sequence number
- pAsySdoSeqCon->m_bRecSeqNum +=
- 4;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon,
- uiDataSize_p, pData_p,
- TRUE);
- if (Ret == kEplSdoSeqRequestAckNeeded) { // request ack
- // change state to wait ack
- pAsySdoSeqCon->
- m_SdoState =
- kEplAsySdoStateWaitAck;
- // set Ret to kEplSuccessful, because no error
- // for higher layer
- Ret = kEplSuccessful;
-
- } else if (Ret !=
- kEplSuccessful) {
- goto Exit;
- } else {
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateFrameSended);
- }
- }
- break;
- } // end of case kAsySdoSeqEventFrameSend
-
- // frame received
- case kAsySdoSeqEventFrameRec:
- {
- u8 bSendSeqNumCon =
- AmiGetByteFromLe(&pRecFrame_p->
- m_le_bSendSeqNumCon);
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer(pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
- // check scon
- switch (bSendSeqNumCon &
- EPL_ASY_SDO_CON_MASK) {
- // close from other node
- case 0:
- case 1:
- {
- // return to idle
- pAsySdoSeqCon->
- m_SdoState =
- kEplAsySdoStateIdle;
- // delete timer
- EplTimeruDeleteTimer
- (&pAsySdoSeqCon->
- m_EplTimerHdl);
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateConClosed);
-
- break;
- }
-
- // Request Ack or Error Ack
- // possible contain data
- case 3:
- // normal frame
- case 2:
- {
- if ((AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon)
- &
- EPL_ASY_SDO_CON_MASK)
- == 3) {
-// PRINTF0("EplSdoAsySequ: error response received\n");
-
- // error response (retransmission request)
- // resend frames from history
-
- // read frame from history
- Ret =
- EplSdoAsyReadFromHistory
- (pAsySdoSeqCon,
- &pEplFrame,
- &uiFrameSize,
- TRUE);
- if (Ret !=
- kEplSuccessful)
- {
- goto Exit;
- }
-
- while ((pEplFrame != NULL)
- &&
- (uiFrameSize
- != 0)) {
- // send frame
- Ret =
- EplSdoAsySeqSendLowerLayer
- (pAsySdoSeqCon,
- uiFrameSize,
- pEplFrame);
- if (Ret
- !=
- kEplSuccessful)
- {
- goto Exit;
- }
- // read next frame from history
- Ret =
- EplSdoAsyReadFromHistory
- (pAsySdoSeqCon,
- &pEplFrame,
- &uiFrameSize,
- FALSE);
- if (Ret
- !=
- kEplSuccessful)
- {
- goto Exit;
- }
- } // end of while((pabFrame != NULL)
- } // end of if (error response)
-
- if (((pAsySdoSeqCon->m_bSendSeqNum + 4) & EPL_SEQ_NUM_MASK) == (bSendSeqNumCon & EPL_SEQ_NUM_MASK)) { // next frame of sequence received
- // save send sequence number (without ack request)
- pAsySdoSeqCon->
- m_bSendSeqNum
- =
- bSendSeqNumCon
- & ~0x01;
-
- // check if ack or data-frame
- //ignore ack -> already processed
- if (uiDataSize_p
- >
- EPL_SEQ_HEADER_SIZE)
- {
- AsySdoSequInstance_g.
- m_fpSdoComReceiveCb
- (SdoSeqConHdl,
- ((tEplAsySdoCom *) & pRecFrame_p->m_le_abSdoSeqPayload), (uiDataSize_p - EPL_SEQ_HEADER_SIZE));
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateFrameSended);
-
- } else {
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateAckReceived);
- }
- } else if (((bSendSeqNumCon - pAsySdoSeqCon->m_bSendSeqNum - 4) & EPL_SEQ_NUM_MASK) < EPL_SEQ_NUM_THRESHOLD) { // frame of sequence was lost,
- // because difference of received and old value
- // is less then halve of the values range.
-
- // send error frame with own rcon = 3
- pAsySdoSeqCon->
- m_bSendSeqNum
- |= 0x03;
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon,
- 0, NULL,
- FALSE);
- // restore send sequence number
- pAsySdoSeqCon->
- m_bSendSeqNum
- =
- (pAsySdoSeqCon->
- m_bSendSeqNum
- &
- EPL_SEQ_NUM_MASK)
- | 0x02;
- if (Ret !=
- kEplSuccessful)
- {
- goto Exit;
- }
- // break here, because a requested acknowledge
- // was sent implicitly above
- break;
- }
- // else, ignore repeated frame
-
- if ((bSendSeqNumCon & EPL_ASY_SDO_CON_MASK) == 3) { // ack request received
-
- // create ack with own scon = 2
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon,
- 0, NULL,
- FALSE);
- if (Ret !=
- kEplSuccessful)
- {
- goto Exit;
- }
- }
-
- break;
- }
-
- } // switch(pAsySdoSeqCon->m_bSendSeqNum & EPL_ASY_SDO_CON_MASK)
- break;
- } // end of case kAsySdoSeqEventFrameRec:
-
- //close event from higher layer
- case kAsySdoSeqEventCloseCon:
- {
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // set rcon and scon to 0
- pAsySdoSeqCon->m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern(pAsySdoSeqCon,
- 0, NULL, FALSE);
-
- // delete timer
- EplTimeruDeleteTimer(&pAsySdoSeqCon->
- m_EplTimerHdl);
- // call Command Layer Cb is not necessary, because the event came from there
-// AsySdoSequInstance_g.m_fpSdoComConCb(SdoSeqConHdl,
-// kAsySdoConStateInitError);
- break;
- }
-
- // timeout
- case kAsySdoSeqEventTimeout:
- {
-
- uiFreeEntries =
- EplSdoAsyGetFreeEntriesFromHistory
- (pAsySdoSeqCon);
- if ((uiFreeEntries <
- EPL_SDO_HISTORY_SIZE)
- && (pAsySdoSeqCon->m_uiRetryCount < EPL_SEQ_RETRY_COUNT)) { // unacknowlegded frames in history
- // and retry counter not exceeded
-
- // resend data with acknowledge request
-
- // increment retry counter
- pAsySdoSeqCon->m_uiRetryCount++;
-
- // set timer
- Ret =
- EplSdoAsySeqSetTimer
- (pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
-
- // read first frame from history
- Ret =
- EplSdoAsyReadFromHistory
- (pAsySdoSeqCon, &pEplFrame,
- &uiFrameSize, TRUE);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- if ((pEplFrame != NULL)
- && (uiFrameSize != 0)) {
-
- // set ack request in scon
- AmiSetByteToLe
- (&pEplFrame->m_Data.
- m_Asnd.m_Payload.
- m_SdoSequenceFrame.
- m_le_bSendSeqNumCon,
- AmiGetByteFromLe
- (&pEplFrame->
- m_Data.m_Asnd.
- m_Payload.
- m_SdoSequenceFrame.
- m_le_bSendSeqNumCon)
- | 0x03);
-
- // send frame
- Ret =
- EplSdoAsySeqSendLowerLayer
- (pAsySdoSeqCon,
- uiFrameSize,
- pEplFrame);
- if (Ret !=
- kEplSuccessful) {
- goto Exit;
- }
-
- }
- } else {
- // timeout, because of no traffic -> Close
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // set rcon and scon to 0
- pAsySdoSeqCon->m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->m_bRecSeqNum &=
- EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon, 0, NULL,
- FALSE);
-
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateTimeout);
- }
-
- break;
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(Event_p)
- break;
- }
-
- // wait for Acknowledge (history buffer full)
- case kEplAsySdoStateWaitAck:
- {
- PRINTF0("EplSdoAsySequ: StateWaitAck\n");
-
- // set timer
- Ret = EplSdoAsySeqSetTimer(pAsySdoSeqCon,
- EPL_SEQ_DEFAULT_TIMEOUT);
-
- //TODO: retry of acknowledge
- if (Event_p == kAsySdoSeqEventFrameRec) {
- // check rcon
- switch (pRecFrame_p->
- m_le_bRecSeqNumCon &
- EPL_ASY_SDO_CON_MASK) {
- // close-frome other node
- case 0:
- {
- // return to idle
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateIdle;
- // delete timer
- EplTimeruDeleteTimer
- (&pAsySdoSeqCon->
- m_EplTimerHdl);
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateConClosed);
-
- break;
- }
-
- // normal frame
- case 2:
- {
- // should be ack
- // -> change to state kEplAsySdoStateConnected
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateConnected;
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateAckReceived);
- // send data to higher layer if needed
- if (uiDataSize_p >
- EPL_SEQ_HEADER_SIZE) {
- AsySdoSequInstance_g.
- m_fpSdoComReceiveCb
- (SdoSeqConHdl,
- ((tEplAsySdoCom *)
- & pRecFrame_p->
- m_le_abSdoSeqPayload),
- (uiDataSize_p -
- EPL_SEQ_HEADER_SIZE));
- }
- break;
- }
-
- // Request Ack or Error Ack
- case 3:
- {
- // -> change to state kEplAsySdoStateConnected
- pAsySdoSeqCon->m_SdoState =
- kEplAsySdoStateConnected;
-
- if (pRecFrame_p->m_le_bRecSeqNumCon == pAsySdoSeqCon->m_bRecSeqNum) { // ack request
- // -> send ack
- // save sequence numbers
- pAsySdoSeqCon->
- m_bRecSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bRecSeqNumCon);
- pAsySdoSeqCon->
- m_bSendSeqNum =
- AmiGetByteFromLe
- (&pRecFrame_p->
- m_le_bSendSeqNumCon);
-
- // create answer own rcon = 2
- pAsySdoSeqCon->
- m_bRecSeqNum--;
-
- // check if ack or data-frame
- if (uiDataSize_p >
- EPL_SEQ_HEADER_SIZE)
- {
- AsySdoSequInstance_g.
- m_fpSdoComReceiveCb
- (SdoSeqConHdl,
- ((tEplAsySdoCom *) & pRecFrame_p->m_le_abSdoSeqPayload), (uiDataSize_p - EPL_SEQ_HEADER_SIZE));
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb
- (SdoSeqConHdl,
- kAsySdoConStateFrameSended);
-
- } else {
- Ret =
- EplSdoAsySeqSendIntern
- (pAsySdoSeqCon,
- 0, NULL,
- FALSE);
- if (Ret !=
- kEplSuccessful)
- {
- goto Exit;
- }
- }
-
- } else {
- // error ack
- // resend frames from history
-
- // read frame from history
- Ret =
- EplSdoAsyReadFromHistory
- (pAsySdoSeqCon,
- &pEplFrame,
- &uiFrameSize,
- TRUE);
- while ((pEplFrame !=
- NULL)
- && (uiFrameSize
- != 0)) {
- // send frame
- Ret =
- EplSdoAsySeqSendLowerLayer
- (pAsySdoSeqCon,
- uiFrameSize,
- pEplFrame);
- if (Ret !=
- kEplSuccessful)
- {
- goto Exit;
- }
- // read next frame
-
- // read frame from history
- Ret =
- EplSdoAsyReadFromHistory
- (pAsySdoSeqCon,
- &pEplFrame,
- &uiFrameSize,
- FALSE);
- } // end of while((pabFrame != NULL)
- }
- break;
- }
- } // end of switch(pRecFrame_p->m_le_bRecSeqNumCon & EPL_ASY_SDO_CON_MASK)
-
- } else if (Event_p == kAsySdoSeqEventTimeout) { // error -> Close
- pAsySdoSeqCon->m_SdoState = kEplAsySdoStateIdle;
- // set rcon and scon to 0
- pAsySdoSeqCon->m_bSendSeqNum &=
- EPL_SEQ_NUM_MASK;
- pAsySdoSeqCon->m_bRecSeqNum &= EPL_SEQ_NUM_MASK;
- // send frame
- EplSdoAsySeqSendIntern(pAsySdoSeqCon,
- 0, NULL, FALSE);
-
- // call Command Layer Cb
- AsySdoSequInstance_g.
- m_fpSdoComConCb(SdoSeqConHdl,
- kAsySdoConStateTimeout);
- }
-
- break;
- }
-
- // unknown state
- default:
- {
- EPL_DBGLVL_SDO_TRACE0
- ("Error: Unknown State in EplSdoAsySeqProcess\n");
-
- }
- } // end of switch(pAsySdoSeqCon->m_SdoState)
-
- Exit:
-
-#if defined(WIN32) || defined(_WIN32)
- // leave critical section for process function
- LeaveCriticalSection(AsySdoSequInstance_g.m_pCriticalSection);
-#endif
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqSendIntern
-//
-// Description: intern function to create and send a frame
-// -> if uiDataSize_p == 0 create a frame with infos from
-// pAsySdoSeqCon_p
-//
-//
-//
-// Parameters: pAsySdoSeqCon_p = pointer to control structure of the connection
-// uiDataSize_p = size of data frame to process (can be 0)
-// -> without size of sequence header and Asnd header!!!
-// pData_p = pointer to frame to process (can be NULL)
-// fFrameInHistory = if TRUE frame is saved to history else not
-//
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsySeqSendIntern(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- unsigned int uiDataSize_p,
- tEplFrame * pData_p,
- BOOL fFrameInHistory_p)
-{
- tEplKernel Ret;
- u8 abFrame[EPL_SEQ_FRAME_SIZE];
- tEplFrame *pEplFrame;
- unsigned int uiFreeEntries;
-
- if (pData_p == NULL) { // set pointer to own frame
- EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame));
- pEplFrame = (tEplFrame *) & abFrame[0];
- } else { // set pointer to frame from calling function
- pEplFrame = pData_p;
- }
-
- if (fFrameInHistory_p != FALSE) {
- // check if only one free entry in history buffer
- uiFreeEntries =
- EplSdoAsyGetFreeEntriesFromHistory(pAsySdoSeqCon_p);
- if (uiFreeEntries == 1) { // request an acknowledge in dataframe
- // own scon = 3
- pAsySdoSeqCon_p->m_bRecSeqNum |= 0x03;
- }
- }
- // fillin header informations
- // set service id sdo
- AmiSetByteToLe(&pEplFrame->m_Data.m_Asnd.m_le_bServiceId, 0x05);
- AmiSetByteToLe(&pEplFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.
- m_le_abReserved, 0x00);
- // set receive sequence number and rcon
- AmiSetByteToLe(&pEplFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.
- m_le_bRecSeqNumCon, pAsySdoSeqCon_p->m_bSendSeqNum);
- // set send sequence number and scon
- AmiSetByteToLe(&pEplFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.
- m_le_bSendSeqNumCon, pAsySdoSeqCon_p->m_bRecSeqNum);
-
- // add size
- uiDataSize_p += EPL_SEQ_HEADER_SIZE;
-
- // forward frame to appropriate lower layer
- Ret = EplSdoAsySeqSendLowerLayer(pAsySdoSeqCon_p, uiDataSize_p, pEplFrame); // pointer to frame
-
- // check if all allright
- if ((Ret == kEplSuccessful)
- && (fFrameInHistory_p != FALSE)) {
- // set own scon to 2 if needed
- if ((pAsySdoSeqCon_p->m_bRecSeqNum & 0x03) == 0x03) {
- pAsySdoSeqCon_p->m_bRecSeqNum--;
- }
- // save frame to history
- Ret = EplSdoAsyAddFrameToHistory(pAsySdoSeqCon_p,
- pEplFrame, uiDataSize_p);
- if (Ret == kEplSdoSeqNoFreeHistory) { // request Ack needed
- Ret = kEplSdoSeqRequestAckNeeded;
- }
-
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqSendLowerLayer
-//
-// Description: intern function to send a previously created frame to lower layer
-//
-// Parameters: pAsySdoSeqCon_p = pointer to control structure of the connection
-// uiDataSize_p = size of data frame to process (can be 0)
-// -> without size of Asnd header!!!
-// pData_p = pointer to frame to process (can be NULL)
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsySeqSendLowerLayer(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- unsigned int uiDataSize_p,
- tEplFrame * pEplFrame_p)
-{
- tEplKernel Ret;
-
- // call send-function
- // check handle for UDP or Asnd
- if ((pAsySdoSeqCon_p->m_ConHandle & EPL_SDO_ASY_HANDLE_MASK) == EPL_SDO_UDP_HANDLE) { // send over UDP
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
- Ret = EplSdoUdpuSendData(pAsySdoSeqCon_p->m_ConHandle, pEplFrame_p, // pointer to frame
- uiDataSize_p);
-#else
- Ret = kEplSdoSeqUnsupportedProt;
-#endif
-
- } else if ((pAsySdoSeqCon_p->m_ConHandle & EPL_SDO_ASY_HANDLE_MASK) == EPL_SDO_ASND_HANDLE) { // ASND
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
- Ret = EplSdoAsnduSendData(pAsySdoSeqCon_p->m_ConHandle, pEplFrame_p, // pointer to frame
- uiDataSize_p);
-#else
- Ret = kEplSdoSeqUnsupportedProt;
-#endif
- } else { // error
- Ret = kEplSdoSeqInvalidHdl;
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsyReceiveCb
-//
-// Description: callback-function for received frames from lower layer
-//
-//
-//
-// Parameters: ConHdl_p = handle of the connection
-// pSdoSeqData_p = pointer to frame
-// uiDataSize_p = size of frame
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoAsyReceiveCb(tEplSdoConHdl ConHdl_p,
- tEplAsySdoSeq *pSdoSeqData_p,
- unsigned int uiDataSize_p)
-{
- tEplKernel Ret;
- unsigned int uiCount = 0;
- unsigned int uiFreeEntry = EPL_MAX_SDO_SEQ_CON;
- tEplAsySdoSeqCon *pAsySdoSeqCon;
-
-#if defined(WIN32) || defined(_WIN32)
- // enter critical section
- EnterCriticalSection(AsySdoSequInstance_g.m_pCriticalSectionReceive);
-#endif
-
- EPL_DBGLVL_SDO_TRACE2("Handle: 0x%x , First Databyte 0x%x\n", ConHdl_p,
- ((u8 *) pSdoSeqData_p)[0]);
-
- // search controll structure for this connection
- pAsySdoSeqCon = &AsySdoSequInstance_g.m_AsySdoConnection[uiCount];
- while (uiCount < EPL_MAX_SDO_SEQ_CON) {
- if (pAsySdoSeqCon->m_ConHandle == ConHdl_p) {
- break;
- } else if ((pAsySdoSeqCon->m_ConHandle == 0)
- && (uiFreeEntry == EPL_MAX_SDO_SEQ_CON)) {
- // free entry
- uiFreeEntry = uiCount;
- }
- uiCount++;
- pAsySdoSeqCon++;
- }
-
- if (uiCount == EPL_MAX_SDO_SEQ_CON) { // new connection
- if (uiFreeEntry == EPL_MAX_SDO_SEQ_CON) {
- Ret = kEplSdoSeqNoFreeHandle;
- goto Exit;
- } else {
- pAsySdoSeqCon =
- &AsySdoSequInstance_g.
- m_AsySdoConnection[uiFreeEntry];
- // save handle from lower layer
- pAsySdoSeqCon->m_ConHandle = ConHdl_p;
- // increment use counter
- pAsySdoSeqCon->m_uiUseCount++;
- uiCount = uiFreeEntry;
- }
- }
- // call history ack function
- Ret = EplSdoAsyAckFrameToHistory(pAsySdoSeqCon,
- (AmiGetByteFromLe
- (&pSdoSeqData_p->
- m_le_bRecSeqNumCon) &
- EPL_SEQ_NUM_MASK));
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#if defined(WIN32) || defined(_WIN32)
- // leave critical section
- LeaveCriticalSection(AsySdoSequInstance_g.m_pCriticalSectionReceive);
-#endif
-
- // call process function with pointer of frame and event kAsySdoSeqEventFrameRec
- Ret = EplSdoAsySeqProcess(uiCount,
- uiDataSize_p,
- NULL, pSdoSeqData_p, kAsySdoSeqEventFrameRec);
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsyInitHistory
-//
-// Description: inti function for history buffer
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsyInitHistory(void)
-{
- tEplKernel Ret;
- unsigned int uiCount;
-
- Ret = kEplSuccessful;
- // init m_bFreeEntries in history-buffer
- for (uiCount = 0; uiCount < EPL_MAX_SDO_SEQ_CON; uiCount++) {
- AsySdoSequInstance_g.m_AsySdoConnection[uiCount].
- m_SdoConHistory.m_bFreeEntries = EPL_SDO_HISTORY_SIZE;
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsyAddFrameToHistory
-//
-// Description: function to add a frame to the history buffer
-//
-//
-//
-// Parameters: pAsySdoSeqCon_p = pointer to control structure of this connection
-// pFrame_p = pointer to frame
-// uiSize_p = size of the frame
-// -> without size of the ethernet header
-// and the asnd header
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsyAddFrameToHistory(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- tEplFrame * pFrame_p,
- unsigned int uiSize_p)
-{
- tEplKernel Ret;
- tEplAsySdoConHistory *pHistory;
-
- Ret = kEplSuccessful;
-
- // add frame to history buffer
-
- // check size
- // $$$ d.k. EPL_SEQ_HISTORY_FRAME_SIZE includes the header size, but uiSize_p does not!!!
- if (uiSize_p > EPL_SEQ_HISTROY_FRAME_SIZE) {
- Ret = kEplSdoSeqFrameSizeError;
- goto Exit;
- }
- // save pointer to history
- pHistory = &pAsySdoSeqCon_p->m_SdoConHistory;
-
- // check if a free entry is available
- if (pHistory->m_bFreeEntries > 0) { // write message in free entry
- EPL_MEMCPY(&
- ((tEplFrame *) pHistory->
- m_aabHistoryFrame[pHistory->m_bWrite])->
- m_le_bMessageType, &pFrame_p->m_le_bMessageType,
- uiSize_p + EPL_ASND_HEADER_SIZE);
- // store size
- pHistory->m_auiFrameSize[pHistory->m_bWrite] = uiSize_p;
-
- // decremend number of free bufferentries
- pHistory->m_bFreeEntries--;
-
- // increment writeindex
- pHistory->m_bWrite++;
-
- // check if write-index run over array-boarder
- if (pHistory->m_bWrite == EPL_SDO_HISTORY_SIZE) {
- pHistory->m_bWrite = 0;
- }
-
- } else { // no free entry
- Ret = kEplSdoSeqNoFreeHistory;
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsyAckFrameToHistory
-//
-// Description: function to delete acknowledged frames fron history buffer
-//
-//
-//
-// Parameters: pAsySdoSeqCon_p = pointer to control structure of this connection
-// bRecSeqNumber_p = receive sequence number of the received frame
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsyAckFrameToHistory(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- u8 bRecSeqNumber_p)
-{
- tEplKernel Ret;
- tEplAsySdoConHistory *pHistory;
- u8 bAckIndex;
- u8 bCurrentSeqNum;
-
- Ret = kEplSuccessful;
-
- // get pointer to history buffer
- pHistory = &pAsySdoSeqCon_p->m_SdoConHistory;
-
- // release all acknowledged frames from history buffer
-
- // check if there are entries in history
- if (pHistory->m_bFreeEntries < EPL_SDO_HISTORY_SIZE) {
- bAckIndex = pHistory->m_bAck;
- do {
- bCurrentSeqNum =
- (((tEplFrame *) pHistory->
- m_aabHistoryFrame[bAckIndex])->m_Data.m_Asnd.
- m_Payload.m_SdoSequenceFrame.
- m_le_bSendSeqNumCon & EPL_SEQ_NUM_MASK);
- if (((bRecSeqNumber_p -
- bCurrentSeqNum) & EPL_SEQ_NUM_MASK)
- < EPL_SEQ_NUM_THRESHOLD) {
- pHistory->m_auiFrameSize[bAckIndex] = 0;
- bAckIndex++;
- pHistory->m_bFreeEntries++;
- if (bAckIndex == EPL_SDO_HISTORY_SIZE) { // read index run over array-boarder
- bAckIndex = 0;
- }
- } else { // nothing to do anymore,
- // because any further frame in history has larger sequence
- // number than the acknowledge
- goto Exit;
- }
- }
- while ((((bRecSeqNumber_p - 1 -
- bCurrentSeqNum) & EPL_SEQ_NUM_MASK)
- < EPL_SEQ_NUM_THRESHOLD)
- && (pHistory->m_bWrite != bAckIndex));
-
- // store local read-index to global var
- pHistory->m_bAck = bAckIndex;
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsyReadFromHistory
-//
-// Description: function to one frame from history
-//
-//
-//
-// Parameters: pAsySdoSeqCon_p = pointer to control structure of this connection
-// ppFrame_p = pointer to pointer to the buffer of the stored frame
-// puiSize_p = OUT: size of the frame
-// fInitRead = bool which indicate a start of retransmission
-// -> return last not acknowledged message if TRUE
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsyReadFromHistory(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- tEplFrame ** ppFrame_p,
- unsigned int *puiSize_p,
- BOOL fInitRead_p)
-{
- tEplKernel Ret;
- tEplAsySdoConHistory *pHistory;
-
- Ret = kEplSuccessful;
-
- // read one message from History
-
- // get pointer to history buffer
- pHistory = &pAsySdoSeqCon_p->m_SdoConHistory;
-
- // check if init
- if (fInitRead_p != FALSE) { // initialize read index to the index which shall be acknowledged next
- pHistory->m_bRead = pHistory->m_bAck;
- }
- // check if entries are available for reading
- if ((pHistory->m_bFreeEntries < EPL_SDO_HISTORY_SIZE)
- && (pHistory->m_bWrite != pHistory->m_bRead)) {
-// PRINTF4("EplSdoAsyReadFromHistory(): init = %d, read = %u, write = %u, ack = %u", (int) fInitRead_p, (u16)pHistory->m_bRead, (u16)pHistory->m_bWrite, (u16)pHistory->m_bAck);
-// PRINTF2(", free entries = %u, next frame size = %u\n", (u16)pHistory->m_bFreeEntries, pHistory->m_auiFrameSize[pHistory->m_bRead]);
-
- // return pointer to stored frame
- *ppFrame_p =
- (tEplFrame *) pHistory->m_aabHistoryFrame[pHistory->
- m_bRead];
-
- // save size
- *puiSize_p = pHistory->m_auiFrameSize[pHistory->m_bRead];
-
- pHistory->m_bRead++;
- if (pHistory->m_bRead == EPL_SDO_HISTORY_SIZE) {
- pHistory->m_bRead = 0;
- }
-
- } else {
-// PRINTF3("EplSdoAsyReadFromHistory(): read = %u, ack = %u, free entries = %u, no frame\n", (u16)pHistory->m_bRead, (u16)pHistory->m_bAck, (u16)pHistory->m_bFreeEntries);
-
- // no more frames to send
- // return null pointer
- *ppFrame_p = NULL;
-
- *puiSize_p = 0;
- }
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsyGetFreeEntriesFromHistory
-//
-// Description: function returns the number of free histroy entries
-//
-//
-//
-// Parameters: pAsySdoSeqCon_p = pointer to control structure of this connection
-//
-//
-// Returns: unsigned int = number of free entries
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static unsigned int EplSdoAsyGetFreeEntriesFromHistory(tEplAsySdoSeqCon *
- pAsySdoSeqCon_p)
-{
- unsigned int uiFreeEntries;
-
- uiFreeEntries =
- (unsigned int)pAsySdoSeqCon_p->m_SdoConHistory.m_bFreeEntries;
-
- return uiFreeEntries;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoAsySeqSetTimer
-//
-// Description: function sets or modify timer in timermosule
-//
-//
-//
-// Parameters: pAsySdoSeqCon_p = pointer to control structure of this connection
-// ulTimeout = timeout in ms
-//
-//
-// Returns: unsigned int = number of free entries
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoAsySeqSetTimer(tEplAsySdoSeqCon * pAsySdoSeqCon_p,
- unsigned long ulTimeout)
-{
- tEplKernel Ret;
- tEplTimerArg TimerArg;
-
- TimerArg.m_EventSink = kEplEventSinkSdoAsySeq;
- TimerArg.m_ulArg = (unsigned long)pAsySdoSeqCon_p;
-
- if (pAsySdoSeqCon_p->m_EplTimerHdl == 0) { // create new timer
- Ret = EplTimeruSetTimerMs(&pAsySdoSeqCon_p->m_EplTimerHdl,
- ulTimeout, TimerArg);
- } else { // modify exisiting timer
- Ret = EplTimeruModifyTimerMs(&pAsySdoSeqCon_p->m_EplTimerHdl,
- ulTimeout, TimerArg);
-
- }
-
- return Ret;
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for SDO Command 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: EplSdoComu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.14 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplSdoComu.h"
-
-#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) == 0) &&\
- (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) == 0) )
-
-#error 'ERROR: At least SDO Server or SDO Client should be activate!'
-
-#endif
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0) && (EPL_OBD_USE_KERNEL == FALSE)
-
-#error 'ERROR: SDO Server needs OBDu module!'
-
-#endif
-
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef EPL_MAX_SDO_COM_CON
-#define EPL_MAX_SDO_COM_CON 5
-#endif
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-// intern events
-typedef enum {
- kEplSdoComConEventSendFirst = 0x00, // first frame to send
- kEplSdoComConEventRec = 0x01, // frame received
- kEplSdoComConEventConEstablished = 0x02, // connection established
- kEplSdoComConEventConClosed = 0x03, // connection closed
- kEplSdoComConEventAckReceived = 0x04, // acknowledge received by lower layer
- // -> continue sending
- kEplSdoComConEventFrameSended = 0x05, // lower has send a frame
- kEplSdoComConEventInitError = 0x06, // error duringinitialisiation
- // of the connection
- kEplSdoComConEventTimeout = 0x07 // timeout in lower layer
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- ,
-
- kEplSdoComConEventInitCon = 0x08, // init connection (only client)
- kEplSdoComConEventAbort = 0x09 // abort sdo transfer (only client)
-#endif
-} tEplSdoComConEvent;
-
-typedef enum {
- kEplSdoComSendTypeReq = 0x00, // send a request
- kEplSdoComSendTypeAckRes = 0x01, // send a resonse without data
- kEplSdoComSendTypeRes = 0x02, // send response with data
- kEplSdoComSendTypeAbort = 0x03 // send abort
-} tEplSdoComSendType;
-
-// state of the state maschine
-typedef enum {
- // General State
- kEplSdoComStateIdle = 0x00, // idle state
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
- // Server States
- kEplSdoComStateServerSegmTrans = 0x01, // send following frames
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- // Client States
- kEplSdoComStateClientWaitInit = 0x10, // wait for init connection
- // on lower layer
- kEplSdoComStateClientConnected = 0x11, // connection established
- kEplSdoComStateClientSegmTrans = 0x12 // send following frames
-#endif
-} tEplSdoComState;
-
-// control structure for transaction
-typedef struct {
- tEplSdoSeqConHdl m_SdoSeqConHdl; // if != 0 -> entry used
- tEplSdoComState m_SdoComState;
- u8 m_bTransactionId;
- unsigned int m_uiNodeId; // NodeId of the target
- // -> needed to reinit connection
- // after timeout
- tEplSdoTransType m_SdoTransType; // Auto, Expedited, Segmented
- tEplSdoServiceType m_SdoServiceType; // WriteByIndex, ReadByIndex
- tEplSdoType m_SdoProtType; // protocol layer: Auto, Udp, Asnd, Pdo
- u8 *m_pData; // pointer to data
- unsigned int m_uiTransSize; // number of bytes
- // to transfer
- unsigned int m_uiTransferredByte; // number of bytes
- // already transferred
- tEplSdoFinishedCb m_pfnTransferFinished; // callback function of the
- // application
- // -> called in the end of
- // the SDO transfer
- void *m_pUserArg; // user definable argument pointer
-
- u32 m_dwLastAbortCode; // save the last abort code
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- // only for client
- unsigned int m_uiTargetIndex; // index to access
- unsigned int m_uiTargetSubIndex; // subiondex to access
-
- // for future use
- unsigned int m_uiTimeout; // timeout for this connection
-
-#endif
-
-} tEplSdoComCon;
-
-// instance table
-typedef struct {
- tEplSdoComCon m_SdoComCon[EPL_MAX_SDO_COM_CON];
-
-#if defined(WIN32) || defined(_WIN32)
- LPCRITICAL_SECTION m_pCriticalSection;
- CRITICAL_SECTION m_CriticalSection;
-#endif
-
-} tEplSdoComInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-static tEplSdoComInstance SdoComInstance_g;
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-tEplKernel EplSdoComReceiveCb(tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplAsySdoCom *pAsySdoCom_p,
- unsigned int uiDataSize_p);
-
-tEplKernel EplSdoComConCb(tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplAsySdoConState AsySdoConState_p);
-
-static tEplKernel EplSdoComSearchConIntern(tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplSdoComConEvent SdoComConEvent_p,
- tEplAsySdoCom * pAsySdoCom_p);
-
-static tEplKernel EplSdoComProcessIntern(tEplSdoComConHdl SdoComCon_p,
- tEplSdoComConEvent SdoComConEvent_p,
- tEplAsySdoCom * pAsySdoCom_p);
-
-static tEplKernel EplSdoComTransferFinished(tEplSdoComConHdl SdoComCon_p,
- tEplSdoComCon * pSdoComCon_p,
- tEplSdoComConState
- SdoComConState_p);
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
-static tEplKernel EplSdoComServerInitReadByIndex(tEplSdoComCon * pSdoComCon_p,
- tEplAsySdoCom * pAsySdoCom_p);
-
-static tEplKernel EplSdoComServerSendFrameIntern(tEplSdoComCon * pSdoComCon_p,
- unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplSdoComSendType SendType_p);
-
-static tEplKernel EplSdoComServerInitWriteByIndex(tEplSdoComCon * pSdoComCon_p,
- tEplAsySdoCom * pAsySdoCom_p);
-#endif
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-
-static tEplKernel EplSdoComClientSend(tEplSdoComCon * pSdoComCon_p);
-
-static tEplKernel EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p,
- tEplAsySdoCom * pAsySdoCom_p);
-
-static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon * pSdoComCon_p,
- u32 dwAbortCode_p);
-#endif
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <SDO Command Layer> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description: SDO Command layer Modul
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComInit
-//
-// Description: Init first instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoComInit(void)
-{
- tEplKernel Ret;
-
- Ret = EplSdoComAddInstance();
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComAddInstance
-//
-// Description: Init additional instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoComAddInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // init controll structure
- EPL_MEMSET(&SdoComInstance_g, 0x00, sizeof(SdoComInstance_g));
-
- // init instance of lower layer
- Ret = EplSdoAsySeqAddInstance(EplSdoComReceiveCb, EplSdoComConCb);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-#if defined(WIN32) || defined(_WIN32)
- // create critical section for process function
- SdoComInstance_g.m_pCriticalSection =
- &SdoComInstance_g.m_CriticalSection;
- InitializeCriticalSection(SdoComInstance_g.m_pCriticalSection);
-#endif
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComDelInstance
-//
-// Description: delete instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoComDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
-#if defined(WIN32) || defined(_WIN32)
- // delete critical section for process function
- DeleteCriticalSection(SdoComInstance_g.m_pCriticalSection);
-#endif
-
- Ret = EplSdoAsySeqDelInstance();
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComDefineCon
-//
-// Description: function defines a SDO connection to another node
-// -> init lower layer and returns a handle for the connection.
-// Two client connections to the same node via the same protocol
-// are not allowed. If this function detects such a situation
-// it will return kEplSdoComHandleExists and the handle of
-// the existing connection in pSdoComConHdl_p.
-// Using of existing server connections is possible.
-//
-// Parameters: pSdoComConHdl_p = pointer to the buffer of the handle
-// uiTargetNodeId_p = NodeId of the targetnode
-// ProtType_p = type of protocol to use for connection
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-tEplKernel EplSdoComDefineCon(tEplSdoComConHdl *pSdoComConHdl_p,
- unsigned int uiTargetNodeId_p,
- tEplSdoType ProtType_p)
-{
- tEplKernel Ret;
- unsigned int uiCount;
- unsigned int uiFreeHdl;
- tEplSdoComCon *pSdoComCon;
-
- // check Parameter
- ASSERT(pSdoComConHdl_p != NULL);
-
- // check NodeId
- if ((uiTargetNodeId_p == EPL_C_ADR_INVALID)
- || (uiTargetNodeId_p >= EPL_C_ADR_BROADCAST)) {
- Ret = kEplInvalidNodeId;
-
- }
- // search free control structure
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[0];
- uiCount = 0;
- uiFreeHdl = EPL_MAX_SDO_COM_CON;
- while (uiCount < EPL_MAX_SDO_COM_CON) {
- if (pSdoComCon->m_SdoSeqConHdl == 0) { // free entry
- uiFreeHdl = uiCount;
- } else if ((pSdoComCon->m_uiNodeId == uiTargetNodeId_p)
- && (pSdoComCon->m_SdoProtType == ProtType_p)) { // existing client connection with same node ID and same protocol type
- *pSdoComConHdl_p = uiCount;
- Ret = kEplSdoComHandleExists;
- goto Exit;
- }
- uiCount++;
- pSdoComCon++;
- }
-
- if (uiFreeHdl == EPL_MAX_SDO_COM_CON) {
- Ret = kEplSdoComNoFreeHandle;
- goto Exit;
- }
-
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[uiFreeHdl];
- // save handle for application
- *pSdoComConHdl_p = uiFreeHdl;
- // save parameters
- pSdoComCon->m_SdoProtType = ProtType_p;
- pSdoComCon->m_uiNodeId = uiTargetNodeId_p;
-
- // set Transaction Id
- pSdoComCon->m_bTransactionId = 0;
-
- // check protocol
- switch (ProtType_p) {
- // udp
- case kEplSdoTypeUdp:
- {
- // call connection int function of lower layer
- Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl,
- pSdoComCon->m_uiNodeId,
- kEplSdoTypeUdp);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- break;
- }
-
- // Asend
- case kEplSdoTypeAsnd:
- {
- // call connection int function of lower layer
- Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl,
- pSdoComCon->m_uiNodeId,
- kEplSdoTypeAsnd);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- break;
- }
-
- // Pdo -> not supported
- case kEplSdoTypePdo:
- default:
- {
- Ret = kEplSdoComUnsupportedProt;
- goto Exit;
- }
- } // end of switch(m_ProtType_p)
-
- // call process function
- Ret = EplSdoComProcessIntern(uiFreeHdl,
- kEplSdoComConEventInitCon, NULL);
-
- Exit:
- return Ret;
-}
-#endif
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComInitTransferByIndex
-//
-// Description: function init SDO Transfer for a defined connection
-//
-//
-//
-// Parameters: SdoComTransParam_p = Structure with parameters for connection
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-tEplKernel EplSdoComInitTransferByIndex(tEplSdoComTransParamByIndex *pSdoComTransParam_p)
-{
- tEplKernel Ret;
- tEplSdoComCon *pSdoComCon;
-
- // check parameter
- if ((pSdoComTransParam_p->m_uiSubindex >= 0xFF)
- || (pSdoComTransParam_p->m_uiIndex == 0)
- || (pSdoComTransParam_p->m_uiIndex > 0xFFFF)
- || (pSdoComTransParam_p->m_pData == NULL)
- || (pSdoComTransParam_p->m_uiDataSize == 0)) {
- Ret = kEplSdoComInvalidParam;
- goto Exit;
- }
-
- if (pSdoComTransParam_p->m_SdoComConHdl >= EPL_MAX_SDO_COM_CON) {
- Ret = kEplSdoComInvalidHandle;
- goto Exit;
- }
- // get pointer to control structure of connection
- pSdoComCon =
- &SdoComInstance_g.m_SdoComCon[pSdoComTransParam_p->m_SdoComConHdl];
-
- // check if handle ok
- if (pSdoComCon->m_SdoSeqConHdl == 0) {
- Ret = kEplSdoComInvalidHandle;
- goto Exit;
- }
- // check if command layer is idle
- if ((pSdoComCon->m_uiTransferredByte + pSdoComCon->m_uiTransSize) > 0) { // handle is not idle
- Ret = kEplSdoComHandleBusy;
- goto Exit;
- }
- // save parameter
- // callback function for end of transfer
- pSdoComCon->m_pfnTransferFinished =
- pSdoComTransParam_p->m_pfnSdoFinishedCb;
- pSdoComCon->m_pUserArg = pSdoComTransParam_p->m_pUserArg;
-
- // set type of SDO command
- if (pSdoComTransParam_p->m_SdoAccessType == kEplSdoAccessTypeRead) {
- pSdoComCon->m_SdoServiceType = kEplSdoServiceReadByIndex;
- } else {
- pSdoComCon->m_SdoServiceType = kEplSdoServiceWriteByIndex;
-
- }
- // save pointer to data
- pSdoComCon->m_pData = pSdoComTransParam_p->m_pData;
- // maximal bytes to transfer
- pSdoComCon->m_uiTransSize = pSdoComTransParam_p->m_uiDataSize;
- // bytes already transfered
- pSdoComCon->m_uiTransferredByte = 0;
-
- // reset parts of control structure
- pSdoComCon->m_dwLastAbortCode = 0;
- pSdoComCon->m_SdoTransType = kEplSdoTransAuto;
- // save timeout
- //pSdoComCon->m_uiTimeout = SdoComTransParam_p.m_uiTimeout;
-
- // save index and subindex
- pSdoComCon->m_uiTargetIndex = pSdoComTransParam_p->m_uiIndex;
- pSdoComCon->m_uiTargetSubIndex = pSdoComTransParam_p->m_uiSubindex;
-
- // call process function
- Ret = EplSdoComProcessIntern(pSdoComTransParam_p->m_SdoComConHdl, kEplSdoComConEventSendFirst, // event to start transfer
- NULL);
-
- Exit:
- return Ret;
-
-}
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComUndefineCon
-//
-// Description: function undefine a SDO connection
-//
-//
-//
-// Parameters: SdoComConHdl_p = handle for the connection
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-tEplKernel EplSdoComUndefineCon(tEplSdoComConHdl SdoComConHdl_p)
-{
- tEplKernel Ret;
- tEplSdoComCon *pSdoComCon;
-
- Ret = kEplSuccessful;
-
- if (SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) {
- Ret = kEplSdoComInvalidHandle;
- goto Exit;
- }
- // get pointer to control structure
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p];
-
- // $$$ d.k. abort a running transfer before closing the sequence layer
-
- if (((pSdoComCon->m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) !=
- EPL_SDO_SEQ_INVALID_HDL)
- && (pSdoComCon->m_SdoSeqConHdl != 0)) {
- // close connection in lower layer
- switch (pSdoComCon->m_SdoProtType) {
- case kEplSdoTypeAsnd:
- case kEplSdoTypeUdp:
- {
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- break;
- }
-
- case kEplSdoTypePdo:
- case kEplSdoTypeAuto:
- default:
- {
- Ret = kEplSdoComUnsupportedProt;
- goto Exit;
- }
-
- } // end of switch(pSdoComCon->m_SdoProtType)
- }
-
- // clean controll structure
- EPL_MEMSET(pSdoComCon, 0x00, sizeof(tEplSdoComCon));
- Exit:
- return Ret;
-}
-#endif
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComGetState
-//
-// Description: function returns the state fo the connection
-//
-//
-//
-// Parameters: SdoComConHdl_p = handle for the connection
-// pSdoComFinished_p = pointer to structur for sdo state
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-tEplKernel EplSdoComGetState(tEplSdoComConHdl SdoComConHdl_p,
- tEplSdoComFinished *pSdoComFinished_p)
-{
- tEplKernel Ret;
- tEplSdoComCon *pSdoComCon;
-
- Ret = kEplSuccessful;
-
- if (SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) {
- Ret = kEplSdoComInvalidHandle;
- goto Exit;
- }
- // get pointer to control structure
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p];
-
- // check if handle ok
- if (pSdoComCon->m_SdoSeqConHdl == 0) {
- Ret = kEplSdoComInvalidHandle;
- goto Exit;
- }
-
- pSdoComFinished_p->m_pUserArg = pSdoComCon->m_pUserArg;
- pSdoComFinished_p->m_uiNodeId = pSdoComCon->m_uiNodeId;
- pSdoComFinished_p->m_uiTargetIndex = pSdoComCon->m_uiTargetIndex;
- pSdoComFinished_p->m_uiTargetSubIndex = pSdoComCon->m_uiTargetSubIndex;
- pSdoComFinished_p->m_uiTransferredByte =
- pSdoComCon->m_uiTransferredByte;
- pSdoComFinished_p->m_dwAbortCode = pSdoComCon->m_dwLastAbortCode;
- pSdoComFinished_p->m_SdoComConHdl = SdoComConHdl_p;
- if (pSdoComCon->m_SdoServiceType == kEplSdoServiceWriteByIndex) {
- pSdoComFinished_p->m_SdoAccessType = kEplSdoAccessTypeWrite;
- } else {
- pSdoComFinished_p->m_SdoAccessType = kEplSdoAccessTypeRead;
- }
-
- if (pSdoComCon->m_dwLastAbortCode != 0) { // sdo abort
- pSdoComFinished_p->m_SdoComConState =
- kEplSdoComTransferRxAborted;
-
- // delete abort code
- pSdoComCon->m_dwLastAbortCode = 0;
-
- } else if ((pSdoComCon->m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) == EPL_SDO_SEQ_INVALID_HDL) { // check state
- pSdoComFinished_p->m_SdoComConState =
- kEplSdoComTransferLowerLayerAbort;
- } else if (pSdoComCon->m_SdoComState == kEplSdoComStateClientWaitInit) {
- // finished
- pSdoComFinished_p->m_SdoComConState =
- kEplSdoComTransferNotActive;
- } else if (pSdoComCon->m_uiTransSize == 0) { // finished
- pSdoComFinished_p->m_SdoComConState =
- kEplSdoComTransferFinished;
- }
-
- Exit:
- return Ret;
-
-}
-#endif
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComSdoAbort
-//
-// Description: function abort a sdo transfer
-//
-//
-//
-// Parameters: SdoComConHdl_p = handle for the connection
-// dwAbortCode_p = abort code
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-tEplKernel EplSdoComSdoAbort(tEplSdoComConHdl SdoComConHdl_p,
- u32 dwAbortCode_p)
-{
- tEplKernel Ret;
- tEplSdoComCon *pSdoComCon;
-
- if (SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) {
- Ret = kEplSdoComInvalidHandle;
- goto Exit;
- }
- // get pointer to control structure of connection
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p];
-
- // check if handle ok
- if (pSdoComCon->m_SdoSeqConHdl == 0) {
- Ret = kEplSdoComInvalidHandle;
- goto Exit;
- }
- // save pointer to abort code
- pSdoComCon->m_pData = (u8 *) & dwAbortCode_p;
-
- Ret = EplSdoComProcessIntern(SdoComConHdl_p,
- kEplSdoComConEventAbort,
- (tEplAsySdoCom *) NULL);
-
- Exit:
- return Ret;
-}
-#endif
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComReceiveCb
-//
-// Description: callback function for SDO Sequence Layer
-// -> indicates new data
-//
-//
-//
-// Parameters: SdoSeqConHdl_p = Handle for connection
-// pAsySdoCom_p = pointer to data
-// uiDataSize_p = size of data ($$$ not used yet, but it should)
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoComReceiveCb(tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplAsySdoCom *pAsySdoCom_p,
- unsigned int uiDataSize_p)
-{
- tEplKernel Ret;
-
- // search connection internally
- Ret = EplSdoComSearchConIntern(SdoSeqConHdl_p,
- kEplSdoComConEventRec, pAsySdoCom_p);
-
- EPL_DBGLVL_SDO_TRACE3
- ("EplSdoComReceiveCb SdoSeqConHdl: 0x%X, First Byte of pAsySdoCom_p: 0x%02X, uiDataSize_p: 0x%04X\n",
- SdoSeqConHdl_p, (u16) pAsySdoCom_p->m_le_abCommandData[0],
- uiDataSize_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComConCb
-//
-// Description: callback function called by SDO Sequence Layer to inform
-// command layer about state change of connection
-//
-//
-//
-// Parameters: SdoSeqConHdl_p = Handle of the connection
-// AsySdoConState_p = Event of the connection
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoComConCb(tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplAsySdoConState AsySdoConState_p)
-{
- tEplKernel Ret;
- tEplSdoComConEvent SdoComConEvent = kEplSdoComConEventSendFirst;
-
- Ret = kEplSuccessful;
-
- // check state
- switch (AsySdoConState_p) {
- case kAsySdoConStateConnected:
- {
- EPL_DBGLVL_SDO_TRACE0("Connection established\n");
- SdoComConEvent = kEplSdoComConEventConEstablished;
- // start transmission if needed
- break;
- }
-
- case kAsySdoConStateInitError:
- {
- EPL_DBGLVL_SDO_TRACE0("Error during initialisation\n");
- SdoComConEvent = kEplSdoComConEventInitError;
- // inform app about error and close sequence layer handle
- break;
- }
-
- case kAsySdoConStateConClosed:
- {
- EPL_DBGLVL_SDO_TRACE0("Connection closed\n");
- SdoComConEvent = kEplSdoComConEventConClosed;
- // close sequence layer handle
- break;
- }
-
- case kAsySdoConStateAckReceived:
- {
- EPL_DBGLVL_SDO_TRACE0("Acknowlage received\n");
- SdoComConEvent = kEplSdoComConEventAckReceived;
- // continue transmission
- break;
- }
-
- case kAsySdoConStateFrameSended:
- {
- EPL_DBGLVL_SDO_TRACE0("One Frame sent\n");
- SdoComConEvent = kEplSdoComConEventFrameSended;
- // to continue transmission
- break;
-
- }
-
- case kAsySdoConStateTimeout:
- {
- EPL_DBGLVL_SDO_TRACE0("Timeout\n");
- SdoComConEvent = kEplSdoComConEventTimeout;
- // close sequence layer handle
- break;
-
- }
- } // end of switch(AsySdoConState_p)
-
- Ret = EplSdoComSearchConIntern(SdoSeqConHdl_p,
- SdoComConEvent, (tEplAsySdoCom *) NULL);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComSearchConIntern
-//
-// Description: search a Sdo Sequence Layer connection handle in the
-// control structure of the Command Layer
-//
-// Parameters: SdoSeqConHdl_p = Handle to search
-// SdoComConEvent_p = event to process
-// pAsySdoCom_p = pointer to received frame
-//
-// Returns: tEplKernel
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoComSearchConIntern(tEplSdoSeqConHdl SdoSeqConHdl_p,
- tEplSdoComConEvent SdoComConEvent_p,
- tEplAsySdoCom * pAsySdoCom_p)
-{
- tEplKernel Ret;
- tEplSdoComCon *pSdoComCon;
- tEplSdoComConHdl HdlCount;
- tEplSdoComConHdl HdlFree;
-
- Ret = kEplSdoComNotResponsible;
-
- // get pointer to first element of the array
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[0];
- HdlCount = 0;
- HdlFree = 0xFFFF;
- while (HdlCount < EPL_MAX_SDO_COM_CON) {
- if (pSdoComCon->m_SdoSeqConHdl == SdoSeqConHdl_p) { // matching command layer handle found
- Ret = EplSdoComProcessIntern(HdlCount,
- SdoComConEvent_p,
- pAsySdoCom_p);
- } else if ((pSdoComCon->m_SdoSeqConHdl == 0)
- && (HdlFree == 0xFFFF)) {
- HdlFree = HdlCount;
- }
-
- pSdoComCon++;
- HdlCount++;
- }
-
- if (Ret == kEplSdoComNotResponsible) { // no responsible command layer handle found
- if (HdlFree == 0xFFFF) { // no free handle
- // delete connection immediately
- // 2008/04/14 m.u./d.k. This connection actually does not exist.
- // pSdoComCon is invalid.
- // Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl);
- Ret = kEplSdoComNoFreeHandle;
- } else { // create new handle
- HdlCount = HdlFree;
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[HdlCount];
- pSdoComCon->m_SdoSeqConHdl = SdoSeqConHdl_p;
- Ret = EplSdoComProcessIntern(HdlCount,
- SdoComConEvent_p,
- pAsySdoCom_p);
- }
- }
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComProcessIntern
-//
-// Description: search a Sdo Sequence Layer connection handle in the
-// control structer of the Command Layer
-//
-//
-//
-// Parameters: SdoComCon_p = index of control structure of connection
-// SdoComConEvent_p = event to process
-// pAsySdoCom_p = pointer to received frame
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoComProcessIntern(tEplSdoComConHdl SdoComCon_p,
- tEplSdoComConEvent SdoComConEvent_p,
- tEplAsySdoCom * pAsySdoCom_p)
-{
- tEplKernel Ret;
- tEplSdoComCon *pSdoComCon;
- u8 bFlag;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
- u32 dwAbortCode;
- unsigned int uiSize;
-#endif
-
-#if defined(WIN32) || defined(_WIN32)
- // enter critical section for process function
- EnterCriticalSection(SdoComInstance_g.m_pCriticalSection);
- EPL_DBGLVL_SDO_TRACE0
- ("\n\tEnterCiticalSection EplSdoComProcessIntern\n\n");
-#endif
-
- Ret = kEplSuccessful;
-
- // get pointer to control structure
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComCon_p];
-
- // process state maschine
- switch (pSdoComCon->m_SdoComState) {
- // idle state
- case kEplSdoComStateIdle:
- {
- // check events
- switch (SdoComConEvent_p) {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- // init con for client
- case kEplSdoComConEventInitCon:
- {
-
- // call of the init function already
- // processed in EplSdoComDefineCon()
- // only change state to kEplSdoComStateClientWaitInit
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientWaitInit;
- break;
- }
-#endif
-
- // int con for server
- case kEplSdoComConEventRec:
- {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
- // check if init of an transfer and no SDO abort
- if ((pAsySdoCom_p->m_le_bFlags & 0x80) == 0) { // SDO request
- if ((pAsySdoCom_p->m_le_bFlags & 0x40) == 0) { // no SDO abort
- // save tansaction id
- pSdoComCon->
- m_bTransactionId =
- AmiGetByteFromLe
- (&pAsySdoCom_p->
- m_le_bTransactionId);
- // check command
- switch (pAsySdoCom_p->
- m_le_bCommandId)
- {
- case kEplSdoServiceNIL:
- { // simply acknowlegde NIL command on sequence layer
-
- Ret =
- EplSdoAsySeqSendData
- (pSdoComCon->
- m_SdoSeqConHdl,
- 0,
- (tEplFrame
- *)
- NULL);
-
- break;
- }
-
- case kEplSdoServiceReadByIndex:
- { // read by index
-
- // search entry an start transfer
- EplSdoComServerInitReadByIndex
- (pSdoComCon,
- pAsySdoCom_p);
- // check next state
- if (pSdoComCon->m_uiTransSize == 0) { // ready -> stay idle
- pSdoComCon->
- m_SdoComState
- =
- kEplSdoComStateIdle;
- // reset abort code
- pSdoComCon->
- m_dwLastAbortCode
- =
- 0;
- } else { // segmented transfer
- pSdoComCon->
- m_SdoComState
- =
- kEplSdoComStateServerSegmTrans;
- }
-
- break;
- }
-
- case kEplSdoServiceWriteByIndex:
- {
-
- // search entry an start write
- EplSdoComServerInitWriteByIndex
- (pSdoComCon,
- pAsySdoCom_p);
- // check next state
- if (pSdoComCon->m_uiTransSize == 0) { // already -> stay idle
- pSdoComCon->
- m_SdoComState
- =
- kEplSdoComStateIdle;
- // reset abort code
- pSdoComCon->
- m_dwLastAbortCode
- =
- 0;
- } else { // segmented transfer
- pSdoComCon->
- m_SdoComState
- =
- kEplSdoComStateServerSegmTrans;
- }
-
- break;
- }
-
- default:
- {
- // unsupported command
- // -> abort senden
- dwAbortCode
- =
- EPL_SDOAC_UNKNOWN_COMMAND_SPECIFIER;
- // send abort
- pSdoComCon->
- m_pData
- =
- (u8
- *)
- &
- dwAbortCode;
- Ret =
- EplSdoComServerSendFrameIntern
- (pSdoComCon,
- 0,
- 0,
- kEplSdoComSendTypeAbort);
-
- }
-
- } // end of switch(pAsySdoCom_p->m_le_bCommandId)
- }
- } else { // this command layer handle is not responsible
- // (wrong direction or wrong transaction ID)
- Ret = kEplSdoComNotResponsible;
- goto Exit;
- }
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
-
- break;
- }
-
- // connection closed
- case kEplSdoComConEventInitError:
- case kEplSdoComConEventTimeout:
- case kEplSdoComConEventConClosed:
- {
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- // clean control structure
- EPL_MEMSET(pSdoComCon, 0x00,
- sizeof(tEplSdoComCon));
- break;
- }
-
- default:
- // d.k. do nothing
- break;
- } // end of switch(SdoComConEvent_p)
- break;
- }
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
- //-------------------------------------------------------------------------
- // SDO Server part
- // segmented transfer
- case kEplSdoComStateServerSegmTrans:
- {
- // check events
- switch (SdoComConEvent_p) {
- // send next frame
- case kEplSdoComConEventAckReceived:
- case kEplSdoComConEventFrameSended:
- {
- // check if it is a read
- if (pSdoComCon->m_SdoServiceType ==
- kEplSdoServiceReadByIndex) {
- // send next frame
- EplSdoComServerSendFrameIntern
- (pSdoComCon, 0, 0,
- kEplSdoComSendTypeRes);
- // if all send -> back to idle
- if (pSdoComCon->m_uiTransSize == 0) { // back to idle
- pSdoComCon->
- m_SdoComState =
- kEplSdoComStateIdle;
- // reset abort code
- pSdoComCon->
- m_dwLastAbortCode =
- 0;
- }
-
- }
- break;
- }
-
- // process next frame
- case kEplSdoComConEventRec:
- {
- // check if the frame is a SDO response and has the right transaction ID
- bFlag =
- AmiGetByteFromLe(&pAsySdoCom_p->
- m_le_bFlags);
- if (((bFlag & 0x80) != 0)
- &&
- (AmiGetByteFromLe
- (&pAsySdoCom_p->
- m_le_bTransactionId) ==
- pSdoComCon->m_bTransactionId)) {
- // check if it is a abort
- if ((bFlag & 0x40) != 0) { // SDO abort
- // clear control structure
- pSdoComCon->
- m_uiTransSize = 0;
- pSdoComCon->
- m_uiTransferredByte
- = 0;
- // change state
- pSdoComCon->
- m_SdoComState =
- kEplSdoComStateIdle;
- // reset abort code
- pSdoComCon->
- m_dwLastAbortCode =
- 0;
- // d.k.: do not execute anything further on this command
- break;
- }
- // check if it is a write
- if (pSdoComCon->
- m_SdoServiceType ==
- kEplSdoServiceWriteByIndex)
- {
- // write data to OD
- uiSize =
- AmiGetWordFromLe
- (&pAsySdoCom_p->
- m_le_wSegmentSize);
- if (pSdoComCon->
- m_dwLastAbortCode ==
- 0) {
- EPL_MEMCPY
- (pSdoComCon->
- m_pData,
- &pAsySdoCom_p->
- m_le_abCommandData
- [0],
- uiSize);
- }
- // update counter
- pSdoComCon->
- m_uiTransferredByte
- += uiSize;
- pSdoComCon->
- m_uiTransSize -=
- uiSize;
-
- // update pointer
- if (pSdoComCon->
- m_dwLastAbortCode ==
- 0) {
- ( /*(u8*) */
- pSdoComCon->
- m_pData) +=
- uiSize;
- }
- // check end of transfer
- if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x30) { // transfer ready
- pSdoComCon->
- m_uiTransSize
- = 0;
-
- if (pSdoComCon->
- m_dwLastAbortCode
- == 0) {
- // send response
- // send next frame
- EplSdoComServerSendFrameIntern
- (pSdoComCon,
- 0,
- 0,
- kEplSdoComSendTypeRes);
- // if all send -> back to idle
- if (pSdoComCon->m_uiTransSize == 0) { // back to idle
- pSdoComCon->
- m_SdoComState
- =
- kEplSdoComStateIdle;
- // reset abort code
- pSdoComCon->
- m_dwLastAbortCode
- =
- 0;
- }
- } else { // send dabort code
- // send abort
- pSdoComCon->
- m_pData
- =
- (u8
- *)
- &
- pSdoComCon->
- m_dwLastAbortCode;
- Ret =
- EplSdoComServerSendFrameIntern
- (pSdoComCon,
- 0,
- 0,
- kEplSdoComSendTypeAbort);
-
- // reset abort code
- pSdoComCon->
- m_dwLastAbortCode
- = 0;
-
- }
- } else {
- // send acknowledge without any Command layer data
- Ret =
- EplSdoAsySeqSendData
- (pSdoComCon->
- m_SdoSeqConHdl,
- 0,
- (tEplFrame
- *) NULL);
- }
- }
- } else { // this command layer handle is not responsible
- // (wrong direction or wrong transaction ID)
- Ret = kEplSdoComNotResponsible;
- goto Exit;
- }
- break;
- }
-
- // connection closed
- case kEplSdoComConEventInitError:
- case kEplSdoComConEventTimeout:
- case kEplSdoComConEventConClosed:
- {
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- // clean control structure
- EPL_MEMSET(pSdoComCon, 0x00,
- sizeof(tEplSdoComCon));
- break;
- }
-
- default:
- // d.k. do nothing
- break;
- } // end of switch(SdoComConEvent_p)
-
- break;
- }
-#endif // endif of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- //-------------------------------------------------------------------------
- // SDO Client part
- // wait for finish of establishing connection
- case kEplSdoComStateClientWaitInit:
- {
-
- // if connection handle is invalid reinit connection
- // d.k.: this will be done only on new events (i.e. InitTransfer)
- if ((pSdoComCon->
- m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) ==
- EPL_SDO_SEQ_INVALID_HDL) {
- // check kind of connection to reinit
- // check protocol
- switch (pSdoComCon->m_SdoProtType) {
- // udp
- case kEplSdoTypeUdp:
- {
- // call connection int function of lower layer
- Ret =
- EplSdoAsySeqInitCon
- (&pSdoComCon->
- m_SdoSeqConHdl,
- pSdoComCon->m_uiNodeId,
- kEplSdoTypeUdp);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- break;
- }
-
- // Asend -> not supported
- case kEplSdoTypeAsnd:
- {
- // call connection int function of lower layer
- Ret =
- EplSdoAsySeqInitCon
- (&pSdoComCon->
- m_SdoSeqConHdl,
- pSdoComCon->m_uiNodeId,
- kEplSdoTypeAsnd);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- break;
- }
-
- // Pdo -> not supported
- case kEplSdoTypePdo:
- default:
- {
- Ret = kEplSdoComUnsupportedProt;
- goto Exit;
- }
- } // end of switch(m_ProtType_p)
- // d.k.: reset transaction ID, because new sequence layer connection was initialized
- // $$$ d.k. is this really necessary?
- //pSdoComCon->m_bTransactionId = 0;
- }
- // check events
- switch (SdoComConEvent_p) {
- // connection established
- case kEplSdoComConEventConEstablished:
- {
- //send first frame if needed
- if ((pSdoComCon->m_uiTransSize > 0)
- && (pSdoComCon->m_uiTargetIndex != 0)) { // start SDO transfer
- Ret =
- EplSdoComClientSend
- (pSdoComCon);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // check if segemted transfer
- if (pSdoComCon->
- m_SdoTransType ==
- kEplSdoTransSegmented) {
- pSdoComCon->
- m_SdoComState =
- kEplSdoComStateClientSegmTrans;
- goto Exit;
- }
- }
- // goto state kEplSdoComStateClientConnected
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientConnected;
- goto Exit;
- }
-
- case kEplSdoComConEventSendFirst:
- {
- // infos for transfer already saved by function EplSdoComInitTransferByIndex
- break;
- }
-
- case kEplSdoComConEventConClosed:
- case kEplSdoComConEventInitError:
- case kEplSdoComConEventTimeout:
- {
- // close sequence layer handle
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- pSdoComCon->m_SdoSeqConHdl |=
- EPL_SDO_SEQ_INVALID_HDL;
- // call callback function
- if (SdoComConEvent_p ==
- kEplSdoComConEventTimeout) {
- pSdoComCon->m_dwLastAbortCode =
- EPL_SDOAC_TIME_OUT;
- } else {
- pSdoComCon->m_dwLastAbortCode =
- 0;
- }
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferLowerLayerAbort);
- // d.k.: do not clean control structure
- break;
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(SdoComConEvent_p)
- break;
- }
-
- // connected
- case kEplSdoComStateClientConnected:
- {
- // check events
- switch (SdoComConEvent_p) {
- // send a frame
- case kEplSdoComConEventSendFirst:
- case kEplSdoComConEventAckReceived:
- case kEplSdoComConEventFrameSended:
- {
- Ret = EplSdoComClientSend(pSdoComCon);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // check if read transfer finished
- if ((pSdoComCon->m_uiTransSize == 0)
- && (pSdoComCon->
- m_uiTransferredByte != 0)
- && (pSdoComCon->m_SdoServiceType ==
- kEplSdoServiceReadByIndex)) {
- // inc transaction id
- pSdoComCon->m_bTransactionId++;
- // call callback of application
- pSdoComCon->m_dwLastAbortCode =
- 0;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferFinished);
-
- goto Exit;
- }
- // check if segemted transfer
- if (pSdoComCon->m_SdoTransType ==
- kEplSdoTransSegmented) {
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientSegmTrans;
- goto Exit;
- }
- break;
- }
-
- // frame received
- case kEplSdoComConEventRec:
- {
- // check if the frame is a SDO response and has the right transaction ID
- bFlag =
- AmiGetByteFromLe(&pAsySdoCom_p->
- m_le_bFlags);
- if (((bFlag & 0x80) != 0)
- &&
- (AmiGetByteFromLe
- (&pAsySdoCom_p->
- m_le_bTransactionId) ==
- pSdoComCon->m_bTransactionId)) {
- // check if abort or not
- if ((bFlag & 0x40) != 0) {
- // send acknowledge without any Command layer data
- Ret =
- EplSdoAsySeqSendData
- (pSdoComCon->
- m_SdoSeqConHdl, 0,
- (tEplFrame *)
- NULL);
- // inc transaction id
- pSdoComCon->
- m_bTransactionId++;
- // save abort code
- pSdoComCon->
- m_dwLastAbortCode =
- AmiGetDwordFromLe
- (&pAsySdoCom_p->
- m_le_abCommandData
- [0]);
- // call callback of application
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p,
- pSdoComCon,
- kEplSdoComTransferRxAborted);
-
- goto Exit;
- } else { // normal frame received
- // check frame
- Ret =
- EplSdoComClientProcessFrame
- (SdoComCon_p,
- pAsySdoCom_p);
-
- // check if transfer ready
- if (pSdoComCon->
- m_uiTransSize ==
- 0) {
- // send acknowledge without any Command layer data
- Ret =
- EplSdoAsySeqSendData
- (pSdoComCon->
- m_SdoSeqConHdl,
- 0,
- (tEplFrame
- *) NULL);
- // inc transaction id
- pSdoComCon->
- m_bTransactionId++;
- // call callback of application
- pSdoComCon->
- m_dwLastAbortCode
- = 0;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p,
- pSdoComCon,
- kEplSdoComTransferFinished);
-
- goto Exit;
- }
-
- }
- } else { // this command layer handle is not responsible
- // (wrong direction or wrong transaction ID)
- Ret = kEplSdoComNotResponsible;
- goto Exit;
- }
- break;
- }
-
- // connection closed event go back to kEplSdoComStateClientWaitInit
- case kEplSdoComConEventConClosed:
- { // connection closed by communication partner
- // close sequence layer handle
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- // set handle to invalid and enter kEplSdoComStateClientWaitInit
- pSdoComCon->m_SdoSeqConHdl |=
- EPL_SDO_SEQ_INVALID_HDL;
- // change state
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientWaitInit;
-
- // call callback of application
- pSdoComCon->m_dwLastAbortCode = 0;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferLowerLayerAbort);
-
- goto Exit;
-
- break;
- }
-
- // abort to send from higher layer
- case kEplSdoComConEventAbort:
- {
- EplSdoComClientSendAbort(pSdoComCon,
- *((u32 *)
- pSdoComCon->
- m_pData));
-
- // inc transaction id
- pSdoComCon->m_bTransactionId++;
- // call callback of application
- pSdoComCon->m_dwLastAbortCode =
- *((u32 *) pSdoComCon->m_pData);
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferTxAborted);
-
- break;
- }
-
- case kEplSdoComConEventInitError:
- case kEplSdoComConEventTimeout:
- {
- // close sequence layer handle
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- pSdoComCon->m_SdoSeqConHdl |=
- EPL_SDO_SEQ_INVALID_HDL;
- // change state
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientWaitInit;
- // call callback of application
- pSdoComCon->m_dwLastAbortCode =
- EPL_SDOAC_TIME_OUT;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferLowerLayerAbort);
-
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(SdoComConEvent_p)
-
- break;
- }
-
- // process segmented transfer
- case kEplSdoComStateClientSegmTrans:
- {
- // check events
- switch (SdoComConEvent_p) {
- // sned a frame
- case kEplSdoComConEventSendFirst:
- case kEplSdoComConEventAckReceived:
- case kEplSdoComConEventFrameSended:
- {
- Ret = EplSdoComClientSend(pSdoComCon);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
- // check if read transfer finished
- if ((pSdoComCon->m_uiTransSize == 0)
- && (pSdoComCon->m_SdoServiceType ==
- kEplSdoServiceReadByIndex)) {
- // inc transaction id
- pSdoComCon->m_bTransactionId++;
- // change state
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientConnected;
- // call callback of application
- pSdoComCon->m_dwLastAbortCode =
- 0;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferFinished);
-
- goto Exit;
- }
-
- break;
- }
-
- // frame received
- case kEplSdoComConEventRec:
- {
- // check if the frame is a response
- bFlag =
- AmiGetByteFromLe(&pAsySdoCom_p->
- m_le_bFlags);
- if (((bFlag & 0x80) != 0)
- &&
- (AmiGetByteFromLe
- (&pAsySdoCom_p->
- m_le_bTransactionId) ==
- pSdoComCon->m_bTransactionId)) {
- // check if abort or not
- if ((bFlag & 0x40) != 0) {
- // send acknowledge without any Command layer data
- Ret =
- EplSdoAsySeqSendData
- (pSdoComCon->
- m_SdoSeqConHdl, 0,
- (tEplFrame *)
- NULL);
- // inc transaction id
- pSdoComCon->
- m_bTransactionId++;
- // change state
- pSdoComCon->
- m_SdoComState =
- kEplSdoComStateClientConnected;
- // save abort code
- pSdoComCon->
- m_dwLastAbortCode =
- AmiGetDwordFromLe
- (&pAsySdoCom_p->
- m_le_abCommandData
- [0]);
- // call callback of application
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p,
- pSdoComCon,
- kEplSdoComTransferRxAborted);
-
- goto Exit;
- } else { // normal frame received
- // check frame
- Ret =
- EplSdoComClientProcessFrame
- (SdoComCon_p,
- pAsySdoCom_p);
-
- // check if transfer ready
- if (pSdoComCon->
- m_uiTransSize ==
- 0) {
- // send acknowledge without any Command layer data
- Ret =
- EplSdoAsySeqSendData
- (pSdoComCon->
- m_SdoSeqConHdl,
- 0,
- (tEplFrame
- *) NULL);
- // inc transaction id
- pSdoComCon->
- m_bTransactionId++;
- // change state
- pSdoComCon->
- m_SdoComState
- =
- kEplSdoComStateClientConnected;
- // call callback of application
- pSdoComCon->
- m_dwLastAbortCode
- = 0;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p,
- pSdoComCon,
- kEplSdoComTransferFinished);
-
- }
-
- }
- }
- break;
- }
-
- // connection closed event go back to kEplSdoComStateClientWaitInit
- case kEplSdoComConEventConClosed:
- { // connection closed by communication partner
- // close sequence layer handle
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- // set handle to invalid and enter kEplSdoComStateClientWaitInit
- pSdoComCon->m_SdoSeqConHdl |=
- EPL_SDO_SEQ_INVALID_HDL;
- // change state
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientWaitInit;
- // inc transaction id
- pSdoComCon->m_bTransactionId++;
- // call callback of application
- pSdoComCon->m_dwLastAbortCode = 0;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferFinished);
-
- break;
- }
-
- // abort to send from higher layer
- case kEplSdoComConEventAbort:
- {
- EplSdoComClientSendAbort(pSdoComCon,
- *((u32 *)
- pSdoComCon->
- m_pData));
-
- // inc transaction id
- pSdoComCon->m_bTransactionId++;
- // change state
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientConnected;
- // call callback of application
- pSdoComCon->m_dwLastAbortCode =
- *((u32 *) pSdoComCon->m_pData);
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferTxAborted);
-
- break;
- }
-
- case kEplSdoComConEventInitError:
- case kEplSdoComConEventTimeout:
- {
- // close sequence layer handle
- Ret =
- EplSdoAsySeqDelCon(pSdoComCon->
- m_SdoSeqConHdl);
- pSdoComCon->m_SdoSeqConHdl |=
- EPL_SDO_SEQ_INVALID_HDL;
- // change state
- pSdoComCon->m_SdoComState =
- kEplSdoComStateClientWaitInit;
- // call callback of application
- pSdoComCon->m_dwLastAbortCode =
- EPL_SDOAC_TIME_OUT;
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p, pSdoComCon,
- kEplSdoComTransferLowerLayerAbort);
-
- }
-
- default:
- // d.k. do nothing
- break;
-
- } // end of switch(SdoComConEvent_p)
-
- break;
- }
-#endif // endo of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-
- } // end of switch(pSdoComCon->m_SdoComState)
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
- Exit:
-#endif
-
-#if defined(WIN32) || defined(_WIN32)
- // leave critical section for process function
- EPL_DBGLVL_SDO_TRACE0
- ("\n\tLeaveCriticalSection EplSdoComProcessIntern\n\n");
- LeaveCriticalSection(SdoComInstance_g.m_pCriticalSection);
-
-#endif
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComServerInitReadByIndex
-//
-// Description: function start the processing of an read by index command
-//
-//
-//
-// Parameters: pSdoComCon_p = pointer to control structure of connection
-// pAsySdoCom_p = pointer to received frame
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
-static tEplKernel EplSdoComServerInitReadByIndex(tEplSdoComCon * pSdoComCon_p,
- tEplAsySdoCom * pAsySdoCom_p)
-{
- tEplKernel Ret;
- unsigned int uiIndex;
- unsigned int uiSubindex;
- tEplObdSize EntrySize;
- tEplObdAccess AccessType;
- u32 dwAbortCode;
-
- dwAbortCode = 0;
-
- // a init of a read could not be a segmented transfer
- // -> no variable part of header
-
- // get index and subindex
- uiIndex = AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]);
- uiSubindex = AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[2]);
-
- // check accesstype of entry
- // existens of entry
-//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- Ret = EplObduGetAccessType(uiIndex, uiSubindex, &AccessType);
-/*#else
- Ret = kEplObdSubindexNotExist;
- AccessType = 0;
-#endif*/
- if (Ret == kEplObdSubindexNotExist) { // subentry doesn't exist
- dwAbortCode = EPL_SDOAC_SUB_INDEX_NOT_EXIST;
- // send abort
- pSdoComCon_p->m_pData = (u8 *) & dwAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort);
- goto Exit;
- } else if (Ret != kEplSuccessful) { // entry doesn't exist
- dwAbortCode = EPL_SDOAC_OBJECT_NOT_EXIST;
- // send abort
- pSdoComCon_p->m_pData = (u8 *) & dwAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort);
- goto Exit;
- }
- // compare accesstype must be read or const
- if (((AccessType & kEplObdAccRead) == 0)
- && ((AccessType & kEplObdAccConst) == 0)) {
-
- if ((AccessType & kEplObdAccWrite) != 0) {
- // entry read a write only object
- dwAbortCode = EPL_SDOAC_READ_TO_WRITE_ONLY_OBJ;
- } else {
- dwAbortCode = EPL_SDOAC_UNSUPPORTED_ACCESS;
- }
- // send abort
- pSdoComCon_p->m_pData = (u8 *) & dwAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort);
- goto Exit;
- }
- // save service
- pSdoComCon_p->m_SdoServiceType = kEplSdoServiceReadByIndex;
-
- // get size of object to see iof segmented or expedited transfer
-//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- EntrySize = EplObduGetDataSize(uiIndex, uiSubindex);
-/*#else
- EntrySize = 0;
-#endif*/
- if (EntrySize > EPL_SDO_MAX_PAYLOAD) { // segmented transfer
- pSdoComCon_p->m_SdoTransType = kEplSdoTransSegmented;
- // get pointer to object-entry data
-//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- pSdoComCon_p->m_pData =
- EplObduGetObjectDataPtr(uiIndex, uiSubindex);
-//#endif
- } else { // expedited transfer
- pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited;
- }
-
- pSdoComCon_p->m_uiTransSize = EntrySize;
- pSdoComCon_p->m_uiTransferredByte = 0;
-
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex, kEplSdoComSendTypeRes);
- if (Ret != kEplSuccessful) {
- // error -> abort
- dwAbortCode = EPL_SDOAC_GENERAL_ERROR;
- // send abort
- pSdoComCon_p->m_pData = (u8 *) & dwAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort);
- goto Exit;
- }
-
- Exit:
- return Ret;
-}
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComServerSendFrameIntern();
-//
-// Description: function creats and send a frame for server
-//
-//
-//
-// Parameters: pSdoComCon_p = pointer to control structure of connection
-// uiIndex_p = index to send if expedited transfer else 0
-// uiSubIndex_p = subindex to send if expedited transfer else 0
-// SendType_p = to of frame to send
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
-static tEplKernel EplSdoComServerSendFrameIntern(tEplSdoComCon * pSdoComCon_p,
- unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplSdoComSendType SendType_p)
-{
- tEplKernel Ret;
- u8 abFrame[EPL_MAX_SDO_FRAME_SIZE];
- tEplFrame *pFrame;
- tEplAsySdoCom *pCommandFrame;
- unsigned int uiSizeOfFrame;
- u8 bFlag;
-
- Ret = kEplSuccessful;
-
- pFrame = (tEplFrame *) & abFrame[0];
-
- EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame));
-
- // build generic part of frame
- // get pointer to command layerpart of frame
- pCommandFrame =
- &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.
- m_le_abSdoSeqPayload;
- AmiSetByteToLe(&pCommandFrame->m_le_bCommandId,
- pSdoComCon_p->m_SdoServiceType);
- AmiSetByteToLe(&pCommandFrame->m_le_bTransactionId,
- pSdoComCon_p->m_bTransactionId);
-
- // set size to header size
- uiSizeOfFrame = 8;
-
- // check SendType
- switch (SendType_p) {
- // requestframe to send
- case kEplSdoComSendTypeReq:
- {
- // nothing to do for server
- //-> error
- Ret = kEplSdoComInvalidSendType;
- break;
- }
-
- // response without data to send
- case kEplSdoComSendTypeAckRes:
- {
- // set response flag
- AmiSetByteToLe(&pCommandFrame->m_le_bFlags, 0x80);
-
- // send frame
- Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl,
- uiSizeOfFrame, pFrame);
-
- break;
- }
-
- // responsframe to send
- case kEplSdoComSendTypeRes:
- {
- // set response flag
- bFlag = AmiGetByteFromLe(&pCommandFrame->m_le_bFlags);
- bFlag |= 0x80;
- AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag);
-
- // check type of resonse
- if (pSdoComCon_p->m_SdoTransType == kEplSdoTransExpedited) { // Expedited transfer
- // copy data in frame
-//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- Ret = EplObduReadEntryToLe(uiIndex_p,
- uiSubIndex_p,
- &pCommandFrame->
- m_le_abCommandData
- [0],
- (tEplObdSize *) &
- pSdoComCon_p->
- m_uiTransSize);
- if (Ret != kEplSuccessful) {
- goto Exit;
- }
-//#endif
-
- // set size of frame
- AmiSetWordToLe(&pCommandFrame->
- m_le_wSegmentSize,
- (u16) pSdoComCon_p->
- m_uiTransSize);
-
- // correct byte-counter
- uiSizeOfFrame += pSdoComCon_p->m_uiTransSize;
- pSdoComCon_p->m_uiTransferredByte +=
- pSdoComCon_p->m_uiTransSize;
- pSdoComCon_p->m_uiTransSize = 0;
-
- // send frame
- uiSizeOfFrame += pSdoComCon_p->m_uiTransSize;
- Ret =
- EplSdoAsySeqSendData(pSdoComCon_p->
- m_SdoSeqConHdl,
- uiSizeOfFrame, pFrame);
- } else if (pSdoComCon_p->m_SdoTransType == kEplSdoTransSegmented) { // segmented transfer
- // distinguish between init, segment and complete
- if (pSdoComCon_p->m_uiTransferredByte == 0) { // init
- // set init flag
- bFlag =
- AmiGetByteFromLe(&pCommandFrame->
- m_le_bFlags);
- bFlag |= 0x10;
- AmiSetByteToLe(&pCommandFrame->
- m_le_bFlags, bFlag);
- // init variable header
- AmiSetDwordToLe(&pCommandFrame->
- m_le_abCommandData[0],
- pSdoComCon_p->
- m_uiTransSize);
- // copy data in frame
- EPL_MEMCPY(&pCommandFrame->
- m_le_abCommandData[4],
- pSdoComCon_p->m_pData,
- (EPL_SDO_MAX_PAYLOAD - 4));
-
- // correct byte-counter
- pSdoComCon_p->m_uiTransSize -=
- (EPL_SDO_MAX_PAYLOAD - 4);
- pSdoComCon_p->m_uiTransferredByte +=
- (EPL_SDO_MAX_PAYLOAD - 4);
- // move data pointer
- pSdoComCon_p->m_pData +=
- (EPL_SDO_MAX_PAYLOAD - 4);
-
- // set segment size
- AmiSetWordToLe(&pCommandFrame->
- m_le_wSegmentSize,
- (EPL_SDO_MAX_PAYLOAD -
- 4));
-
- // send frame
- uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD;
- Ret =
- EplSdoAsySeqSendData(pSdoComCon_p->
- m_SdoSeqConHdl,
- uiSizeOfFrame,
- pFrame);
-
- } else
- if ((pSdoComCon_p->m_uiTransferredByte > 0)
- && (pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD)) { // segment
- // set segment flag
- bFlag =
- AmiGetByteFromLe(&pCommandFrame->
- m_le_bFlags);
- bFlag |= 0x20;
- AmiSetByteToLe(&pCommandFrame->
- m_le_bFlags, bFlag);
-
- // copy data in frame
- EPL_MEMCPY(&pCommandFrame->
- m_le_abCommandData[0],
- pSdoComCon_p->m_pData,
- EPL_SDO_MAX_PAYLOAD);
-
- // correct byte-counter
- pSdoComCon_p->m_uiTransSize -=
- EPL_SDO_MAX_PAYLOAD;
- pSdoComCon_p->m_uiTransferredByte +=
- EPL_SDO_MAX_PAYLOAD;
- // move data pointer
- pSdoComCon_p->m_pData +=
- EPL_SDO_MAX_PAYLOAD;
-
- // set segment size
- AmiSetWordToLe(&pCommandFrame->
- m_le_wSegmentSize,
- EPL_SDO_MAX_PAYLOAD);
-
- // send frame
- uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD;
- Ret =
- EplSdoAsySeqSendData(pSdoComCon_p->
- m_SdoSeqConHdl,
- uiSizeOfFrame,
- pFrame);
- } else {
- if ((pSdoComCon_p->m_uiTransSize == 0)
- && (pSdoComCon_p->
- m_SdoServiceType !=
- kEplSdoServiceWriteByIndex)) {
- goto Exit;
- }
- // complete
- // set segment complete flag
- bFlag =
- AmiGetByteFromLe(&pCommandFrame->
- m_le_bFlags);
- bFlag |= 0x30;
- AmiSetByteToLe(&pCommandFrame->
- m_le_bFlags, bFlag);
-
- // copy data in frame
- EPL_MEMCPY(&pCommandFrame->
- m_le_abCommandData[0],
- pSdoComCon_p->m_pData,
- pSdoComCon_p->m_uiTransSize);
-
- // correct byte-counter
- pSdoComCon_p->m_uiTransferredByte +=
- pSdoComCon_p->m_uiTransSize;
-
- // move data pointer
- pSdoComCon_p->m_pData +=
- pSdoComCon_p->m_uiTransSize;
-
- // set segment size
- AmiSetWordToLe(&pCommandFrame->
- m_le_wSegmentSize,
- (u16) pSdoComCon_p->
- m_uiTransSize);
-
- // send frame
- uiSizeOfFrame +=
- pSdoComCon_p->m_uiTransSize;
- pSdoComCon_p->m_uiTransSize = 0;
- Ret =
- EplSdoAsySeqSendData(pSdoComCon_p->
- m_SdoSeqConHdl,
- uiSizeOfFrame,
- pFrame);
- }
-
- }
- break;
- }
- // abort to send
- case kEplSdoComSendTypeAbort:
- {
- // set response and abort flag
- bFlag = AmiGetByteFromLe(&pCommandFrame->m_le_bFlags);
- bFlag |= 0xC0;
- AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag);
-
- // copy abortcode to frame
- AmiSetDwordToLe(&pCommandFrame->m_le_abCommandData[0],
- *((u32 *) pSdoComCon_p->m_pData));
-
- // set size of segment
- AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize,
- sizeof(u32));
-
- // update counter
- pSdoComCon_p->m_uiTransferredByte = sizeof(u32);
- pSdoComCon_p->m_uiTransSize = 0;
-
- // calc framesize
- uiSizeOfFrame += sizeof(u32);
- Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl,
- uiSizeOfFrame, pFrame);
- break;
- }
- } // end of switch(SendType_p)
-
- Exit:
- return Ret;
-}
-#endif
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComServerInitWriteByIndex
-//
-// Description: function start the processing of an write by index command
-//
-//
-//
-// Parameters: pSdoComCon_p = pointer to control structure of connection
-// pAsySdoCom_p = pointer to received frame
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0)
-static tEplKernel EplSdoComServerInitWriteByIndex(tEplSdoComCon * pSdoComCon_p,
- tEplAsySdoCom * pAsySdoCom_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiIndex;
- unsigned int uiSubindex;
- unsigned int uiBytesToTransfer;
- tEplObdSize EntrySize;
- tEplObdAccess AccessType;
- u32 dwAbortCode;
- u8 *pbSrcData;
-
- dwAbortCode = 0;
-
- // a init of a write
- // -> variable part of header possible
-
- // check if expedited or segmented transfer
- if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x10) { // initiate segmented transfer
- pSdoComCon_p->m_SdoTransType = kEplSdoTransSegmented;
- // get index and subindex
- uiIndex =
- AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[4]);
- uiSubindex =
- AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[6]);
- // get source-pointer for copy
- pbSrcData = &pAsySdoCom_p->m_le_abCommandData[8];
- // save size
- pSdoComCon_p->m_uiTransSize =
- AmiGetDwordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]);
-
- } else if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x00) { // expedited transfer
- pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited;
- // get index and subindex
- uiIndex =
- AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]);
- uiSubindex =
- AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[2]);
- // get source-pointer for copy
- pbSrcData = &pAsySdoCom_p->m_le_abCommandData[4];
- // save size
- pSdoComCon_p->m_uiTransSize =
- AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize);
- // subtract header
- pSdoComCon_p->m_uiTransSize -= 4;
-
- } else {
- // just ignore any other transfer type
- goto Exit;
- }
-
- // check accesstype of entry
- // existens of entry
-//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- Ret = EplObduGetAccessType(uiIndex, uiSubindex, &AccessType);
-/*#else
- Ret = kEplObdSubindexNotExist;
- AccessType = 0;
-#endif*/
- if (Ret == kEplObdSubindexNotExist) { // subentry doesn't exist
- pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_SUB_INDEX_NOT_EXIST;
- // send abort
- // d.k. This is wrong: k.t. not needed send abort on end of write
- /*pSdoComCon_p->m_pData = (u8*)pSdoComCon_p->m_dwLastAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort); */
- goto Abort;
- } else if (Ret != kEplSuccessful) { // entry doesn't exist
- pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_OBJECT_NOT_EXIST;
- // send abort
- // d.k. This is wrong: k.t. not needed send abort on end of write
- /*
- pSdoComCon_p->m_pData = (u8*)&dwAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort); */
- goto Abort;
- }
- // compare accesstype must be read
- if ((AccessType & kEplObdAccWrite) == 0) {
-
- if ((AccessType & kEplObdAccRead) != 0) {
- // entry write a read only object
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_WRITE_TO_READ_ONLY_OBJ;
- } else {
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_UNSUPPORTED_ACCESS;
- }
- // send abort
- // d.k. This is wrong: k.t. not needed send abort on end of write
- /*pSdoComCon_p->m_pData = (u8*)&dwAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort); */
- goto Abort;
- }
- // save service
- pSdoComCon_p->m_SdoServiceType = kEplSdoServiceWriteByIndex;
-
- pSdoComCon_p->m_uiTransferredByte = 0;
-
- // write data to OD
- if (pSdoComCon_p->m_SdoTransType == kEplSdoTransExpedited) { // expedited transfer
- // size checking is done by EplObduWriteEntryFromLe()
-
-//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- Ret = EplObduWriteEntryFromLe(uiIndex,
- uiSubindex,
- pbSrcData,
- pSdoComCon_p->m_uiTransSize);
- switch (Ret) {
- case kEplSuccessful:
- {
- break;
- }
-
- case kEplObdAccessViolation:
- {
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_UNSUPPORTED_ACCESS;
- // send abort
- goto Abort;
- }
-
- case kEplObdValueLengthError:
- {
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_DATA_TYPE_LENGTH_NOT_MATCH;
- // send abort
- goto Abort;
- }
-
- case kEplObdValueTooHigh:
- {
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_VALUE_RANGE_TOO_HIGH;
- // send abort
- goto Abort;
- }
-
- case kEplObdValueTooLow:
- {
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_VALUE_RANGE_TOO_LOW;
- // send abort
- goto Abort;
- }
-
- default:
- {
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_GENERAL_ERROR;
- // send abort
- goto Abort;
- }
- }
-//#endif
- // send command acknowledge
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- 0,
- 0,
- kEplSdoComSendTypeAckRes);
-
- pSdoComCon_p->m_uiTransSize = 0;
- goto Exit;
- } else {
- // get size of the object to check if it fits
- // because we directly write to the destination memory
- // d.k. no one calls the user OD callback function
-
- //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- EntrySize = EplObduGetDataSize(uiIndex, uiSubindex);
- /*#else
- EntrySize = 0;
- #endif */
- if (EntrySize < pSdoComCon_p->m_uiTransSize) { // parameter too big
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_DATA_TYPE_LENGTH_TOO_HIGH;
- // send abort
- // d.k. This is wrong: k.t. not needed send abort on end of write
- /*pSdoComCon_p->m_pData = (u8*)&dwAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort); */
- goto Abort;
- }
-
- uiBytesToTransfer =
- AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize);
- // eleminate header (Command header (8) + variable part (4) + Command header (4))
- uiBytesToTransfer -= 16;
- // get pointer to object entry
-//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
- pSdoComCon_p->m_pData = EplObduGetObjectDataPtr(uiIndex,
- uiSubindex);
-//#endif
- if (pSdoComCon_p->m_pData == NULL) {
- pSdoComCon_p->m_dwLastAbortCode =
- EPL_SDOAC_GENERAL_ERROR;
- // send abort
- // d.k. This is wrong: k.t. not needed send abort on end of write
-/* pSdoComCon_p->m_pData = (u8*)&pSdoComCon_p->m_dwLastAbortCode;
- Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p,
- uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort);*/
- goto Abort;
- }
- // copy data
- EPL_MEMCPY(pSdoComCon_p->m_pData, pbSrcData, uiBytesToTransfer);
-
- // update internal counter
- pSdoComCon_p->m_uiTransferredByte = uiBytesToTransfer;
- pSdoComCon_p->m_uiTransSize -= uiBytesToTransfer;
-
- // update target pointer
- ( /*(u8*) */ pSdoComCon_p->m_pData) += uiBytesToTransfer;
-
- // send acknowledge without any Command layer data
- Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl,
- 0, (tEplFrame *) NULL);
- goto Exit;
- }
-
- Abort:
- if (pSdoComCon_p->m_dwLastAbortCode != 0) {
- // send abort
- pSdoComCon_p->m_pData =
- (u8 *) & pSdoComCon_p->m_dwLastAbortCode;
- Ret =
- EplSdoComServerSendFrameIntern(pSdoComCon_p, uiIndex,
- uiSubindex,
- kEplSdoComSendTypeAbort);
-
- // reset abort code
- pSdoComCon_p->m_dwLastAbortCode = 0;
- pSdoComCon_p->m_uiTransSize = 0;
- goto Exit;
- }
-
- Exit:
- return Ret;
-}
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComClientSend
-//
-// Description: function starts an sdo transfer an send all further frames
-//
-//
-//
-// Parameters: pSdoComCon_p = pointer to control structure of connection
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-static tEplKernel EplSdoComClientSend(tEplSdoComCon * pSdoComCon_p)
-{
- tEplKernel Ret;
- u8 abFrame[EPL_MAX_SDO_FRAME_SIZE];
- tEplFrame *pFrame;
- tEplAsySdoCom *pCommandFrame;
- unsigned int uiSizeOfFrame;
- u8 bFlags;
- u8 *pbPayload;
-
- Ret = kEplSuccessful;
-
- pFrame = (tEplFrame *) & abFrame[0];
-
- EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame));
-
- // build generic part of frame
- // get pointer to command layerpart of frame
- pCommandFrame =
- &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.
- m_le_abSdoSeqPayload;
- AmiSetByteToLe(&pCommandFrame->m_le_bCommandId,
- pSdoComCon_p->m_SdoServiceType);
- AmiSetByteToLe(&pCommandFrame->m_le_bTransactionId,
- pSdoComCon_p->m_bTransactionId);
-
- // set size constant part of header
- uiSizeOfFrame = 8;
-
- // check if first frame to send -> command header needed
- if (pSdoComCon_p->m_uiTransSize > 0) {
- if (pSdoComCon_p->m_uiTransferredByte == 0) { // start SDO transfer
- // check if segmented or expedited transfer
- // only for write commands
- switch (pSdoComCon_p->m_SdoServiceType) {
- case kEplSdoServiceReadByIndex:
- { // first frame of read access always expedited
- pSdoComCon_p->m_SdoTransType =
- kEplSdoTransExpedited;
- pbPayload =
- &pCommandFrame->
- m_le_abCommandData[0];
- // fill rest of header
- AmiSetWordToLe(&pCommandFrame->
- m_le_wSegmentSize, 4);
-
- // create command header
- AmiSetWordToLe(pbPayload,
- (u16) pSdoComCon_p->
- m_uiTargetIndex);
- pbPayload += 2;
- AmiSetByteToLe(pbPayload,
- (u8) pSdoComCon_p->
- m_uiTargetSubIndex);
- // calc size
- uiSizeOfFrame += 4;
-
- // set pSdoComCon_p->m_uiTransferredByte to one
- pSdoComCon_p->m_uiTransferredByte = 1;
- break;
- }
-
- case kEplSdoServiceWriteByIndex:
- {
- if (pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD) { // segmented transfer
- // -> variable part of header needed
- // save that transfer is segmented
- pSdoComCon_p->m_SdoTransType =
- kEplSdoTransSegmented;
- // fill variable part of header
- AmiSetDwordToLe(&pCommandFrame->
- m_le_abCommandData
- [0],
- pSdoComCon_p->
- m_uiTransSize);
- // set pointer to real payload
- pbPayload =
- &pCommandFrame->
- m_le_abCommandData[4];
- // fill rest of header
- AmiSetWordToLe(&pCommandFrame->
- m_le_wSegmentSize,
- EPL_SDO_MAX_PAYLOAD);
- bFlags = 0x10;
- AmiSetByteToLe(&pCommandFrame->
- m_le_bFlags,
- bFlags);
- // create command header
- AmiSetWordToLe(pbPayload,
- (u16)
- pSdoComCon_p->
- m_uiTargetIndex);
- pbPayload += 2;
- AmiSetByteToLe(pbPayload,
- (u8)
- pSdoComCon_p->
- m_uiTargetSubIndex);
- // on byte for reserved
- pbPayload += 2;
- // calc size
- uiSizeOfFrame +=
- EPL_SDO_MAX_PAYLOAD;
-
- // copy payload
- EPL_MEMCPY(pbPayload,
- pSdoComCon_p->
- m_pData,
- (EPL_SDO_MAX_PAYLOAD
- - 8));
- pSdoComCon_p->m_pData +=
- (EPL_SDO_MAX_PAYLOAD - 8);
- // correct intern counter
- pSdoComCon_p->m_uiTransSize -=
- (EPL_SDO_MAX_PAYLOAD - 8);
- pSdoComCon_p->
- m_uiTransferredByte =
- (EPL_SDO_MAX_PAYLOAD - 8);
-
- } else { // expedited trandsfer
- // save that transfer is expedited
- pSdoComCon_p->m_SdoTransType =
- kEplSdoTransExpedited;
- pbPayload =
- &pCommandFrame->
- m_le_abCommandData[0];
-
- // create command header
- AmiSetWordToLe(pbPayload,
- (u16)
- pSdoComCon_p->
- m_uiTargetIndex);
- pbPayload += 2;
- AmiSetByteToLe(pbPayload,
- (u8)
- pSdoComCon_p->
- m_uiTargetSubIndex);
- // + 2 -> one byte for subindex and one byte reserved
- pbPayload += 2;
- // copy data
- EPL_MEMCPY(pbPayload,
- pSdoComCon_p->
- m_pData,
- pSdoComCon_p->
- m_uiTransSize);
- // calc size
- uiSizeOfFrame +=
- (4 +
- pSdoComCon_p->
- m_uiTransSize);
- // fill rest of header
- AmiSetWordToLe(&pCommandFrame->
- m_le_wSegmentSize,
- (u16) (4 +
- pSdoComCon_p->
- m_uiTransSize));
-
- pSdoComCon_p->
- m_uiTransferredByte =
- pSdoComCon_p->m_uiTransSize;
- pSdoComCon_p->m_uiTransSize = 0;
- }
- break;
- }
-
- case kEplSdoServiceNIL:
- default:
- // invalid service requested
- Ret = kEplSdoComInvalidServiceType;
- goto Exit;
- } // end of switch(pSdoComCon_p->m_SdoServiceType)
- } else // (pSdoComCon_p->m_uiTransferredByte > 0)
- { // continue SDO transfer
- switch (pSdoComCon_p->m_SdoServiceType) {
- // for expedited read is nothing to do
- // -> server sends data
-
- case kEplSdoServiceWriteByIndex:
- { // send next frame
- if (pSdoComCon_p->m_SdoTransType ==
- kEplSdoTransSegmented) {
- if (pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD) { // next segment
- pbPayload =
- &pCommandFrame->
- m_le_abCommandData
- [0];
- // fill rest of header
- AmiSetWordToLe
- (&pCommandFrame->
- m_le_wSegmentSize,
- EPL_SDO_MAX_PAYLOAD);
- bFlags = 0x20;
- AmiSetByteToLe
- (&pCommandFrame->
- m_le_bFlags,
- bFlags);
- // copy data
- EPL_MEMCPY(pbPayload,
- pSdoComCon_p->
- m_pData,
- EPL_SDO_MAX_PAYLOAD);
- pSdoComCon_p->m_pData +=
- EPL_SDO_MAX_PAYLOAD;
- // correct intern counter
- pSdoComCon_p->
- m_uiTransSize -=
- EPL_SDO_MAX_PAYLOAD;
- pSdoComCon_p->
- m_uiTransferredByte
- =
- EPL_SDO_MAX_PAYLOAD;
- // calc size
- uiSizeOfFrame +=
- EPL_SDO_MAX_PAYLOAD;
-
- } else { // end of transfer
- pbPayload =
- &pCommandFrame->
- m_le_abCommandData
- [0];
- // fill rest of header
- AmiSetWordToLe
- (&pCommandFrame->
- m_le_wSegmentSize,
- (u16)
- pSdoComCon_p->
- m_uiTransSize);
- bFlags = 0x30;
- AmiSetByteToLe
- (&pCommandFrame->
- m_le_bFlags,
- bFlags);
- // copy data
- EPL_MEMCPY(pbPayload,
- pSdoComCon_p->
- m_pData,
- pSdoComCon_p->
- m_uiTransSize);
- pSdoComCon_p->m_pData +=
- pSdoComCon_p->
- m_uiTransSize;
- // calc size
- uiSizeOfFrame +=
- pSdoComCon_p->
- m_uiTransSize;
- // correct intern counter
- pSdoComCon_p->
- m_uiTransSize = 0;
- pSdoComCon_p->
- m_uiTransferredByte
- =
- pSdoComCon_p->
- m_uiTransSize;
-
- }
- } else {
- goto Exit;
- }
- break;
- }
- default:
- {
- goto Exit;
- }
- } // end of switch(pSdoComCon_p->m_SdoServiceType)
- }
- } else {
- goto Exit;
- }
-
- // call send function of lower layer
- switch (pSdoComCon_p->m_SdoProtType) {
- case kEplSdoTypeAsnd:
- case kEplSdoTypeUdp:
- {
- Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl,
- uiSizeOfFrame, pFrame);
- break;
- }
-
- default:
- {
- Ret = kEplSdoComUnsupportedProt;
- }
- } // end of switch(pSdoComCon_p->m_SdoProtType)
-
- Exit:
- return Ret;
-
-}
-#endif
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComClientProcessFrame
-//
-// Description: function process a received frame
-//
-//
-//
-// Parameters: SdoComCon_p = connection handle
-// pAsySdoCom_p = pointer to frame to process
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-static tEplKernel EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p,
- tEplAsySdoCom * pAsySdoCom_p)
-{
- tEplKernel Ret;
- u8 bBuffer;
- unsigned int uiBuffer;
- unsigned int uiDataSize;
- unsigned long ulBuffer;
- tEplSdoComCon *pSdoComCon;
-
- Ret = kEplSuccessful;
-
- // get pointer to control structure
- pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComCon_p];
-
- // check if transaction Id fit
- bBuffer = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bTransactionId);
- if (pSdoComCon->m_bTransactionId != bBuffer) {
- // incorrect transaction id
-
- // if running transfer
- if ((pSdoComCon->m_uiTransferredByte != 0)
- && (pSdoComCon->m_uiTransSize != 0)) {
- pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_GENERAL_ERROR;
- // -> send abort
- EplSdoComClientSendAbort(pSdoComCon,
- pSdoComCon->m_dwLastAbortCode);
- // call callback of application
- Ret =
- EplSdoComTransferFinished(SdoComCon_p, pSdoComCon,
- kEplSdoComTransferTxAborted);
- }
-
- } else { // check if correct command
- bBuffer = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bCommandId);
- if (pSdoComCon->m_SdoServiceType != bBuffer) {
- // incorrect command
- // if running transfer
- if ((pSdoComCon->m_uiTransferredByte != 0)
- && (pSdoComCon->m_uiTransSize != 0)) {
- pSdoComCon->m_dwLastAbortCode =
- EPL_SDOAC_GENERAL_ERROR;
- // -> send abort
- EplSdoComClientSendAbort(pSdoComCon,
- pSdoComCon->
- m_dwLastAbortCode);
- // call callback of application
- Ret =
- EplSdoComTransferFinished(SdoComCon_p,
- pSdoComCon,
- kEplSdoComTransferTxAborted);
- }
-
- } else { // switch on command
- switch (pSdoComCon->m_SdoServiceType) {
- case kEplSdoServiceWriteByIndex:
- { // check if confirmation from server
- // nothing more to do
- break;
- }
-
- case kEplSdoServiceReadByIndex:
- { // check if it is an segmented or an expedited transfer
- bBuffer =
- AmiGetByteFromLe(&pAsySdoCom_p->
- m_le_bFlags);
- // mask uninteressting bits
- bBuffer &= 0x30;
- switch (bBuffer) {
- // expedited transfer
- case 0x00:
- {
- // check size of buffer
- uiBuffer =
- AmiGetWordFromLe
- (&pAsySdoCom_p->
- m_le_wSegmentSize);
- if (uiBuffer > pSdoComCon->m_uiTransSize) { // buffer provided by the application is to small
- // copy only a part
- uiDataSize =
- pSdoComCon->
- m_uiTransSize;
- } else { // buffer fits
- uiDataSize =
- uiBuffer;
- }
-
- // copy data
- EPL_MEMCPY(pSdoComCon->
- m_pData,
- &pAsySdoCom_p->
- m_le_abCommandData
- [0],
- uiDataSize);
-
- // correct counter
- pSdoComCon->
- m_uiTransSize = 0;
- pSdoComCon->
- m_uiTransferredByte
- = uiDataSize;
- break;
- }
-
- // start of a segmented transfer
- case 0x10:
- { // get total size of transfer
- ulBuffer =
- AmiGetDwordFromLe
- (&pAsySdoCom_p->
- m_le_abCommandData
- [0]);
- if (ulBuffer <= pSdoComCon->m_uiTransSize) { // buffer fit
- pSdoComCon->
- m_uiTransSize
- =
- (unsigned
- int)
- ulBuffer;
- } else { // buffer to small
- // send abort
- pSdoComCon->
- m_dwLastAbortCode
- =
- EPL_SDOAC_DATA_TYPE_LENGTH_TOO_HIGH;
- // -> send abort
- EplSdoComClientSendAbort
- (pSdoComCon,
- pSdoComCon->
- m_dwLastAbortCode);
- // call callback of application
- Ret =
- EplSdoComTransferFinished
- (SdoComCon_p,
- pSdoComCon,
- kEplSdoComTransferRxAborted);
- goto Exit;
- }
-
- // get segment size
- // check size of buffer
- uiBuffer =
- AmiGetWordFromLe
- (&pAsySdoCom_p->
- m_le_wSegmentSize);
- // subtract size of vaiable header from datasize
- uiBuffer -= 4;
- // copy data
- EPL_MEMCPY(pSdoComCon->
- m_pData,
- &pAsySdoCom_p->
- m_le_abCommandData
- [4],
- uiBuffer);
-
- // correct counter an pointer
- pSdoComCon->m_pData +=
- uiBuffer;
- pSdoComCon->
- m_uiTransferredByte
- += uiBuffer;
- pSdoComCon->
- m_uiTransSize -=
- uiBuffer;
-
- break;
- }
-
- // segment
- case 0x20:
- {
- // get segment size
- // check size of buffer
- uiBuffer =
- AmiGetWordFromLe
- (&pAsySdoCom_p->
- m_le_wSegmentSize);
- // check if data to copy fit to buffer
- if (uiBuffer >= pSdoComCon->m_uiTransSize) { // to much data
- uiBuffer =
- (pSdoComCon->
- m_uiTransSize
- - 1);
- }
- // copy data
- EPL_MEMCPY(pSdoComCon->
- m_pData,
- &pAsySdoCom_p->
- m_le_abCommandData
- [0],
- uiBuffer);
-
- // correct counter an pointer
- pSdoComCon->m_pData +=
- uiBuffer;
- pSdoComCon->
- m_uiTransferredByte
- += uiBuffer;
- pSdoComCon->
- m_uiTransSize -=
- uiBuffer;
- break;
- }
-
- // last segment
- case 0x30:
- {
- // get segment size
- // check size of buffer
- uiBuffer =
- AmiGetWordFromLe
- (&pAsySdoCom_p->
- m_le_wSegmentSize);
- // check if data to copy fit to buffer
- if (uiBuffer > pSdoComCon->m_uiTransSize) { // to much data
- uiBuffer =
- (pSdoComCon->
- m_uiTransSize
- - 1);
- }
- // copy data
- EPL_MEMCPY(pSdoComCon->
- m_pData,
- &pAsySdoCom_p->
- m_le_abCommandData
- [0],
- uiBuffer);
-
- // correct counter an pointer
- pSdoComCon->m_pData +=
- uiBuffer;
- pSdoComCon->
- m_uiTransferredByte
- += uiBuffer;
- pSdoComCon->
- m_uiTransSize = 0;
-
- break;
- }
- } // end of switch(bBuffer & 0x30)
-
- break;
- }
-
- case kEplSdoServiceNIL:
- default:
- // invalid service requested
- // $$$ d.k. What should we do?
- break;
- } // end of switch(pSdoComCon->m_SdoServiceType)
- }
- }
-
- Exit:
- return Ret;
-}
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComClientSendAbort
-//
-// Description: function send a abort message
-//
-//
-//
-// Parameters: pSdoComCon_p = pointer to control structure of connection
-// dwAbortCode_p = Sdo abort code
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon * pSdoComCon_p,
- u32 dwAbortCode_p)
-{
- tEplKernel Ret;
- u8 abFrame[EPL_MAX_SDO_FRAME_SIZE];
- tEplFrame *pFrame;
- tEplAsySdoCom *pCommandFrame;
- unsigned int uiSizeOfFrame;
-
- Ret = kEplSuccessful;
-
- pFrame = (tEplFrame *) & abFrame[0];
-
- EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame));
-
- // build generic part of frame
- // get pointer to command layerpart of frame
- pCommandFrame =
- &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.
- m_le_abSdoSeqPayload;
- AmiSetByteToLe(&pCommandFrame->m_le_bCommandId,
- pSdoComCon_p->m_SdoServiceType);
- AmiSetByteToLe(&pCommandFrame->m_le_bTransactionId,
- pSdoComCon_p->m_bTransactionId);
-
- uiSizeOfFrame = 8;
-
- // set response and abort flag
- pCommandFrame->m_le_bFlags |= 0x40;
-
- // copy abortcode to frame
- AmiSetDwordToLe(&pCommandFrame->m_le_abCommandData[0], dwAbortCode_p);
-
- // set size of segment
- AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, sizeof(u32));
-
- // update counter
- pSdoComCon_p->m_uiTransferredByte = sizeof(u32);
- pSdoComCon_p->m_uiTransSize = 0;
-
- // calc framesize
- uiSizeOfFrame += sizeof(u32);
-
- // save abort code
- pSdoComCon_p->m_dwLastAbortCode = dwAbortCode_p;
-
- // call send function of lower layer
- switch (pSdoComCon_p->m_SdoProtType) {
- case kEplSdoTypeAsnd:
- case kEplSdoTypeUdp:
- {
- Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl,
- uiSizeOfFrame, pFrame);
- break;
- }
-
- default:
- {
- Ret = kEplSdoComUnsupportedProt;
- }
- } // end of switch(pSdoComCon_p->m_SdoProtType)
-
- return Ret;
-}
-#endif
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoComTransferFinished
-//
-// Description: calls callback function of application if available
-// and clears entry in control structure
-//
-// Parameters: pSdoComCon_p = pointer to control structure of connection
-// SdoComConState_p = state of SDO transfer
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplSdoComTransferFinished(tEplSdoComConHdl SdoComCon_p,
- tEplSdoComCon * pSdoComCon_p,
- tEplSdoComConState SdoComConState_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- if (pSdoComCon_p->m_pfnTransferFinished != NULL) {
- tEplSdoFinishedCb pfnTransferFinished;
- tEplSdoComFinished SdoComFinished;
-
- SdoComFinished.m_pUserArg = pSdoComCon_p->m_pUserArg;
- SdoComFinished.m_uiNodeId = pSdoComCon_p->m_uiNodeId;
- SdoComFinished.m_uiTargetIndex = pSdoComCon_p->m_uiTargetIndex;
- SdoComFinished.m_uiTargetSubIndex =
- pSdoComCon_p->m_uiTargetSubIndex;
- SdoComFinished.m_uiTransferredByte =
- pSdoComCon_p->m_uiTransferredByte;
- SdoComFinished.m_dwAbortCode = pSdoComCon_p->m_dwLastAbortCode;
- SdoComFinished.m_SdoComConHdl = SdoComCon_p;
- SdoComFinished.m_SdoComConState = SdoComConState_p;
- if (pSdoComCon_p->m_SdoServiceType ==
- kEplSdoServiceWriteByIndex) {
- SdoComFinished.m_SdoAccessType = kEplSdoAccessTypeWrite;
- } else {
- SdoComFinished.m_SdoAccessType = kEplSdoAccessTypeRead;
- }
-
- // reset transfer state so this handle is not busy anymore
- pSdoComCon_p->m_uiTransferredByte = 0;
- pSdoComCon_p->m_uiTransSize = 0;
-
- pfnTransferFinished = pSdoComCon_p->m_pfnTransferFinished;
- // delete function pointer to inform application only once for each transfer
- pSdoComCon_p->m_pfnTransferFinished = NULL;
-
- // call application's callback function
- pfnTransferFinished(&SdoComFinished);
-
- }
-
- return Ret;
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for SDO/UDP-Protocolabstractionlayer 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: EplSdoUdpu.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplSdoUdpu.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
-
-#include "SocketLinuxKernel.h"
-#include <linux/completion.h>
-#include <linux/sched.h>
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef EPL_SDO_MAX_CONNECTION_UDP
-#define EPL_SDO_MAX_CONNECTION_UDP 5
-#endif
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- unsigned long m_ulIpAddr; // in network byte order
- unsigned int m_uiPort; // in network byte order
-
-} tEplSdoUdpCon;
-
-// instance table
-typedef struct {
- tEplSdoUdpCon m_aSdoAbsUdpConnection[EPL_SDO_MAX_CONNECTION_UDP];
- tEplSequLayerReceiveCb m_fpSdoAsySeqCb;
- SOCKET m_UdpSocket;
-
- struct completion m_CompletionUdpThread;
- int m_ThreadHandle;
- int m_iTerminateThread;
-} tEplSdoUdpInstance;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static tEplSdoUdpInstance SdoUdpInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static int EplSdoUdpThread(void *pArg_p);
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <EPL-SDO-UDP-Layer> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description: Protocolabstraction layer for UDP
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpuInit
-//
-// Description: init first instance of the module
-//
-//
-//
-// Parameters: pReceiveCb_p = functionpointer to Sdo-Sequence layer
-// callback-function
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoUdpuInit(tEplSequLayerReceiveCb fpReceiveCb_p)
-{
- tEplKernel Ret;
-
- Ret = EplSdoUdpuAddInstance(fpReceiveCb_p);
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpuAddInstance
-//
-// Description: init additional instance of the module
-// înit socket and start Listen-Thread
-//
-//
-//
-// Parameters: pReceiveCb_p = functionpointer to Sdo-Sequence layer
-// callback-function
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoUdpuAddInstance(tEplSequLayerReceiveCb fpReceiveCb_p)
-{
- tEplKernel Ret;
-
- // set instance variables to 0
- EPL_MEMSET(&SdoUdpInstance_g, 0x00, sizeof(SdoUdpInstance_g));
-
- Ret = kEplSuccessful;
-
- // save pointer to callback-function
- if (fpReceiveCb_p != NULL) {
- SdoUdpInstance_g.m_fpSdoAsySeqCb = fpReceiveCb_p;
- } else {
- Ret = kEplSdoUdpMissCb;
- goto Exit;
- }
-
- init_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
- SdoUdpInstance_g.m_iTerminateThread = 0;
- SdoUdpInstance_g.m_ThreadHandle = 0;
- SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
-
- Ret = EplSdoUdpuConfig(INADDR_ANY, 0);
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpuDelInstance
-//
-// Description: del instance of the module
-// del socket and del Listen-Thread
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoUdpuDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- if (SdoUdpInstance_g.m_ThreadHandle != 0) { // listen thread was started
- // close thread
- SdoUdpInstance_g.m_iTerminateThread = 1;
- /* kill_proc(SdoUdpInstance_g.m_ThreadHandle, SIGTERM, 1 ); */
- send_sig(SIGTERM, SdoUdpInstance_g.m_ThreadHandle, 1);
- wait_for_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
- SdoUdpInstance_g.m_ThreadHandle = 0;
- }
-
- if (SdoUdpInstance_g.m_UdpSocket != INVALID_SOCKET) {
- // close socket
- closesocket(SdoUdpInstance_g.m_UdpSocket);
- SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
- }
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpuConfig
-//
-// Description: reconfigurate socket with new IP-Address
-// -> needed for NMT ResetConfiguration
-//
-// Parameters: ulIpAddr_p = IpAddress in platform byte order
-// uiPort_p = port number in platform byte order
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoUdpuConfig(unsigned long ulIpAddr_p, unsigned int uiPort_p)
-{
- tEplKernel Ret;
- struct sockaddr_in Addr;
- int iError;
-
- Ret = kEplSuccessful;
-
- if (uiPort_p == 0) { // set UDP port to default port number
- uiPort_p = EPL_C_SDO_EPL_PORT;
- } else if (uiPort_p > 65535) {
- Ret = kEplSdoUdpSocketError;
- goto Exit;
- }
-
- if (SdoUdpInstance_g.m_ThreadHandle != 0) { // listen thread was started
-
- // close old thread
- SdoUdpInstance_g.m_iTerminateThread = 1;
- /* kill_proc(SdoUdpInstance_g.m_ThreadHandle, SIGTERM, 1 ); */
- send_sig(SIGTERM, SdoUdpInstance_g.m_ThreadHandle, 1);
- wait_for_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
- SdoUdpInstance_g.m_iTerminateThread = 0;
- SdoUdpInstance_g.m_ThreadHandle = 0;
- }
-
- if (SdoUdpInstance_g.m_UdpSocket != INVALID_SOCKET) {
- // close socket
- iError = closesocket(SdoUdpInstance_g.m_UdpSocket);
- SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
- if (iError != 0) {
- Ret = kEplSdoUdpSocketError;
- goto Exit;
- }
- }
- // create Socket
- SdoUdpInstance_g.m_UdpSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (SdoUdpInstance_g.m_UdpSocket == INVALID_SOCKET) {
- Ret = kEplSdoUdpNoSocket;
- EPL_DBGLVL_SDO_TRACE0("EplSdoUdpuConfig: socket() failed\n");
- goto Exit;
- }
- // bind socket
- Addr.sin_family = AF_INET;
- Addr.sin_port = htons((unsigned short)uiPort_p);
- Addr.sin_addr.s_addr = htonl(ulIpAddr_p);
- iError =
- bind(SdoUdpInstance_g.m_UdpSocket, (struct sockaddr *)&Addr,
- sizeof(Addr));
- if (iError < 0) {
- //iError = WSAGetLastError();
- EPL_DBGLVL_SDO_TRACE1
- ("EplSdoUdpuConfig: bind() finished with %i\n", iError);
- Ret = kEplSdoUdpNoSocket;
- goto Exit;
- }
- // create Listen-Thread
- SdoUdpInstance_g.m_ThreadHandle =
- kernel_thread(EplSdoUdpThread, &SdoUdpInstance_g,
- CLONE_FS | CLONE_FILES);
- if (SdoUdpInstance_g.m_ThreadHandle == 0) {
- Ret = kEplSdoUdpThreadError;
- goto Exit;
- }
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpuInitCon
-//
-// Description: init a new connect
-//
-//
-//
-// Parameters: pSdoConHandle_p = pointer for the new connection handle
-// uiTargetNodeId_p = NodeId of the target node
-//
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoUdpuInitCon(tEplSdoConHdl *pSdoConHandle_p,
- unsigned int uiTargetNodeId_p)
-{
- tEplKernel Ret;
- unsigned int uiCount;
- unsigned int uiFreeCon;
- tEplSdoUdpCon *pSdoUdpCon;
-
- Ret = kEplSuccessful;
-
- // get free entry in control structure
- uiCount = 0;
- uiFreeCon = EPL_SDO_MAX_CONNECTION_UDP;
- pSdoUdpCon = &SdoUdpInstance_g.m_aSdoAbsUdpConnection[0];
- while (uiCount < EPL_SDO_MAX_CONNECTION_UDP) {
- if ((pSdoUdpCon->m_ulIpAddr & htonl(0xFF)) == htonl(uiTargetNodeId_p)) { // existing connection to target node found
- // set handle
- *pSdoConHandle_p = (uiCount | EPL_SDO_UDP_HANDLE);
-
- goto Exit;
- } else if ((pSdoUdpCon->m_ulIpAddr == 0)
- && (pSdoUdpCon->m_uiPort == 0)) {
- uiFreeCon = uiCount;
- }
- uiCount++;
- pSdoUdpCon++;
- }
-
- if (uiFreeCon == EPL_SDO_MAX_CONNECTION_UDP) {
- // error no free handle
- Ret = kEplSdoUdpNoFreeHandle;
- } else {
- pSdoUdpCon =
- &SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiFreeCon];
- // save infos for connection
- pSdoUdpCon->m_uiPort = htons(EPL_C_SDO_EPL_PORT);
- pSdoUdpCon->m_ulIpAddr = htonl(0xC0A86400 | uiTargetNodeId_p); // 192.168.100.uiTargetNodeId_p
-
- // set handle
- *pSdoConHandle_p = (uiFreeCon | EPL_SDO_UDP_HANDLE);
-
- }
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpuSendData
-//
-// Description: send data using exisiting connection
-//
-//
-//
-// Parameters: SdoConHandle_p = connection handle
-// pSrcData_p = pointer to data
-// dwDataSize_p = number of databyte
-// -> without asend-header!!!
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoUdpuSendData(tEplSdoConHdl SdoConHandle_p,
- tEplFrame *pSrcData_p, u32 dwDataSize_p)
-{
- tEplKernel Ret;
- int iError;
- unsigned int uiArray;
- struct sockaddr_in Addr;
-
- Ret = kEplSuccessful;
-
- uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
- if (uiArray >= EPL_SDO_MAX_CONNECTION_UDP) {
- Ret = kEplSdoUdpInvalidHdl;
- goto Exit;
- }
- //set message type
- AmiSetByteToLe(&pSrcData_p->m_le_bMessageType, 0x06); // SDO
- // target node id (for Udp = 0)
- AmiSetByteToLe(&pSrcData_p->m_le_bDstNodeId, 0x00);
- // set source-nodeid (for Udp = 0)
- AmiSetByteToLe(&pSrcData_p->m_le_bSrcNodeId, 0x00);
-
- // calc size
- dwDataSize_p += EPL_ASND_HEADER_SIZE;
-
- // call sendto
- Addr.sin_family = AF_INET;
- Addr.sin_port =
- (unsigned short)SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].
- m_uiPort;
- Addr.sin_addr.s_addr =
- SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_ulIpAddr;
-
- iError = sendto(SdoUdpInstance_g.m_UdpSocket, // sockethandle
- (const char *)&pSrcData_p->m_le_bMessageType, // data to send
- dwDataSize_p, // number of bytes to send
- 0, // flags
- (struct sockaddr *)&Addr, // target
- sizeof(struct sockaddr_in)); // sizeof targetadress
- if (iError < 0) {
- EPL_DBGLVL_SDO_TRACE1
- ("EplSdoUdpuSendData: sendto() finished with %i\n", iError);
- Ret = kEplSdoUdpSendError;
- goto Exit;
- }
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpuDelCon
-//
-// Description: delete connection from intern structure
-//
-//
-//
-// Parameters: SdoConHandle_p = connection handle
-//
-// Returns: tEplKernel = Errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-tEplKernel EplSdoUdpuDelCon(tEplSdoConHdl SdoConHandle_p)
-{
- tEplKernel Ret;
- unsigned int uiArray;
-
- uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
-
- if (uiArray >= EPL_SDO_MAX_CONNECTION_UDP) {
- Ret = kEplSdoUdpInvalidHdl;
- goto Exit;
- } else {
- Ret = kEplSuccessful;
- }
-
- // delete connection
- SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_ulIpAddr = 0;
- SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_uiPort = 0;
-
- Exit:
- return Ret;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplSdoUdpThread
-//
-// Description: thread check socket for new data
-//
-//
-//
-// Parameters: lpParameter = pointer to parameter type tEplSdoUdpThreadPara
-//
-//
-// Returns: u32 = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static int EplSdoUdpThread(void *pArg_p)
-{
-
- tEplSdoUdpInstance *pInstance;
- struct sockaddr_in RemoteAddr;
- int iError;
- int iCount;
- int iFreeEntry;
- u8 abBuffer[EPL_MAX_SDO_REC_FRAME_SIZE];
- unsigned int uiSize;
- tEplSdoConHdl SdoConHdl;
-
- pInstance = (tEplSdoUdpInstance *) pArg_p;
- daemonize("EplSdoUdpThread");
- allow_signal(SIGTERM);
-
- for (; pInstance->m_iTerminateThread == 0;)
-
- {
- // wait for data
- uiSize = sizeof(struct sockaddr);
- iError = recvfrom(pInstance->m_UdpSocket, // Socket
- (char *)&abBuffer[0], // buffer for data
- sizeof(abBuffer), // size of the buffer
- 0, // flags
- (struct sockaddr *)&RemoteAddr,
- (int *)&uiSize);
- if (iError == -ERESTARTSYS) {
- break;
- }
- if (iError > 0) {
- // get handle for higher layer
- iCount = 0;
- iFreeEntry = 0xFFFF;
- while (iCount < EPL_SDO_MAX_CONNECTION_UDP) {
- // check if this connection is already known
- if ((pInstance->m_aSdoAbsUdpConnection[iCount].
- m_ulIpAddr == RemoteAddr.sin_addr.s_addr)
- && (pInstance->
- m_aSdoAbsUdpConnection[iCount].
- m_uiPort == RemoteAddr.sin_port)) {
- break;
- }
-
- if ((pInstance->m_aSdoAbsUdpConnection[iCount].
- m_ulIpAddr == 0)
- && (pInstance->
- m_aSdoAbsUdpConnection[iCount].
- m_uiPort == 0)
- && (iFreeEntry == 0xFFFF))
- {
- iFreeEntry = iCount;
- }
-
- iCount++;
- }
-
- if (iCount == EPL_SDO_MAX_CONNECTION_UDP) {
- // connection unknown
- // see if there is a free handle
- if (iFreeEntry != 0xFFFF) {
- // save adress infos
- pInstance->
- m_aSdoAbsUdpConnection[iFreeEntry].
- m_ulIpAddr =
- RemoteAddr.sin_addr.s_addr;
- pInstance->
- m_aSdoAbsUdpConnection[iFreeEntry].
- m_uiPort = RemoteAddr.sin_port;
- // call callback
- SdoConHdl = iFreeEntry;
- SdoConHdl |= EPL_SDO_UDP_HANDLE;
- // offset 4 -> start of SDO Sequence header
- pInstance->m_fpSdoAsySeqCb(SdoConHdl,
- (tEplAsySdoSeq
- *) &
- abBuffer[4],
- (iError -
- 4));
- } else {
- EPL_DBGLVL_SDO_TRACE0
- ("Error in EplSdoUdpThread() no free handle\n");
- }
-
- } else {
- // known connection
- // call callback with correct handle
- SdoConHdl = iCount;
- SdoConHdl |= EPL_SDO_UDP_HANDLE;
- // offset 4 -> start of SDO Sequence header
- pInstance->m_fpSdoAsySeqCb(SdoConHdl,
- (tEplAsySdoSeq *) &
- abBuffer[4],
- (iError - 4));
- }
- } // end of if(iError!=SOCKET_ERROR)
- } // end of for(;;)
-
- complete_and_exit(&SdoUdpInstance_g.m_CompletionUdpThread, 0);
- return 0;
-}
-
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for Statusu-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: EplStatusu.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/11/15 d.k.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplStatusu.h"
-#include "user/EplDlluCal.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <xxxxx> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description:
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P R I V A T E D E F I N I T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-typedef struct {
- tEplStatusuCbResponse m_apfnCbResponse[254];
-
-} tEplStatusuInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-static tEplStatusuInstance EplStatusuInstance_g;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static tEplKernel EplStatusuCbStatusResponse(tEplFrameInfo *pFrameInfo_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplStatusuInit
-//
-// Description: init first instance of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplStatusuInit(void)
-{
- tEplKernel Ret;
-
- Ret = EplStatusuAddInstance();
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplStatusuAddInstance
-//
-// Description: init other instances of the module
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplStatusuAddInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // reset instance structure
- EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof(EplStatusuInstance_g));
-
- // register StatusResponse callback function
- Ret =
- EplDlluCalRegAsndService(kEplDllAsndStatusResponse,
- EplStatusuCbStatusResponse,
- kEplDllAsndFilterAny);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplStatusuDelInstance
-//
-// Description: delete instance
-//
-//
-//
-// Parameters:
-//
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplStatusuDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // deregister StatusResponse callback function
- Ret =
- EplDlluCalRegAsndService(kEplDllAsndStatusResponse, NULL,
- kEplDllAsndFilterNone);
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplStatusuReset
-//
-// Description: resets this instance
-//
-// Parameters:
-//
-// Returns: tEplKernel = errorcode
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplStatusuReset(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // reset instance structure
- EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof(EplStatusuInstance_g));
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplStatusuRequestStatusResponse
-//
-// Description: returns the StatusResponse for the specified node.
-//
-// Parameters: uiNodeId_p = IN: node ID
-// pfnCbResponse_p = IN: function pointer to callback function
-// which will be called if StatusResponse is received
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplStatusuRequestStatusResponse(unsigned int uiNodeId_p,
- tEplStatusuCbResponse pfnCbResponse_p)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- // decrement node ID, because array is zero based
- uiNodeId_p--;
- if (uiNodeId_p < tabentries(EplStatusuInstance_g.m_apfnCbResponse)) {
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if (EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] != NULL) { // request already issued (maybe by someone else)
- Ret = kEplInvalidOperation;
- } else {
- EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] =
- pfnCbResponse_p;
- Ret =
- EplDlluCalIssueRequest(kEplDllReqServiceStatus,
- (uiNodeId_p + 1), 0xFF);
- }
-#else
- Ret = kEplInvalidOperation;
-#endif
- } else { // invalid node ID specified
- Ret = kEplInvalidNodeId;
- }
-
- return Ret;
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplStatusuCbStatusResponse
-//
-// Description: callback funktion for StatusResponse
-//
-//
-//
-// Parameters: pFrameInfo_p = Frame with the StatusResponse
-//
-//
-// Returns: tEplKernel = error code
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static tEplKernel EplStatusuCbStatusResponse(tEplFrameInfo *pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiNodeId;
- unsigned int uiIndex;
- tEplStatusuCbResponse pfnCbResponse;
-
- uiNodeId = AmiGetByteFromLe(&pFrameInfo_p->m_pFrame->m_le_bSrcNodeId);
-
- uiIndex = uiNodeId - 1;
-
- if (uiIndex < tabentries(EplStatusuInstance_g.m_apfnCbResponse)) {
- // memorize pointer to callback function
- pfnCbResponse = EplStatusuInstance_g.m_apfnCbResponse[uiIndex];
- if (pfnCbResponse == NULL) { // response was not requested
- goto Exit;
- }
- // reset callback function pointer so that caller may issue next request
- EplStatusuInstance_g.m_apfnCbResponse[uiIndex] = NULL;
-
- if (pFrameInfo_p->m_uiFrameSize < EPL_C_DLL_MINSIZE_STATUSRES) { // StatusResponse not received or it has invalid size
- Ret = pfnCbResponse(uiNodeId, NULL);
- } else { // StatusResponse received
- Ret =
- pfnCbResponse(uiNodeId,
- &pFrameInfo_p->m_pFrame->m_Data.
- m_Asnd.m_Payload.m_StatusResponse);
- }
- }
-
- Exit:
- return Ret;
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for target api function
-
- 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: EplTarget.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2005/12/05 -as: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPLTARGET_H_
-#define _EPLTARGET_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-// =========================================================================
-// macros for memory access (depends on target system)
-// =========================================================================
-
-// NOTE:
-// The following macros are used to combine standard library definitions. Some
-// applications needs to use one common library function (e.g. memcpy()). So
-// you can set (or change) it here.
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/major.h>
-
- //29.11.2004 f.j. sonst ist memcpy und memset unbekannt
-// #include <string.h>
-
-#define EPL_MEMCPY(dst,src,siz) memcpy((void*)(dst),(const void*)(src),(size_t)(siz));
-#define EPL_MEMSET(dst,val,siz) memset((void*)(dst),(int)(val),(size_t)(siz));
-
-#define EPL_MALLOC(siz) kmalloc((size_t)(siz), GFP_KERNEL)
-#define EPL_FREE(ptr) kfree((void *)ptr)
-
-#ifndef PRINTF0
-#define PRINTF TRACE
-#define PRINTF0(arg) TRACE0(arg)
-#define PRINTF1(arg,p1) TRACE1(arg,p1)
-#define PRINTF2(arg,p1,p2) TRACE2(arg,p1,p2)
-#define PRINTF3(arg,p1,p2,p3) TRACE3(arg,p1,p2,p3)
-#define PRINTF4(arg,p1,p2,p3,p4) TRACE4(arg,p1,p2,p3,p4)
- //#define PRINTF printf
- //#define PRINTF0(arg) PRINTF(arg)
- //#define PRINTF1(arg,p1) PRINTF(arg,p1)
- //#define PRINTF2(arg,p1,p2) PRINTF(arg,p1,p2)
- //#define PRINTF3(arg,p1,p2,p3) PRINTF(arg,p1,p2,p3)
- //#define PRINTF4(arg,p1,p2,p3,p4) PRINTF(arg,p1,p2,p3,p4)
-#endif
-
-#define EPL_TGT_INTMASK_ETH 0x0001 // ethernet interrupt
-#define EPL_TGT_INTMASK_DMA 0x0002 // DMA interrupt
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-// currently no Timer functions are needed by EPL stack
-// so they are not implemented yet
-//void TgtTimerInit(void);
-//u32 TgtGetTickCount(void);
-//void TgtGetNetTime(tEplNetTime * pNetTime_p);
-
-// functions for ethernet driver
-tEplKernel TgtInitEthIsr(void);
-void TgtFreeEthIsr(void);
-void TgtEnableGlobalInterrupt(u8 fEnable_p);
-void TgtEnableEthInterrupt0(u8 fEnable_p, unsigned int uiInterruptMask_p);
-void TgtEnableEthInterrupt1(u8 fEnable_p, unsigned int uiInterruptMask_p);
-
-#endif // #ifndef _EPLTARGET_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for Epl Timer-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: EplTimer.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/06 k.t.: start of the implementation
-
-****************************************************************************/
-
-#include "EplInc.h"
-#include "EplEvent.h"
-
-#ifndef _EPLTIMER_H_
-#define _EPLTIMER_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-// type for timer handle
-typedef unsigned long tEplTimerHdl;
-
-typedef struct {
- tEplEventSink m_EventSink;
- unsigned long m_ulArg; // d.k.: converted to unsigned long because
- // it is never accessed as a pointer by the
- // timer module and the data the
- // pointer points to is not saved in any way.
- // It is just a value. The user is responsible
- // to store the data statically and convert
- // the pointer between address spaces.
-
-} tEplTimerArg;
-
-typedef struct {
- tEplTimerHdl m_TimerHdl;
- unsigned long m_ulArg; // d.k.: converted to unsigned long because
- // it is never accessed as a pointer by the
- // timer module and the data the
- // pointer points to is not saved in any way.
- // It is just a value.
-
-} tEplTimerEventArg;
-
-typedef tEplKernel(* tEplTimerkCallback) (tEplTimerEventArg *pEventArg_p);
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _EPLTIMER_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: source file for EPL User Timermodule for Linux kernel 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: EplTimeruLinuxKernel.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- KEIL uVision 2
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/09/12 d.k.: start of the implementation
-
-****************************************************************************/
-
-#include "user/EplTimeru.h"
-#include <linux/timer.h>
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-typedef struct {
- struct timer_list m_Timer;
- tEplTimerArg TimerArgument;
-
-} tEplTimeruData;
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-static void EplTimeruCbMs(unsigned long ulParameter_p);
-
-/***************************************************************************/
-/* */
-/* */
-/* C L A S S <Epl Userspace-Timermodule for Linux Kernel> */
-/* */
-/* */
-/***************************************************************************/
-//
-// Description: Epl Userspace-Timermodule for Linux Kernel
-//
-//
-/***************************************************************************/
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruInit
-//
-// Description: function inits first instance
-//
-// Parameters: void
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimeruInit(void)
-{
- tEplKernel Ret;
-
- Ret = EplTimeruAddInstance();
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruAddInstance
-//
-// Description: function inits additional instance
-//
-// Parameters: void
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimeruAddInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruDelInstance
-//
-// Description: function deletes instance
-// -> under Linux nothing to do
-// -> no instance table needed
-//
-// Parameters: void
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimeruDelInstance(void)
-{
- tEplKernel Ret;
-
- Ret = kEplSuccessful;
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruSetTimerMs
-//
-// Description: function creates a timer and returns the corresponding handle
-//
-// Parameters: pTimerHdl_p = pointer to a buffer to fill in the handle
-// ulTime_p = time for timer in ms
-// Argument_p = argument for timer
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimeruSetTimerMs(tEplTimerHdl *pTimerHdl_p,
- unsigned long ulTime_p,
- tEplTimerArg Argument_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplTimeruData *pData;
-
- // check pointer to handle
- if (pTimerHdl_p == NULL) {
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
-
- pData = (tEplTimeruData *) EPL_MALLOC(sizeof(tEplTimeruData));
- if (pData == NULL) {
- Ret = kEplNoResource;
- goto Exit;
- }
-
- init_timer(&pData->m_Timer);
- pData->m_Timer.function = EplTimeruCbMs;
- pData->m_Timer.data = (unsigned long)pData;
- pData->m_Timer.expires = jiffies + ulTime_p * HZ / 1000;
-
- EPL_MEMCPY(&pData->TimerArgument, &Argument_p, sizeof(tEplTimerArg));
-
- add_timer(&pData->m_Timer);
-
- *pTimerHdl_p = (tEplTimerHdl) pData;
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruModifyTimerMs
-//
-// Description: function changes a timer and returns the corresponding handle
-//
-// Parameters: pTimerHdl_p = pointer to a buffer to fill in the handle
-// ulTime_p = time for timer in ms
-// Argument_p = argument for timer
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimeruModifyTimerMs(tEplTimerHdl *pTimerHdl_p,
- unsigned long ulTime_p,
- tEplTimerArg Argument_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplTimeruData *pData;
-
- // check pointer to handle
- if (pTimerHdl_p == NULL) {
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
- // check handle itself, i.e. was the handle initialized before
- if (*pTimerHdl_p == 0) {
- Ret = EplTimeruSetTimerMs(pTimerHdl_p, ulTime_p, Argument_p);
- goto Exit;
- }
- pData = (tEplTimeruData *) * pTimerHdl_p;
- if ((tEplTimeruData *) pData->m_Timer.data != pData) {
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
-
- mod_timer(&pData->m_Timer, (jiffies + ulTime_p * HZ / 1000));
-
- // copy the TimerArg after the timer is restarted,
- // so that a timer occured immediately before mod_timer
- // won't use the new TimerArg and
- // therefore the old timer cannot be distinguished from the new one.
- // But if the new timer is too fast, it may get lost.
- EPL_MEMCPY(&pData->TimerArgument, &Argument_p, sizeof(tEplTimerArg));
-
- // check if timer is really running
- if (timer_pending(&pData->m_Timer) == 0) { // timer is not running
- // retry starting it
- add_timer(&pData->m_Timer);
- }
- // set handle to pointer of tEplTimeruData
-// *pTimerHdl_p = (tEplTimerHdl) pData;
-
- Exit:
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruDeleteTimer
-//
-// Description: function deletes a timer
-//
-// Parameters: pTimerHdl_p = pointer to a buffer to fill in the handle
-//
-// Returns: tEplKernel = errorcode
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimeruDeleteTimer(tEplTimerHdl *pTimerHdl_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplTimeruData *pData;
-
- // check pointer to handle
- if (pTimerHdl_p == NULL) {
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
- // check handle itself, i.e. was the handle initialized before
- if (*pTimerHdl_p == 0) {
- Ret = kEplSuccessful;
- goto Exit;
- }
- pData = (tEplTimeruData *) * pTimerHdl_p;
- if ((tEplTimeruData *) pData->m_Timer.data != pData) {
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
-
-/* if (del_timer(&pData->m_Timer) == 1)
- {
- kfree(pData);
- }
-*/
- // try to delete the timer
- del_timer(&pData->m_Timer);
- // free memory in any case
- kfree(pData);
-
- // uninitialize handle
- *pTimerHdl_p = 0;
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruIsTimerActive
-//
-// Description: checks if the timer referenced by the handle is currently
-// active.
-//
-// Parameters: TimerHdl_p = handle of the timer to check
-//
-// Returns: BOOL = TRUE, if active;
-// FALSE, otherwise
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-BOOL EplTimeruIsTimerActive(tEplTimerHdl TimerHdl_p)
-{
- BOOL fActive = FALSE;
- tEplTimeruData *pData;
-
- // check handle itself, i.e. was the handle initialized before
- if (TimerHdl_p == 0) { // timer was not created yet, so it is not active
- goto Exit;
- }
- pData = (tEplTimeruData *) TimerHdl_p;
- if ((tEplTimeruData *) pData->m_Timer.data != pData) { // invalid timer
- goto Exit;
- }
- // check if timer is running
- if (timer_pending(&pData->m_Timer) == 0) { // timer is not running
- goto Exit;
- }
-
- fActive = TRUE;
-
- Exit:
- return fActive;
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimeruCbMs
-//
-// Description: function to process timer
-//
-//
-//
-// Parameters: lpParameter = pointer to structur of type tEplTimeruData
-//
-//
-// Returns: (none)
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-static void EplTimeruCbMs(unsigned long ulParameter_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplTimeruData *pData;
- tEplEvent EplEvent;
- tEplTimerEventArg TimerEventArg;
-
- pData = (tEplTimeruData *) ulParameter_p;
-
- // call event function
- TimerEventArg.m_TimerHdl = (tEplTimerHdl) pData;
- TimerEventArg.m_ulArg = pData->TimerArgument.m_ulArg;
-
- EplEvent.m_EventSink = pData->TimerArgument.m_EventSink;
- EplEvent.m_EventType = kEplEventTypeTimer;
- EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(tEplNetTime));
- EplEvent.m_pArg = &TimerEventArg;
- EplEvent.m_uiSize = sizeof(TimerEventArg);
-
- Ret = EplEventuPost(&EplEvent);
-
- // d.k. do not free memory, user has to call EplTimeruDeleteTimer()
- //kfree(pData);
-
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: This file defines the EPL version for the stack, as string
- and for object 0x1018 within object dictionary.
-
- 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: EplVersion.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- all
-
- -------------------------------------------------------------------------
-
- Revision History:
-
-****************************************************************************/
-
-#ifndef _EPL_VERSION_H_
-#define _EPL_VERSION_H_
-
-// NOTE:
-// All version macros should contain the same version number. But do not use
-// defines instead of the numbers. Because the macro EPL_STRING_VERSION() can not
-// convert a define to a string.
-//
-// Format: maj.min.build
-// maj = major version
-// min = minor version (will be set to 0 if major version will be incremented)
-// build = current build (will be set to 0 if minor version will be incremented)
-//
-#define DEFINED_STACK_VERSION EPL_STACK_VERSION (1, 3, 0)
-#define DEFINED_OBJ1018_VERSION EPL_OBJ1018_VERSION (1, 3, 0)
-#define DEFINED_STRING_VERSION EPL_STRING_VERSION (1, 3, 0)
-
-// -----------------------------------------------------------------------------
-#define EPL_PRODUCT_NAME "EPL V2"
-#define EPL_PRODUCT_VERSION DEFINED_STRING_VERSION
-#define EPL_PRODUCT_MANUFACTURER "SYS TEC electronic GmbH"
-
-#define EPL_PRODUCT_KEY "SO-1083"
-#define EPL_PRODUCT_DESCRIPTION "openPOWERLINK Protocol Stack Source"
-
-#endif // _EPL_VERSION_H_
-
-// Die letzte Zeile muß unbedingt eine leere Zeile sein, weil manche Compiler
-// damit ein Problem haben, wenn das nicht so ist (z.B. GNU oder Borland C++ Builder).
+++ /dev/null
-config EPL
- tristate "openPOWERLINK protocol stack"
- depends on NET && HIGH_RES_TIMERS && X86
- default N
- ---help---
- Enable support for the openPOWERLINK network protocol stack.
+++ /dev/null
-obj-$(CONFIG_EPL) += epl.o
-
-epl-objs := \
- EplApiGeneric.o \
- EplApiLinuxKernel.o \
- EplApiProcessImage.o \
- EplDllk.o \
- EplDllkCal.o \
- EplDlluCal.o \
- EplErrorHandlerk.o \
- EplEventk.o \
- EplEventu.o \
- EplIdentu.o \
- EplNmtCnu.o \
- EplNmtk.o \
- EplNmtkCal.o \
- EplNmtMnu.o \
- EplNmtu.o \
- EplNmtuCal.o \
- EplObd.o \
- EplObdkCal.o \
- EplObdu.o \
- EplObduCal.o \
- EplPdok.o \
- EplPdokCal.o \
- EplPdou.o \
- EplSdoAsndu.o \
- EplSdoAsySequ.o \
- EplSdoComu.o \
- EplSdoUdpu.o \
- EplStatusu.o \
- EplTimeruLinuxKernel.o \
- amix86.o \
- SharedBuff.o \
- ShbIpc-LinuxKernel.o \
- TimerHighReskX86.o \
- VirtualEthernetLinux.o \
- SocketLinuxKernel.o \
- proc_fs.o \
- demo_main.o \
- Edrv8139.o \
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: Project independend shared buffer (linear + circular)
-
- Description: Implementation of platform independend part for the
- shared buffer
-
- 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.
-
- -------------------------------------------------------------------------
-
- 2006/06/27 -rs: V 1.00 (initial version)
-
-****************************************************************************/
-
-#if defined(WIN32) || defined(_WIN32)
-
-#ifdef UNDER_RTSS
- // RTX header
-#include <windows.h>
-#include <process.h>
-#include <rtapi.h>
-
-#elif __BORLANDC__
- // borland C header
-#include <windows.h>
-#include <process.h>
-
-#elif WINCE
-#include <windows.h>
-
-#else
- // MSVC needs to include windows.h at first
- // the following defines ar necessary for function prototypes for waitable timers
-#define _WIN32_WINDOWS 0x0401
-#define _WIN32_WINNT 0x0400
-#include <windows.h>
-#include <process.h>
-#endif
-
-#endif
-
-#include "global.h"
-#include "SharedBuff.h"
-#include "ShbIpc.h"
-
-#include <linux/string.h>
-#include <linux/kernel.h>
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// Configuration
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Constant definitions
-//---------------------------------------------------------------------------
-
-#define SBC_MAGIC_ID 0x53424323 // magic ID ("SBC#")
-#define SBL_MAGIC_ID 0x53424C23 // magic ID ("SBL#")
-
-//---------------------------------------------------------------------------
-// Local types
-//---------------------------------------------------------------------------
-
-// structure to administrate circular shared buffer head
-typedef struct {
- unsigned long m_ShbCirMagicID; // magic ID ("SBC#")
- unsigned long m_ulBufferTotalSize; // over-all size of complete buffer
- unsigned long m_ulBufferDataSize; // size of complete data area
- unsigned long m_ulWrIndex; // current write index (set bevore write)
- unsigned long m_ulRdIndex; // current read index (set after read)
- unsigned long m_ulNumOfWriteJobs; // number of currently (parallel running) write operations
- unsigned long m_ulDataInUse; // currently used buffer size (incl. uncompleted write operations)
- unsigned long m_ulDataApended; // buffer size of complete new written but not yet readable data (in case of m_ulNumOfWriteJobs>1)
- unsigned long m_ulBlocksApended; // number of complete new written but not yet readable data blocks (in case of m_ulNumOfWriteJobs>1)
- unsigned long m_ulDataReadable; // buffer size with readable (complete written) data
- unsigned long m_ulBlocksReadable; // number of readable (complete written) data blocks
- tShbCirSigHndlrNewData m_pfnSigHndlrNewData; // application handler to signal new data
- unsigned int m_fBufferLocked; // TRUE if buffer is locked (because of pending reset request)
- tShbCirSigHndlrReset m_pfnSigHndlrReset; // application handler to signal buffer reset is done
- unsigned char m_Data; // start of data area (the real data size is unknown at this time)
-
-} tShbCirBuff;
-
-// structure to administrate linear shared buffer head
-typedef struct {
- unsigned int m_ShbLinMagicID; // magic ID ("SBL#")
- unsigned long m_ulBufferTotalSize; // over-all size of complete buffer
- unsigned long m_ulBufferDataSize; // size of complete data area
- unsigned char m_Data; // start of data area (the real data size is unknown at this time)
-
-} tShbLinBuff;
-
-// type to save size of a single data block inside the circular shared buffer
-typedef struct {
- unsigned int m_uiFullBlockSize:28; // a single block must not exceed a length of 256MByte :-)
- unsigned int m_uiAlignFillBytes:4;
-
-} tShbCirBlockSize;
-
-#define SBC_BLOCK_ALIGNMENT 4 // alignment must *not* be lower than sizeof(tShbCirBlockSize)!
-#define SBC_MAX_BLOCK_SIZE ((1<<28)-1) // = (2^28 - 1) = (256MByte - 1) -> should be enought for real life :-)
-
-#define SBL_BLOCK_ALIGNMENT 4
-#define SBL_MAX_BLOCK_SIZE ((1<<28)-1) // = (2^28 - 1) = (256MByte - 1) -> should be enought for real life :-)
-
-//---------------------------------------------------------------------------
-// Global variables
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Local variables
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Prototypes of internal functions
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Get pointer to Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbCirBuff *ShbCirGetBuffer(tShbInstance pShbInstance_p)
-{
-
- tShbCirBuff *pShbCirBuff;
-
- pShbCirBuff = (tShbCirBuff *) ShbIpcGetShMemPtr(pShbInstance_p);
- ASSERT(pShbCirBuff->m_ShbCirMagicID == SBC_MAGIC_ID);
-
- return (pShbCirBuff);
-
-}
-
-//---------------------------------------------------------------------------
-// Get pointer to Linear Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbLinBuff *ShbLinGetBuffer(tShbInstance pShbInstance_p)
-{
-
- tShbLinBuff *pShbLinBuff;
-
- pShbLinBuff = (tShbLinBuff *) ShbIpcGetShMemPtr(pShbInstance_p);
- ASSERT(pShbLinBuff->m_ShbLinMagicID == SBL_MAGIC_ID);
-
- return (pShbLinBuff);
-
-}
-
-// not inlined internal functions
-int ShbCirSignalHandlerNewData(tShbInstance pShbInstance_p);
-void ShbCirSignalHandlerReset(tShbInstance pShbInstance_p,
- unsigned int fTimeOut_p);
-
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-// not inlined external functions
-
-//---------------------------------------------------------------------------
-// Initialize Shared Buffer Module
-//---------------------------------------------------------------------------
-
-tShbError ShbInit(void)
-{
-
- tShbError ShbError;
-
- ShbError = ShbIpcInit();
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Deinitialize Shared Buffer Module
-//---------------------------------------------------------------------------
-
-tShbError ShbExit(void)
-{
-
- tShbError ShbError;
-
- ShbError = ShbIpcExit();
-
- return (ShbError);
-
-}
-
-//-------------------------------------------------------------------------//
-// //
-// C i r c u l a r S h a r e d B u f f e r //
-// //
-//-------------------------------------------------------------------------//
-
-//---------------------------------------------------------------------------
-// Allocate Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirAllocBuffer(unsigned long ulBufferSize_p,
- const char *pszBufferID_p,
- tShbInstance * ppShbInstance_p,
- unsigned int *pfShbNewCreated_p)
-{
-
- tShbInstance pShbInstance;
- tShbCirBuff *pShbCirBuff;
- unsigned int fShbNewCreated;
- unsigned long ulBufferDataSize;
- unsigned long ulBufferTotalSize;
- tShbError ShbError;
-
- // check arguments
- if ((ulBufferSize_p == 0) || (ppShbInstance_p == NULL)) {
- return (kShbInvalidArg);
- }
-
- // calculate length of memory to allocate
- ulBufferDataSize =
- (ulBufferSize_p +
- (SBC_BLOCK_ALIGNMENT - 1)) & ~(SBC_BLOCK_ALIGNMENT - 1);
- ulBufferTotalSize = ulBufferDataSize + sizeof(tShbCirBuff);
-
- // allocate a new or open an existing shared buffer
- ShbError = ShbIpcAllocBuffer(ulBufferTotalSize, pszBufferID_p,
- &pShbInstance, &fShbNewCreated);
- if (ShbError != kShbOk) {
- goto Exit;
- }
-
- if (pShbInstance == NULL) {
- ShbError = kShbOutOfMem;
- goto Exit;
- }
-
- // get pointer to shared buffer
- pShbCirBuff = (tShbCirBuff *) ShbIpcGetShMemPtr(pShbInstance);
-
- // if the shared buffer was new created, than this process has
- // to initialize it, otherwise the buffer is already in use
- // and *must not* be reseted
- if (fShbNewCreated) {
-#ifndef NDEBUG
- {
- memset(pShbCirBuff, 0xCC, ulBufferTotalSize);
- }
-#endif
-
- pShbCirBuff->m_ShbCirMagicID = SBC_MAGIC_ID;
- pShbCirBuff->m_ulBufferTotalSize = ulBufferTotalSize;
- pShbCirBuff->m_ulBufferDataSize = ulBufferDataSize;
- pShbCirBuff->m_ulWrIndex = 0;
- pShbCirBuff->m_ulRdIndex = 0;
- pShbCirBuff->m_ulNumOfWriteJobs = 0;
- pShbCirBuff->m_ulDataInUse = 0;
- pShbCirBuff->m_ulDataApended = 0;
- pShbCirBuff->m_ulBlocksApended = 0;
- pShbCirBuff->m_ulDataReadable = 0;
- pShbCirBuff->m_ulBlocksReadable = 0;
- pShbCirBuff->m_pfnSigHndlrNewData = NULL;
- pShbCirBuff->m_fBufferLocked = FALSE;
- pShbCirBuff->m_pfnSigHndlrReset = NULL;
- } else {
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
- }
-
- Exit:
-
- *ppShbInstance_p = pShbInstance;
- *pfShbNewCreated_p = fShbNewCreated;
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Release Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirReleaseBuffer(tShbInstance pShbInstance_p)
-{
-
- tShbError ShbError;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- ShbError = kShbOk;
- goto Exit;
- }
-
- ShbError = ShbIpcReleaseBuffer(pShbInstance_p);
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Reset Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirResetBuffer(tShbInstance pShbInstance_p,
- unsigned long ulTimeOut_p,
- tShbCirSigHndlrReset pfnSignalHandlerReset_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- unsigned long ulNumOfWriteJobs = 0; // d.k. GCC complains about uninitialized variable otherwise
- tShbError ShbError;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- // start reset job by setting request request in buffer header
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- if (!pShbCirBuff->m_fBufferLocked) {
- ulNumOfWriteJobs = pShbCirBuff->m_ulNumOfWriteJobs;
-
- pShbCirBuff->m_fBufferLocked = TRUE;
- pShbCirBuff->m_pfnSigHndlrReset =
- pfnSignalHandlerReset_p;
- } else {
- ShbError = kShbAlreadyReseting;
- }
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- if (ShbError != kShbOk) {
- goto Exit;
- }
-
- // if there is currently no running write operation then reset buffer
- // immediately, otherwise wait until the last write job is ready by
- // starting a signal process
- if (ulNumOfWriteJobs == 0) {
- // there is currently no running write operation
- // -> reset buffer immediately
- ShbCirSignalHandlerReset(pShbInstance_p, FALSE);
- ShbError = kShbOk;
- } else {
- // there is currently at least one running write operation
- // -> starting signal process to wait until the last write job is ready
- ShbError =
- ShbIpcStartSignalingJobReady(pShbInstance_p, ulTimeOut_p,
- ShbCirSignalHandlerReset);
- }
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Write data block to Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirWriteDataBlock(tShbInstance pShbInstance_p,
- const void *pSrcDataBlock_p,
- unsigned long ulDataBlockSize_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- tShbCirBlockSize ShbCirBlockSize;
- unsigned int uiFullBlockSize;
- unsigned int uiAlignFillBytes;
- unsigned char *pShbCirDataPtr;
- unsigned char *pScrDataPtr;
- unsigned long ulDataSize;
- unsigned long ulChunkSize;
- unsigned long ulWrIndex = 0; // d.k. GCC complains about uninitialized variable otherwise
- unsigned int fSignalNewData;
- unsigned int fSignalReset;
- tShbError ShbError;
- tShbError ShbError2;
- int fRes;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- if ((pSrcDataBlock_p == NULL) || (ulDataBlockSize_p == 0)) {
- // nothing to do here
- ShbError = kShbOk;
- goto Exit;
- }
-
- if (ulDataBlockSize_p > SBC_MAX_BLOCK_SIZE) {
- ShbError = kShbExceedDataSizeLimit;
- goto Exit;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- pScrDataPtr = (unsigned char *)pSrcDataBlock_p;
- fSignalNewData = FALSE;
- fSignalReset = FALSE;
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- // calculate data block size in circular buffer
- ulDataSize =
- (ulDataBlockSize_p +
- (SBC_BLOCK_ALIGNMENT - 1)) & ~(SBC_BLOCK_ALIGNMENT - 1);
- uiFullBlockSize = ulDataSize + sizeof(tShbCirBlockSize); // data size + header
- uiAlignFillBytes = ulDataSize - ulDataBlockSize_p;
-
- ShbCirBlockSize.m_uiFullBlockSize = uiFullBlockSize;
- ShbCirBlockSize.m_uiAlignFillBytes = uiAlignFillBytes;
-
- // reserve the needed memory for the write operation to do now
- // and make necessary adjustments in the circular buffer header
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- // check if there is sufficient memory available to store
- // the new data
- fRes =
- uiFullBlockSize <=
- (pShbCirBuff->m_ulBufferDataSize -
- pShbCirBuff->m_ulDataInUse);
- if (fRes) {
- // set write pointer for the write operation to do now
- // to the current write pointer of the circular buffer
- ulWrIndex = pShbCirBuff->m_ulWrIndex;
-
- // reserve the needed memory for the write operation to do now
- pShbCirBuff->m_ulDataInUse += uiFullBlockSize;
-
- // set new write pointer behind the reserved memory
- // for the write operation to do now
- pShbCirBuff->m_ulWrIndex += uiFullBlockSize;
- pShbCirBuff->m_ulWrIndex %=
- pShbCirBuff->m_ulBufferDataSize;
-
- // increment number of currently (parallel running)
- // write operations
- pShbCirBuff->m_ulNumOfWriteJobs++;
- }
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- if (!fRes) {
- ShbError = kShbBufferFull;
- goto Exit;
- }
-
- // copy the data to the circular buffer
- // (the copy process itself will be done outside of any
- // critical/locked section)
- pShbCirDataPtr = &pShbCirBuff->m_Data; // ptr to start of data area
-
- // write real size of current block (incl. alignment fill bytes)
- *(tShbCirBlockSize *) (pShbCirDataPtr + ulWrIndex) = ShbCirBlockSize;
- ulWrIndex += sizeof(tShbCirBlockSize);
- ulWrIndex %= pShbCirBuff->m_ulBufferDataSize;
-
- if (ulWrIndex + ulDataBlockSize_p <= pShbCirBuff->m_ulBufferDataSize) {
- // linear write operation
- memcpy(pShbCirDataPtr + ulWrIndex, pScrDataPtr,
- ulDataBlockSize_p);
- } else {
- // wrap-around write operation
- ulChunkSize = pShbCirBuff->m_ulBufferDataSize - ulWrIndex;
- memcpy(pShbCirDataPtr + ulWrIndex, pScrDataPtr, ulChunkSize);
- memcpy(pShbCirDataPtr, pScrDataPtr + ulChunkSize,
- ulDataBlockSize_p - ulChunkSize);
- }
-
- // adjust header information for circular buffer with properties
- // of the wiritten data block
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- pShbCirBuff->m_ulDataApended += uiFullBlockSize;
- pShbCirBuff->m_ulBlocksApended++;
-
- // decrement number of currently (parallel running) write operations
- if (!--pShbCirBuff->m_ulNumOfWriteJobs) {
- // if there is no other write process running then
- // set new size of readable (complete written) data and
- // adjust number of readable blocks
- pShbCirBuff->m_ulDataReadable +=
- pShbCirBuff->m_ulDataApended;
- pShbCirBuff->m_ulBlocksReadable +=
- pShbCirBuff->m_ulBlocksApended;
-
- pShbCirBuff->m_ulDataApended = 0;
- pShbCirBuff->m_ulBlocksApended = 0;
-
- fSignalNewData = TRUE;
- fSignalReset = pShbCirBuff->m_fBufferLocked;
- }
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- // signal new data event to a potentially reading application
- if (fSignalNewData) {
- ShbError2 = ShbIpcSignalNewData(pShbInstance_p);
- if (ShbError == kShbOk) {
- ShbError = ShbError2;
- }
- }
- // signal that the last write job has been finished to allow
- // a waiting application to reset the buffer now
- if (fSignalReset) {
- ShbError2 = ShbIpcSignalJobReady(pShbInstance_p);
- if (ShbError == kShbOk) {
- ShbError = ShbError2;
- }
- }
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Allocate block within the Circular Shared Buffer for chunk writing
-//---------------------------------------------------------------------------
-
-tShbError ShbCirAllocDataBlock(tShbInstance pShbInstance_p,
- tShbCirChunk * pShbCirChunk_p,
- unsigned long ulDataBufferSize_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- tShbCirBlockSize ShbCirBlockSize;
- unsigned int uiFullBlockSize;
- unsigned int uiAlignFillBytes;
- unsigned char *pShbCirDataPtr;
- unsigned long ulDataSize;
- unsigned long ulWrIndex = 0; // d.k. GCC complains about uninitialized variable otherwise
- tShbError ShbError;
- int fRes;
-
- // check arguments
- if ((pShbInstance_p == NULL) || (pShbCirChunk_p == NULL)) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- if (ulDataBufferSize_p == 0) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- if (ulDataBufferSize_p > SBC_MAX_BLOCK_SIZE) {
- ShbError = kShbExceedDataSizeLimit;
- goto Exit;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- // calculate data block size in circular buffer
- ulDataSize =
- (ulDataBufferSize_p +
- (SBC_BLOCK_ALIGNMENT - 1)) & ~(SBC_BLOCK_ALIGNMENT - 1);
- uiFullBlockSize = ulDataSize + sizeof(tShbCirBlockSize); // data size + header
- uiAlignFillBytes = ulDataSize - ulDataBufferSize_p;
-
- ShbCirBlockSize.m_uiFullBlockSize = uiFullBlockSize;
- ShbCirBlockSize.m_uiAlignFillBytes = uiAlignFillBytes;
-
- // reserve the needed memory for the write operation to do now
- // and make necessary adjustments in the circular buffer header
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- // check if there is sufficient memory available to store
- // the new data
- fRes =
- (uiFullBlockSize <=
- (pShbCirBuff->m_ulBufferDataSize -
- pShbCirBuff->m_ulDataInUse));
- if (fRes) {
- // set write pointer for the write operation to do now
- // to the current write pointer of the circular buffer
- ulWrIndex = pShbCirBuff->m_ulWrIndex;
-
- // reserve the needed memory for the write operation to do now
- pShbCirBuff->m_ulDataInUse += uiFullBlockSize;
-
- // set new write pointer behind the reserved memory
- // for the write operation to do now
- pShbCirBuff->m_ulWrIndex += uiFullBlockSize;
- pShbCirBuff->m_ulWrIndex %=
- pShbCirBuff->m_ulBufferDataSize;
-
- // increment number of currently (parallel running)
- // write operations
- pShbCirBuff->m_ulNumOfWriteJobs++;
- }
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- if (!fRes) {
- ShbError = kShbBufferFull;
- goto Exit;
- }
-
- // setup header information for allocated buffer
- pShbCirDataPtr = &pShbCirBuff->m_Data; // ptr to start of data area
-
- // write real size of current block (incl. alignment fill bytes)
- *(tShbCirBlockSize *) (pShbCirDataPtr + ulWrIndex) = ShbCirBlockSize;
- ulWrIndex += sizeof(tShbCirBlockSize);
- ulWrIndex %= pShbCirBuff->m_ulBufferDataSize;
-
- // setup chunk descriptor
- pShbCirChunk_p->m_uiFullBlockSize = uiFullBlockSize;
- pShbCirChunk_p->m_ulAvailableSize = ulDataBufferSize_p;
- pShbCirChunk_p->m_ulWrIndex = ulWrIndex;
- pShbCirChunk_p->m_fBufferCompleted = FALSE;
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Write data chunk into an allocated buffer of the Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirWriteDataChunk(tShbInstance pShbInstance_p,
- tShbCirChunk *pShbCirChunk_p,
- const void *pSrcDataChunk_p,
- unsigned long ulDataChunkSize_p,
- unsigned int *pfBufferCompleted_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- unsigned char *pShbCirDataPtr;
- unsigned char *pScrDataPtr;
- unsigned long ulSubChunkSize;
- unsigned long ulWrIndex;
- unsigned int fBufferCompleted;
- unsigned int fSignalNewData;
- unsigned int fSignalReset;
- tShbError ShbError;
- tShbError ShbError2;
-
- // check arguments
- if ((pShbInstance_p == NULL) || (pShbCirChunk_p == NULL)
- || (pfBufferCompleted_p == NULL)) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- if ((pSrcDataChunk_p == NULL) || (ulDataChunkSize_p == 0)) {
- // nothing to do here
- ShbError = kShbOk;
- goto Exit;
- }
-
- if (pShbCirChunk_p->m_fBufferCompleted) {
- ShbError = kShbBufferAlreadyCompleted;
- goto Exit;
- }
-
- if (ulDataChunkSize_p > pShbCirChunk_p->m_ulAvailableSize) {
- ShbError = kShbExceedDataSizeLimit;
- goto Exit;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- pScrDataPtr = (unsigned char *)pSrcDataChunk_p;
- fSignalNewData = FALSE;
- fSignalReset = FALSE;
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- ulWrIndex = pShbCirChunk_p->m_ulWrIndex;
-
- // copy the data to the circular buffer
- // (the copy process itself will be done outside of any
- // critical/locked section)
- pShbCirDataPtr = &pShbCirBuff->m_Data; // ptr to start of data area
-
- if (ulWrIndex + ulDataChunkSize_p <= pShbCirBuff->m_ulBufferDataSize) {
- // linear write operation
- memcpy(pShbCirDataPtr + ulWrIndex, pScrDataPtr,
- ulDataChunkSize_p);
- } else {
- // wrap-around write operation
- ulSubChunkSize = pShbCirBuff->m_ulBufferDataSize - ulWrIndex;
- memcpy(pShbCirDataPtr + ulWrIndex, pScrDataPtr, ulSubChunkSize);
- memcpy(pShbCirDataPtr, pScrDataPtr + ulSubChunkSize,
- ulDataChunkSize_p - ulSubChunkSize);
- }
-
- // adjust chunk descriptor
- ulWrIndex += ulDataChunkSize_p;
- ulWrIndex %= pShbCirBuff->m_ulBufferDataSize;
-
- pShbCirChunk_p->m_ulAvailableSize -= ulDataChunkSize_p;
- pShbCirChunk_p->m_ulWrIndex = ulWrIndex;
-
- fBufferCompleted = (pShbCirChunk_p->m_ulAvailableSize == 0);
- pShbCirChunk_p->m_fBufferCompleted = fBufferCompleted;
-
- // if the complete allocated buffer is filled with data then
- // adjust header information for circular buffer with properties
- // of the wiritten data block
- if (fBufferCompleted) {
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- pShbCirBuff->m_ulDataApended +=
- pShbCirChunk_p->m_uiFullBlockSize;
- pShbCirBuff->m_ulBlocksApended++;
-
- // decrement number of currently (parallel running) write operations
- if (!--pShbCirBuff->m_ulNumOfWriteJobs) {
- // if there is no other write process running then
- // set new size of readable (complete written) data and
- // adjust number of readable blocks
- pShbCirBuff->m_ulDataReadable +=
- pShbCirBuff->m_ulDataApended;
- pShbCirBuff->m_ulBlocksReadable +=
- pShbCirBuff->m_ulBlocksApended;
-
- pShbCirBuff->m_ulDataApended = 0;
- pShbCirBuff->m_ulBlocksApended = 0;
-
- fSignalNewData = TRUE;
- fSignalReset = pShbCirBuff->m_fBufferLocked;
- }
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
- }
-
- // signal new data event to a potentially reading application
- if (fSignalNewData) {
- ShbError2 = ShbIpcSignalNewData(pShbInstance_p);
- if (ShbError == kShbOk) {
- ShbError = ShbError2;
- }
- }
- // signal that the last write job has been finished to allow
- // a waiting application to reset the buffer now
- if (fSignalReset) {
- ShbError2 = ShbIpcSignalJobReady(pShbInstance_p);
- if (ShbError == kShbOk) {
- ShbError = ShbError2;
- }
- }
-
- *pfBufferCompleted_p = fBufferCompleted;
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Read data block from Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirReadDataBlock(tShbInstance pShbInstance_p,
- void *pDstDataBlock_p,
- unsigned long ulRdBuffSize_p,
- unsigned long *pulDataBlockSize_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- tShbCirBlockSize ShbCirBlockSize;
- unsigned long ulDataReadable;
- unsigned char *pShbCirDataPtr;
- unsigned char *pDstDataPtr;
- unsigned long ulDataSize = 0; // d.k. GCC complains about uninitialized variable otherwise
- unsigned long ulChunkSize;
- unsigned long ulRdIndex;
- tShbError ShbError;
-
- // check arguments
- if ((pShbInstance_p == NULL) || (pulDataBlockSize_p == NULL)) {
- return (kShbInvalidArg);
- }
-
- if ((pDstDataBlock_p == NULL) || (ulRdBuffSize_p == 0)) {
- // nothing to do here
- ShbError = kShbOk;
- goto Exit;
- }
-
- ShbError = kShbOk;
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- pDstDataPtr = (unsigned char *)pDstDataBlock_p;
- ulDataSize = 0;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- // get total number of readable bytes for the whole circular buffer
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- ulDataReadable = pShbCirBuff->m_ulDataReadable;
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- // if there are readable data available, then there must be at least
- // one complete readable data block
- if (ulDataReadable > 0) {
- // get pointer to start of data area and current read index
- pShbCirDataPtr = &pShbCirBuff->m_Data; // ptr to start of data area
- ulRdIndex = pShbCirBuff->m_ulRdIndex;
-
- // get real size of current block (incl. alignment fill bytes)
- ShbCirBlockSize =
- *(tShbCirBlockSize *) (pShbCirDataPtr + ulRdIndex);
- ulRdIndex += sizeof(tShbCirBlockSize);
- ulRdIndex %= pShbCirBuff->m_ulBufferDataSize;
-
- // get size of user data inside the current block
- ulDataSize =
- ShbCirBlockSize.m_uiFullBlockSize -
- ShbCirBlockSize.m_uiAlignFillBytes;
- ulDataSize -= sizeof(tShbCirBlockSize);
- }
-
- // ulDataSize = MIN(ulDataSize, ulRdBuffSize_p);
- if (ulDataSize > ulRdBuffSize_p) {
- ulDataSize = ulRdBuffSize_p;
- ShbError = kShbDataTruncated;
- }
-
- if (ulDataSize == 0) {
- // nothing to do here
- ShbError = kShbNoReadableData;
- goto Exit;
- }
-
- // copy the data from the circular buffer
- // (the copy process itself will be done outside of any
- // critical/locked section)
- if (ulRdIndex + ulDataSize <= pShbCirBuff->m_ulBufferDataSize) {
- // linear read operation
- memcpy(pDstDataPtr, pShbCirDataPtr + ulRdIndex, ulDataSize);
- } else {
- // wrap-around read operation
- ulChunkSize = pShbCirBuff->m_ulBufferDataSize - ulRdIndex;
- memcpy(pDstDataPtr, pShbCirDataPtr + ulRdIndex, ulChunkSize);
- memcpy(pDstDataPtr + ulChunkSize, pShbCirDataPtr,
- ulDataSize - ulChunkSize);
- }
-
-#ifndef NDEBUG
- {
- tShbCirBlockSize ClrShbCirBlockSize;
-
- if (ulRdIndex + ulDataSize <= pShbCirBuff->m_ulBufferDataSize) {
- // linear buffer
- memset(pShbCirDataPtr + ulRdIndex, 0xDD, ulDataSize);
- } else {
- // wrap-around read operation
- ulChunkSize =
- pShbCirBuff->m_ulBufferDataSize - ulRdIndex;
- memset(pShbCirDataPtr + ulRdIndex, 0xDD, ulChunkSize);
- memset(pShbCirDataPtr, 0xDD, ulDataSize - ulChunkSize);
- }
-
- ClrShbCirBlockSize.m_uiFullBlockSize = /*(unsigned int) */ -1; // -1 = xFFFFFFF
- ClrShbCirBlockSize.m_uiAlignFillBytes = /*(unsigned int) */ -1; // -1 = Fxxxxxxx
- *(tShbCirBlockSize *) (pShbCirDataPtr +
- pShbCirBuff->m_ulRdIndex) =
- ClrShbCirBlockSize;
- }
-#endif // #ifndef NDEBUG
-
- // set new size of readable data, data in use, new read index
- // and adjust number of readable blocks
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- pShbCirBuff->m_ulDataInUse -= ShbCirBlockSize.m_uiFullBlockSize;
- pShbCirBuff->m_ulDataReadable -=
- ShbCirBlockSize.m_uiFullBlockSize;
- pShbCirBuff->m_ulBlocksReadable--;
-
- //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- if ((pShbCirBuff->m_ulDataInUse == 0)
- && (pShbCirBuff->m_ulDataReadable == 0)) {
- ASSERT(pShbCirBuff->m_ulBlocksReadable == 0);
-
- pShbCirBuff->m_ulWrIndex = 0;
- pShbCirBuff->m_ulRdIndex = 0;
- } else
- //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- {
- pShbCirBuff->m_ulRdIndex +=
- ShbCirBlockSize.m_uiFullBlockSize;
- pShbCirBuff->m_ulRdIndex %=
- pShbCirBuff->m_ulBufferDataSize;
- }
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- Exit:
-
- *pulDataBlockSize_p = ulDataSize;
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Get data size of next readable block from Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirGetReadDataSize(tShbInstance pShbInstance_p,
- unsigned long *pulDataBlockSize_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- unsigned long ulDataReadable;
- unsigned char *pShbCirDataPtr;
- tShbCirBlockSize ShbCirBlockSize;
- unsigned long ulDataSize;
- tShbError ShbError;
-
- // check arguments
- if ((pShbInstance_p == NULL) || (pulDataBlockSize_p == NULL)) {
- return (kShbInvalidArg);
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- ulDataSize = 0;
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- // get total number of readable bytes for the whole circular buffer
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- ulDataReadable = pShbCirBuff->m_ulDataReadable;
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- // if there are readable data available, then there must be at least
- // one complete readable data block
- if (ulDataReadable > 0) {
- pShbCirDataPtr =
- &pShbCirBuff->m_Data + pShbCirBuff->m_ulRdIndex;
-
- // get real size of current block (incl. alignment fill bytes)
- ShbCirBlockSize = *(tShbCirBlockSize *) pShbCirDataPtr;
-
- // get size of user data inside the current block
- ulDataSize =
- ShbCirBlockSize.m_uiFullBlockSize -
- ShbCirBlockSize.m_uiAlignFillBytes;
- ulDataSize -= sizeof(tShbCirBlockSize);
- }
-
- Exit:
-
- *pulDataBlockSize_p = ulDataSize;
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Get number of readable blocks from Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbCirGetReadBlockCount(tShbInstance pShbInstance_p,
- unsigned long *pulDataBlockCount_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- unsigned long ulBlockCount;
- tShbError ShbError;
-
- // check arguments
- if ((pShbInstance_p == NULL) || (pulDataBlockCount_p == NULL)) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- ulBlockCount = 0;
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- ulBlockCount = pShbCirBuff->m_ulBlocksReadable;
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- *pulDataBlockCount_p = ulBlockCount;
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Set application handler to signal new data for Circular Shared Buffer
-// d.k.: new parameter priority as enum
-//---------------------------------------------------------------------------
-
-tShbError ShbCirSetSignalHandlerNewData(tShbInstance pShbInstance_p,
- tShbCirSigHndlrNewData pfnSignalHandlerNewData_p,
- tShbPriority ShbPriority_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- tShbError ShbError;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- if (pfnSignalHandlerNewData_p != NULL) {
- // set a new signal handler
- if (pShbCirBuff->m_pfnSigHndlrNewData != NULL) {
- ShbError = kShbAlreadySignaling;
- goto Exit;
- }
-
- pShbCirBuff->m_pfnSigHndlrNewData = pfnSignalHandlerNewData_p;
- ShbError =
- ShbIpcStartSignalingNewData(pShbInstance_p,
- ShbCirSignalHandlerNewData,
- ShbPriority_p);
- } else {
- // remove existing signal handler
- ShbError = ShbIpcStopSignalingNewData(pShbInstance_p);
- if (pShbCirBuff->m_pfnSigHndlrNewData != NULL) {
- pShbCirBuff->m_pfnSigHndlrNewData(pShbInstance_p, 0);
- }
- pShbCirBuff->m_pfnSigHndlrNewData = NULL;
- }
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// DEBUG: Trace Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-#ifndef NDEBUG
-tShbError ShbCirTraceBuffer(tShbInstance pShbInstance_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- char szMagigID[sizeof(SBC_MAGIC_ID) + 1];
- tShbCirBlockSize ShbCirBlockSize;
- unsigned long ulDataReadable;
- unsigned char *pShbCirDataPtr;
- unsigned long ulBlockIndex;
- unsigned int nBlockCount;
- unsigned long ulDataSize;
- unsigned long ulChunkSize;
- unsigned long ulRdIndex;
- tShbError ShbError;
-
- TRACE0("\n\n##### Circular Shared Buffer #####\n");
-
- // check arguments
- if (pShbInstance_p == NULL) {
- TRACE1("\nERROR: invalid buffer address (0x%08lX)\n",
- (unsigned long)pShbInstance_p);
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- *(unsigned long *)&szMagigID[0] = pShbCirBuff->m_ShbCirMagicID;
- szMagigID[sizeof(SBC_MAGIC_ID)] = '\0';
-
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- TRACE1("\nBuffer Address: 0x%08lX\n",
- (unsigned long)pShbCirBuff);
-
- TRACE0("\nHeader Info:");
- TRACE2("\nMagigID: '%s' (%08lX)", szMagigID,
- pShbCirBuff->m_ShbCirMagicID);
- TRACE1("\nBufferTotalSize: %4lu [Bytes]",
- pShbCirBuff->m_ulBufferTotalSize);
- TRACE1("\nBufferDataSize: %4lu [Bytes]",
- pShbCirBuff->m_ulBufferDataSize);
- TRACE1("\nWrIndex: %4lu", pShbCirBuff->m_ulWrIndex);
- TRACE1("\nRdIndex: %4lu", pShbCirBuff->m_ulRdIndex);
- TRACE1("\nNumOfWriteJobs: %4lu",
- pShbCirBuff->m_ulNumOfWriteJobs);
- TRACE1("\nDataInUse: %4lu [Bytes]",
- pShbCirBuff->m_ulDataInUse);
- TRACE1("\nDataApended: %4lu [Bytes]",
- pShbCirBuff->m_ulDataApended);
- TRACE1("\nBlocksApended: %4lu",
- pShbCirBuff->m_ulBlocksApended);
- TRACE1("\nDataReadable: %4lu [Bytes]",
- pShbCirBuff->m_ulDataReadable);
- TRACE1("\nBlocksReadable: %4lu",
- pShbCirBuff->m_ulBlocksReadable);
- TRACE1("\nSigHndlrNewData: %08lX",
- (unsigned long)pShbCirBuff->m_pfnSigHndlrNewData);
- TRACE1("\nBufferLocked: %d", pShbCirBuff->m_fBufferLocked);
- TRACE1("\nSigHndlrReset: %08lX",
- (unsigned long)pShbCirBuff->m_pfnSigHndlrReset);
-
- ShbTraceDump(&pShbCirBuff->m_Data,
- pShbCirBuff->m_ulBufferDataSize, 0x00000000L,
- "\nData Area:");
-
- ulDataReadable = pShbCirBuff->m_ulDataReadable;
- nBlockCount = 1;
- ulBlockIndex = pShbCirBuff->m_ulRdIndex;
-
- while (ulDataReadable > 0) {
- TRACE1("\n\n--- Block #%u ---", nBlockCount);
-
- // get pointer to start of data area and current read index
- pShbCirDataPtr = &pShbCirBuff->m_Data; // ptr to start of data area
- ulRdIndex = ulBlockIndex;
-
- // get real size of current block (incl. alignment fill bytes)
- ShbCirBlockSize =
- *(tShbCirBlockSize *) (pShbCirDataPtr + ulRdIndex);
- ulRdIndex += sizeof(tShbCirBlockSize);
- ulRdIndex %= pShbCirBuff->m_ulBufferDataSize;
-
- // get size of user data inside the current block
- ulDataSize =
- ShbCirBlockSize.m_uiFullBlockSize -
- ShbCirBlockSize.m_uiAlignFillBytes;
- ulDataSize -= sizeof(tShbCirBlockSize);
-
- TRACE1
- ("\nFull Data Size: %4u [Bytes] (incl. header and alignment fill bytes)",
- ShbCirBlockSize.m_uiFullBlockSize);
- TRACE1("\nUser Data Size: %4lu [Bytes]",
- ulDataSize);
- TRACE1("\nAlignment Fill Bytes: %4u [Bytes]",
- ShbCirBlockSize.m_uiAlignFillBytes);
-
- if (ulRdIndex + ulDataSize <=
- pShbCirBuff->m_ulBufferDataSize) {
- // linear data buffer
- ShbTraceDump(pShbCirDataPtr + ulRdIndex,
- ulDataSize, 0x00000000L, NULL);
- } else {
- // wrap-around data buffer
- ulChunkSize =
- pShbCirBuff->m_ulBufferDataSize - ulRdIndex;
- ShbTraceDump(pShbCirDataPtr + ulRdIndex,
- ulChunkSize, 0x00000000L, NULL);
- ShbTraceDump(pShbCirDataPtr,
- ulDataSize - ulChunkSize,
- ulChunkSize, NULL);
- }
-
- nBlockCount++;
-
- ulBlockIndex += ShbCirBlockSize.m_uiFullBlockSize;
- ulBlockIndex %= pShbCirBuff->m_ulBufferDataSize;
-
- ulDataReadable -= ShbCirBlockSize.m_uiFullBlockSize;
- }
-
- ASSERT(pShbCirBuff->m_ulBlocksReadable == nBlockCount - 1);
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- Exit:
-
- return (ShbError);
-
-}
-#endif
-
-//-------------------------------------------------------------------------//
-// //
-// L i n e a r S h a r e d B u f f e r //
-// //
-//-------------------------------------------------------------------------//
-
-//---------------------------------------------------------------------------
-// Allocate Linear Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbLinAllocBuffer(unsigned long ulBufferSize_p,
- const char *pszBufferID_p,
- tShbInstance * ppShbInstance_p,
- unsigned int *pfShbNewCreated_p)
-{
-
- tShbInstance pShbInstance;
- tShbLinBuff *pShbLinBuff;
- unsigned int fShbNewCreated;
- unsigned long ulBufferDataSize;
- unsigned long ulBufferTotalSize;
- tShbError ShbError;
-
- // check arguments
- if ((ulBufferSize_p == 0) || (ppShbInstance_p == NULL)) {
- return (kShbInvalidArg);
- }
-
- // calculate length of memory to allocate
- ulBufferDataSize =
- (ulBufferSize_p +
- (SBL_BLOCK_ALIGNMENT - 1)) & ~(SBL_BLOCK_ALIGNMENT - 1);
- ulBufferTotalSize = ulBufferDataSize + sizeof(tShbLinBuff);
-
- // allocate a new or open an existing shared buffer
- ShbError = ShbIpcAllocBuffer(ulBufferTotalSize, pszBufferID_p,
- &pShbInstance, &fShbNewCreated);
- if (ShbError != kShbOk) {
- goto Exit;
- }
-
- if (pShbInstance == NULL) {
- ShbError = kShbOutOfMem;
- goto Exit;
- }
-
- // get pointer to shared buffer
- pShbLinBuff = (tShbLinBuff *) ShbIpcGetShMemPtr(pShbInstance);
-
- // if the shared buffer was new created, than this process has
- // to initialize it, otherwise the buffer is already in use
- // and *must not* be reseted
- if (fShbNewCreated) {
-#ifndef NDEBUG
- {
- memset(pShbLinBuff, 0xCC, ulBufferTotalSize);
- }
-#endif
-
- pShbLinBuff->m_ShbLinMagicID = SBL_MAGIC_ID;
- pShbLinBuff->m_ulBufferTotalSize = ulBufferTotalSize;
- pShbLinBuff->m_ulBufferDataSize = ulBufferDataSize;
- } else {
- if (pShbLinBuff->m_ShbLinMagicID != SBL_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
- }
-
- Exit:
-
- *ppShbInstance_p = pShbInstance;
- *pfShbNewCreated_p = fShbNewCreated;
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Release Linear Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbLinReleaseBuffer(tShbInstance pShbInstance_p)
-{
-
- tShbError ShbError;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- ShbError = kShbOk;
- goto Exit;
- }
-
- ShbError = ShbIpcReleaseBuffer(pShbInstance_p);
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Write data block to Linear Shared Buffer
-//---------------------------------------------------------------------------
-tShbError ShbLinWriteDataBlock(tShbInstance pShbInstance_p,
- unsigned long ulDstBufferOffs_p,
- const void *pSrcDataBlock_p,
- unsigned long ulDataBlockSize_p)
-{
-
- tShbLinBuff *pShbLinBuff;
- unsigned char *pShbLinDataPtr;
- unsigned char *pScrDataPtr;
- unsigned long ulBufferDataSize;
- tShbError ShbError;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- if ((pSrcDataBlock_p == NULL) || (ulDataBlockSize_p == 0)) {
- // nothing to do here
- ShbError = kShbOk;
- goto Exit;
- }
-
- if (ulDataBlockSize_p > SBL_MAX_BLOCK_SIZE) {
- ShbError = kShbExceedDataSizeLimit;
- goto Exit;
- }
-
- pShbLinBuff = ShbLinGetBuffer(pShbInstance_p);
- pScrDataPtr = (unsigned char *)pSrcDataBlock_p;
- ShbError = kShbOk;
-
- if (pShbLinBuff->m_ShbLinMagicID != SBL_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- // check if offeset and size for the write operation matches with
- // the size of the shared buffer
- ulBufferDataSize = pShbLinBuff->m_ulBufferDataSize;
- if ((ulDstBufferOffs_p > ulBufferDataSize) ||
- (ulDataBlockSize_p > ulBufferDataSize) ||
- ((ulDstBufferOffs_p + ulDataBlockSize_p) > ulBufferDataSize)) {
- ShbError = kShbDataOutsideBufferArea;
- goto Exit;
- }
-
- // copy the data to the linear buffer
- // (the copy process will be done inside of any critical/locked section)
- pShbLinDataPtr = &pShbLinBuff->m_Data; // ptr to start of data area
- pShbLinDataPtr += ulDstBufferOffs_p;
-
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- memcpy(pShbLinDataPtr, pScrDataPtr, ulDataBlockSize_p);
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Read data block from Linear Shared Buffer
-//---------------------------------------------------------------------------
-tShbError ShbLinReadDataBlock(tShbInstance pShbInstance_p,
- void *pDstDataBlock_p,
- unsigned long ulSrcBufferOffs_p,
- unsigned long ulDataBlockSize_p)
-{
-
- tShbLinBuff *pShbLinBuff;
- unsigned char *pShbLinDataPtr;
- unsigned char *pDstDataPtr;
- unsigned long ulBufferDataSize;
- tShbError ShbError;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- if ((pDstDataBlock_p == NULL) || (ulDataBlockSize_p == 0)) {
- // nothing to do here
- ShbError = kShbOk;
- goto Exit;
- }
-
- if (ulDataBlockSize_p > SBL_MAX_BLOCK_SIZE) {
- ShbError = kShbExceedDataSizeLimit;
- goto Exit;
- }
-
- pShbLinBuff = ShbLinGetBuffer(pShbInstance_p);
- pDstDataPtr = (unsigned char *)pDstDataBlock_p;
- ShbError = kShbOk;
-
- if (pShbLinBuff->m_ShbLinMagicID != SBL_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- // check if offeset and size for the read operation matches with
- // the size of the shared buffer
- ulBufferDataSize = pShbLinBuff->m_ulBufferDataSize;
- if ((ulSrcBufferOffs_p > ulBufferDataSize) ||
- (ulDataBlockSize_p > ulBufferDataSize) ||
- ((ulSrcBufferOffs_p + ulDataBlockSize_p) > ulBufferDataSize)) {
- ShbError = kShbDataOutsideBufferArea;
- goto Exit;
- }
-
- // copy the data to the linear buffer
- // (the copy process will be done inside of any critical/locked section)
- pShbLinDataPtr = &pShbLinBuff->m_Data; // ptr to start of data area
- pShbLinDataPtr += ulSrcBufferOffs_p;
-
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- memcpy(pDstDataPtr, pShbLinDataPtr, ulDataBlockSize_p);
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- Exit:
-
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// DEBUG: Trace Linear Shared Buffer
-//---------------------------------------------------------------------------
-
-#ifndef NDEBUG
-tShbError ShbLinTraceBuffer(tShbInstance pShbInstance_p)
-{
-
- tShbLinBuff *pShbLinBuff;
- char szMagigID[sizeof(SBL_MAGIC_ID) + 1];
- tShbError ShbError;
-
- TRACE0("\n\n##### Linear Shared Buffer #####\n");
-
- // check arguments
- if (pShbInstance_p == NULL) {
- TRACE1("\nERROR: invalid buffer address (0x%08lX)\n",
- (unsigned long)pShbInstance_p);
- ShbError = kShbInvalidArg;
- goto Exit;
- }
-
- pShbLinBuff = ShbLinGetBuffer(pShbInstance_p);
- ShbError = kShbOk;
-
- if (pShbLinBuff->m_ShbLinMagicID != SBL_MAGIC_ID) {
- ShbError = kShbInvalidBufferType;
- goto Exit;
- }
-
- *(unsigned int *)&szMagigID[0] = pShbLinBuff->m_ShbLinMagicID;
- szMagigID[sizeof(SBL_MAGIC_ID)] = '\0';
-
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- TRACE1("\nBuffer Address: 0x%08lX\n",
- (unsigned long)pShbLinBuff);
-
- TRACE0("\nHeader Info:");
- TRACE2("\nMagigID: '%s' (%08X)", szMagigID,
- pShbLinBuff->m_ShbLinMagicID);
- TRACE1("\nBufferTotalSize: %4lu [Bytes]",
- pShbLinBuff->m_ulBufferTotalSize);
- TRACE1("\nBufferDataSize: %4lu [Bytes]",
- pShbLinBuff->m_ulBufferDataSize);
-
- ShbTraceDump(&pShbLinBuff->m_Data,
- pShbLinBuff->m_ulBufferDataSize, 0x00000000L,
- "\nData Area:");
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- Exit:
-
- return (ShbError);
-
-}
-#endif
-
-//---------------------------------------------------------------------------
-// Dump buffer contents
-//---------------------------------------------------------------------------
-
-#ifndef NDEBUG
-tShbError ShbTraceDump(const unsigned char *pabStartAddr_p,
- unsigned long ulDataSize_p,
- unsigned long ulAddrOffset_p, const char *pszInfoText_p)
-{
-
- const unsigned char *pabBuffData;
- unsigned long ulBuffSize;
- unsigned char bData;
- int nRow;
- int nCol;
-
- // get pointer to buffer and length of buffer
- pabBuffData = pabStartAddr_p;
- ulBuffSize = ulDataSize_p;
-
- if (pszInfoText_p != NULL) {
- TRACE1("%s", pszInfoText_p);
- }
- // dump buffer contents
- for (nRow = 0;; nRow++) {
- TRACE1("\n%08lX: ",
- (unsigned long)(nRow * 0x10) + ulAddrOffset_p);
-
- for (nCol = 0; nCol < 16; nCol++) {
- if ((unsigned long)nCol < ulBuffSize) {
- TRACE1("%02X ",
- (unsigned int)*(pabBuffData + nCol));
- } else {
- TRACE0(" ");
- }
- }
-
- TRACE0(" ");
-
- for (nCol = 0; nCol < 16; nCol++) {
- bData = *pabBuffData++;
- if ((unsigned long)nCol < ulBuffSize) {
- if ((bData >= 0x20) && (bData < 0x7F)) {
- TRACE1("%c", bData);
- } else {
- TRACE0(".");
- }
- } else {
- TRACE0(" ");
- }
- }
-
- if (ulBuffSize > 16) {
- ulBuffSize -= 16;
- } else {
- break;
- }
- }
-
- return (kShbOk);
-
-}
-#endif // #ifndef NDEBUG
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// Handler to signal new data event for Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-int ShbCirSignalHandlerNewData(tShbInstance pShbInstance_p)
-{
-
- tShbCirBuff *pShbCirBuff;
- unsigned long ulDataSize;
- unsigned long ulBlockCount;
- tShbError ShbError;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- return FALSE;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- ShbError = kShbOk;
-
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- return FALSE;
- }
-
- // call application handler
- if (pShbCirBuff->m_pfnSigHndlrNewData != NULL) {
-/* do
- {*/
- ShbError = ShbCirGetReadDataSize(pShbInstance_p, &ulDataSize);
- if ((ulDataSize > 0) && (ShbError == kShbOk)) {
- pShbCirBuff->m_pfnSigHndlrNewData(pShbInstance_p,
- ulDataSize);
- }
-
- ShbError =
- ShbCirGetReadBlockCount(pShbInstance_p, &ulBlockCount);
-/* }
- while ((ulBlockCount > 0) && (ShbError == kShbOk));*/
- }
- // Return TRUE if there are pending blocks.
- // In that case ShbIpc tries to call this function again immediately if there
- // is no other filled shared buffer with higher priority.
- return ((ulBlockCount > 0) && (ShbError == kShbOk));
-
-}
-
-//---------------------------------------------------------------------------
-// Handler to reset Circular Shared Buffer
-//---------------------------------------------------------------------------
-
-void ShbCirSignalHandlerReset(tShbInstance pShbInstance_p,
- unsigned int fTimeOut_p)
-{
-
- tShbCirBuff *pShbCirBuff;
-
- // check arguments
- if (pShbInstance_p == NULL) {
- return;
- }
-
- pShbCirBuff = ShbCirGetBuffer(pShbInstance_p);
- if (pShbCirBuff->m_ShbCirMagicID != SBC_MAGIC_ID) {
- return;
- }
-
- // reset buffer header
- if (!fTimeOut_p) {
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- pShbCirBuff->m_ulWrIndex = 0;
- pShbCirBuff->m_ulRdIndex = 0;
- pShbCirBuff->m_ulNumOfWriteJobs = 0;
- pShbCirBuff->m_ulDataInUse = 0;
- pShbCirBuff->m_ulDataApended = 0;
- pShbCirBuff->m_ulBlocksApended = 0;
- pShbCirBuff->m_ulDataReadable = 0;
- pShbCirBuff->m_ulBlocksReadable = 0;
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
-#ifndef NDEBUG
- {
- memset(&pShbCirBuff->m_Data, 0xCC,
- pShbCirBuff->m_ulBufferDataSize);
- }
-#endif
- }
-
- // call application handler
- if (pShbCirBuff->m_pfnSigHndlrReset != NULL) {
- pShbCirBuff->m_pfnSigHndlrReset(pShbInstance_p, fTimeOut_p);
- }
-
- // unlock buffer
- ShbIpcEnterAtomicSection(pShbInstance_p);
- {
- pShbCirBuff->m_fBufferLocked = FALSE;
- pShbCirBuff->m_pfnSigHndlrReset = NULL;
- }
- ShbIpcLeaveAtomicSection(pShbInstance_p);
-
- return;
-
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: Project independend shared buffer (linear + circular)
-
- Description: Declaration of platform independend part for the
- shared buffer
-
- 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.
-
- -------------------------------------------------------------------------
-
- 2006/06/27 -rs: V 1.00 (initial version)
-
-****************************************************************************/
-
-#ifndef _SHAREDBUFF_H_
-#define _SHAREDBUFF_H_
-
-//---------------------------------------------------------------------------
-// Type definitions
-//---------------------------------------------------------------------------
-
-typedef enum {
- kShbOk = 0,
- kShbNoReadableData = 1,
- kShbDataTruncated = 2,
- kShbBufferFull = 3,
- kShbDataOutsideBufferArea = 4,
- kShbBufferAlreadyCompleted = 5,
- kShbMemUsedByOtherProcs = 6,
- kShbOpenMismatch = 7,
- kShbInvalidBufferType = 8,
- kShbInvalidArg = 9,
- kShbBufferInvalid = 10,
- kShbOutOfMem = 11,
- kShbAlreadyReseting = 12,
- kShbAlreadySignaling = 13,
- kShbExceedDataSizeLimit = 14,
-
-} tShbError;
-
-// 2006/08/24 d.k.: Priority for threads (new data, job signaling)
-typedef enum {
- kShbPriorityLow = 0,
- kShbPriorityNormal = 1,
- kshbPriorityHigh = 2
-} tShbPriority;
-
-typedef struct {
- unsigned int m_uiFullBlockSize; // real size of allocated block (incl. alignment fill bytes)
- unsigned long m_ulAvailableSize; // still available size for data
- unsigned long m_ulWrIndex; // current write index
- unsigned int m_fBufferCompleted; // TRUE if allocated block is complete filled with data
-
-} tShbCirChunk;
-
-typedef void *tShbInstance;
-
-typedef void (*tShbCirSigHndlrNewData) (tShbInstance pShbInstance_p,
- unsigned long ulDataBlockSize_p);
-typedef void (*tShbCirSigHndlrReset) (tShbInstance pShbInstance_p,
- unsigned int fTimeOut_p);
-
-//---------------------------------------------------------------------------
-// Prototypes
-//---------------------------------------------------------------------------
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- tShbError ShbInit(void);
- tShbError ShbExit(void);
-
-// Circular Shared Buffer
- tShbError ShbCirAllocBuffer(unsigned long ulBufferSize_p,
- const char *pszBufferID_p,
- tShbInstance * ppShbInstance_p,
- unsigned int *pfShbNewCreated_p);
- tShbError ShbCirReleaseBuffer(tShbInstance pShbInstance_p);
-
-
- tShbError ShbCirResetBuffer(tShbInstance pShbInstance_p,
- unsigned long ulTimeOut_p,
- tShbCirSigHndlrReset
- pfnSignalHandlerReset_p);
- tShbError ShbCirWriteDataBlock(tShbInstance pShbInstance_p,
- const void *pSrcDataBlock_p,
- unsigned long ulDataBlockSize_p);
- tShbError ShbCirAllocDataBlock(tShbInstance pShbInstance_p,
- tShbCirChunk * pShbCirChunk_p,
- unsigned long ulDataBufferSize_p);
- tShbError ShbCirWriteDataChunk(tShbInstance pShbInstance_p,
- tShbCirChunk * pShbCirChunk_p,
- const void *pSrcDataChunk_p,
- unsigned long ulDataChunkSize_p,
- unsigned int *pfBufferCompleted_p);
- tShbError ShbCirReadDataBlock(tShbInstance pShbInstance_p,
- void *pDstDataBlock_p,
- unsigned long ulRdBuffSize_p,
- unsigned long *pulDataBlockSize_p);
- tShbError ShbCirGetReadDataSize(tShbInstance pShbInstance_p,
- unsigned long *pulDataBlockSize_p);
- tShbError ShbCirGetReadBlockCount(tShbInstance pShbInstance_p,
- unsigned long *pulDataBlockCount_p);
- tShbError ShbCirSetSignalHandlerNewData(tShbInstance pShbInstance_p,
- tShbCirSigHndlrNewData
- pfnShbSignalHandlerNewData_p,
- tShbPriority ShbPriority_p);
-
-
-// Linear Shared Buffer
- tShbError ShbLinAllocBuffer(unsigned long ulBufferSize_p,
- const char *pszBufferID_p,
- tShbInstance * ppShbInstance_p,
- unsigned int *pfShbNewCreated_p);
- tShbError ShbLinReleaseBuffer(tShbInstance pShbInstance_p);
-
-
- tShbError ShbLinWriteDataBlock(tShbInstance pShbInstance_p,
- unsigned long ulDstBufferOffs_p,
- const void *pSrcDataBlock_p,
- unsigned long ulDataBlockSize_p);
- tShbError ShbLinReadDataBlock(tShbInstance pShbInstance_p,
- void *pDstDataBlock_p,
- unsigned long ulSrcBufferOffs_p,
- unsigned long ulDataBlockSize_p);
-
-
-#ifndef NDEBUG
- tShbError ShbCirTraceBuffer(tShbInstance pShbInstance_p);
- tShbError ShbLinTraceBuffer(tShbInstance pShbInstance_p);
- tShbError ShbTraceDump(const unsigned char *pabStartAddr_p,
- unsigned long ulDataSize_p,
- unsigned long ulAddrOffset_p,
- const char *pszInfoText_p);
-#else
-#define ShbCirTraceBuffer(p0)
-#define ShbLinTraceBuffer(p0)
-#define ShbTraceDump(p0, p1, p2, p3)
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-#endif // #ifndef _SHAREDBUFF_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: Project independend shared buffer (linear + circular)
-
- Description: Implementation of platform specific part for the
- shared buffer
- (Implementation for Linux KernelSpace)
-
- 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.
-
- -------------------------------------------------------------------------
-
- 2006/06/28 -rs: V 1.00 (initial version)
-
-****************************************************************************/
-
-#include "global.h"
-#include "SharedBuff.h"
-#include "ShbIpc.h"
-#include "ShbLinuxKernel.h"
-#include "Debug.h"
-
-#include <linux/string.h>
-#include <linux/module.h>
-#include <asm/processor.h>
-//#include <linux/vmalloc.h>
-#include <linux/sched.h>
-#include <linux/param.h>
-#include <linux/spinlock.h>
-#include <linux/wait.h>
-#include <linux/completion.h>
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// Configuration
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Constant definitions
-//---------------------------------------------------------------------------
-
-#define MAX_LEN_BUFFER_ID 256
-
-#define TIMEOUT_ENTER_ATOMIC 1000 // (ms) for debgging: INFINITE
-#define TIMEOUT_TERM_THREAD 1000
-#define INFINITE 3600
-
-#define SBI_MAGIC_ID 0x5342492B // magic ID ("SBI+")
-#define SBH_MAGIC_ID 0x5342482A // magic ID ("SBH*")
-
-#define INVALID_ID -1
-
-#define TABLE_SIZE 10
-
-//---------------------------------------------------------------------------
-// Local types
-//---------------------------------------------------------------------------
-
-// This structure is the common header for the shared memory region used
-// by all processes attached this shared memory. It includes common
-// information to administrate/manage the shared buffer from a couple of
-// separated processes (e.g. the refernce counter). This structure is
-// located at the start of the shared memory region itself and exists
-// consequently only one times per shared memory instance.
-typedef struct {
-
- unsigned long m_ulShMemSize;
- unsigned long m_ulRefCount;
- int m_iBufferId;
-// int m_iUserSpaceMem; //0 for userspace mem !=0 kernelspace mem
- spinlock_t m_SpinlockBuffAccess;
- BOOL m_fNewData;
- BOOL m_fJobReady;
- wait_queue_head_t m_WaitQueueNewData;
- wait_queue_head_t m_WaitQueueJobReady;
-
-#ifndef NDEBUG
- unsigned long m_ulOwnerProcID;
-#endif
-
-} tShbMemHeader;
-
-// This structure is the "external entry point" from a separate process
-// to get access to a shared buffer. This structure includes all platform
-// resp. target specific information to administrate/manage the shared
-// buffer from a separate process. Every process attached to the shared
-// buffer has its own runtime instance of this structure with its individual
-// runtime data (e.g. the scope of an event handle is limitted to the
-// owner process only). The structure member <m_pShbMemHeader> points
-// to the (process specific) start address of the shared memory region
-// itself.
-typedef struct {
- unsigned long m_SbiMagicID; // magic ID ("SBI+")
-// void* m_pSharedMem;
- int m_tThreadNewDataId;
- long m_lThreadNewDataNice; // nice value of the new data thread
- int m_tThreadJobReadyId;
- unsigned long m_ulFlagsBuffAccess; // d.k. moved from tShbMemHeader, because each
- // process needs to store the interrupt flags separately
- tSigHndlrNewData m_pfnSigHndlrNewData;
- unsigned long m_ulTimeOutJobReady;
- tSigHndlrJobReady m_pfnSigHndlrJobReady;
- tShbMemHeader *m_pShbMemHeader;
- int m_iThreadTermFlag;
- struct completion m_CompletionNewData;
-/*
- struct semaphore *m_pSemBuffAccess;
- struct semaphore *m_pSemNewData;
- struct semaphore *m_pSemStopSignalingNewData;
- struct semaphore *m_pSemJobReady;
-*/
-#ifndef NDEBUG
- unsigned long m_ulThreadIDNewData;
- unsigned long m_ulThreadIDJobReady;
-#endif
-} tShbMemInst;
-
-//---------------------------------------------------------------------------
-// Prototypes of internal functions
-//---------------------------------------------------------------------------
-
-//tShbMemInst* ShbIpcGetShbMemInst (tShbInstance pShbInstance_p);
-//tShbMemHeader* ShbIpcGetShbMemHeader (tShbMemInst* pShbMemInst_p);
-
-//---------------------------------------------------------------------------
-// Get pointer to process local information structure
-//---------------------------------------------------------------------------
-
-static inline tShbMemInst *ShbIpcGetShbMemInst(tShbInstance pShbInstance_p)
-{
-
- tShbMemInst *pShbMemInst;
-
- pShbMemInst = (tShbMemInst *) pShbInstance_p;
-
- return (pShbMemInst);
-
-}
-
-//---------------------------------------------------------------------------
-// Get pointer to shared memory header
-//---------------------------------------------------------------------------
-
-static inline tShbMemHeader *ShbIpcGetShbMemHeader(tShbMemInst * pShbMemInst_p)
-{
-
- tShbMemHeader *pShbMemHeader;
-
- pShbMemHeader = pShbMemInst_p->m_pShbMemHeader;
-
- return (pShbMemHeader);
-
-}
-
-// Get pointer to process local information structure
-//#define ShbIpcGetShbMemInst(pShbInstance_p) ((tShbMemInst*)pShbInstance_p)
-
-// Get pointer to shared memory header
-//#define ShbIpcGetShbMemHeader(pShbMemInst_p) (pShbMemInst_p->m_pShbMemHeader)
-
-// not inlined internal functions
-int ShbIpcThreadSignalNewData(void *pvThreadParam_p);
-int ShbIpcThreadSignalJobReady(void *pvThreadParam_p);
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-struct sShbMemTable *psMemTableElementFirst_g;
-
-static void *ShbIpcAllocPrivateMem(unsigned long ulMemSize_p);
-static int ShbIpcFindListElement(int iBufferId,
- struct sShbMemTable
- **ppsReturnMemTableElement);
-static void ShbIpcAppendListElement(struct sShbMemTable *sNewMemTableElement);
-static void ShbIpcDeleteListElement(int iBufferId);
-static void ShbIpcCrc32GenTable(unsigned long aulCrcTable[256]);
-static unsigned long ShbIpcCrc32GetCrc(const char *pcString,
- unsigned long aulCrcTable[256]);
-
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-// not inlined external functions
-
-//---------------------------------------------------------------------------
-// Initialize IPC for Shared Buffer Module
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcInit(void)
-{
- psMemTableElementFirst_g = NULL;
- return (kShbOk);
-
-}
-
-//---------------------------------------------------------------------------
-// Deinitialize IPC for Shared Buffer Module
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcExit(void)
-{
-
- return (kShbOk);
-
-}
-
-//---------------------------------------------------------------------------
-// Allocate Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcAllocBuffer(unsigned long ulBufferSize_p,
- const char *pszBufferID_p,
- tShbInstance * ppShbInstance_p,
- unsigned int *pfShbNewCreated_p)
-{
- tShbError ShbError;
- int iBufferId = 0;
- unsigned long ulCrc32 = 0;
- unsigned int uiFirstProcess = 0;
- unsigned long ulShMemSize;
- tShbMemHeader *pShbMemHeader;
- tShbMemInst *pShbMemInst = NULL;
- tShbInstance pShbInstance;
- unsigned int fShMemNewCreated = FALSE;
- void *pSharedMem = NULL;
- unsigned long aulCrcTable[256];
- struct sShbMemTable *psMemTableElement;
-
- DEBUG_LVL_29_TRACE0("ShbIpcAllocBuffer \n");
- ulShMemSize = ulBufferSize_p + sizeof(tShbMemHeader);
-
- //create Buffer ID
- ShbIpcCrc32GenTable(aulCrcTable);
- ulCrc32 = ShbIpcCrc32GetCrc(pszBufferID_p, aulCrcTable);
- iBufferId = ulCrc32;
- DEBUG_LVL_29_TRACE2
- ("ShbIpcAllocBuffer BufferSize:%d sizeof(tShb..):%d\n",
- ulBufferSize_p, sizeof(tShbMemHeader));
- DEBUG_LVL_29_TRACE2("ShbIpcAllocBuffer BufferId:%d MemSize:%d\n",
- iBufferId, ulShMemSize);
- //---------------------------------------------------------------
- // (1) open an existing or create a new shared memory
- //---------------------------------------------------------------
- //test if buffer already exists
- if (ShbIpcFindListElement(iBufferId, &psMemTableElement) == 0) {
- //Buffer already exists
- fShMemNewCreated = FALSE;
- pSharedMem = psMemTableElement->m_pBuffer;
- DEBUG_LVL_29_TRACE1
- ("ShbIpcAllocBuffer attach Buffer at:%p Id:%d\n",
- pSharedMem);
- uiFirstProcess = 1;
- } else {
- //create new Buffer
- fShMemNewCreated = TRUE;
- uiFirstProcess = 0;
- pSharedMem = kmalloc(ulShMemSize, GFP_KERNEL);
- DEBUG_LVL_29_TRACE2
- ("ShbIpcAllocBuffer Create New Buffer at:%p Id:%d\n",
- pSharedMem, iBufferId);
- if (pSharedMem == NULL) {
- //unable to create mem
- ShbError = kShbOutOfMem;
- goto Exit;
- }
- DEBUG_LVL_29_TRACE0("ShbIpcAllocBuffer create semas\n");
- // append Element to Mem Table
- psMemTableElement =
- kmalloc(sizeof(struct sShbMemTable), GFP_KERNEL);
- psMemTableElement->m_iBufferId = iBufferId;
- psMemTableElement->m_pBuffer = pSharedMem;
- psMemTableElement->m_psNextMemTableElement = NULL;
- ShbIpcAppendListElement(psMemTableElement);
- }
-
- DEBUG_LVL_29_TRACE0("ShbIpcAllocBuffer update header\n");
- //update header
- pShbMemHeader = (tShbMemHeader *) pSharedMem;
- DEBUG_LVL_29_TRACE1
- ("ShbIpcAllocBuffer 0 pShbMemHeader->m_ulShMemSize: %d\n",
- pShbMemHeader->m_ulShMemSize);
- // allocate a memory block from process specific mempool to save
- // process local information to administrate/manage the shared buffer
- DEBUG_LVL_29_TRACE0("ShbIpcAllocBuffer alloc private mem\n");
- pShbMemInst =
- (tShbMemInst *) ShbIpcAllocPrivateMem(sizeof(tShbMemInst));
- if (pShbMemInst == NULL) {
- ShbError = kShbOutOfMem;
- goto Exit;
- }
- // reset complete header to default values
- //pShbMemInst->m_SbiMagicID = SBI_MAGIC_ID;
-// pShbMemInst->m_pSharedMem = pSharedMem;
- pShbMemInst->m_tThreadNewDataId = INVALID_ID;
- pShbMemInst->m_tThreadJobReadyId = INVALID_ID;
- pShbMemInst->m_pfnSigHndlrNewData = NULL;
- pShbMemInst->m_ulTimeOutJobReady = 0;
- pShbMemInst->m_pfnSigHndlrJobReady = NULL;
- pShbMemInst->m_pShbMemHeader = pShbMemHeader;
- pShbMemInst->m_iThreadTermFlag = 0;
-
- // initialize completion etc.
- init_completion(&pShbMemInst->m_CompletionNewData);
-
- ShbError = kShbOk;
- if (fShMemNewCreated) {
- // this process was the first who wanted to use the shared memory,
- // so a new shared memory was created
- // -> setup new header information inside the shared memory region
- // itself
- pShbMemHeader->m_ulShMemSize = ulShMemSize;
- pShbMemHeader->m_ulRefCount = 1;
- pShbMemHeader->m_iBufferId = iBufferId;
- // initialize spinlock
- spin_lock_init(&pShbMemHeader->m_SpinlockBuffAccess);
- // initialize wait queues
- init_waitqueue_head(&pShbMemHeader->m_WaitQueueNewData);
- init_waitqueue_head(&pShbMemHeader->m_WaitQueueJobReady);
- } else {
- // any other process has created the shared memory and this
- // process only has to attach to it
- // -> check and update existing header information inside the
- // shared memory region itself
- if (pShbMemHeader->m_ulShMemSize != ulShMemSize) {
- ShbError = kShbOpenMismatch;
- goto Exit;
- }
- pShbMemHeader->m_ulRefCount++;
- }
-
- Exit:
- pShbInstance = (tShbInstance *) pShbMemInst;
- *pfShbNewCreated_p = fShMemNewCreated;
- *ppShbInstance_p = pShbInstance;
- return (ShbError);
-
-}
-
-//---------------------------------------------------------------------------
-// Release Shared Buffer
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcReleaseBuffer(tShbInstance pShbInstance_p)
-{
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- tShbError ShbError;
- tShbError ShbError2;
-
- DEBUG_LVL_26_TRACE1("ShbIpcReleaseBuffer(%p)\n", pShbInstance_p);
- if (pShbInstance_p == NULL) {
- return (kShbOk);
- }
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance_p);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
-
- // stop threads in any case, because they are bound to that specific instance
- ShbError2 = ShbIpcStopSignalingNewData(pShbInstance_p);
- // d.k.: Whats up with JobReady thread?
- // Just wake it up, but without setting the semaphore variable
- wake_up_interruptible(&pShbMemHeader->m_WaitQueueJobReady);
-
- if (!--pShbMemHeader->m_ulRefCount) {
- ShbError = kShbOk;
- // delete mem table element
- ShbIpcDeleteListElement(pShbMemHeader->m_iBufferId);
- // delete shared mem
- kfree(pShbMemInst->m_pShbMemHeader);
- } else {
- ShbError = kShbMemUsedByOtherProcs;
- }
- //delete privat mem
- kfree(pShbMemInst);
- return (ShbError);
-}
-
-//---------------------------------------------------------------------------
-// Enter atomic section for Shared Buffer access
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcEnterAtomicSection(tShbInstance pShbInstance_p)
-{
-
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- tShbError ShbError = kShbOk;
-
- if (pShbInstance_p == NULL) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
- DEBUG_LVL_29_TRACE0("enter atomic\n");
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance_p);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
-
- // lock interrupts
- spin_lock_irqsave(&pShbMemHeader->m_SpinlockBuffAccess,
- pShbMemInst->m_ulFlagsBuffAccess);
-
- Exit:
- return ShbError;
-
-}
-
-//---------------------------------------------------------------------------
-// Leave atomic section for Shared Buffer access
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcLeaveAtomicSection(tShbInstance pShbInstance_p)
-{
-
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- tShbError ShbError = kShbOk;
-
- if (pShbInstance_p == NULL) {
- ShbError = kShbInvalidArg;
- goto Exit;
- }
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance_p);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
- // unlock interrupts
- spin_unlock_irqrestore(&pShbMemHeader->m_SpinlockBuffAccess,
- pShbMemInst->m_ulFlagsBuffAccess);
-
- Exit:
- DEBUG_LVL_29_TRACE0("Leave Atomic \n");
- return ShbError;
-
-}
-
-//---------------------------------------------------------------------------
-// Start signaling of new data (called from reading process)
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcStartSignalingNewData(tShbInstance pShbInstance_p,
- tSigHndlrNewData pfnSignalHandlerNewData_p,
- tShbPriority ShbPriority_p)
-{
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- tShbError ShbError;
-
- DEBUG_LVL_29_TRACE0("------->ShbIpcStartSignalingNewData\n");
- if ((pShbInstance_p == NULL) || (pfnSignalHandlerNewData_p == NULL)) {
- return (kShbInvalidArg);
- }
-
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance_p);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
- ShbError = kShbOk;
-
- if ((pShbMemInst->m_tThreadNewDataId != INVALID_ID)
- || (pShbMemInst->m_pfnSigHndlrNewData != NULL)) {
- ShbError = kShbAlreadySignaling;
- goto Exit;
- }
- DEBUG_LVL_26_TRACE2
- ("ShbIpcStartSignalingNewData(%p) m_pfnSigHndlrNewData = %p\n",
- pShbInstance_p, pfnSignalHandlerNewData_p);
- pShbMemInst->m_pfnSigHndlrNewData = pfnSignalHandlerNewData_p;
- pShbMemHeader->m_fNewData = FALSE;
- pShbMemInst->m_iThreadTermFlag = 0;
-
- switch (ShbPriority_p) {
- case kShbPriorityLow:
- pShbMemInst->m_lThreadNewDataNice = -2;
- break;
-
- case kShbPriorityNormal:
- pShbMemInst->m_lThreadNewDataNice = -9;
- break;
-
- case kshbPriorityHigh:
- pShbMemInst->m_lThreadNewDataNice = -20;
- break;
-
- }
-
- //create thread for signalling new data
- pShbMemInst->m_tThreadNewDataId =
- kernel_thread(ShbIpcThreadSignalNewData, pShbInstance_p,
- CLONE_FS | CLONE_FILES);
-
- Exit:
- return ShbError;
-
-}
-
-//---------------------------------------------------------------------------
-// Stop signaling of new data (called from reading process)
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcStopSignalingNewData(tShbInstance pShbInstance_p)
-{
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- tShbError ShbError;
-
- DEBUG_LVL_29_TRACE0("------->ShbIpcStopSignalingNewData\n");
- if (pShbInstance_p == NULL) {
- return (kShbInvalidArg);
- }
- ShbError = kShbOk;
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance_p);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
-
- DEBUG_LVL_26_TRACE2
- ("ShbIpcStopSignalingNewData(%p) pfnSignHndlrNewData=%p\n",
- pShbInstance_p, pShbMemInst->m_pfnSigHndlrNewData);
- if (pShbMemInst->m_pfnSigHndlrNewData != NULL) { // signal handler was set before
- int iErr;
- //set termination flag in mem header
- pShbMemInst->m_iThreadTermFlag = 1;
-
- // check if thread is still running at all by sending the null-signal to this thread
- /* iErr = kill_proc(pShbMemInst->m_tThreadNewDataId, 0, 1); */
- iErr = send_sig(0, pShbMemInst->m_tThreadNewDataId, 1);
- if (iErr == 0) {
- // wake up thread, because it is still running
- wake_up_interruptible(&pShbMemHeader->
- m_WaitQueueNewData);
-
- //wait for termination of thread
- wait_for_completion(&pShbMemInst->m_CompletionNewData);
- }
-
- pShbMemInst->m_pfnSigHndlrNewData = NULL;
- pShbMemInst->m_tThreadNewDataId = INVALID_ID;
- }
-
- return ShbError;
-
-}
-
-//---------------------------------------------------------------------------
-// Signal new data (called from writing process)
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcSignalNewData(tShbInstance pShbInstance_p)
-{
- tShbMemHeader *pShbMemHeader;
-
- if (pShbInstance_p == NULL) {
- return (kShbInvalidArg);
- }
- pShbMemHeader =
- ShbIpcGetShbMemHeader(ShbIpcGetShbMemInst(pShbInstance_p));
- //set semaphore
- pShbMemHeader->m_fNewData = TRUE;
- DEBUG_LVL_29_TRACE0("ShbIpcSignalNewData set Sem -> New Data\n");
-
- wake_up_interruptible(&pShbMemHeader->m_WaitQueueNewData);
- return (kShbOk);
-}
-
-//---------------------------------------------------------------------------
-// Start signaling for job ready (called from waiting process)
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcStartSignalingJobReady(tShbInstance pShbInstance_p,
- unsigned long ulTimeOut_p,
- tSigHndlrJobReady pfnSignalHandlerJobReady_p)
-{
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- tShbError ShbError;
-
- if ((pShbInstance_p == NULL) || (pfnSignalHandlerJobReady_p == NULL)) {
- return (kShbInvalidArg);
- }
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance_p);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
-
- ShbError = kShbOk;
- if ((pShbMemInst->m_tThreadJobReadyId != INVALID_ID)
- || (pShbMemInst->m_pfnSigHndlrJobReady != NULL)) {
- ShbError = kShbAlreadySignaling;
- goto Exit;
- }
- pShbMemInst->m_ulTimeOutJobReady = ulTimeOut_p;
- pShbMemInst->m_pfnSigHndlrJobReady = pfnSignalHandlerJobReady_p;
- pShbMemHeader->m_fJobReady = FALSE;
- //create thread for signalling new data
- pShbMemInst->m_tThreadJobReadyId =
- kernel_thread(ShbIpcThreadSignalJobReady, pShbInstance_p,
- CLONE_FS | CLONE_FILES);
- Exit:
- return ShbError;
-}
-
-//---------------------------------------------------------------------------
-// Signal job ready (called from executing process)
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcSignalJobReady(tShbInstance pShbInstance_p)
-{
- tShbMemHeader *pShbMemHeader;
-
- DEBUG_LVL_29_TRACE0("ShbIpcSignalJobReady\n");
- if (pShbInstance_p == NULL) {
- return (kShbInvalidArg);
- }
- pShbMemHeader =
- ShbIpcGetShbMemHeader(ShbIpcGetShbMemInst(pShbInstance_p));
- //set semaphore
- pShbMemHeader->m_fJobReady = TRUE;
- DEBUG_LVL_29_TRACE0("ShbIpcSignalJobReady set Sem -> Job Ready \n");
-
- wake_up_interruptible(&pShbMemHeader->m_WaitQueueJobReady);
- return (kShbOk);
-}
-
-//---------------------------------------------------------------------------
-// Get pointer to common used share memory area
-//---------------------------------------------------------------------------
-
-void *ShbIpcGetShMemPtr(tShbInstance pShbInstance_p)
-{
-
- tShbMemHeader *pShbMemHeader;
- void *pShbShMemPtr;
-
- pShbMemHeader =
- ShbIpcGetShbMemHeader(ShbIpcGetShbMemInst(pShbInstance_p));
- if (pShbMemHeader != NULL) {
- pShbShMemPtr = (u8 *) pShbMemHeader + sizeof(tShbMemHeader);
- } else {
- pShbShMemPtr = NULL;
- }
-
- return (pShbShMemPtr);
-
-}
-
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-// Get pointer to process local information structure
-//---------------------------------------------------------------------------
-
-/*tShbMemInst* ShbIpcGetShbMemInst (
- tShbInstance pShbInstance_p)
-{
-
-tShbMemInst* pShbMemInst;
-
- pShbMemInst = (tShbMemInst*)pShbInstance_p;
-
- return (pShbMemInst);
-
-}
-*/
-
-//---------------------------------------------------------------------------
-// Get pointer to shared memory header
-//---------------------------------------------------------------------------
-
-/*tShbMemHeader* ShbIpcGetShbMemHeader (
- tShbMemInst* pShbMemInst_p)
-{
-
-tShbMemHeader* pShbMemHeader;
-
- pShbMemHeader = pShbMemInst_p->m_pShbMemHeader;
-
- return (pShbMemHeader);
-
-}
-*/
-
-//---------------------------------------------------------------------------
-// Allocate a memory block from process specific mempool
-//---------------------------------------------------------------------------
-
-static void *ShbIpcAllocPrivateMem(unsigned long ulMemSize_p)
-{
- tShbError ShbError;
- void *pMem;
-
- DEBUG_LVL_29_TRACE0("ShbIpcAllocPrivateMem \n");
- //get private mem
- pMem = kmalloc(ulMemSize_p, GFP_KERNEL);
- if (pMem == NULL) {
- //unable to create mem
- ShbError = kShbOutOfMem;
- goto Exit;
- }
- Exit:
- return (pMem);
-
-}
-
-//---------------------------------------------------------------------------
-// Thread for new data signaling
-//---------------------------------------------------------------------------
-
-int ShbIpcThreadSignalNewData(void *pvThreadParam_p)
-{
- tShbInstance pShbInstance;
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- int iRetVal = -1;
- int fCallAgain;
-
- daemonize("ShbND%p", pvThreadParam_p);
- allow_signal(SIGTERM);
- pShbInstance = (tShbMemInst *) pvThreadParam_p;
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
-
- DEBUG_LVL_26_TRACE1("ShbIpcThreadSignalNewData(%p)\n", pvThreadParam_p);
-
- set_user_nice(current, pShbMemInst->m_lThreadNewDataNice);
-
-// DEBUG_LVL_29_TRACE1("ShbIpcThreadSignalNewData wait for New Data Sem %p\n",pShbMemInst->m_pSemNewData);
- do {
- iRetVal =
- wait_event_interruptible(pShbMemHeader->m_WaitQueueNewData,
- (pShbMemInst->m_iThreadTermFlag !=
- 0)
- || (pShbMemHeader->m_fNewData !=
- FALSE));
-
- if (iRetVal != 0) { // signal pending
- break;
- }
-
- if (pShbMemHeader->m_fNewData != FALSE) {
- pShbMemHeader->m_fNewData = FALSE;
- do {
- fCallAgain =
- pShbMemInst->
- m_pfnSigHndlrNewData(pShbInstance);
- // call scheduler, which will execute any task with higher priority
- schedule();
- } while (fCallAgain != FALSE);
- }
- } while (pShbMemInst->m_iThreadTermFlag == 0);
- DEBUG_LVL_29_TRACE0("ShbIpcThreadSignalNewData terminated \n");
- //set thread completed
- complete_and_exit(&pShbMemInst->m_CompletionNewData, 0);
- return 0;
-}
-
-//---------------------------------------------------------------------------
-// Thread for new data Job Ready signaling
-//---------------------------------------------------------------------------
-
-int ShbIpcThreadSignalJobReady(void *pvThreadParam_p)
-{
- tShbInstance pShbInstance;
- tShbMemInst *pShbMemInst;
- tShbMemHeader *pShbMemHeader;
- long lTimeOut;
- int iRetVal = -1;
-
- daemonize("ShbJR%p", pvThreadParam_p);
- allow_signal(SIGTERM);
- pShbInstance = (tShbMemInst *) pvThreadParam_p;
- pShbMemInst = ShbIpcGetShbMemInst(pShbInstance);
- pShbMemHeader = ShbIpcGetShbMemHeader(pShbMemInst);
-
- DEBUG_LVL_29_TRACE0
- ("ShbIpcThreadSignalJobReady wait for job ready Sem\n");
- if (pShbMemInst->m_ulTimeOutJobReady != 0) {
- lTimeOut = (long)pShbMemInst->m_ulTimeOutJobReady;
- //wait for job ready semaphore
- iRetVal =
- wait_event_interruptible_timeout(pShbMemHeader->
- m_WaitQueueJobReady,
- (pShbMemHeader->
- m_fJobReady != FALSE),
- lTimeOut);
- } else {
- //wait for job ready semaphore
- iRetVal =
- wait_event_interruptible(pShbMemHeader->m_WaitQueueJobReady,
- (pShbMemHeader->m_fJobReady !=
- FALSE));
- }
-
- if (pShbMemInst->m_pfnSigHndlrJobReady != NULL) {
- //call Handler
- pShbMemInst->m_pfnSigHndlrJobReady(pShbInstance,
- !pShbMemHeader->m_fJobReady);
- }
-
- pShbMemInst->m_pfnSigHndlrJobReady = NULL;
- return 0;
-}
-
-//Build the crc table
-static void ShbIpcCrc32GenTable(unsigned long aulCrcTable[256])
-{
- unsigned long ulCrc, ulPoly;
- int iIndexI, iIndexJ;
-
- ulPoly = 0xEDB88320L;
- for (iIndexI = 0; iIndexI < 256; iIndexI++) {
- ulCrc = iIndexI;
- for (iIndexJ = 8; iIndexJ > 0; iIndexJ--) {
- if (ulCrc & 1) {
- ulCrc = (ulCrc >> 1) ^ ulPoly;
- } else {
- ulCrc >>= 1;
- }
- }
- aulCrcTable[iIndexI] = ulCrc;
- }
-}
-
-//Calculate the crc value
-static unsigned long ShbIpcCrc32GetCrc(const char *pcString,
- unsigned long aulCrcTable[256])
-{
- unsigned long ulCrc;
- int iIndex;
-
- ulCrc = 0xFFFFFFFF;
- for (iIndex = 0; iIndex < strlen(pcString); iIndex++) {
- ulCrc =
- ((ulCrc >> 8) & 0x00FFFFFF) ^
- aulCrcTable[(ulCrc ^ pcString[iIndex]) & 0xFF];
- }
- return (ulCrc ^ 0xFFFFFFFF);
-
-}
-
-static void ShbIpcAppendListElement(struct sShbMemTable *psNewMemTableElement)
-{
- struct sShbMemTable *psMemTableElement = psMemTableElementFirst_g;
- psNewMemTableElement->m_psNextMemTableElement = NULL;
-
- if (psMemTableElementFirst_g != NULL) { /* sind Elemente vorhanden */
- while (psMemTableElement->m_psNextMemTableElement != NULL) { /* suche das letzte Element */
- psMemTableElement =
- psMemTableElement->m_psNextMemTableElement;
- }
- psMemTableElement->m_psNextMemTableElement = psNewMemTableElement; /* Haenge das Element hinten an */
- } else { /* wenn die liste leer ist, bin ich das erste Element */
- psMemTableElementFirst_g = psNewMemTableElement;
- }
-}
-
-static int ShbIpcFindListElement(int iBufferId,
- struct sShbMemTable **ppsReturnMemTableElement)
-{
- struct sShbMemTable *psMemTableElement = psMemTableElementFirst_g;
- while (psMemTableElement != NULL) {
- if (psMemTableElement->m_iBufferId == iBufferId) {
-//printk("ShbIpcFindListElement Buffer at:%p Id:%d\n",psMemTableElement->m_pBuffer,psMemTableElement->m_iBufferId);
- *ppsReturnMemTableElement = psMemTableElement;
-//printk("ShbIpcFindListElement Buffer at:%p Id:%d\n",(*ppsReturnMemTableElement)->m_pBuffer,(*ppsReturnMemTableElement)->m_iBufferId);
- return 0;
- }
- psMemTableElement = psMemTableElement->m_psNextMemTableElement;
- }
- return -1;
-}
-
-static void ShbIpcDeleteListElement(int iBufferId)
-{
- struct sShbMemTable *psMemTableElement = psMemTableElementFirst_g;
- struct sShbMemTable *psMemTableElementOld = psMemTableElementFirst_g;
- if (psMemTableElement != NULL) {
- while ((psMemTableElement != NULL)
- && (psMemTableElement->m_iBufferId != iBufferId)) {
- psMemTableElementOld = psMemTableElement;
- psMemTableElement =
- psMemTableElement->m_psNextMemTableElement;
- }
- if (psMemTableElement != NULL) {
- if (psMemTableElement != psMemTableElementFirst_g) {
- psMemTableElementOld->m_psNextMemTableElement =
- psMemTableElement->m_psNextMemTableElement;
- kfree(psMemTableElement);
- } else {
- kfree(psMemTableElement);
- psMemTableElementFirst_g = NULL;
- }
-
- }
- }
-
-}
-
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: Project independend shared buffer (linear + circular)
-
- Description: Declaration of platform specific part for the
- shared buffer
-
- 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.
-
- -------------------------------------------------------------------------
-
- 2006/06/27 -rs: V 1.00 (initial version)
-
-****************************************************************************/
-
-#ifndef _SHBIPC_H_
-#define _SHBIPC_H_
-
-//---------------------------------------------------------------------------
-// Type definitions
-//---------------------------------------------------------------------------
-
-typedef int (*tSigHndlrNewData) (tShbInstance pShbInstance_p);
-typedef void (*tSigHndlrJobReady) (tShbInstance pShbInstance_p,
- unsigned int fTimeOut_p);
-
-//---------------------------------------------------------------------------
-// Prototypes
-//---------------------------------------------------------------------------
-
-tShbError ShbIpcInit(void);
-tShbError ShbIpcExit(void);
-
-tShbError ShbIpcAllocBuffer(unsigned long ulBufferSize_p,
- const char *pszBufferID_p,
- tShbInstance * ppShbInstance_p,
- unsigned int *pfShbNewCreated_p);
-tShbError ShbIpcReleaseBuffer(tShbInstance pShbInstance_p);
-
-tShbError ShbIpcEnterAtomicSection(tShbInstance pShbInstance_p);
-tShbError ShbIpcLeaveAtomicSection(tShbInstance pShbInstance_p);
-
-tShbError ShbIpcStartSignalingNewData(tShbInstance pShbInstance_p,
- tSigHndlrNewData
- pfnSignalHandlerNewData_p,
- tShbPriority ShbPriority_p);
-tShbError ShbIpcStopSignalingNewData(tShbInstance pShbInstance_p);
-tShbError ShbIpcSignalNewData(tShbInstance pShbInstance_p);
-
-tShbError ShbIpcStartSignalingJobReady(tShbInstance pShbInstance_p,
- unsigned long ulTimeOut_p,
- tSigHndlrJobReady
- pfnSignalHandlerJobReady_p);
-tShbError ShbIpcSignalJobReady(tShbInstance pShbInstance_p);
-
-void *ShbIpcGetShMemPtr(tShbInstance pShbInstance_p);
-
-#endif // #ifndef _SHBIPC_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: Project independend shared buffer (linear + circular)
-
- Description: Declaration of platform specific part for the
- shared buffer
-
- 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.
-
- -------------------------------------------------------------------------
-
- 2006/07/20 -rs: V 1.00 (initial version)
-
-****************************************************************************/
-
-#ifndef _SHBLINUXKERNEL_H_
-#define _SHBLINUXKERNEL_H_
-
-struct sShbMemTable {
- int m_iBufferId;
- void *m_pBuffer;
- struct sShbMemTable *m_psNextMemTableElement;
-};
-
-extern struct sShbMemTable *psMemTableElementFirst_g;
-
-#endif // _SHBLINUXKERNEL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: Wrapper for BSD socket API for Linux kernel
-
- 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: SocketLinuxKernel.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- Dev C++ and GNU-Compiler for m68k
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/08/25 d.k.: start of implementation
-
-****************************************************************************/
-
-#include <linux/net.h>
-#include <linux/in.h>
-#include "SocketLinuxKernel.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Kernel Module specific Data Structures
-//---------------------------------------------------------------------------
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-SOCKET socket(int af, int type, int protocol)
-{
- int rc;
- SOCKET socket;
-
- rc = sock_create_kern(af, type, protocol, &socket);
- if (rc < 0) {
- socket = NULL;
- goto Exit;
- }
-
- Exit:
- return socket;
-}
-
-int bind(SOCKET socket_p, const struct sockaddr *addr, int addrlen)
-{
- int rc;
-
- rc = socket_p->ops->bind(socket_p, (struct sockaddr *)addr, addrlen);
-
- return rc;
-}
-
-int closesocket(SOCKET socket_p)
-{
- sock_release(socket_p);
-
- return 0;
-}
-
-int recvfrom(SOCKET socket_p, char *buf, int len, int flags,
- struct sockaddr *from, int *fromlen)
-{
- int rc;
- struct msghdr msg;
- struct kvec iov;
-
- msg.msg_control = NULL;
- msg.msg_controllen = 0;
- msg.msg_name = from; // will be struct sock_addr
- msg.msg_namelen = *fromlen;
- iov.iov_len = len;
- iov.iov_base = buf;
-
- rc = kernel_recvmsg(socket_p, &msg, &iov, 1, iov.iov_len, 0);
-
- return rc;
-}
-
-int sendto(SOCKET socket_p, const char *buf, int len, int flags,
- const struct sockaddr *to, int tolen)
-{
- int rc;
- struct msghdr msg;
- struct kvec iov;
-
- msg.msg_control = NULL;
- msg.msg_controllen = 0;
- msg.msg_name = (struct sockaddr *)to; // will be struct sock_addr
- msg.msg_namelen = tolen;
- msg.msg_flags = 0;
- iov.iov_len = len;
- iov.iov_base = (char *)buf;
-
- rc = kernel_sendmsg(socket_p, &msg, &iov, 1, len);
-
- return rc;
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for BSD socket API for Linux kernel
-
- 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: SocketLinuxKernel.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- KEIL uVision 2
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/08/25 d.k.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _SOCKETLINUXKERNEL_H_
-#define _SOCKETLINUXKERNEL_H_
-
-#include <linux/net.h>
-#include <linux/in.h>
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#define INVALID_SOCKET 0
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef struct socket *SOCKET;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-int bind(SOCKET s, const struct sockaddr *addr, int addrlen);
-
-int closesocket(SOCKET s);
-
-int recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from,
- int *fromlen);
-
-int sendto(SOCKET s, const char *buf, int len, int flags,
- const struct sockaddr *to, int tolen);
-
-SOCKET socket(int af, int type, int protocol);
-
-#endif // #ifndef _SOCKETLINUXKERNEL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: target specific implementation of
- high resolution timer module for X86 under Linux
- The Linux kernel has to be compiled with high resolution
- timers enabled. This is done by configuring the kernel
- with CONFIG_HIGH_RES_TIMERS enabled.
-
- 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: TimerHighReskX86.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:38:01 $
-
- $State: Exp $
-
- Build Environment:
- GNU
-
- -------------------------------------------------------------------------
-
- Revision History:
-
-****************************************************************************/
-
-#include "EplInc.h"
-#include "kernel/EplTimerHighResk.h"
-#include "Benchmark.h"
-
-//#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/hrtimer.h>
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#define TIMER_COUNT 2 /* max 15 timers selectable */
-#define TIMER_MIN_VAL_SINGLE 5000 /* min 5us */
-#define TIMER_MIN_VAL_CYCLE 100000 /* min 100us */
-
-#define PROVE_OVERRUN
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 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)
-#endif
-#define HRT_DBG_POST_TRACE_VALUE(Event_p, uiNodeId_p, wErrorCode_p) \
- TGT_DBG_POST_TRACE_VALUE((0xE << 28) | (Event_p << 24) \
- | (uiNodeId_p << 16) | wErrorCode_p)
-
-#define TIMERHDL_MASK 0x0FFFFFFF
-#define TIMERHDL_SHIFT 28
-#define HDL_TO_IDX(Hdl) ((Hdl >> TIMERHDL_SHIFT) - 1)
-#define HDL_INIT(Idx) ((Idx + 1) << TIMERHDL_SHIFT)
-#define HDL_INC(Hdl) (((Hdl + 1) & TIMERHDL_MASK) \
- | (Hdl & ~TIMERHDL_MASK))
-
-//---------------------------------------------------------------------------
-// modul global types
-//---------------------------------------------------------------------------
-
-typedef struct {
- tEplTimerEventArg m_EventArg;
- tEplTimerkCallback m_pfnCallback;
- struct hrtimer m_Timer;
- BOOL m_fContinuously;
- unsigned long long m_ullPeriod;
-
-} tEplTimerHighReskTimerInfo;
-
-typedef struct {
- tEplTimerHighReskTimerInfo m_aTimerInfo[TIMER_COUNT];
-
-} tEplTimerHighReskInstance;
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-static tEplTimerHighReskInstance EplTimerHighReskInstance_l;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-enum hrtimer_restart EplTimerHighReskCallback(struct hrtimer *pTimer_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimerHighReskInit()
-//
-// Description: initializes the high resolution timer module.
-//
-// Parameters: void
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimerHighReskInit(void)
-{
- tEplKernel Ret;
-
- Ret = EplTimerHighReskAddInstance();
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimerHighReskAddInstance()
-//
-// Description: initializes the high resolution timer module.
-//
-// Parameters: void
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimerHighReskAddInstance(void)
-{
- tEplKernel Ret;
- unsigned int uiIndex;
-
- Ret = kEplSuccessful;
-
- EPL_MEMSET(&EplTimerHighReskInstance_l, 0,
- sizeof(EplTimerHighReskInstance_l));
-
- /*
- * Initialize hrtimer structures for all usable timers.
- */
- for (uiIndex = 0; uiIndex < TIMER_COUNT; uiIndex++) {
- tEplTimerHighReskTimerInfo *pTimerInfo;
- struct hrtimer *pTimer;
-
- pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
- pTimer = &pTimerInfo->m_Timer;
- hrtimer_init(pTimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
-
- pTimer->function = EplTimerHighReskCallback;
- }
-
- return Ret;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimerHighReskDelInstance()
-//
-// Description: shuts down the high resolution timer module.
-//
-// Parameters: void
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimerHighReskDelInstance(void)
-{
- tEplTimerHighReskTimerInfo *pTimerInfo;
- tEplKernel Ret;
- unsigned int uiIndex;
-
- Ret = kEplSuccessful;
-
- for (uiIndex = 0; uiIndex < TIMER_COUNT; uiIndex++) {
- pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[0];
- pTimerInfo->m_pfnCallback = NULL;
- pTimerInfo->m_EventArg.m_TimerHdl = 0;
- /*
- * In this case we can not just try to cancel the timer.
- * We actually have to wait until its callback function
- * has returned.
- */
- hrtimer_cancel(&pTimerInfo->m_Timer);
- }
-
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimerHighReskModifyTimerNs()
-//
-// Description: modifies the timeout of the timer with the specified handle.
-// If the handle the pointer points to is zero, the timer must
-// be created first.
-// If it is not possible to stop the old timer,
-// this function always assures that the old timer does not
-// trigger the callback function with the same handle as the new
-// timer. That means the callback function must check the passed
-// handle with the one returned by this function. If these are
-// unequal, the call can be discarded.
-//
-// Parameters: pTimerHdl_p = pointer to timer handle
-// ullTimeNs_p = relative timeout in [ns]
-// pfnCallback_p = callback function, which is called mutual
-// exclusive with the Edrv callback functions
-// (Rx and Tx).
-// ulArgument_p = user-specific argument
-// fContinuously_p = if TRUE, callback function will be called
-// continuously;
-// otherwise, it is a oneshot timer.
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimerHighReskModifyTimerNs(tEplTimerHdl *pTimerHdl_p,
- unsigned long long ullTimeNs_p,
- tEplTimerkCallback pfnCallback_p,
- unsigned long ulArgument_p,
- BOOL fContinuously_p)
-{
- tEplKernel Ret;
- unsigned int uiIndex;
- tEplTimerHighReskTimerInfo *pTimerInfo;
- ktime_t RelTime;
-
- Ret = kEplSuccessful;
-
- // check pointer to handle
- if (pTimerHdl_p == NULL) {
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
-
- if (*pTimerHdl_p == 0) { // no timer created yet
-
- // search free timer info structure
- pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[0];
- for (uiIndex = 0; uiIndex < TIMER_COUNT;
- uiIndex++, pTimerInfo++) {
- if (pTimerInfo->m_EventArg.m_TimerHdl == 0) { // free structure found
- break;
- }
- }
- if (uiIndex >= TIMER_COUNT) { // no free structure found
- Ret = kEplTimerNoTimerCreated;
- goto Exit;
- }
-
- pTimerInfo->m_EventArg.m_TimerHdl = HDL_INIT(uiIndex);
- } else {
- uiIndex = HDL_TO_IDX(*pTimerHdl_p);
- if (uiIndex >= TIMER_COUNT) { // invalid handle
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
-
- pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
- }
-
- /*
- * increment timer handle
- * (if timer expires right after this statement, the user
- * would detect an unknown timer handle and discard it)
- */
- pTimerInfo->m_EventArg.m_TimerHdl =
- HDL_INC(pTimerInfo->m_EventArg.m_TimerHdl);
- *pTimerHdl_p = pTimerInfo->m_EventArg.m_TimerHdl;
-
- // reject too small time values
- if ((fContinuously_p && (ullTimeNs_p < TIMER_MIN_VAL_CYCLE))
- || (!fContinuously_p && (ullTimeNs_p < TIMER_MIN_VAL_SINGLE))) {
- Ret = kEplTimerNoTimerCreated;
- goto Exit;
- }
-
- pTimerInfo->m_EventArg.m_ulArg = ulArgument_p;
- pTimerInfo->m_pfnCallback = pfnCallback_p;
- pTimerInfo->m_fContinuously = fContinuously_p;
- pTimerInfo->m_ullPeriod = ullTimeNs_p;
-
- /*
- * HRTIMER_MODE_REL does not influence general handling of this timer.
- * It only sets relative mode for this start operation.
- * -> Expire time is calculated by: Now + RelTime
- * hrtimer_start also skips pending timer events.
- * The state HRTIMER_STATE_CALLBACK is ignored.
- * We have to cope with that in our callback function.
- */
- RelTime = ktime_add_ns(ktime_set(0, 0), ullTimeNs_p);
- hrtimer_start(&pTimerInfo->m_Timer, RelTime, HRTIMER_MODE_REL);
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimerHighReskDeleteTimer()
-//
-// Description: deletes the timer with the specified handle. Afterward the
-// handle is set to zero.
-//
-// Parameters: pTimerHdl_p = pointer to timer handle
-//
-// Return: tEplKernel = error code
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-tEplKernel EplTimerHighReskDeleteTimer(tEplTimerHdl *pTimerHdl_p)
-{
- tEplKernel Ret = kEplSuccessful;
- unsigned int uiIndex;
- tEplTimerHighReskTimerInfo *pTimerInfo;
-
- // check pointer to handle
- if (pTimerHdl_p == NULL) {
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
-
- if (*pTimerHdl_p == 0) { // no timer created yet
- goto Exit;
- } else {
- uiIndex = HDL_TO_IDX(*pTimerHdl_p);
- if (uiIndex >= TIMER_COUNT) { // invalid handle
- Ret = kEplTimerInvalidHandle;
- goto Exit;
- }
- pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
- if (pTimerInfo->m_EventArg.m_TimerHdl != *pTimerHdl_p) { // invalid handle
- goto Exit;
- }
- }
-
- *pTimerHdl_p = 0;
- pTimerInfo->m_EventArg.m_TimerHdl = 0;
- pTimerInfo->m_pfnCallback = NULL;
-
- /*
- * Three return cases of hrtimer_try_to_cancel have to be tracked:
- * 1 - timer has been removed
- * 0 - timer was not active
- * We need not do anything. hrtimer timers just consist of
- * a hrtimer struct, which we might enqueue in the hrtimers
- * event list by calling hrtimer_start().
- * If a timer is not enqueued, it is not present in hrtimers.
- * -1 - callback function is running
- * In this case we have to ensure that the timer is not
- * continuously restarted. This has been done by clearing
- * its handle.
- */
- hrtimer_try_to_cancel(&pTimerInfo->m_Timer);
-
- Exit:
- return Ret;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: EplTimerHighReskCallback()
-//
-// Description: Callback function commonly used for all timers.
-//
-// Parameters: pTimer_p = pointer to hrtimer
-//
-// Return:
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-enum hrtimer_restart EplTimerHighReskCallback(struct hrtimer *pTimer_p)
-{
- unsigned int uiIndex;
- tEplTimerHighReskTimerInfo *pTimerInfo;
- tEplTimerHdl OrgTimerHdl;
- enum hrtimer_restart Ret;
-
- BENCHMARK_MOD_24_SET(4);
-
- Ret = HRTIMER_NORESTART;
- pTimerInfo =
- container_of(pTimer_p, tEplTimerHighReskTimerInfo, m_Timer);
- uiIndex = HDL_TO_IDX(pTimerInfo->m_EventArg.m_TimerHdl);
- if (uiIndex >= TIMER_COUNT) { // invalid handle
- goto Exit;
- }
-
- /*
- * We store the timer handle before calling the callback function
- * as the timer can be modified inside it.
- */
- OrgTimerHdl = pTimerInfo->m_EventArg.m_TimerHdl;
-
- if (pTimerInfo->m_pfnCallback != NULL) {
- pTimerInfo->m_pfnCallback(&pTimerInfo->m_EventArg);
- }
-
- if (pTimerInfo->m_fContinuously) {
- ktime_t Interval;
-#ifdef PROVE_OVERRUN
- ktime_t Now;
- unsigned long Overruns;
-#endif
-
- if (OrgTimerHdl != pTimerInfo->m_EventArg.m_TimerHdl) {
- /* modified timer has already been restarted */
- goto Exit;
- }
-#ifdef PROVE_OVERRUN
- Now = ktime_get();
- Interval =
- ktime_add_ns(ktime_set(0, 0), pTimerInfo->m_ullPeriod);
- Overruns = hrtimer_forward(pTimer_p, Now, Interval);
- if (Overruns > 1) {
- printk
- ("EplTimerHighResk: Continuous timer (handle 0x%lX) had to skip %lu interval(s)!\n",
- pTimerInfo->m_EventArg.m_TimerHdl, Overruns - 1);
- }
-#else
- pTimer_p->expires = ktime_add_ns(pTimer_p->expires,
- pTimerInfo->m_ullPeriod);
-#endif
-
- Ret = HRTIMER_RESTART;
- }
-
- Exit:
- BENCHMARK_MOD_24_RESET(4);
- return Ret;
-}
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: Virtual Ethernet Driver for Linux
-
- 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: VirtualEthernetLinux.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/11/20 17:06:51 $
-
- $State: Exp $
-
- Build Environment:
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/12 -ar: start of the implementation, version 1.00
-
- 2006/09/18 d.k.: integration into EPL DLLk module
-
- ToDo:
-
- void netif_carrier_off(struct net_device *dev);
- void netif_carrier_on(struct net_device *dev);
-
-****************************************************************************/
-
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/if_arp.h>
-#include <net/arp.h>
-
-#include <net/protocol.h>
-#include <net/pkt_sched.h>
-#include <linux/if_ether.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#include <linux/udp.h>
-#include <linux/mm.h>
-#include <linux/types.h>
-#include <linux/skbuff.h> /* for struct sk_buff */
-
-#include "kernel/VirtualEthernet.h"
-#include "kernel/EplDllkCal.h"
-#include "kernel/EplDllk.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef EPL_VETH_TX_TIMEOUT
-//#define EPL_VETH_TX_TIMEOUT (2*HZ)
-#define EPL_VETH_TX_TIMEOUT 0 // d.k.: we use no timeout
-#endif
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static struct net_device *pVEthNetDevice_g = NULL;
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static int VEthOpen(struct net_device *pNetDevice_p);
-static int VEthClose(struct net_device *pNetDevice_p);
-static int VEthXmit(struct sk_buff *pSkb_p, struct net_device *pNetDevice_p);
-static struct net_device_stats *VEthGetStats(struct net_device *pNetDevice_p);
-static void VEthTimeout(struct net_device *pNetDevice_p);
-static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-static int VEthOpen(struct net_device *pNetDevice_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- //open the device
-// struct net_device_stats* pStats = netdev_priv(pNetDevice_p);
-
- //start the interface queue for the network subsystem
- netif_start_queue(pNetDevice_p);
-
- // register callback function in DLL
- Ret = EplDllkRegAsyncHandler(VEthRecvFrame);
-
- EPL_DBGLVL_VETH_TRACE1
- ("VEthOpen: EplDllkRegAsyncHandler returned 0x%02X\n", Ret);
-
- return 0;
-}
-
-static int VEthClose(struct net_device *pNetDevice_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- EPL_DBGLVL_VETH_TRACE0("VEthClose\n");
-
- Ret = EplDllkDeregAsyncHandler(VEthRecvFrame);
-
- //stop the interface queue for the network subsystem
- netif_stop_queue(pNetDevice_p);
- return 0;
-}
-
-static int VEthXmit(struct sk_buff *pSkb_p, struct net_device *pNetDevice_p)
-{
- tEplKernel Ret = kEplSuccessful;
- tEplFrameInfo FrameInfo;
-
- //transmit function
- struct net_device_stats *pStats = netdev_priv(pNetDevice_p);
-
- //save timestemp
- pNetDevice_p->trans_start = jiffies;
-
- FrameInfo.m_pFrame = (tEplFrame *) pSkb_p->data;
- FrameInfo.m_uiFrameSize = pSkb_p->len;
-
- //call send fkt on DLL
- Ret = EplDllkCalAsyncSend(&FrameInfo, kEplDllAsyncReqPrioGeneric);
- if (Ret != kEplSuccessful) {
- EPL_DBGLVL_VETH_TRACE1
- ("VEthXmit: EplDllkCalAsyncSend returned 0x%02X\n", Ret);
- netif_stop_queue(pNetDevice_p);
- goto Exit;
- } else {
- EPL_DBGLVL_VETH_TRACE0("VEthXmit: frame passed to DLL\n");
- dev_kfree_skb(pSkb_p);
-
- //set stats for the device
- pStats->tx_packets++;
- pStats->tx_bytes += FrameInfo.m_uiFrameSize;
- }
-
- Exit:
- return NETDEV_TX_OK;
-
-}
-
-static struct net_device_stats *VEthGetStats(struct net_device *pNetDevice_p)
-{
- EPL_DBGLVL_VETH_TRACE0("VEthGetStats\n");
-
- return netdev_priv(pNetDevice_p);
-}
-
-static void VEthTimeout(struct net_device *pNetDevice_p)
-{
- EPL_DBGLVL_VETH_TRACE0("VEthTimeout(\n");
-
- // $$$ d.k.: move to extra function, which is called by DLL when new space is available in TxFifo
- if (netif_queue_stopped(pNetDevice_p)) {
- netif_wake_queue(pNetDevice_p);
- }
-}
-
-static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p)
-{
- tEplKernel Ret = kEplSuccessful;
- struct net_device *pNetDevice = pVEthNetDevice_g;
- struct net_device_stats *pStats = netdev_priv(pNetDevice);
- struct sk_buff *pSkb;
-
- EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: FrameSize=%u\n",
- pFrameInfo_p->m_uiFrameSize);
-
- pSkb = dev_alloc_skb(pFrameInfo_p->m_uiFrameSize + 2);
- if (pSkb == NULL) {
- pStats->rx_dropped++;
- goto Exit;
- }
- pSkb->dev = pNetDevice;
-
- skb_reserve(pSkb, 2);
-
- memcpy((void *)skb_put(pSkb, pFrameInfo_p->m_uiFrameSize),
- pFrameInfo_p->m_pFrame, pFrameInfo_p->m_uiFrameSize);
-
- pSkb->protocol = eth_type_trans(pSkb, pNetDevice);
- pSkb->ip_summed = CHECKSUM_UNNECESSARY;
-
- // call netif_rx with skb
- netif_rx(pSkb);
-
- EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: SrcMAC=0x%llx\n",
- AmiGetQword48FromBe(pFrameInfo_p->m_pFrame->
- m_be_abSrcMac));
-
- // update receive statistics
- pStats->rx_packets++;
- pStats->rx_bytes += pFrameInfo_p->m_uiFrameSize;
-
- Exit:
- return Ret;
-}
-
-static const struct net_device_ops epl_netdev_ops = {
- .ndo_open = VEthOpen,
- .ndo_stop = VEthClose,
- .ndo_get_stats = VEthGetStats,
- .ndo_start_xmit = VEthXmit,
- .ndo_tx_timeout = VEthTimeout,
- .ndo_change_mtu = eth_change_mtu,
- .ndo_set_mac_address = eth_mac_addr,
- .ndo_validate_addr = eth_validate_addr,
-};
-
-tEplKernel VEthAddInstance(tEplDllkInitParam *pInitParam_p)
-{
- tEplKernel Ret = kEplSuccessful;
-
- // allocate net device structure with priv pointing to stats structure
- pVEthNetDevice_g =
- alloc_netdev(sizeof(struct net_device_stats), EPL_VETH_NAME,
- ether_setup);
-// pVEthNetDevice_g = alloc_etherdev(sizeof (struct net_device_stats));
-
- if (pVEthNetDevice_g == NULL) {
- Ret = kEplNoResource;
- goto Exit;
- }
-
- pVEthNetDevice_g->netdev_ops = &epl_netdev_ops;
- pVEthNetDevice_g->watchdog_timeo = EPL_VETH_TX_TIMEOUT;
- pVEthNetDevice_g->destructor = free_netdev;
-
- // copy own MAC address to net device structure
- memcpy(pVEthNetDevice_g->dev_addr, pInitParam_p->m_be_abSrcMac, 6);
-
- //register VEth to the network subsystem
- if (register_netdev(pVEthNetDevice_g)) {
- EPL_DBGLVL_VETH_TRACE0
- ("VEthAddInstance: Could not register VEth...\n");
- } else {
- EPL_DBGLVL_VETH_TRACE0
- ("VEthAddInstance: Register VEth successfull...\n");
- }
-
- Exit:
- return Ret;
-}
-
-tEplKernel VEthDelInstance(void)
-{
- tEplKernel Ret = kEplSuccessful;
-
- if (pVEthNetDevice_g != NULL) {
- //unregister VEth from the network subsystem
- unregister_netdev(pVEthNetDevice_g);
- // destructor was set to free_netdev,
- // so we do not need to call free_netdev here
- pVEthNetDevice_g = NULL;
- }
-
- return Ret;
-}
-
-#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: Abstract Memory Interface for x86 compatible
-
- 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: amix86.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- ...
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- r.s.: first implemetation
-
- 2006-06-13 d.k.: duplicate functions for little endian and big endian
-
-****************************************************************************/
-
-//#include "global.h"
-//#include "EplAmi.h"
-#include "EplInc.h"
-
-//---------------------------------------------------------------------------
-// typedef
-//---------------------------------------------------------------------------
-
-typedef struct {
- u16 m_wWord;
-
-} twStruct;
-
-typedef struct {
- u32 m_dwDword;
-
-} tdwStruct;
-
-typedef struct {
- u64 m_qwQword;
-
-} tqwStruct;
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetXXXToBe()
-//
-// Description: writes the specified value to the absolute address in
-// big endian
-//
-// Parameters: pAddr_p = absolute address
-// xXXXVal_p = value
-//
-// Returns: (none)
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-//------------< write u8 in big endian >--------------------------
-/*
-void AmiSetByteToBe (void *pAddr_p, u8 bByteVal_p)
-{
-
- *(u8 *)pAddr_p = bByteVal_p;
-
-}
-*/
-
-//------------< write u16 in big endian >--------------------------
-
-void AmiSetWordToBe(void * pAddr_p, u16 wWordVal_p)
-{
- twStruct *pwStruct;
- twStruct wValue;
-
- wValue.m_wWord = (u16) ((wWordVal_p & 0x00FF) << 8); //LSB to MSB
- wValue.m_wWord |= (u16) ((wWordVal_p & 0xFF00) >> 8); //MSB to LSB
-
- pwStruct = (twStruct *) pAddr_p;
- pwStruct->m_wWord = wValue.m_wWord;
-
-}
-
-//------------< write u32 in big endian >-------------------------
-
-void AmiSetDwordToBe(void *pAddr_p, u32 dwDwordVal_p)
-{
- tdwStruct *pdwStruct;
- tdwStruct dwValue;
-
- dwValue.m_dwDword = ((dwDwordVal_p & 0x000000FF) << 24); //LSB to MSB
- dwValue.m_dwDword |= ((dwDwordVal_p & 0x0000FF00) << 8);
- dwValue.m_dwDword |= ((dwDwordVal_p & 0x00FF0000) >> 8);
- dwValue.m_dwDword |= ((dwDwordVal_p & 0xFF000000) >> 24); //MSB to LSB
-
- pdwStruct = (tdwStruct *) pAddr_p;
- pdwStruct->m_dwDword = dwValue.m_dwDword;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetXXXToLe()
-//
-// Description: writes the specified value to the absolute address in
-// little endian
-//
-// Parameters: pAddr_p = absolute address
-// xXXXVal_p = value
-//
-// Returns: (none)
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-//------------< write u8 in little endian >--------------------------
-/*
-void AmiSetByteToLe (void *pAddr_p, u8 bByteVal_p)
-{
-
- *(u8 *)pAddr_p = bByteVal_p;
-
-}
-*/
-
-//------------< write u16 in little endian >--------------------------
-
-void AmiSetWordToLe(void *pAddr_p, u16 wWordVal_p)
-{
- twStruct *pwStruct;
-
- pwStruct = (twStruct *) pAddr_p;
- pwStruct->m_wWord = wWordVal_p;
-
-}
-
-//------------< write u32 in little endian >-------------------------
-
-void AmiSetDwordToLe(void *pAddr_p, u32 dwDwordVal_p)
-{
- tdwStruct *pdwStruct;
-
- pdwStruct = (tdwStruct *) pAddr_p;
- pdwStruct->m_dwDword = dwDwordVal_p;
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetXXXFromBe()
-//
-// Description: reads the specified value from the absolute address in
-// big endian
-//
-// Parameters: pAddr_p = absolute address
-//
-// Returns: XXX = value
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-//------------< read u8 in big endian >---------------------------
-/*
-u8 AmiGetByteFromBe (void *pAddr_p)
-{
-
- return ( *(u8 *)pAddr_p );
-
-}
-*/
-
-//------------< read u16 in big endian >---------------------------
-
-u16 AmiGetWordFromBe(void *pAddr_p)
-{
- twStruct *pwStruct;
- twStruct wValue;
-
- pwStruct = (twStruct *) pAddr_p;
-
- wValue.m_wWord = (u16) ((pwStruct->m_wWord & 0x00FF) << 8); //LSB to MSB
- wValue.m_wWord |= (u16) ((pwStruct->m_wWord & 0xFF00) >> 8); //MSB to LSB
-
- return (wValue.m_wWord);
-
-}
-
-//------------< read u32 in big endian >--------------------------
-
-u32 AmiGetDwordFromBe(void *pAddr_p)
-{
- tdwStruct *pdwStruct;
- tdwStruct dwValue;
-
- pdwStruct = (tdwStruct *) pAddr_p;
-
- dwValue.m_dwDword = ((pdwStruct->m_dwDword & 0x000000FF) << 24); //LSB to MSB
- dwValue.m_dwDword |= ((pdwStruct->m_dwDword & 0x0000FF00) << 8);
- dwValue.m_dwDword |= ((pdwStruct->m_dwDword & 0x00FF0000) >> 8);
- dwValue.m_dwDword |= ((pdwStruct->m_dwDword & 0xFF000000) >> 24); //MSB to LSB
-
- return (dwValue.m_dwDword);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetXXXFromLe()
-//
-// Description: reads the specified value from the absolute address in
-// little endian
-//
-// Parameters: pAddr_p = absolute address
-//
-// Returns: XXX = value
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-//------------< read u8 in little endian >---------------------------
-/*
-u8 AmiGetByteFromLe (void *pAddr_p)
-{
-
- return ( *(u8 *)pAddr_p );
-
-}
-*/
-
-//------------< read u16 in little endian >---------------------------
-
-u16 AmiGetWordFromLe(void *pAddr_p)
-{
- twStruct *pwStruct;
-
- pwStruct = (twStruct *) pAddr_p;
- return (pwStruct->m_wWord);
-}
-
-//------------< read u32 in little endian >--------------------------
-
-u32 AmiGetDwordFromLe(void *pAddr_p)
-{
- tdwStruct *pdwStruct;
-
- pdwStruct = (tdwStruct *) pAddr_p;
- return (pdwStruct->m_dwDword);
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetDword24ToBe()
-//
-// Description: sets a 24 bit value to a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// dwDwordVal_p = value to set
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetDword24ToBe(void *pAddr_p, u32 dwDwordVal_p)
-{
- ((u8 *) pAddr_p)[0] = ((u8 *) & dwDwordVal_p)[2];
- ((u8 *) pAddr_p)[1] = ((u8 *) & dwDwordVal_p)[1];
- ((u8 *) pAddr_p)[2] = ((u8 *) & dwDwordVal_p)[0];
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetDword24ToLe()
-//
-// Description: sets a 24 bit value to a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// dwDwordVal_p = value to set
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetDword24ToLe(void *pAddr_p, u32 dwDwordVal_p)
-{
- ((u8 *) pAddr_p)[0] = ((u8 *) & dwDwordVal_p)[0];
- ((u8 *) pAddr_p)[1] = ((u8 *) & dwDwordVal_p)[1];
- ((u8 *) pAddr_p)[2] = ((u8 *) & dwDwordVal_p)[2];
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetDword24FromBe()
-//
-// Description: reads a 24 bit value from a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u32 = read value
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-u32 AmiGetDword24FromBe(void *pAddr_p)
-{
- tdwStruct dwStruct;
-
- dwStruct.m_dwDword = AmiGetDwordFromBe(pAddr_p);
- dwStruct.m_dwDword >>= 8;
-
- return (dwStruct.m_dwDword);
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetDword24FromLe()
-//
-// Description: reads a 24 bit value from a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u32 = read value
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-u32 AmiGetDword24FromLe(void *pAddr_p)
-{
- tdwStruct dwStruct;
-
- dwStruct.m_dwDword = AmiGetDwordFromLe(pAddr_p);
- dwStruct.m_dwDword &= 0x00FFFFFF;
-
- return (dwStruct.m_dwDword);
-}
-
-//#ifdef USE_VAR64
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword64ToBe()
-//
-// Description: sets a 64 bit value to a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-void AmiSetQword64ToBe(void *pAddr_p, u64 qwQwordVal_p)
-{
- ((u8 *) pAddr_p)[0] = ((u8 *) & qwQwordVal_p)[7];
- ((u8 *) pAddr_p)[1] = ((u8 *) & qwQwordVal_p)[6];
- ((u8 *) pAddr_p)[2] = ((u8 *) & qwQwordVal_p)[5];
- ((u8 *) pAddr_p)[3] = ((u8 *) & qwQwordVal_p)[4];
- ((u8 *) pAddr_p)[4] = ((u8 *) & qwQwordVal_p)[3];
- ((u8 *) pAddr_p)[5] = ((u8 *) & qwQwordVal_p)[2];
- ((u8 *) pAddr_p)[6] = ((u8 *) & qwQwordVal_p)[1];
- ((u8 *) pAddr_p)[7] = ((u8 *) & qwQwordVal_p)[0];
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword64ToLe()
-//
-// Description: sets a 64 bit value to a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-void AmiSetQword64ToLe(void *pAddr_p, u64 qwQwordVal_p)
-{
- u64 *pqwDst;
-
- pqwDst = (u64 *) pAddr_p;
- *pqwDst = qwQwordVal_p;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword64FromBe()
-//
-// Description: reads a 64 bit value from a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-u64 AmiGetQword64FromBe(void *pAddr_p)
-{
- tqwStruct qwStruct;
-
- ((u8 *) & qwStruct.m_qwQword)[0] = ((u8 *) pAddr_p)[7];
- ((u8 *) & qwStruct.m_qwQword)[1] = ((u8 *) pAddr_p)[6];
- ((u8 *) & qwStruct.m_qwQword)[2] = ((u8 *) pAddr_p)[5];
- ((u8 *) & qwStruct.m_qwQword)[3] = ((u8 *) pAddr_p)[4];
- ((u8 *) & qwStruct.m_qwQword)[4] = ((u8 *) pAddr_p)[3];
- ((u8 *) & qwStruct.m_qwQword)[5] = ((u8 *) pAddr_p)[2];
- ((u8 *) & qwStruct.m_qwQword)[6] = ((u8 *) pAddr_p)[1];
- ((u8 *) & qwStruct.m_qwQword)[7] = ((u8 *) pAddr_p)[0];
-
- return (qwStruct.m_qwQword);
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword64FromLe()
-//
-// Description: reads a 64 bit value from a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-u64 AmiGetQword64FromLe(void *pAddr_p)
-{
- tqwStruct *pqwStruct;
- tqwStruct qwStruct;
-
- pqwStruct = (tqwStruct *) pAddr_p;
- qwStruct.m_qwQword = pqwStruct->m_qwQword;
-
- return (qwStruct.m_qwQword);
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword40ToBe()
-//
-// Description: sets a 40 bit value to a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword40ToBe(void *pAddr_p, u64 qwQwordVal_p)
-{
-
- ((u8 *) pAddr_p)[0] = ((u8 *) & qwQwordVal_p)[4];
- ((u8 *) pAddr_p)[1] = ((u8 *) & qwQwordVal_p)[3];
- ((u8 *) pAddr_p)[2] = ((u8 *) & qwQwordVal_p)[2];
- ((u8 *) pAddr_p)[3] = ((u8 *) & qwQwordVal_p)[1];
- ((u8 *) pAddr_p)[4] = ((u8 *) & qwQwordVal_p)[0];
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword40ToLe()
-//
-// Description: sets a 40 bit value to a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword40ToLe(void *pAddr_p, u64 qwQwordVal_p)
-{
-
- ((u32 *) pAddr_p)[0] = ((u32 *) & qwQwordVal_p)[0];
- ((u8 *) pAddr_p)[4] = ((u8 *) & qwQwordVal_p)[4];
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword40FromBe()
-//
-// Description: reads a 40 bit value from a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword40FromBe(void *pAddr_p)
-{
-
- tqwStruct qwStruct;
-
- qwStruct.m_qwQword = AmiGetQword64FromBe(pAddr_p);
- qwStruct.m_qwQword >>= 24;
-
- return (qwStruct.m_qwQword);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword40FromLe()
-//
-// Description: reads a 40 bit value from a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword40FromLe(void *pAddr_p)
-{
-
- tqwStruct qwStruct;
-
- qwStruct.m_qwQword = AmiGetQword64FromLe(pAddr_p);
- qwStruct.m_qwQword &= 0x000000FFFFFFFFFFLL;
-
- return (qwStruct.m_qwQword);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword48ToBe()
-//
-// Description: sets a 48 bit value to a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword48ToBe(void *pAddr_p, u64 qwQwordVal_p)
-{
-
- ((u8 *) pAddr_p)[0] = ((u8 *) & qwQwordVal_p)[5];
- ((u8 *) pAddr_p)[1] = ((u8 *) & qwQwordVal_p)[4];
- ((u8 *) pAddr_p)[2] = ((u8 *) & qwQwordVal_p)[3];
- ((u8 *) pAddr_p)[3] = ((u8 *) & qwQwordVal_p)[2];
- ((u8 *) pAddr_p)[4] = ((u8 *) & qwQwordVal_p)[1];
- ((u8 *) pAddr_p)[5] = ((u8 *) & qwQwordVal_p)[0];
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword48ToLe()
-//
-// Description: sets a 48 bit value to a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword48ToLe(void *pAddr_p, u64 qwQwordVal_p)
-{
-
- ((u32 *) pAddr_p)[0] = ((u32 *) & qwQwordVal_p)[0];
- ((u16 *) pAddr_p)[2] = ((u16 *) & qwQwordVal_p)[2];
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword48FromBe()
-//
-// Description: reads a 48 bit value from a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword48FromBe(void *pAddr_p)
-{
-
- tqwStruct qwStruct;
-
- qwStruct.m_qwQword = AmiGetQword64FromBe(pAddr_p);
- qwStruct.m_qwQword >>= 16;
-
- return (qwStruct.m_qwQword);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword48FromLe()
-//
-// Description: reads a 48 bit value from a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword48FromLe(void *pAddr_p)
-{
-
- tqwStruct qwStruct;
-
- qwStruct.m_qwQword = AmiGetQword64FromLe(pAddr_p);
- qwStruct.m_qwQword &= 0x0000FFFFFFFFFFFFLL;
-
- return (qwStruct.m_qwQword);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword56ToBe()
-//
-// Description: sets a 56 bit value to a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword56ToBe(void *pAddr_p, u64 qwQwordVal_p)
-{
-
- ((u8 *) pAddr_p)[0] = ((u8 *) & qwQwordVal_p)[6];
- ((u8 *) pAddr_p)[1] = ((u8 *) & qwQwordVal_p)[5];
- ((u8 *) pAddr_p)[2] = ((u8 *) & qwQwordVal_p)[4];
- ((u8 *) pAddr_p)[3] = ((u8 *) & qwQwordVal_p)[3];
- ((u8 *) pAddr_p)[4] = ((u8 *) & qwQwordVal_p)[2];
- ((u8 *) pAddr_p)[5] = ((u8 *) & qwQwordVal_p)[1];
- ((u8 *) pAddr_p)[6] = ((u8 *) & qwQwordVal_p)[0];
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetQword56ToLe()
-//
-// Description: sets a 56 bit value to a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// qwQwordVal_p = quadruple word value
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetQword56ToLe(void *pAddr_p, u64 qwQwordVal_p)
-{
-
- ((u32 *) pAddr_p)[0] = ((u32 *) & qwQwordVal_p)[0];
- ((u16 *) pAddr_p)[2] = ((u16 *) & qwQwordVal_p)[2];
- ((u8 *) pAddr_p)[6] = ((u8 *) & qwQwordVal_p)[6];
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword56FromBe()
-//
-// Description: reads a 56 bit value from a buffer in big endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword56FromBe(void *pAddr_p)
-{
-
- tqwStruct qwStruct;
-
- qwStruct.m_qwQword = AmiGetQword64FromBe(pAddr_p);
- qwStruct.m_qwQword >>= 8;
-
- return (qwStruct.m_qwQword);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetQword56FromLe()
-//
-// Description: reads a 56 bit value from a buffer in little endian
-//
-// Parameters: pAddr_p = pointer to source buffer
-//
-// Return: u64
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-u64 AmiGetQword56FromLe(void *pAddr_p)
-{
-
- tqwStruct qwStruct;
-
- qwStruct.m_qwQword = AmiGetQword64FromLe(pAddr_p);
- qwStruct.m_qwQword &= 0x00FFFFFFFFFFFFFFLL;
-
- return (qwStruct.m_qwQword);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiSetTimeOfDay()
-//
-// Description: sets a TIME_OF_DAY (CANopen) value to a buffer
-//
-// Parameters: pAddr_p = pointer to destination buffer
-// pTimeOfDay_p = pointer to struct TIME_OF_DAY
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiSetTimeOfDay(void *pAddr_p, tTimeOfDay *pTimeOfDay_p)
-{
-
- AmiSetDwordToLe(((u8 *) pAddr_p), pTimeOfDay_p->m_dwMs & 0x0FFFFFFF);
- AmiSetWordToLe(((u8 *) pAddr_p) + 4, pTimeOfDay_p->m_wDays);
-
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AmiGetTimeOfDay()
-//
-// Description: reads a TIME_OF_DAY (CANopen) value from a buffer
-//
-// Parameters: pAddr_p = pointer to source buffer
-// pTimeOfDay_p = pointer to struct TIME_OF_DAY
-//
-// Return: void
-//
-// State: not tested
-//
-//---------------------------------------------------------------------------
-
-void AmiGetTimeOfDay(void *pAddr_p, tTimeOfDay *pTimeOfDay_p)
-{
-
- pTimeOfDay_p->m_dwMs = AmiGetDwordFromLe(((u8 *) pAddr_p)) & 0x0FFFFFFF;
- pTimeOfDay_p->m_wDays = AmiGetWordFromLe(((u8 *) pAddr_p) + 4);
-
-}
-
-// EOF
-
-// Die letzte Zeile muß unbedingt eine leere Zeile sein, weil manche Compiler
-// damit ein Problem haben, wenn das nicht so ist (z.B. GNU oder Borland C++ Builder).
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: demoapplication for EPL MN (with SDO over UDP)
- under Linux on X86 with RTL8139 Ethernet controller
-
- 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: demo_main.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.10 $ $Date: 2008/11/19 18:11:43 $
-
- $State: Exp $
-
- Build Environment:
- GCC
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/09/01 d.k.: start of implementation
-
-****************************************************************************/
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/major.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/atomic.h>
-#include <linux/sched.h>
-#include <linux/kmod.h>
-#include <linux/slab.h>
-#include <linux/pci.h>
-#include <linux/proc_fs.h>
-
-#include "Epl.h"
-#include "proc_fs.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-// Metainformation
-MODULE_LICENSE("Dual BSD/GPL");
-#ifdef MODULE_AUTHOR
-MODULE_AUTHOR("Daniel.Krueger@SYSTEC-electronic.com");
-MODULE_DESCRIPTION("EPL MN demo");
-#endif
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-// TracePoint support for realtime-debugging
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
-#else
-#define TGT_DBG_SIGNAL_TRACE_POINT(p)
-#endif
-
-#define NODEID 0xF0 //=> MN
-#define CYCLE_LEN 5000 // [us]
-#define IP_ADDR 0xc0a86401 // 192.168.100.1
-#define SUBNET_MASK 0xFFFFFF00 // 255.255.255.0
-#define HOSTNAME "SYS TEC electronic EPL Stack "
-#define IF_ETH EPL_VETH_NAME
-
-// LIGHT EFFECT
-#define DEFAULT_MAX_CYCLE_COUNT 20 // 6 is very fast
-#define APP_DEFAULT_MODE 0x01
-#define APP_LED_COUNT 5 // number of LEDs in one row
-#define APP_LED_MASK ((1 << APP_LED_COUNT) - 1)
-#define APP_DOUBLE_LED_MASK ((1 << (APP_LED_COUNT * 2)) - 1)
-#define APP_MODE_COUNT 5
-#define APP_MODE_MASK ((1 << APP_MODE_COUNT) - 1)
-
-//---------------------------------------------------------------------------
-// local types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// modul globale vars
-//---------------------------------------------------------------------------
-
-static const u8 abMacAddr[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
-static u8 bVarIn1_l;
-static u8 bVarOut1_l;
-static u8 bVarOut1Old_l;
-static u8 bModeSelect_l; // state of the pushbuttons to select the mode
-static u8 bSpeedSelect_l; // state of the pushbuttons to increase/decrease the speed
-static u8 bSpeedSelectOld_l; // old state of the pushbuttons
-static u32 dwLeds_l; // current state of all LEDs
-static u8 bLedsRow1_l; // current state of the LEDs in row 1
-static u8 bLedsRow2_l; // current state of the LEDs in row 2
-static u8 abSelect_l[3]; // pushbuttons from CNs
-
-static u32 dwMode_l; // current mode
-static int iCurCycleCount_l; // current cycle count
-static int iMaxCycleCount_l; // maximum cycle count (i.e. number of cycles until next light movement step)
-static int iToggle; // indicates the light movement direction
-
-//static u8 abDomain_l[3000];
-
-static wait_queue_head_t WaitQueueShutdown_g; // wait queue for tEplNmtEventSwitchOff
-static atomic_t AtomicShutdown_g = ATOMIC_INIT(FALSE);
-
-static u32 dw_le_CycleLen_g;
-
-static uint uiNodeId_g = EPL_C_ADR_INVALID;
-module_param_named(nodeid, uiNodeId_g, uint, 0);
-
-static uint uiCycleLen_g = CYCLE_LEN;
-module_param_named(cyclelen, uiCycleLen_g, uint, 0);
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-// This function is the entry point for your object dictionary. It is defined
-// in OBJDICT.C by define EPL_OBD_INIT_RAM_NAME. Use this function name to define
-// this function prototype here. If you want to use more than one Epl
-// instances then the function name of each object dictionary has to differ.
-
-tEplKernel EplObdInitRam(tEplObdInitParam *pInitParam_p);
-
-tEplKernel AppCbEvent(tEplApiEventType EventType_p, // IN: event type (enum)
- tEplApiEventArg *pEventArg_p, // IN: event argument (union)
- void *pUserArg_p);
-
-tEplKernel AppCbSync(void);
-
-
-//---------------------------------------------------------------------------
-// Kernel Module specific Data Structures
-//---------------------------------------------------------------------------
-
-//module_init(EplLinInit);
-//module_exit(EplLinExit);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function:
-//
-// Description:
-//
-//
-//
-// Parameters:
-//
-//
-// Returns:
-//
-//
-// State:
-//
-//---------------------------------------------------------------------------
-#if 0
-static int __init EplLinInit(void)
-{
- tEplKernel EplRet;
- int iRet;
- static tEplApiInitParam EplApiInitParam = { 0 };
- char *sHostname = HOSTNAME;
- char *argv[4], *envp[3];
- char sBuffer[16];
- unsigned int uiVarEntries;
- tEplObdSize ObdSize;
-
- atomic_set(&AtomicShutdown_g, TRUE);
-
- // get node ID from insmod command line
- EplApiInitParam.m_uiNodeId = uiNodeId_g;
-
- if (EplApiInitParam.m_uiNodeId == EPL_C_ADR_INVALID) { // invalid node ID set
- // set default node ID
- EplApiInitParam.m_uiNodeId = NODEID;
- }
-
- uiNodeId_g = EplApiInitParam.m_uiNodeId;
-
- // calculate IP address
- EplApiInitParam.m_dwIpAddress =
- (0xFFFFFF00 & IP_ADDR) | EplApiInitParam.m_uiNodeId;
-
- EplApiInitParam.m_fAsyncOnly = FALSE;
-
- EplApiInitParam.m_uiSizeOfStruct = sizeof(EplApiInitParam);
- EPL_MEMCPY(EplApiInitParam.m_abMacAddress, abMacAddr,
- sizeof(EplApiInitParam.m_abMacAddress));
-// EplApiInitParam.m_abMacAddress[5] = (u8) EplApiInitParam.m_uiNodeId;
- EplApiInitParam.m_dwFeatureFlags = -1;
- EplApiInitParam.m_dwCycleLen = uiCycleLen_g; // required for error detection
- EplApiInitParam.m_uiIsochrTxMaxPayload = 100; // const
- EplApiInitParam.m_uiIsochrRxMaxPayload = 100; // const
- EplApiInitParam.m_dwPresMaxLatency = 50000; // const; only required for IdentRes
- EplApiInitParam.m_uiPreqActPayloadLimit = 36; // required for initialisation (+28 bytes)
- EplApiInitParam.m_uiPresActPayloadLimit = 36; // required for initialisation of Pres frame (+28 bytes)
- EplApiInitParam.m_dwAsndMaxLatency = 150000; // const; only required for IdentRes
- EplApiInitParam.m_uiMultiplCycleCnt = 0; // required for error detection
- EplApiInitParam.m_uiAsyncMtu = 1500; // required to set up max frame size
- EplApiInitParam.m_uiPrescaler = 2; // required for sync
- EplApiInitParam.m_dwLossOfFrameTolerance = 500000;
- EplApiInitParam.m_dwAsyncSlotTimeout = 3000000;
- EplApiInitParam.m_dwWaitSocPreq = 150000;
- EplApiInitParam.m_dwDeviceType = -1; // NMT_DeviceType_U32
- EplApiInitParam.m_dwVendorId = -1; // NMT_IdentityObject_REC.VendorId_U32
- EplApiInitParam.m_dwProductCode = -1; // NMT_IdentityObject_REC.ProductCode_U32
- EplApiInitParam.m_dwRevisionNumber = -1; // NMT_IdentityObject_REC.RevisionNo_U32
- EplApiInitParam.m_dwSerialNumber = -1; // NMT_IdentityObject_REC.SerialNo_U32
- EplApiInitParam.m_dwSubnetMask = SUBNET_MASK;
- EplApiInitParam.m_dwDefaultGateway = 0;
- EPL_MEMCPY(EplApiInitParam.m_sHostname, sHostname,
- sizeof(EplApiInitParam.m_sHostname));
-
- // currently unset parameters left at default value 0
- //EplApiInitParam.m_qwVendorSpecificExt1;
- //EplApiInitParam.m_dwVerifyConfigurationDate; // CFM_VerifyConfiguration_REC.ConfDate_U32
- //EplApiInitParam.m_dwVerifyConfigurationTime; // CFM_VerifyConfiguration_REC.ConfTime_U32
- //EplApiInitParam.m_dwApplicationSwDate; // PDL_LocVerApplSw_REC.ApplSwDate_U32 on programmable device or date portion of NMT_ManufactSwVers_VS on non-programmable device
- //EplApiInitParam.m_dwApplicationSwTime; // PDL_LocVerApplSw_REC.ApplSwTime_U32 on programmable device or time portion of NMT_ManufactSwVers_VS on non-programmable device
- //EplApiInitParam.m_abVendorSpecificExt2[48];
-
- // set callback functions
- EplApiInitParam.m_pfnCbEvent = AppCbEvent;
- EplApiInitParam.m_pfnCbSync = AppCbSync;
-
- printk
- ("\n\n Hello, I'm a simple POWERLINK node running as %s!\n (build: %s / %s)\n\n",
- (uiNodeId_g ==
- EPL_C_ADR_MN_DEF_NODE_ID ? "Managing Node" : "Controlled Node"),
- __DATE__, __TIME__);
-
- // initialize the Linux a wait queue for shutdown of this module
- init_waitqueue_head(&WaitQueueShutdown_g);
-
- // initialize the procfs device
- EplRet = EplLinProcInit();
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
- // initialize POWERLINK stack
- EplRet = EplApiInitialize(&EplApiInitParam);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
- // link process variables used by CN to object dictionary
- ObdSize = sizeof(bVarIn1_l);
- uiVarEntries = 1;
- EplRet =
- EplApiLinkObject(0x6000, &bVarIn1_l, &uiVarEntries, &ObdSize, 0x01);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = sizeof(bVarOut1_l);
- uiVarEntries = 1;
- EplRet =
- EplApiLinkObject(0x6200, &bVarOut1_l, &uiVarEntries, &ObdSize,
- 0x01);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
- // link process variables used by MN to object dictionary
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- ObdSize = sizeof(bLedsRow1_l);
- uiVarEntries = 1;
- EplRet =
- EplApiLinkObject(0x2000, &bLedsRow1_l, &uiVarEntries, &ObdSize,
- 0x01);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = sizeof(bLedsRow2_l);
- uiVarEntries = 1;
- EplRet =
- EplApiLinkObject(0x2000, &bLedsRow2_l, &uiVarEntries, &ObdSize,
- 0x02);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = sizeof(bSpeedSelect_l);
- uiVarEntries = 1;
- EplRet =
- EplApiLinkObject(0x2000, &bSpeedSelect_l, &uiVarEntries, &ObdSize,
- 0x03);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = sizeof(bSpeedSelectOld_l);
- uiVarEntries = 1;
- EplRet =
- EplApiLinkObject(0x2000, &bSpeedSelectOld_l, &uiVarEntries,
- &ObdSize, 0x04);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
-
- ObdSize = sizeof(abSelect_l[0]);
- uiVarEntries = sizeof(abSelect_l);
- EplRet =
- EplApiLinkObject(0x2200, &abSelect_l[0], &uiVarEntries, &ObdSize,
- 0x01);
- if (EplRet != kEplSuccessful) {
- goto Exit;
- }
-#endif
-
- // link a DOMAIN to object 0x6100, but do not exit, if it is missing
- ObdSize = sizeof(abDomain_l);
- uiVarEntries = 1;
- EplRet =
- EplApiLinkObject(0x6100, &abDomain_l, &uiVarEntries, &ObdSize,
- 0x00);
- if (EplRet != kEplSuccessful) {
- printk("EplApiLinkObject(0x6100): returns 0x%X\n", EplRet);
- }
- // reset old process variables
- bVarOut1Old_l = 0;
- bSpeedSelectOld_l = 0;
- dwMode_l = APP_DEFAULT_MODE;
- iMaxCycleCount_l = DEFAULT_MAX_CYCLE_COUNT;
-
- // configure IP address of virtual network interface
- // for TCP/IP communication over the POWERLINK network
- sprintf(sBuffer, "%u.%u.%u.%u",
- (EplApiInitParam.m_dwIpAddress >> 24),
- ((EplApiInitParam.m_dwIpAddress >> 16) & 0xFF),
- ((EplApiInitParam.m_dwIpAddress >> 8) & 0xFF),
- (EplApiInitParam.m_dwIpAddress & 0xFF));
- /* set up a minimal environment */
- iRet = 0;
- envp[iRet++] = "HOME=/";
- envp[iRet++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
- envp[iRet] = NULL;
-
- /* set up the argument list */
- iRet = 0;
- argv[iRet++] = "/sbin/ifconfig";
- argv[iRet++] = IF_ETH;
- argv[iRet++] = sBuffer;
- argv[iRet] = NULL;
-
- /* call ifconfig to configure the virtual network interface */
- iRet = call_usermodehelper(argv[0], argv, envp, 1);
- printk("ifconfig %s %s returned %d\n", argv[1], argv[2], iRet);
-
- // start the NMT state machine
- EplRet = EplApiExecNmtCommand(kEplNmtEventSwReset);
- atomic_set(&AtomicShutdown_g, FALSE);
-
- Exit:
- printk("EplLinInit(): returns 0x%X\n", EplRet);
- return EplRet;
-}
-
-static void __exit EplLinExit(void)
-{
- tEplKernel EplRet;
-
- // halt the NMT state machine
- // so the processing of POWERLINK frames stops
- EplRet = EplApiExecNmtCommand(kEplNmtEventSwitchOff);
-
- // wait until NMT state machine is shut down
- wait_event_interruptible(WaitQueueShutdown_g,
- (atomic_read(&AtomicShutdown_g) == TRUE));
-/* if ((iErr != 0) || (atomic_read(&AtomicShutdown_g) == EVENT_STATE_IOCTL))
- { // waiting was interrupted by signal or application called wrong function
- EplRet = kEplShutdown;
- }*/
- // delete instance for all modules
- EplRet = EplApiShutdown();
- printk("EplApiShutdown(): 0x%X\n", EplRet);
-
- // deinitialize proc fs
- EplRet = EplLinProcFree();
- printk("EplLinProcFree(): 0x%X\n", EplRet);
-
-}
-#endif
-//=========================================================================//
-// //
-// P R I V A T E F U N C T I O N S //
-// //
-//=========================================================================//
-
-//---------------------------------------------------------------------------
-//
-// Function: AppCbEvent
-//
-// Description: event callback function called by EPL API layer within
-// user part (low priority).
-//
-// Parameters: EventType_p = event type
-// pEventArg_p = pointer to union, which describes
-// the event in detail
-// pUserArg_p = user specific argument
-//
-// Returns: tEplKernel = error code,
-// kEplSuccessful = no error
-// kEplReject = reject further processing
-// otherwise = post error event to API layer
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel AppCbEvent(tEplApiEventType EventType_p, // IN: event type (enum)
- tEplApiEventArg *pEventArg_p, // IN: event argument (union)
- void *pUserArg_p)
-{
- tEplKernel EplRet = kEplSuccessful;
-
- // check if NMT_GS_OFF is reached
- switch (EventType_p) {
- case kEplApiEventNmtStateChange:
- {
- switch (pEventArg_p->m_NmtStateChange.m_NewNmtState) {
- case kEplNmtGsOff:
- { // NMT state machine was shut down,
- // because of user signal (CTRL-C) or critical EPL stack error
- // -> also shut down EplApiProcess() and main()
- EplRet = kEplShutdown;
-
- printk
- ("AppCbEvent(kEplNmtGsOff) originating event = 0x%X\n",
- pEventArg_p->m_NmtStateChange.
- m_NmtEvent);
-
- // wake up EplLinExit()
- atomic_set(&AtomicShutdown_g, TRUE);
- wake_up_interruptible
- (&WaitQueueShutdown_g);
- break;
- }
-
- case kEplNmtGsResetCommunication:
- {
- u32 dwBuffer;
-
- // configure OD for MN in state ResetComm after reseting the OD
- // TODO: setup your own network configuration here
- dwBuffer = (EPL_NODEASSIGN_NODE_IS_CN | EPL_NODEASSIGN_NODE_EXISTS); // 0x00000003L
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x01,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x02,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x03,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x04,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x05,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x06,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x07,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x08,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x20,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0xFE,
- &dwBuffer,
- 4);
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0x6E,
- &dwBuffer,
- 4);
-
-// dwBuffer |= EPL_NODEASSIGN_MANDATORY_CN; // 0x0000000BL
-// EplRet = EplApiWriteLocalObject(0x1F81, 0x6E, &dwBuffer, 4);
- dwBuffer = (EPL_NODEASSIGN_MN_PRES | EPL_NODEASSIGN_NODE_EXISTS); // 0x00010001L
- EplRet =
- EplApiWriteLocalObject(0x1F81, 0xF0,
- &dwBuffer,
- 4);
-
- // continue
- }
-
- case kEplNmtGsResetConfiguration:
- {
- unsigned int uiSize;
-
- // fetch object 0x1006 NMT_CycleLen_U32 from local OD (in little endian byte order)
- // for configuration of remote CN
- uiSize = 4;
- EplRet =
- EplApiReadObject(NULL, 0, 0x1006,
- 0x00,
- &dw_le_CycleLen_g,
- &uiSize,
- kEplSdoTypeAsnd,
- NULL);
- if (EplRet != kEplSuccessful) { // local OD access failed
- break;
- }
- // continue
- }
-
- case kEplNmtMsPreOperational1:
- {
- printk
- ("AppCbEvent(0x%X) originating event = 0x%X\n",
- pEventArg_p->m_NmtStateChange.
- m_NewNmtState,
- pEventArg_p->m_NmtStateChange.
- m_NmtEvent);
-
- // continue
- }
-
- case kEplNmtGsInitialising:
- case kEplNmtGsResetApplication:
- case kEplNmtMsNotActive:
- case kEplNmtCsNotActive:
- case kEplNmtCsPreOperational1:
- {
- break;
- }
-
- case kEplNmtCsOperational:
- case kEplNmtMsOperational:
- {
- break;
- }
-
- default:
- {
- break;
- }
- }
-
-/*
- switch (pEventArg_p->m_NmtStateChange.m_NmtEvent)
- {
- case kEplNmtEventSwReset:
- case kEplNmtEventResetNode:
- case kEplNmtEventResetCom:
- case kEplNmtEventResetConfig:
- case kEplNmtEventInternComError:
- case kEplNmtEventNmtCycleError:
- {
- printk("AppCbEvent(0x%X) originating event = 0x%X\n",
- pEventArg_p->m_NmtStateChange.m_NewNmtState,
- pEventArg_p->m_NmtStateChange.m_NmtEvent);
- break;
- }
-
- default:
- {
- break;
- }
- }
-*/
- break;
- }
-
- case kEplApiEventCriticalError:
- case kEplApiEventWarning:
- { // error or warning occured within the stack or the application
- // on error the API layer stops the NMT state machine
-
- printk
- ("AppCbEvent(Err/Warn): Source=%02X EplError=0x%03X",
- pEventArg_p->m_InternalError.m_EventSource,
- pEventArg_p->m_InternalError.m_EplError);
- // check additional argument
- switch (pEventArg_p->m_InternalError.m_EventSource) {
- case kEplEventSourceEventk:
- case kEplEventSourceEventu:
- { // error occured within event processing
- // either in kernel or in user part
- printk(" OrgSource=%02X\n",
- pEventArg_p->m_InternalError.
- m_Arg.m_EventSource);
- break;
- }
-
- case kEplEventSourceDllk:
- { // error occured within the data link layer (e.g. interrupt processing)
- // the u32 argument contains the DLL state and the NMT event
- printk(" val=%X\n",
- pEventArg_p->m_InternalError.
- m_Arg.m_dwArg);
- break;
- }
-
- default:
- {
- printk("\n");
- break;
- }
- }
- break;
- }
-
- case kEplApiEventNode:
- {
-// printk("AppCbEvent(Node): Source=%02X EplError=0x%03X", pEventArg_p->m_InternalError.m_EventSource, pEventArg_p->m_InternalError.m_EplError);
- // check additional argument
- switch (pEventArg_p->m_Node.m_NodeEvent) {
- case kEplNmtNodeEventCheckConf:
- {
- tEplSdoComConHdl SdoComConHdl;
- // update object 0x1006 on CN
- EplRet =
- EplApiWriteObject(&SdoComConHdl,
- pEventArg_p->
- m_Node.m_uiNodeId,
- 0x1006, 0x00,
- &dw_le_CycleLen_g,
- 4,
- kEplSdoTypeAsnd,
- NULL);
- if (EplRet == kEplApiTaskDeferred) { // SDO transfer started
- EplRet = kEplReject;
- } else if (EplRet == kEplSuccessful) { // local OD access (should not occur)
- printk
- ("AppCbEvent(Node) write to local OD\n");
- } else { // error occured
- TGT_DBG_SIGNAL_TRACE_POINT(1);
-
- EplRet =
- EplApiFreeSdoChannel
- (SdoComConHdl);
- SdoComConHdl = 0;
-
- EplRet =
- EplApiWriteObject
- (&SdoComConHdl,
- pEventArg_p->m_Node.
- m_uiNodeId, 0x1006, 0x00,
- &dw_le_CycleLen_g, 4,
- kEplSdoTypeAsnd, NULL);
- if (EplRet == kEplApiTaskDeferred) { // SDO transfer started
- EplRet = kEplReject;
- } else {
- printk
- ("AppCbEvent(Node): EplApiWriteObject() returned 0x%02X\n",
- EplRet);
- }
- }
-
- break;
- }
-
- default:
- {
- break;
- }
- }
- break;
- }
-
- case kEplApiEventSdo:
- { // SDO transfer finished
- EplRet =
- EplApiFreeSdoChannel(pEventArg_p->m_Sdo.
- m_SdoComConHdl);
- if (EplRet != kEplSuccessful) {
- break;
- }
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- if (pEventArg_p->m_Sdo.m_SdoComConState == kEplSdoComTransferFinished) { // continue boot-up of CN with NMT command Reset Configuration
- EplRet =
- EplApiMnTriggerStateChange(pEventArg_p->
- m_Sdo.m_uiNodeId,
- kEplNmtNodeCommandConfReset);
- } else { // indicate configuration error CN
- EplRet =
- EplApiMnTriggerStateChange(pEventArg_p->
- m_Sdo.m_uiNodeId,
- kEplNmtNodeCommandConfErr);
- }
-#endif
-
- break;
- }
-
- default:
- break;
- }
-
- return EplRet;
-}
-
-//---------------------------------------------------------------------------
-//
-// Function: AppCbSync
-//
-// Description: sync event callback function called by event module within
-// kernel part (high priority).
-// This function sets the outputs, reads the inputs and runs
-// the control loop.
-//
-// Parameters: void
-//
-// Returns: tEplKernel = error code,
-// kEplSuccessful = no error
-// otherwise = post error event to API layer
-//
-// State:
-//
-//---------------------------------------------------------------------------
-
-tEplKernel AppCbSync(void)
-{
- tEplKernel EplRet = kEplSuccessful;
-
- if (bVarOut1Old_l != bVarOut1_l) { // output variable has changed
- bVarOut1Old_l = bVarOut1_l;
- // set LEDs
-
-// printk("bVarIn = 0x%02X bVarOut = 0x%02X\n", (u16) bVarIn_l, (u16) bVarOut_l);
- }
- if (uiNodeId_g != EPL_C_ADR_MN_DEF_NODE_ID) {
- bVarIn1_l++;
- }
-
- if (uiNodeId_g == EPL_C_ADR_MN_DEF_NODE_ID) { // we are the master and must run the control loop
-
- // collect inputs from CNs and own input
- bSpeedSelect_l = (bVarIn1_l | abSelect_l[0]) & 0x07;
-
- bModeSelect_l = abSelect_l[1] | abSelect_l[2];
-
- if ((bModeSelect_l & APP_MODE_MASK) != 0) {
- dwMode_l = bModeSelect_l & APP_MODE_MASK;
- }
-
- iCurCycleCount_l--;
-
- if (iCurCycleCount_l <= 0) {
- if ((dwMode_l & 0x01) != 0) { // fill-up
- if (iToggle) {
- if ((dwLeds_l & APP_DOUBLE_LED_MASK) ==
- 0x00) {
- dwLeds_l = 0x01;
- } else {
- dwLeds_l <<= 1;
- dwLeds_l++;
- if (dwLeds_l >=
- APP_DOUBLE_LED_MASK) {
- iToggle = 0;
- }
- }
- } else {
- dwLeds_l <<= 1;
- if ((dwLeds_l & APP_DOUBLE_LED_MASK) ==
- 0x00) {
- iToggle = 1;
- }
- }
- bLedsRow1_l =
- (unsigned char)(dwLeds_l & APP_LED_MASK);
- bLedsRow2_l =
- (unsigned char)((dwLeds_l >> APP_LED_COUNT)
- & APP_LED_MASK);
- }
-
- else if ((dwMode_l & 0x02) != 0) { // running light forward
- dwLeds_l <<= 1;
- if ((dwLeds_l > APP_DOUBLE_LED_MASK)
- || (dwLeds_l == 0x00000000L)) {
- dwLeds_l = 0x01;
- }
- bLedsRow1_l =
- (unsigned char)(dwLeds_l & APP_LED_MASK);
- bLedsRow2_l =
- (unsigned char)((dwLeds_l >> APP_LED_COUNT)
- & APP_LED_MASK);
- }
-
- else if ((dwMode_l & 0x04) != 0) { // running light backward
- dwLeds_l >>= 1;
- if ((dwLeds_l > APP_DOUBLE_LED_MASK)
- || (dwLeds_l == 0x00000000L)) {
- dwLeds_l = 1 << (APP_LED_COUNT * 2);
- }
- bLedsRow1_l =
- (unsigned char)(dwLeds_l & APP_LED_MASK);
- bLedsRow2_l =
- (unsigned char)((dwLeds_l >> APP_LED_COUNT)
- & APP_LED_MASK);
- }
-
- else if ((dwMode_l & 0x08) != 0) { // Knightrider
- if (bLedsRow1_l == 0x00) {
- bLedsRow1_l = 0x01;
- iToggle = 1;
- } else if (iToggle) {
- bLedsRow1_l <<= 1;
- if (bLedsRow1_l >=
- (1 << (APP_LED_COUNT - 1))) {
- iToggle = 0;
- }
- } else {
- bLedsRow1_l >>= 1;
- if (bLedsRow1_l <= 0x01) {
- iToggle = 1;
- }
- }
- bLedsRow2_l = bLedsRow1_l;
- }
-
- else if ((dwMode_l & 0x10) != 0) { // Knightrider
- if ((bLedsRow1_l == 0x00)
- || (bLedsRow2_l == 0x00)
- || ((bLedsRow2_l & ~APP_LED_MASK) != 0)) {
- bLedsRow1_l = 0x01;
- bLedsRow2_l =
- (1 << (APP_LED_COUNT - 1));
- iToggle = 1;
- } else if (iToggle) {
- bLedsRow1_l <<= 1;
- bLedsRow2_l >>= 1;
- if (bLedsRow1_l >=
- (1 << (APP_LED_COUNT - 1))) {
- iToggle = 0;
- }
- } else {
- bLedsRow1_l >>= 1;
- bLedsRow2_l <<= 1;
- if (bLedsRow1_l <= 0x01) {
- iToggle = 1;
- }
- }
- }
- // set own output
- bVarOut1_l = bLedsRow1_l;
-// bVarOut1_l = (bLedsRow1_l & 0x03) | (bLedsRow2_l << 2);
-
- // restart cycle counter
- iCurCycleCount_l = iMaxCycleCount_l;
- }
-
- if (bSpeedSelectOld_l == 0) {
- if ((bSpeedSelect_l & 0x01) != 0) {
- if (iMaxCycleCount_l < 200) {
- iMaxCycleCount_l++;
- }
- bSpeedSelectOld_l = bSpeedSelect_l;
- } else if ((bSpeedSelect_l & 0x02) != 0) {
- if (iMaxCycleCount_l > 1) {
- iMaxCycleCount_l--;
- }
- bSpeedSelectOld_l = bSpeedSelect_l;
- } else if ((bSpeedSelect_l & 0x04) != 0) {
- iMaxCycleCount_l = DEFAULT_MAX_CYCLE_COUNT;
- bSpeedSelectOld_l = bSpeedSelect_l;
- }
- } else if (bSpeedSelect_l == 0) {
- bSpeedSelectOld_l = 0;
- }
- }
-
- TGT_DBG_SIGNAL_TRACE_POINT(1);
-
- return EplRet;
-}
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: interface for ethernetdriver
-
- 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: edrv.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- Dev C++ and GNU-Compiler for m68k
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2005/08/01 m.b.: start of implementation
-
-****************************************************************************/
-
-#ifndef _EDRV_H_
-#define _EDRV_H_
-
-#include "EplInc.h"
-#include "EplFrame.h"
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-// --------------------------------------------------------------------------
-#define MAX_ETH_DATA_SIZE 1500
-#define MIN_ETH_DATA_SIZE 46
-
-#define ETH_HDR_OFFSET 0 // Ethernet header at the top of the frame
-#define ETH_HDR_SIZE 14 // size of Ethernet header
-#define MIN_ETH_SIZE (MIN_ETH_DATA_SIZE + ETH_HDR_SIZE) // without CRC
-
-#define ETH_CRC_SIZE 4 // size of Ethernet CRC, i.e. FCS
-
-//---------------------------------------------------------------------------
-// types
-//---------------------------------------------------------------------------
-
-// position of a buffer in an ethernet-frame
-typedef enum {
- kEdrvBufferFirstInFrame = 0x01, // first data buffer in an ethernet frame
- kEdrvBufferMiddleInFrame = 0x02, // a middle data buffer in an ethernet frame
- kEdrvBufferLastInFrame = 0x04 // last data buffer in an ethernet frame
-} tEdrvBufferInFrame;
-
-// format of a tx-buffer
-typedef struct _tEdrvTxBuffer {
- tEplMsgType m_EplMsgType; // IN: type of EPL message, set by calling function
- unsigned int m_uiTxMsgLen; // IN: length of message to be send (set for each transmit call)
- // ----------------------
- unsigned int m_uiBufferNumber; // OUT: number of the buffer, set by ethernetdriver
- u8 *m_pbBuffer; // OUT: pointer to the buffer, set by ethernetdriver
- tEplNetTime m_NetTime; // OUT: Timestamp of end of transmission, set by ethernetdriver
- // ----------------------
- unsigned int m_uiMaxBufferLen; // IN/OUT: maximum length of the buffer
-} tEdrvTxBuffer;
-
-// format of a rx-buffer
-typedef struct _tEdrvRxBuffer {
- tEdrvBufferInFrame m_BufferInFrame; // OUT position of received buffer in an ethernet-frame
- unsigned int m_uiRxMsgLen; // OUT: length of received buffer (without CRC)
- u8 *m_pbBuffer; // OUT: pointer to the buffer, set by ethernetdriver
- tEplNetTime m_NetTime; // OUT: Timestamp of end of receiption
-
-} tEdrvRxBuffer;
-
-//typedef void (*tEdrvRxHandler) (u8 bBufferInFrame_p, tBufferDescr * pbBuffer_p);
-//typedef void (*tEdrvRxHandler) (u8 bBufferInFrame_p, u8 * pbEthernetData_p, u16 wDataLen_p);
-typedef void (*tEdrvRxHandler) (tEdrvRxBuffer * pRxBuffer_p);
-typedef void (*tEdrvTxHandler) (tEdrvTxBuffer * pTxBuffer_p);
-
-// format of init structure
-typedef struct {
- u8 m_abMyMacAddr[6]; // the own MAC address
-
-// u8 m_bNoOfRxBuffDescr; // number of entries in rx bufferdescriptor table
-// tBufferDescr * m_pRxBuffDescrTable; // rx bufferdescriptor table
-// u16 m_wRxBufferSize; // size of the whole rx buffer
-
- tEdrvRxHandler m_pfnRxHandler;
- tEdrvTxHandler m_pfnTxHandler;
-
-} tEdrvInitParam;
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-tEplKernel EdrvInit(tEdrvInitParam * pEdrvInitParam_p);
-
-tEplKernel EdrvShutdown(void);
-
-tEplKernel EdrvDefineRxMacAddrEntry(u8 * pbMacAddr_p);
-tEplKernel EdrvUndefineRxMacAddrEntry(u8 * pbMacAddr_p);
-
-//tEplKernel EdrvDefineUnicastEntry (u8 * pbUCEntry_p);
-//tEplKernel EdrvUndfineUnicastEntry (u8 * pbUCEntry_p);
-
-tEplKernel EdrvAllocTxMsgBuffer(tEdrvTxBuffer * pBuffer_p);
-tEplKernel EdrvReleaseTxMsgBuffer(tEdrvTxBuffer * pBuffer_p);
-
-//tEplKernel EdrvWriteMsg (tBufferDescr * pbBuffer_p);
-tEplKernel EdrvSendTxMsg(tEdrvTxBuffer * pBuffer_p);
-tEplKernel EdrvTxMsgReady(tEdrvTxBuffer * pBuffer_p);
-tEplKernel EdrvTxMsgStart(tEdrvTxBuffer * pBuffer_p);
-
-//tEplKernel EdrvReadMsg (void);
-
-// interrupt handler called by target specific interrupt handler
-void EdrvInterruptHandler(void);
-
-#endif // #ifndef _EDRV_H_
+++ /dev/null
-/****************************************************************************
-
- global project definition file
-
- 12.06.1998 -rs
- 11.02.2002 r.d. Erweiterungen, Ergaenzungen
- 20.08.2002 SYS TEC electronic -as
- Definition Schluesselwort 'GENERIC'
- fuer das Erzeugen von Generic Pointer
- 28.08.2002 r.d. erweiterter SYS TEC Debug Code
- 16.09.2002 r.d. komplette Uebersetzung in Englisch
- 11.04.2003 f.j. Ergaenzung fuer Mitsubishi NC30 Compiler
- 17.06.2003 -rs Definition von Basistypen in <#ifndef _WINDEF_> gesetzt
- 16.04.2004 r.d. Ergaenzung fuer Borland C++ Builder
- 30.08.2004 -rs TRACE5 eingefügt
- 23.12.2005 d.k. Definitions for IAR compiler
-
- $Id: global.h,v 1.6 2008/11/07 13:55:56 D.Krueger Exp $
-
-****************************************************************************/
-
-#ifndef _GLOBAL_H_
-#define _GLOBAL_H_
-
-
-#define TRACE printk
-
-// --- logic types ---
-#ifndef BOOL
-#define BOOL unsigned char
-#endif
-
-// --- alias types ---
-#ifndef TRUE
-#define TRUE 0xFF
-#endif
-#ifndef FALSE
-#define FALSE 0x00
-#endif
-#ifndef _TIME_OF_DAY_DEFINED_
-typedef struct {
- unsigned long int m_dwMs;
- unsigned short int m_wDays;
-
-} tTimeOfDay;
-
-#define _TIME_OF_DAY_DEFINED_
-
-#endif
-
-//---------------------------------------------------------------------------
-// Definition von TRACE
-//---------------------------------------------------------------------------
-
-#ifndef NDEBUG
-
-#ifndef TRACE0
-#define TRACE0(p0) TRACE(p0)
-#endif
-
-#ifndef TRACE1
-#define TRACE1(p0, p1) TRACE(p0, p1)
-#endif
-
-#ifndef TRACE2
-#define TRACE2(p0, p1, p2) TRACE(p0, p1, p2)
-#endif
-
-#ifndef TRACE3
-#define TRACE3(p0, p1, p2, p3) TRACE(p0, p1, p2, p3)
-#endif
-
-#ifndef TRACE4
-#define TRACE4(p0, p1, p2, p3, p4) TRACE(p0, p1, p2, p3, p4)
-#endif
-
-#ifndef TRACE5
-#define TRACE5(p0, p1, p2, p3, p4, p5) TRACE(p0, p1, p2, p3, p4, p5)
-#endif
-
-#ifndef TRACE6
-#define TRACE6(p0, p1, p2, p3, p4, p5, p6) TRACE(p0, p1, p2, p3, p4, p5, p6)
-#endif
-
-#else
-
-#ifndef TRACE0
-#define TRACE0(p0)
-#endif
-
-#ifndef TRACE1
-#define TRACE1(p0, p1)
-#endif
-
-#ifndef TRACE2
-#define TRACE2(p0, p1, p2)
-#endif
-
-#ifndef TRACE3
-#define TRACE3(p0, p1, p2, p3)
-#endif
-
-#ifndef TRACE4
-#define TRACE4(p0, p1, p2, p3, p4)
-#endif
-
-#ifndef TRACE5
-#define TRACE5(p0, p1, p2, p3, p4, p5)
-#endif
-
-#ifndef TRACE6
-#define TRACE6(p0, p1, p2, p3, p4, p5, p6)
-#endif
-
-#endif
-
-//---------------------------------------------------------------------------
-// definition of ASSERT
-//---------------------------------------------------------------------------
-
-#ifndef ASSERT
-#define ASSERT(p)
-#endif
-
-//---------------------------------------------------------------------------
-// SYS TEC extensions
-//---------------------------------------------------------------------------
-
-// This macro doesn't print out C-file and line number of the failed assertion
-// but a string, which exactly names the mistake.
-#ifndef NDEBUG
-
-#define ASSERTMSG(expr,string) if (!(expr)) {\
- PRINTF0 ("Assertion failed: " string );\
- while (1);}
-#else
-#define ASSERTMSG(expr,string)
-#endif
-
-//---------------------------------------------------------------------------
-
-#endif // #ifndef _GLOBAL_H_
-
-// Please keep an empty line at the end of this file.
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for kernelspace DLL 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: EplDllk.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/08 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_DLLK_H_
-#define _EPL_DLLK_H_
-
-#include "../EplDll.h"
-#include "../EplEvent.h"
-
-typedef tEplKernel(*tEplDllkCbAsync) (tEplFrameInfo * pFrameInfo_p);
-
-typedef struct {
- u8 m_be_abSrcMac[6];
-
-} tEplDllkInitParam;
-
-// forward declaration
-struct _tEdrvTxBuffer;
-
-struct _tEplDllkNodeInfo {
- struct _tEplDllkNodeInfo *m_pNextNodeInfo;
- struct _tEdrvTxBuffer *m_pPreqTxBuffer;
- unsigned int m_uiNodeId;
- u32 m_dwPresTimeout;
- unsigned long m_ulDllErrorEvents;
- tEplNmtState m_NmtState;
- u16 m_wPresPayloadLimit;
- u8 m_be_abMacAddr[6];
- u8 m_bSoaFlag1;
- BOOL m_fSoftDelete; // delete node after error and ignore error
-
-};
-
-typedef struct _tEplDllkNodeInfo tEplDllkNodeInfo;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-tEplKernel EplDllkAddInstance(tEplDllkInitParam * pInitParam_p);
-
-tEplKernel EplDllkDelInstance(void);
-
-// called before NMT_GS_COMMUNICATING will be entered to configure fixed parameters
-tEplKernel EplDllkConfig(tEplDllConfigParam * pDllConfigParam_p);
-
-// set identity of local node (may be at any time, e.g. in case of hostname change)
-tEplKernel EplDllkSetIdentity(tEplDllIdentParam * pDllIdentParam_p);
-
-// process internal events and do work that cannot be done in interrupt-context
-tEplKernel EplDllkProcess(tEplEvent * pEvent_p);
-
-// registers handler for non-EPL frames
-tEplKernel EplDllkRegAsyncHandler(tEplDllkCbAsync pfnDllkCbAsync_p);
-
-// deregisters handler for non-EPL frames
-tEplKernel EplDllkDeregAsyncHandler(tEplDllkCbAsync pfnDllkCbAsync_p);
-
-// register C_DLL_MULTICAST_ASND in ethernet driver if any AsndServiceId is registered
-tEplKernel EplDllkSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p,
- tEplDllAsndFilter Filter_p);
-
-// creates the buffer for a Tx frame and registers it to the ethernet driver
-tEplKernel EplDllkCreateTxFrame(unsigned int *puiHandle_p,
- tEplFrame ** ppFrame_p,
- unsigned int *puiFrameSize_p,
- tEplMsgType MsgType_p,
- tEplDllAsndServiceId ServiceId_p);
-
-tEplKernel EplDllkDeleteTxFrame(unsigned int uiHandle_p);
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-tEplKernel EplDllkAddNode(tEplDllNodeInfo * pNodeInfo_p);
-
-tEplKernel EplDllkDeleteNode(unsigned int uiNodeId_p);
-
-tEplKernel EplDllkSoftDeleteNode(unsigned int uiNodeId_p);
-
-tEplKernel EplDllkSetFlag1OfNode(unsigned int uiNodeId_p, u8 bSoaFlag1_p);
-
-tEplKernel EplDllkGetFirstNodeInfo(tEplDllkNodeInfo ** ppNodeInfo_p);
-
-#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-#endif // #ifndef _EPL_DLLK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for kernelspace 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.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/11/13 17:13:09 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/13 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_DLLKCAL_H_
-#define _EPL_DLLKCAL_H_
-
-#include "../EplDll.h"
-#include "../EplEvent.h"
-
-typedef struct {
- unsigned long m_ulCurTxFrameCountGen;
- unsigned long m_ulCurTxFrameCountNmt;
- unsigned long m_ulCurRxFrameCount;
- unsigned long m_ulMaxTxFrameCountGen;
- unsigned long m_ulMaxTxFrameCountNmt;
- unsigned long m_ulMaxRxFrameCount;
-
-} tEplDllkCalStatistics;
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-tEplKernel EplDllkCalAddInstance(void);
-
-tEplKernel EplDllkCalDelInstance(void);
-
-tEplKernel EplDllkCalAsyncGetTxCount(tEplDllAsyncReqPriority * pPriority_p,
- unsigned int *puiCount_p);
-tEplKernel EplDllkCalAsyncGetTxFrame(void *pFrame_p,
- unsigned int *puiFrameSize_p,
- tEplDllAsyncReqPriority Priority_p);
-// only frames with registered AsndServiceIds are passed to CAL
-tEplKernel EplDllkCalAsyncFrameReceived(tEplFrameInfo * pFrameInfo_p);
-
-tEplKernel EplDllkCalAsyncSend(tEplFrameInfo * pFrameInfo_p,
- tEplDllAsyncReqPriority Priority_p);
-
-tEplKernel EplDllkCalAsyncClearBuffer(void);
-
-tEplKernel EplDllkCalGetStatistics(tEplDllkCalStatistics ** ppStatistics);
-
-tEplKernel EplDllkCalProcess(tEplEvent * pEvent_p);
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-tEplKernel EplDllkCalAsyncClearQueues(void);
-
-tEplKernel EplDllkCalIssueRequest(tEplDllReqServiceId Service_p,
- unsigned int uiNodeId_p, u8 bSoaFlag1_p);
-
-tEplKernel EplDllkCalAsyncGetSoaRequest(tEplDllReqServiceId * pReqServiceId_p,
- unsigned int *puiNodeId_p);
-
-tEplKernel EplDllkCalAsyncSetPendingRequests(unsigned int uiNodeId_p,
- tEplDllAsyncReqPriority
- AsyncReqPrio_p,
- unsigned int uiCount_p);
-
-#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
-
-#endif // #ifndef _EPL_DLLKCAL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for kernel error handler 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: EplErrorHandlerk.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/10/02 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_ERRORHANDLERK_H_
-#define _EPL_ERRORHANDLERK_H_
-
-#include "../EplEvent.h"
-
-// init function
-tEplKernel EplErrorHandlerkInit(void);
-
-// add instance
-tEplKernel EplErrorHandlerkAddInstance(void);
-
-// delete instance
-tEplKernel EplErrorHandlerkDelInstance(void);
-
-// processes error events
-tEplKernel EplErrorHandlerkProcess(tEplEvent *pEvent_p);
-
-#endif // #ifndef _EPL_ERRORHANDLERK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for kernel event 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: EplEventk.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/12 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_EVENTK_H_
-#define _EPL_EVENTK_H_
-
-#include "../EplEvent.h"
-
-// init function
-tEplKernel EplEventkInit(tEplSyncCb fpSyncCb);
-
-// add instance
-tEplKernel EplEventkAddInstance(tEplSyncCb fpSyncCb);
-
-// delete instance
-tEplKernel EplEventkDelInstance(void);
-
-// Kernelthread that dispatches events in kernelspace
-tEplKernel EplEventkProcess(tEplEvent *pEvent_p);
-
-// post events from kernelspace
-tEplKernel EplEventkPost(tEplEvent *pEvent_p);
-
-// post errorevents from kernelspace
-tEplKernel EplEventkPostError(tEplEventSource EventSource_p,
- tEplKernel EplError_p,
- unsigned int uiArgSize_p, void *pArg_p);
-
-#endif // #ifndef _EPL_EVENTK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for NMT-Kernelspace-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: EplNmtk.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLNMTK_H_
-#define _EPLNMTK_H_
-
-#include "../EplNmt.h"
-#include "EplEventk.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
-tEplKernel EplNmtkInit(EPL_MCO_DECL_PTR_INSTANCE_PTR);
-
-tEplKernel EplNmtkAddInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR);
-
-tEplKernel EplNmtkDelInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR);
-
-tEplKernel EplNmtkProcess(EPL_MCO_DECL_PTR_INSTANCE_PTR_ tEplEvent *pEvent_p);
-
-tEplNmtState EplNmtkGetNmtState(EPL_MCO_DECL_PTR_INSTANCE_PTR);
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
-
-#endif // #ifndef _EPLNMTK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for Epl-Obd-Kernel-Modul
-
- 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: EplObdk.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.8 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/19 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLOBDK_H_
-#define _EPLOBDK_H_
-
-#include "../EplObd.h"
-
-extern u8 abEplObdTrashObject_g[8];
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
-// ---------------------------------------------------------------------
-tEplKernel EplObdInit(EPL_MCO_DECL_PTR_INSTANCE_PTR_ tEplObdInitParam *pInitParam_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdAddInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR_ tEplObdInitParam *pInitParam_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdDeleteInstance(EPL_MCO_DECL_INSTANCE_PTR);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdWriteEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdReadEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p, tEplObdSize *pSize_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdSetStoreLoadObjCallback(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdStoreLoadObjCallback fpCallback_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdAccessOdPart(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdPart ObdPart_p,
- tEplObdDir Direction_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdDefineVar(EPL_MCO_DECL_INSTANCE_PTR_ tEplVarParam *pVarParam_p);
-
-// ---------------------------------------------------------------------
-void *EplObdGetObjectDataPtr(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p);
-// ---------------------------------------------------------------------
-tEplKernel EplObdRegisterUserOd(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdEntryPtr pUserOd_p);
-
-// ---------------------------------------------------------------------
-void EplObdInitVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ tEplObdVarEntry *pVarEntry_p,
- tEplObdType Type_p, tEplObdSize ObdSize_p);
-
-// ---------------------------------------------------------------------
-tEplObdSize EplObdGetDataSize(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p);
-
-// ---------------------------------------------------------------------
-unsigned int EplObdGetNodeId(EPL_MCO_DECL_INSTANCE_PTR);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdSetNodeId(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiNodeId_p,
- tEplObdNodeIdType NodeIdType_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdIsNumerical(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p, BOOL *pfEntryNumerical);
-// ---------------------------------------------------------------------
-tEplKernel EplObdWriteEntryFromLe(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p,
- tEplObdSize Size_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdReadEntryToLe(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p,
- tEplObdSize *pSize_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdGetAccessType(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplObdAccess *pAccessTyp_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObdSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdVarEntry **ppVarEntry_p);
-
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
-
-#endif // #ifndef _EPLOBDK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for kernel PDO 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: EplPdok.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/06/23 14:56:33 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/05/22 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_PDOK_H_
-#define _EPL_PDOK_H_
-
-#include "../EplPdo.h"
-#include "../EplEvent.h"
-#include "../EplDll.h"
-
-// process events from queue (PDOs/frames and SoA for synchronization)
-tEplKernel EplPdokProcess(tEplEvent * pEvent_p);
-
-// copies RPDO to event queue for processing
-// is called by DLL in NMT_CS_READY_TO_OPERATE and NMT_CS_OPERATIONAL
-// PDO needs not to be valid
-tEplKernel EplPdokCbPdoReceived(tEplFrameInfo * pFrameInfo_p);
-
-// posts pointer and size of TPDO to event queue
-// is called by DLL in NMT_CS_PRE_OPERATIONAL_2,
-// NMT_CS_READY_TO_OPERATE and NMT_CS_OPERATIONAL
-tEplKernel EplPdokCbPdoTransmitted(tEplFrameInfo * pFrameInfo_p);
-
-// posts SoA event to queue
-tEplKernel EplPdokCbSoa(tEplFrameInfo * pFrameInfo_p);
-
-tEplKernel EplPdokAddInstance(void);
-
-tEplKernel EplPdokDelInstance(void);
-
-#endif // #ifndef _EPL_PDOK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for kernel PDO 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: EplPdokCal.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_PDOKCAL_H_
-#define _EPL_PDOKCAL_H_
-
-#include "../EplInc.h"
-
-tEplKernel EplPdokCalAddInstance(void);
-
-tEplKernel EplPdokCalDelInstance(void);
-
-// sets flag for validity of TPDOs in shared memory
-tEplKernel EplPdokCalSetTpdosValid(BOOL fValid_p);
-
-// gets flag for validity of TPDOs from shared memory
-tEplKernel EplPdokCalAreTpdosValid(BOOL * pfValid_p);
-
-#endif // #ifndef _EPL_PDOKCAL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for EPL high resolution Timermodule
-
- 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: EplTimerHighResk.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/09/29 d.k.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLTIMERHIGHRESK_H_
-#define _EPLTIMERHIGHRESK_H_
-
-#include "../EplTimer.h"
-
-tEplKernel EplTimerHighReskInit(void);
-
-tEplKernel EplTimerHighReskAddInstance(void);
-
-tEplKernel EplTimerHighReskDelInstance(void);
-
-tEplKernel EplTimerHighReskSetTimerNs(tEplTimerHdl *pTimerHdl_p,
- unsigned long long ullTimeNs_p,
- tEplTimerkCallback pfnCallback_p,
- unsigned long ulArgument_p,
- BOOL fContinuously_p);
-
-tEplKernel EplTimerHighReskModifyTimerNs(tEplTimerHdl *pTimerHdl_p,
- unsigned long long ullTimeNs_p,
- tEplTimerkCallback pfnCallback_p,
- unsigned long ulArgument_p,
- BOOL fContinuously_p);
-
-tEplKernel EplTimerHighReskDeleteTimer(tEplTimerHdl *pTimerHdl_p);
-
-#endif // #ifndef _EPLTIMERHIGHRESK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for EPL Kernel-Timermodule
-
- 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: EplTimerk.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/06 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLTIMERK_H_
-#define _EPLTIMERK_H_
-
-#include "../EplTimer.h"
-#include "../user/EplEventu.h"
-
-#if EPL_TIMER_USE_USER != FALSE
-#include "../user/EplTimeru.h"
-#endif
-
-
-#if EPL_TIMER_USE_USER != FALSE
-#define EplTimerkInit EplTimeruInit
-#define EplTimerkAddInstance EplTimeruAddInstance
-#define EplTimerkDelInstance EplTimeruDelInstance
-#define EplTimerkSetTimerMs EplTimeruSetTimerMs
-#define EplTimerkModifyTimerMs EplTimeruModifyTimerMs
-#define EplTimerkDeleteTimer EplTimeruDeleteTimer
-#endif
-
-#if EPL_TIMER_USE_USER == FALSE
-tEplKernel EplTimerkInit(void);
-
-tEplKernel EplTimerkAddInstance(void);
-
-tEplKernel EplTimerkDelInstance(void);
-
-tEplKernel EplTimerkSetTimerMs(tEplTimerHdl *pTimerHdl_p,
- unsigned long ulTime_p,
- tEplTimerArg Argument_p);
-
-tEplKernel EplTimerkModifyTimerMs(tEplTimerHdl *pTimerHdl_p,
- unsigned long ulTime_p,
- tEplTimerArg Argument_p);
-
-tEplKernel EplTimerkDeleteTimer(tEplTimerHdl *pTimerHdl_p);
-#endif
-#endif // #ifndef _EPLTIMERK_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for virtual ethernet driver 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: VirtualEthernet.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- KEIL uVision 2
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/09/19 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_VETH_H_
-#define _EPL_VETH_H_
-
-#include "EplDllk.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
-
-tEplKernel VEthAddInstance(tEplDllkInitParam *pInitParam_p);
-
-tEplKernel VEthDelInstance(void);
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
-
-#endif // #ifndef _EPL_VETH_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: proc fs entry with diagnostic information under Linux
-
- 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: proc_fs.c,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.13 $ $Date: 2008/11/07 13:55:56 $
-
- $State: Exp $
-
- Build Environment:
- GNU
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/31 d.k.: start of implementation
-
-****************************************************************************/
-
-#include "kernel/EplNmtk.h"
-#include "user/EplNmtu.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-#include "user/EplNmtMnu.h"
-#endif
-
-#include "kernel/EplDllkCal.h"
-
-//#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/major.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/atomic.h>
-#include <linux/proc_fs.h>
-#include <linux/spinlock.h>
-
-#ifdef CONFIG_COLDFIRE
-#include <asm/coldfire.h>
-#include "fec.h"
-#endif
-
-#include "proc_fs.h"
-
-/***************************************************************************/
-/* */
-/* */
-/* G L O B A L D E F I N I T I O N S */
-/* */
-/* */
-/***************************************************************************/
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-#ifndef EPL_PROC_DEV_NAME
-#define EPL_PROC_DEV_NAME "epl"
-#endif
-
-#ifndef DBG_TRACE_POINTS
-#define DBG_TRACE_POINTS 23 // # of supported debug trace points
-#endif
-
-#ifndef DBG_TRACE_VALUES
-#define DBG_TRACE_VALUES 24 // # of supported debug trace values (size of circular buffer)
-#endif
-
-//---------------------------------------------------------------------------
-// modul global types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// local vars
-//---------------------------------------------------------------------------
-
-#ifdef _DBG_TRACE_POINTS_
-atomic_t aatmDbgTracePoint_l[DBG_TRACE_POINTS];
-u32 adwDbgTraceValue_l[DBG_TRACE_VALUES];
-u32 dwDbgTraceValueOld_l;
-unsigned int uiDbgTraceValuePos_l;
-spinlock_t spinlockDbgTraceValue_l;
-unsigned long ulDbTraceValueFlags_l;
-#endif
-
-//---------------------------------------------------------------------------
-// local function prototypes
-//---------------------------------------------------------------------------
-
-static int EplLinProcRead(char *pcBuffer_p, char **ppcStart_p, off_t Offset_p,
- int nBufferSize_p, int *pEof_p, void *pData_p);
-static int EplLinProcWrite(struct file *file, const char __user * buffer,
- unsigned long count, void *data);
-
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
-void TgtDbgPostTraceValue(u32 dwTraceValue_p);
-
-extern u32 EplIdentuGetRunningRequests(void);
-
-//=========================================================================//
-// //
-// P U B L I C F U N C T I O N S //
-// //
-//=========================================================================//
-
-tEplKernel EplLinProcInit(void)
-{
- struct proc_dir_entry *pProcDirEntry;
- pProcDirEntry = create_proc_entry(EPL_PROC_DEV_NAME, S_IRUGO, NULL);
- if (pProcDirEntry != NULL) {
- pProcDirEntry->read_proc = EplLinProcRead;
- pProcDirEntry->write_proc = EplLinProcWrite;
- pProcDirEntry->data = NULL; // device number or something else
-
- } else {
- return kEplNoResource;
- }
-
-#ifdef _DBG_TRACE_POINTS_
- // initialize spinlock and circular buffer position
- spin_lock_init(&spinlockDbgTraceValue_l);
- uiDbgTraceValuePos_l = 0;
- dwDbgTraceValueOld_l = 0;
-#endif
-
- return kEplSuccessful;
-}
-
-tEplKernel EplLinProcFree(void)
-{
- remove_proc_entry(EPL_PROC_DEV_NAME, NULL);
-
- return kEplSuccessful;
-}
-
-//---------------------------------------------------------------------------
-// Target specific event signaling (FEC Tx-/Rx-Interrupt, used by Edrv)
-//---------------------------------------------------------------------------
-
-#ifdef _DBG_TRACE_POINTS_
-void TgtDbgSignalTracePoint(u8 bTracePointNumber_p)
-{
-
- if (bTracePointNumber_p >=
- ARRAY_SIZE(aatmDbgTracePoint_l)) {
- goto Exit;
- }
-
- atomic_inc(&aatmDbgTracePoint_l[bTracePointNumber_p]);
-
- Exit:
-
- return;
-
-}
-
-void TgtDbgPostTraceValue(u32 dwTraceValue_p)
-{
-
- spin_lock_irqsave(&spinlockDbgTraceValue_l, ulDbTraceValueFlags_l);
- if (dwDbgTraceValueOld_l != dwTraceValue_p) {
- adwDbgTraceValue_l[uiDbgTraceValuePos_l] = dwTraceValue_p;
- uiDbgTraceValuePos_l =
- (uiDbgTraceValuePos_l + 1) % DBG_TRACE_VALUES;
- dwDbgTraceValueOld_l = dwTraceValue_p;
- }
- spin_unlock_irqrestore(&spinlockDbgTraceValue_l, ulDbTraceValueFlags_l);
-
- return;
-
-}
-#endif
-
-//---------------------------------------------------------------------------
-// Read function for PROC-FS read access
-//---------------------------------------------------------------------------
-
-static int EplLinProcRead(char *pcBuffer_p,
- char **ppcStart_p,
- off_t Offset_p,
- int nBufferSize_p, int *pEof_p, void *pData_p)
-{
-
- int nSize;
- int Eof;
- tEplDllkCalStatistics *pDllkCalStats;
-
- nSize = 0;
- Eof = 0;
-
- // count calls of this function
-#ifdef _DBG_TRACE_POINTS_
- TgtDbgSignalTracePoint(0);
-#endif
-
- //---------------------------------------------------------------
- // generate static information
- //---------------------------------------------------------------
-
- // ---- Driver information ----
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "%s %s (c) 2006 %s\n",
- EPL_PRODUCT_NAME, EPL_PRODUCT_VERSION,
- EPL_PRODUCT_MANUFACTURER);
-
- //---------------------------------------------------------------
- // generate process information
- //---------------------------------------------------------------
-
- // ---- EPL state ----
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "NMT state: 0x%04X\n",
- (u16) EplNmtkGetNmtState());
-
- EplDllkCalGetStatistics(&pDllkCalStats);
-
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "CurAsyncTxGen=%lu CurAsyncTxNmt=%lu CurAsyncRx=%lu\nMaxAsyncTxGen=%lu MaxAsyncTxNmt=%lu MaxAsyncRx=%lu\n",
- pDllkCalStats->m_ulCurTxFrameCountGen,
- pDllkCalStats->m_ulCurTxFrameCountNmt,
- pDllkCalStats->m_ulCurRxFrameCount,
- pDllkCalStats->m_ulMaxTxFrameCountGen,
- pDllkCalStats->m_ulMaxTxFrameCountNmt,
- pDllkCalStats->m_ulMaxRxFrameCount);
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
- // fetch running IdentRequests
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "running IdentRequests: 0x%08X\n",
- EplIdentuGetRunningRequests());
-
- // fetch state of NmtMnu module
- {
- unsigned int uiMandatorySlaveCount;
- unsigned int uiSignalSlaveCount;
- u16 wFlags;
-
- EplNmtMnuGetDiagnosticInfo(&uiMandatorySlaveCount,
- &uiSignalSlaveCount, &wFlags);
-
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "MN MandSlaveCount: %u SigSlaveCount: %u Flags: 0x%X\n",
- uiMandatorySlaveCount, uiSignalSlaveCount,
- wFlags);
-
- }
-#endif
-
- // ---- FEC state ----
-#ifdef CONFIG_COLDFIRE
- {
- // Receive the base address
- unsigned long base_addr;
-#if (EDRV_USED_ETH_CTRL == 0)
- // Set the base address of FEC0
- base_addr = FEC_BASE_ADDR_FEC0;
-#else
- // Set the base address of FEC1
- base_addr = FEC_BASE_ADDR_FEC1;
-#endif
-
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "FEC_ECR = 0x%08X FEC_EIR = 0x%08X FEC_EIMR = 0x%08X\nFEC_TCR = 0x%08X FECTFSR = 0x%08X FECRFSR = 0x%08X\n",
- FEC_ECR(base_addr), FEC_EIR(base_addr),
- FEC_EIMR(base_addr), FEC_TCR(base_addr),
- FEC_FECTFSR(base_addr),
- FEC_FECRFSR(base_addr));
- }
-#endif
-
- // ---- DBG: TracePoints ----
-#ifdef _DBG_TRACE_POINTS_
- {
- int nNum;
-
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "DbgTracePoints:\n");
- for (nNum = 0;
- nNum < ARRAY_SIZE(aatmDbgTracePoint_l);
- nNum++) {
- nSize +=
- snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- " TracePoint[%2d]: %d\n", (int)nNum,
- atomic_read(&aatmDbgTracePoint_l[nNum]));
- }
-
- nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "DbgTraceValues:\n");
- for (nNum = 0; nNum < DBG_TRACE_VALUES; nNum++) {
- if (nNum == uiDbgTraceValuePos_l) { // next value will be stored at that position
- nSize +=
- snprintf(pcBuffer_p + nSize,
- nBufferSize_p - nSize, "*%08lX",
- adwDbgTraceValue_l[nNum]);
- } else {
- nSize +=
- snprintf(pcBuffer_p + nSize,
- nBufferSize_p - nSize, " %08lX",
- adwDbgTraceValue_l[nNum]);
- }
- if ((nNum & 0x00000007) == 0x00000007) { // 8 values printed -> end of line reached
- nSize +=
- snprintf(pcBuffer_p + nSize,
- nBufferSize_p - nSize, "\n");
- }
- }
- if ((nNum & 0x00000007) != 0x00000007) { // number of values printed is not a multiple of 8 -> print new line
- nSize +=
- snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
- "\n");
- }
- }
-#endif
-
- Eof = 1;
- goto Exit;
-
- Exit:
-
- *pEof_p = Eof;
-
- return (nSize);
-
-}
-
-//---------------------------------------------------------------------------
-// Write function for PROC-FS write access
-//---------------------------------------------------------------------------
-
-static int EplLinProcWrite(struct file *file, const char __user * buffer,
- unsigned long count, void *data)
-{
- char abBuffer[count + 1];
- int iErr;
- int iVal = 0;
- tEplNmtEvent NmtEvent;
-
- if (count > 0) {
- iErr = copy_from_user(abBuffer, buffer, count);
- if (iErr != 0) {
- return count;
- }
- abBuffer[count] = '\0';
-
- iErr = sscanf(abBuffer, "%i", &iVal);
- }
- if ((iVal <= 0) || (iVal > 0x2F)) {
- NmtEvent = kEplNmtEventSwReset;
- } else {
- NmtEvent = (tEplNmtEvent) iVal;
- }
- // execute specified NMT command on write access of /proc/epl
- EplNmtuNmtEvent(NmtEvent);
-
- return count;
-}
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: interface for proc fs entry under Linux
-
- 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: proc_fs.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:33 $
-
- $State: Exp $
-
- Build Environment:
- GNU
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/31 d.k.: start of implementation
-
-****************************************************************************/
-
-#ifndef _EPLPROCFS_H_
-#define _EPLPROCFS_H_
-
-//---------------------------------------------------------------------------
-// const defines
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// types
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// function prototypes
-//---------------------------------------------------------------------------
-
-tEplKernel EplLinProcInit(void);
-tEplKernel EplLinProcFree(void);
-
-#endif // #ifndef _EPLPROCFS_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for Epl Configuration Manager 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: EplCfgMau.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- VC7
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/14 k.t.: start of the implementation
- -> based on CANopen CfgMa-Modul (CANopen version 5.34)
-
-****************************************************************************/
-
-#ifndef _EPLCFGMA_H_
-#define _EPLCFGMA_H_
-
-#include "../EplInc.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_CFGMA)) != 0)
-
-#include "EplObdu.h"
-#include "EplSdoComu.h"
-
-//define max number of timeouts for configuration of 1 device
-#define EPL_CFGMA_MAX_TIMEOUT 3
-
-//callbackfunction, called if configuration is finished
-typedef void (* tfpEplCfgMaCb)(unsigned int uiNodeId_p,
- tEplKernel Errorstate_p);
-
-//State for configuartion manager Statemachine
-typedef enum {
- // general states
- kEplCfgMaIdle = 0x0000, // Configurationsprocess
- // is idle
- kEplCfgMaWaitForSdocEvent = 0x0001, // wait until the last
- // SDOC is finisched
- kEplCfgMaSkipMappingSub0 = 0x0002, // write Sub0 of mapping
- // parameter with 0
-
- kEplCfgMaFinished = 0x0004 // configuartion is finished
-} tEplCfgState;
-
-typedef enum {
- kEplCfgMaDcfTypSystecSeg = 0x00,
- kEplCfgMaDcfTypConDcf = 0x01,
- kEplCfgMaDcfTypDcf = 0x02, // not supported
- kEplCfgMaDcfTypXdc = 0x03 // not supported
-} tEplCfgMaDcfTyp;
-
-typedef enum {
- kEplCfgMaCommon = 0, // all other index
- kEplCfgMaPdoComm = 1, // communication index
- kEplCfgMaPdoMapp = 2, // mapping index
- kEplCfgMaPdoCommAfterMapp = 3, // write PDO Cob-Id after mapping subindex 0(set PDO valid)
-
-} tEplCfgMaIndexType;
-
-//bitcoded answer about the last sdo transfer saved in m_SdocState
-// also used to singal start of the State Maschine
-typedef enum {
- kEplCfgMaSdocBusy = 0x00, // SDOC activ
- kEplCfgMaSdocReady = 0x01, // SDOC finished
- kEplCfgMaSdocTimeout = 0x02, // SDOC Timeout
- kEplCfgMaSdocAbortReceived = 0x04, // SDOC Abort, see Abortcode
- kEplCfgMaSdocStart = 0x08 // start State Mschine
-} tEplSdocState;
-
-//internal structure (instancetable for modul configuration manager)
-typedef struct {
- tEplCfgState m_CfgState; // state of the configuration state maschine
- tEplSdoComConHdl m_SdoComConHdl; // handle for sdo connection
- u32 m_dwLastAbortCode;
- unsigned int m_uiLastIndex; // last index of configuration, to compair with actual index
- u8 *m_pbConcise; // Ptr to concise DCF
- u8 *m_pbActualIndex; // Ptr to actual index in the DCF segment
- tfpEplCfgMaCb m_pfnCfgMaCb; // Ptr to CfgMa Callback, is call if configuration finished
- tEplKernel m_EplKernelError; // errorcode
- u32 m_dwNumValueCopy; // numeric values are copied in this variable
- unsigned int m_uiPdoNodeId; // buffer for PDO node id
- u8 m_bNrOfMappedObject; // number of mapped objects
- unsigned int m_uiNodeId; // Epl node addresse
- tEplSdocState m_SdocState; // bitcoded state of the SDO transfer
- unsigned int m_uiLastSubIndex; // last subindex of configuration
- BOOL m_fOneTranferOk; // atleased one transfer was successful
- u8 m_bEventFlag; // for Eventsignaling to the State Maschine
- u32 m_dwCntObjectInDcf; // number of Objects in DCF
- tEplCfgMaIndexType m_SkipCfg; // TRUE if a adsitional Configurationprocess
- // have to insert e.g. PDO-mapping
- u16 m_wTimeOutCnt; // Timeout Counter, break configuration is
- // m_wTimeOutCnt == CFGMA_MAX_TIMEOUT
-
-} tEplCfgMaNode;
-
-//---------------------------------------------------------------------------
-// Function: EplCfgMaInit()
-//
-// Description: Function creates first instance of Configuration Manager
-//
-// Parameters:
-//
-// Returns: tEplKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel EplCfgMaInit(void);
-
-//---------------------------------------------------------------------------
-// Function: EplCfgMaAddInstance()
-//
-// Description: Function creates additional instance of Configuration Manager
-//
-// Parameters:
-//
-// Returns: tEplKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel EplCfgMaAddInstance(void);
-
-//---------------------------------------------------------------------------
-// Function: EplCfgMaDelInstance()
-//
-// Description: Function delete instance of Configuration Manager
-//
-// Parameters:
-//
-// Returns: tEplKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel plCfgMaDelInstance(void);
-
-//---------------------------------------------------------------------------
-// Function: EplCfgMaStartConfig()
-//
-// Description: Function starts the configuration process
-// initialization the statemachine for CfgMa- process
-//
-// Parameters: uiNodeId_p = NodeId of the node to configure
-// pbConcise_p = pointer to DCF
-// fpCfgMaCb_p = pointer to callback function (should not be NULL)
-// SizeOfConcise_p = size of DCF in u8 -> for future use
-// DcfType_p = type of the DCF
-//
-// Returns: tCopKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel EplCfgMaStartConfig(unsigned int uiNodeId_p,
- u8 * pbConcise_p,
- tfpEplCfgMaCb fpCfgMaCb_p,
- tEplObdSize SizeOfConcise_p,
- tEplCfgMaDcfTyp DcfType_p);
-
-//---------------------------------------------------------------------------
-// Function: CfgMaStartConfigurationNode()
-//
-// Description: Function started the configuration process
-// with the DCF from according OD-entry Subindex == bNodeId_p
-//
-// Parameters: uiNodeId_p = NodeId of the node to configure
-// fpCfgMaCb_p = pointer to callback function (should not be NULL)
-// DcfType_p = type of the DCF
-//
-// Returns: tCopKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel EplCfgMaStartConfigNode(unsigned int uiNodeId_p,
- tfpEplCfgMaCb fpCfgMaCb_p,
- tEplCfgMaDcfTyp DcfType_p);
-
-//---------------------------------------------------------------------------
-// Function: EplCfgMaStartConfigNodeDcf()
-//
-// Description: Function starts the configuration process
-// and links the configuration data to the OD
-//
-// Parameters: uiNodeId_p = NodeId of the node to configure
-// pbConcise_p = pointer to DCF
-// fpCfgMaCb_p = pointer to callback function (should not be NULL)
-// SizeOfConcise_p = size of DCF in u8 -> for future use
-// DcfType_p = type of the DCF
-//
-// Returns: tCopKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel EplCfgMaStartConfigNodeDcf(unsigned int uiNodeId_p,
- u8 * pbConcise_p,
- tfpEplCfgMaCb fpCfgMaCb_p,
- tEplObdSize SizeOfConcise_p,
- tEplCfgMaDcfTyp DcfType_p);
-
-//---------------------------------------------------------------------------
-// Function: EplCfgMaLinkDcf()
-//
-// Description: Function links the configuration data to the OD
-//
-// Parameters: uiNodeId_p = NodeId of the node to configure
-// pbConcise_p = pointer to DCF
-// SizeOfConcise_p = size of DCF in u8 -> for future use
-// DcfType_p = type of the DCF
-//
-// Returns: tCopKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel EplCfgMaLinkDcf(unsigned int uiNodeId_p,
- u8 * pbConcise_p,
- tEplObdSize SizeOfConcise_p,
- tEplCfgMaDcfTyp DcfType_p);
-
-//---------------------------------------------------------------------------
-// Function: EplCfgMaCheckDcf()
-//
-// Description: Function check if there is allready a configuration file linked
-// to the OD (type is given by DcfType_p)
-//
-// Parameters: uiNodeId_p = NodeId
-// DcfType_p = type of the DCF
-//
-// Returns: tCopKernel = error code
-//---------------------------------------------------------------------------
-tEplKernel EplCfgMaCheckDcf(unsigned int uiNodeId_p, tEplCfgMaDcfTyp DcfType_p);
-
-#endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_CFGMA)) != 0)
-
-#endif // _EPLCFGMA_H_
-
-// EOF
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for userspace DLL module for asynchronous communication
-
- 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: EplDllu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/20 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_DLLU_H_
-#define _EPL_DLLU_H_
-
-#include "../EplDll.h"
-
-typedef tEplKernel(* tEplDlluCbAsnd) (tEplFrameInfo * pFrameInfo_p);
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
-
-tEplKernel EplDlluAddInstance(void);
-
-tEplKernel EplDlluDelInstance(void);
-
-tEplKernel EplDlluRegAsndService(tEplDllAsndServiceId ServiceId_p,
- tEplDlluCbAsnd pfnDlluCbAsnd_p,
- tEplDllAsndFilter Filter_p);
-
-tEplKernel EplDlluAsyncSend(tEplFrameInfo * pFrameInfo_p,
- tEplDllAsyncReqPriority Priority_p);
-
-// processes asynch frames
-tEplKernel EplDlluProcess(tEplFrameInfo * pFrameInfo_p);
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
-
-#endif // #ifndef _EPL_DLLU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for DLL Communication Abstraction Layer module in EPL user part
-
- 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: EplDlluCal.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/20 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_DLLUCAL_H_
-#define _EPL_DLLUCAL_H_
-
-#include "../EplDll.h"
-#include "../EplEvent.h"
-
-
-typedef tEplKernel(* tEplDlluCbAsnd) (tEplFrameInfo * pFrameInfo_p);
-
-tEplKernel EplDlluCalAddInstance(void);
-
-tEplKernel EplDlluCalDelInstance(void);
-
-tEplKernel EplDlluCalRegAsndService(tEplDllAsndServiceId ServiceId_p,
- tEplDlluCbAsnd pfnDlluCbAsnd_p,
- tEplDllAsndFilter Filter_p);
-
-tEplKernel EplDlluCalAsyncSend(tEplFrameInfo * pFrameInfo,
- tEplDllAsyncReqPriority Priority_p);
-
-tEplKernel EplDlluCalProcess(tEplEvent * pEvent_p);
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-tEplKernel EplDlluCalAddNode(tEplDllNodeInfo * pNodeInfo_p);
-
-tEplKernel EplDlluCalDeleteNode(unsigned int uiNodeId_p);
-
-tEplKernel EplDlluCalSoftDeleteNode(unsigned int uiNodeId_p);
-
-tEplKernel EplDlluCalIssueRequest(tEplDllReqServiceId Service_p,
- unsigned int uiNodeId_p, u8 bSoaFlag1_p);
-
-#endif
-
-#endif // #ifndef _EPL_DLLUCAL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for kernel event 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: EplEventu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/12 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_EVENTU_H_
-#define _EPL_EVENTU_H_
-
-#include "../EplEvent.h"
-
-// init function
-tEplKernel EplEventuInit(tEplProcessEventCb pfnApiProcessEventCb_p);
-
-// add instance
-tEplKernel EplEventuAddInstance(tEplProcessEventCb pfnApiProcessEventCb_p);
-
-// delete instance
-tEplKernel EplEventuDelInstance(void);
-
-// Task that dispatches events in userspace
-tEplKernel EplEventuProcess(tEplEvent * pEvent_p);
-
-// post events from userspace
-tEplKernel EplEventuPost(tEplEvent * pEvent_p);
-
-// post errorevents from userspace
-tEplKernel EplEventuPostError(tEplEventSource EventSource_p,
- tEplKernel EplError_p,
- unsigned int uiArgSize_p, void *pArg_p);
-
-#endif // #ifndef _EPL_EVENTU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for Identu-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: EplIdentu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/11/15 d.k.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLIDENTU_H_
-#define _EPLIDENTU_H_
-
-#include "../EplDll.h"
-
-typedef tEplKernel(* tEplIdentuCbResponse) (unsigned int uiNodeId_p,
- tEplIdentResponse *
- pIdentResponse_p);
-
-tEplKernel EplIdentuInit(void);
-
-tEplKernel EplIdentuAddInstance(void);
-
-tEplKernel EplIdentuDelInstance(void);
-
-tEplKernel EplIdentuReset(void);
-
-tEplKernel EplIdentuGetIdentResponse(unsigned int uiNodeId_p,
- tEplIdentResponse **ppIdentResponse_p);
-
-tEplKernel EplIdentuRequestIdentResponse(unsigned int uiNodeId_p,
- tEplIdentuCbResponse pfnCbResponse_p);
-
-#endif // #ifndef _EPLIDENTU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for status and error LED user part 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: EplLedu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.1 $ $Date: 2008/11/17 16:40:39 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2008/11/17 d.k.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLLEDU_H_
-#define _EPLLEDU_H_
-
-#include "../EplLed.h"
-#include "../EplNmt.h"
-#include "EplEventu.h"
-
-typedef tEplKernel(* tEplLeduStateChangeCallback) (tEplLedType LedType_p,
- BOOL fOn_p);
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
-
-tEplKernel EplLeduInit(tEplLeduStateChangeCallback pfnCbStateChange_p);
-
-tEplKernel EplLeduAddInstance(tEplLeduStateChangeCallback pfnCbStateChange_p);
-
-tEplKernel EplLeduDelInstance(void);
-
-tEplKernel EplLeduCbNmtStateChange(tEplEventNmtStateChange NmtStateChange_p);
-
-tEplKernel EplLeduProcessEvent(tEplEvent * pEplEvent_p);
-
-#endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
-
-#endif // #ifndef _EPLLEDU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for NMT-CN-Userspace-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: EplNmtCnu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLNMTCNU_H_
-#define _EPLNMTCNU_H_
-
-#include "EplNmtu.h"
-#include "../EplDll.h"
-#include "../EplFrame.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_CN)) != 0)
-
-tEplKernel EplNmtCnuInit(unsigned int uiNodeId_p);
-
-tEplKernel EplNmtCnuAddInstance(unsigned int uiNodeId_p);
-
-tEplKernel EplNmtCnuDelInstance(void);
-
-tEplKernel EplNmtCnuSendNmtRequest(unsigned int uiNodeId_p, tEplNmtCommand NmtCommand_p);
-
-tEplKernel EplNmtCnuRegisterCheckEventCb(tEplNmtuCheckEventCallback pfnEplNmtCheckEventCb_p);
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_CN)) != 0)
-
-#endif // #ifndef _EPLNMTCNU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for NMT-MN-Userspace-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: EplNmtMnu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLNMTMNU_H_
-#define _EPLNMTMNU_H_
-
-#include "EplNmtu.h"
-
-typedef tEplKernel(* tEplNmtMnuCbNodeEvent) (unsigned int uiNodeId_p,
- tEplNmtNodeEvent NodeEvent_p,
- tEplNmtState NmtState_p,
- u16 wErrorCode_p,
- BOOL fMandatory_p);
-
-typedef tEplKernel(* tEplNmtMnuCbBootEvent) (tEplNmtBootEvent BootEvent_p,
- tEplNmtState NmtState_p,
- u16 wErrorCode_p);
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
-
-tEplKernel EplNmtMnuInit(tEplNmtMnuCbNodeEvent pfnCbNodeEvent_p,
- tEplNmtMnuCbBootEvent pfnCbBootEvent_p);
-
-tEplKernel EplNmtMnuAddInstance(tEplNmtMnuCbNodeEvent pfnCbNodeEvent_p,
- tEplNmtMnuCbBootEvent pfnCbBootEvent_p);
-
-tEplKernel EplNmtMnuDelInstance(void);
-
-tEplKernel EplNmtMnuProcessEvent(tEplEvent *pEvent_p);
-
-tEplKernel EplNmtMnuSendNmtCommand(unsigned int uiNodeId_p,
- tEplNmtCommand NmtCommand_p);
-
-tEplKernel EplNmtMnuTriggerStateChange(unsigned int uiNodeId_p,
- tEplNmtNodeCommand NodeCommand_p);
-
-tEplKernel EplNmtMnuCbNmtStateChange(tEplEventNmtStateChange
- NmtStateChange_p);
-
-tEplKernel EplNmtMnuCbCheckEvent(tEplNmtEvent NmtEvent_p);
-
-tEplKernel EplNmtMnuGetDiagnosticInfo(unsigned int
- *puiMandatorySlaveCount_p,
- unsigned int
- *puiSignalSlaveCount_p,
- u16 * pwFlags_p);
-
-#endif
-
-#endif // #ifndef _EPLNMTMNU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for NMT-Userspace-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: EplNmtu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/09 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLNMTU_H_
-#define _EPLNMTU_H_
-
-#include "../EplNmt.h"
-#include "EplEventu.h"
-
-// nmt commands
-typedef enum {
- // requestable ASnd ServiceIds 0x01..0x1F
- kEplNmtCmdIdentResponse = 0x01,
- kEplNmtCmdStatusResponse = 0x02,
- // plain NMT state commands 0x20..0x3F
- kEplNmtCmdStartNode = 0x21,
- kEplNmtCmdStopNode = 0x22,
- kEplNmtCmdEnterPreOperational2 = 0x23,
- kEplNmtCmdEnableReadyToOperate = 0x24,
- kEplNmtCmdResetNode = 0x28,
- kEplNmtCmdResetCommunication = 0x29,
- kEplNmtCmdResetConfiguration = 0x2A,
- kEplNmtCmdSwReset = 0x2B,
- // extended NMT state commands 0x40..0x5F
- kEplNmtCmdStartNodeEx = 0x41,
- kEplNmtCmdStopNodeEx = 0x42,
- kEplNmtCmdEnterPreOperational2Ex = 0x43,
- kEplNmtCmdEnableReadyToOperateEx = 0x44,
- kEplNmtCmdResetNodeEx = 0x48,
- kEplNmtCmdResetCommunicationEx = 0x49,
- kEplNmtCmdResetConfigurationEx = 0x4A,
- kEplNmtCmdSwResetEx = 0x4B,
- // NMT managing commands 0x60..0x7F
- kEplNmtCmdNetHostNameSet = 0x62,
- kEplNmtCmdFlushArpEntry = 0x63,
- // NMT info services 0x80..0xBF
- kEplNmtCmdPublishConfiguredCN = 0x80,
- kEplNmtCmdPublishActiveCN = 0x90,
- kEplNmtCmdPublishPreOperational1 = 0x91,
- kEplNmtCmdPublishPreOperational2 = 0x92,
- kEplNmtCmdPublishReadyToOperate = 0x93,
- kEplNmtCmdPublishOperational = 0x94,
- kEplNmtCmdPublishStopped = 0x95,
- kEplNmtCmdPublishEmergencyNew = 0xA0,
- kEplNmtCmdPublishTime = 0xB0,
-
- kEplNmtCmdInvalidService = 0xFF
-} tEplNmtCommand;
-
-typedef tEplKernel(* tEplNmtuStateChangeCallback) (tEplEventNmtStateChange NmtStateChange_p);
-
-typedef tEplKernel(* tEplNmtuCheckEventCallback) (tEplNmtEvent NmtEvent_p);
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
-
-tEplKernel EplNmtuInit(void);
-
-tEplKernel EplNmtuAddInstance(void);
-
-tEplKernel EplNmtuDelInstance(void);
-
-tEplKernel EplNmtuNmtEvent(tEplNmtEvent NmtEvent_p);
-
-tEplNmtState EplNmtuGetNmtState(void);
-
-tEplKernel EplNmtuProcessEvent(tEplEvent *pEplEvent_p);
-
-tEplKernel EplNmtuRegisterStateChangeCb(tEplNmtuStateChangeCallback pfnEplNmtStateChangeCb_p);
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
-
-#endif // #ifndef _EPLNMTU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for communication abstraction layer of the
- NMT-Userspace-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: EplNmtuCal.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/16 -k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLNMTUCAL_H_
-#define _EPLNMTUCAL_H_
-
-#include "EplNmtu.h"
-#include "../kernel/EplNmtk.h"
-
-tEplNmtState EplNmtkCalGetNmtState(void);
-
-#endif // #ifndef _EPLNMTUCAL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for Epl-Obd-Userspace-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: EplObdu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/19 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLOBDU_H_
-#define _EPLOBDU_H_
-
-#include "../EplObd.h"
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
-
-#if EPL_OBD_USE_KERNEL != FALSE
-#error "EPL OBDu module enabled, but OBD_USE_KERNEL == TRUE"
-#endif
-
-tEplKernel EplObduWriteEntry(unsigned int uiIndex_p, unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObduReadEntry(unsigned int uiIndex_p, unsigned int uiSubIndex_p,
- void *pDstData_p, tEplObdSize *pSize_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObduAccessOdPart(tEplObdPart ObdPart_p, tEplObdDir Direction_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObduDefineVar(tEplVarParam *pVarParam_p);
-
-// ---------------------------------------------------------------------
-void *EplObduGetObjectDataPtr(unsigned int uiIndex_p, unsigned int uiSubIndex_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObduRegisterUserOd(tEplObdEntryPtr pUserOd_p);
-
-// ---------------------------------------------------------------------
-void EplObduInitVarEntry(tEplObdVarEntry *pVarEntry_p, u8 bType_p,
- tEplObdSize ObdSize_p);
-
-// ---------------------------------------------------------------------
-tEplObdSize EplObduGetDataSize(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p);
-
-// ---------------------------------------------------------------------
-unsigned int EplObduGetNodeId(void);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObduSetNodeId(unsigned int uiNodeId_p,
- tEplObdNodeIdType NodeIdType_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObduGetAccessType(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplObdAccess *pAccessTyp_p);
-// ---------------------------------------------------------------------
-tEplKernel EplObduReadEntryToLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p, tEplObdSize *pSize_p);
-// ---------------------------------------------------------------------
-tEplKernel EplObduWriteEntryFromLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p, tEplObdSize Size_p);
-
-// ---------------------------------------------------------------------
-tEplKernel EplObduSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdVarEntry **ppVarEntry_p);
-
-#elif EPL_OBD_USE_KERNEL != FALSE
-#include "../kernel/EplObdk.h"
-
-#define EplObduWriteEntry EplObdWriteEntry
-
-#define EplObduReadEntry EplObdReadEntry
-
-#define EplObduAccessOdPart EplObdAccessOdPart
-
-#define EplObduDefineVar EplObdDefineVar
-
-#define EplObduGetObjectDataPtr EplObdGetObjectDataPtr
-
-#define EplObduRegisterUserOd EplObdRegisterUserOd
-
-#define EplObduInitVarEntry EplObdInitVarEntry
-
-#define EplObduGetDataSize EplObdGetDataSize
-
-#define EplObduGetNodeId EplObdGetNodeId
-
-#define EplObduSetNodeId EplObdSetNodeId
-
-#define EplObduGetAccessType EplObdGetAccessType
-
-#define EplObduReadEntryToLe EplObdReadEntryToLe
-
-#define EplObduWriteEntryFromLe EplObdWriteEntryFromLe
-
-#define EplObduSearchVarEntry EplObdSearchVarEntry
-
-#define EplObduIsNumerical EplObdIsNumerical
-
-#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
-
-#endif // #ifndef _EPLOBDU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for communication abstraction layer
- for the Epl-Obd-Userspace-Modul
-
- 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: EplObduCal.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/19 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLOBDUCAL_H_
-#define _EPLOBDUCAL_H_
-
-#include "../EplObd.h"
-
-tEplKernel EplObduCalWriteEntry(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p,
- tEplObdSize Size_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalReadEntry(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p,
- tEplObdSize *pSize_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalAccessOdPart(tEplObdPart ObdPart_p,
- tEplObdDir Direction_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalDefineVar(tEplVarParam *pVarParam_p);
-//---------------------------------------------------------------------------
-void *EplObduCalGetObjectDataPtr(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalRegisterUserOd(tEplObdEntryPtr pUserOd_p);
-//---------------------------------------------------------------------------
-void EplObduCalInitVarEntry(tEplObdVarEntry *pVarEntry_p,
- u8 bType_p, tEplObdSize ObdSize_p);
-//---------------------------------------------------------------------------
-tEplObdSize EplObduCalGetDataSize(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p);
-//---------------------------------------------------------------------------
-unsigned int EplObduCalGetNodeId(void);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalSetNodeId(unsigned int uiNodeId_p,
- tEplObdNodeIdType NodeIdType_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalGetAccessType(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- tEplObdAccess *pAccessTyp_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalReadEntryToLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pDstData_p,
- tEplObdSize *pSize_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalWriteEntryFromLe(unsigned int uiIndex_p,
- unsigned int uiSubIndex_p,
- void *pSrcData_p,
- tEplObdSize Size_p);
-//---------------------------------------------------------------------------
-tEplKernel EplObduCalSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
- unsigned int uiSubindex_p,
- tEplObdVarEntry **ppVarEntry_p);
-
-#endif // #ifndef _EPLOBDUCAL_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for userspace PDO 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: EplPdou.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/11/19 17:14:38 $
-
- $State: Exp $
-
- Build Environment:
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/05/22 d.k.: start of the implementation, version 1.00
-
-****************************************************************************/
-
-#ifndef _EPL_PDOU_H_
-#define _EPL_PDOU_H_
-
-#include "../EplPdo.h"
-
-tEplKernel EplPdouAddInstance(void);
-
-tEplKernel EplPdouDelInstance(void);
-
-#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOU)) != 0)
-tEplKernel EplPdouCbObdAccess(tEplObdCbParam *pParam_p);
-#else
-#define EplPdouCbObdAccess NULL
-#endif
-
-// returns error if bPdoId_p is already valid
-/*
-tEplKernel EplPdouSetMapping(
- u8 bPdoId_p, BOOL fTxRx_p, u8 bNodeId, u8 bMappingVersion,
- tEplPdoMapping * pMapping_p, u8 bMaxEntries_p);
-
-tEplKernel EplPdouGetMapping(
- u8 bPdoId_p, BOOL fTxRx_p, u8 * pbNodeId, u8 * pbMappingVersion,
- tEplPdoMapping * pMapping_p, u8 * pbMaxEntries_p);
-*/
-
-#endif // #ifndef _EPL_PDOU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for SDO/Asnd-Protocolabstractionlayer 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: EplSdoAsndu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.6 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/07 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLSDOASNDU_H_
-#define _EPLSDOASNDU_H_
-
-#include "../EplSdo.h"
-#include "../EplDll.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
-
-tEplKernel EplSdoAsnduInit(tEplSequLayerReceiveCb fpReceiveCb_p);
-
-tEplKernel EplSdoAsnduAddInstance(tEplSequLayerReceiveCb fpReceiveCb_p);
-
-tEplKernel EplSdoAsnduDelInstance(void);
-
-tEplKernel EplSdoAsnduInitCon(tEplSdoConHdl *pSdoConHandle_p,
- unsigned int uiTargetNodeId_p);
-
-tEplKernel EplSdoAsnduSendData(tEplSdoConHdl SdoConHandle_p,
- tEplFrame *pSrcData_p,
- u32 dwDataSize_p);
-
-tEplKernel EplSdoAsnduDelCon(tEplSdoConHdl SdoConHandle_p);
-
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
-
-#endif // #ifndef _EPLSDOASNDU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for asychrionus SDO Sequence 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: EplSdoAsySequ.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.4 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLSDOASYSEQU_H_
-#define _EPLSDOASYSEQU_H_
-
-#include "../EplSdo.h"
-#include "EplSdoUdpu.h"
-#include "EplSdoAsndu.h"
-#include "../EplEvent.h"
-#include "EplTimeru.h"
-
-tEplKernel EplSdoAsySeqInit(tEplSdoComReceiveCb fpSdoComCb_p,
- tEplSdoComConCb fpSdoComConCb_p);
-
-tEplKernel EplSdoAsySeqAddInstance(tEplSdoComReceiveCb fpSdoComCb_p,
- tEplSdoComConCb fpSdoComConCb_p);
-
-tEplKernel EplSdoAsySeqDelInstance(void);
-
-tEplKernel EplSdoAsySeqInitCon(tEplSdoSeqConHdl *pSdoSeqConHdl_p,
- unsigned int uiNodeId_p,
- tEplSdoType SdoType);
-
-tEplKernel EplSdoAsySeqSendData(tEplSdoSeqConHdl SdoSeqConHdl_p,
- unsigned int uiDataSize_p,
- tEplFrame *pData_p);
-
-tEplKernel EplSdoAsySeqProcessEvent(tEplEvent *pEvent_p);
-
-tEplKernel EplSdoAsySeqDelCon(tEplSdoSeqConHdl SdoSeqConHdl_p);
-
-#endif // #ifndef _EPLSDOASYSEQU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for SDO Command 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: EplSdoComu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLSDOCOMU_H_
-#define _EPLSDOCOMU_H_
-
-#include "../EplSdo.h"
-#include "../EplObd.h"
-#include "../EplSdoAc.h"
-#include "EplObdu.h"
-#include "EplSdoAsySequ.h"
-
-tEplKernel EplSdoComInit(void);
-
-tEplKernel EplSdoComAddInstance(void);
-
-tEplKernel EplSdoComDelInstance(void);
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0)
-
-tEplKernel EplSdoComDefineCon(tEplSdoComConHdl *pSdoComConHdl_p,
- unsigned int uiTargetNodeId_p,
- tEplSdoType ProtType_p);
-
-tEplKernel EplSdoComInitTransferByIndex(tEplSdoComTransParamByIndex *pSdoComTransParam_p);
-
-tEplKernel EplSdoComUndefineCon(tEplSdoComConHdl SdoComConHdl_p);
-
-tEplKernel EplSdoComGetState(tEplSdoComConHdl SdoComConHdl_p,
- tEplSdoComFinished *pSdoComFinished_p);
-
-tEplKernel EplSdoComSdoAbort(tEplSdoComConHdl SdoComConHdl_p,
- u32 dwAbortCode_p);
-
-#endif
-
-// for future extention
-/*
-tEplKernel EplSdoComInitTransferAllByIndex(tEplSdoComTransParamAllByIndex* pSdoComTransParam_p);
-
-tEplKernel EplSdoComInitTransferByName(tEplSdoComTransParamByName* pSdoComTransParam_p);
-
-tEplKernel EplSdoComInitTransferFile(tEplSdoComTransParamFile* pSdoComTransParam_p);
-
-*/
-
-#endif // #ifndef _EPLSDOCOMU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for SDO/UDP-Protocollabstractionlayer 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: EplSdoUdpu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/06/26 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLSDOUDPU_H_
-#define _EPLSDOUDPU_H_
-
-#include "../EplSdo.h"
-
-#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
-
-tEplKernel EplSdoUdpuInit(tEplSequLayerReceiveCb fpReceiveCb_p);
-
-tEplKernel EplSdoUdpuAddInstance(tEplSequLayerReceiveCb fpReceiveCb_p);
-
-tEplKernel EplSdoUdpuDelInstance(void);
-
-tEplKernel EplSdoUdpuConfig(unsigned long ulIpAddr_p,
- unsigned int uiPort_p);
-
-tEplKernel EplSdoUdpuInitCon(tEplSdoConHdl *pSdoConHandle_p,
- unsigned int uiTargetNodeId_p);
-
-tEplKernel EplSdoUdpuSendData(tEplSdoConHdl SdoConHandle_p,
- tEplFrame *pSrcData_p, u32 dwDataSize_p);
-
-tEplKernel EplSdoUdpuDelCon(tEplSdoConHdl SdoConHandle_p);
-
-#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
-
-#endif // #ifndef _EPLSDOUDPU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for Statusu-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: EplStatusu.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/11/15 d.k.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLSTATUSU_H_
-#define _EPLSTATUSU_H_
-
-#include "../EplDll.h"
-
-typedef tEplKernel(* tEplStatusuCbResponse) (unsigned int uiNodeId_p,
- tEplStatusResponse *pStatusResponse_p);
-
-tEplKernel EplStatusuInit(void);
-
-tEplKernel EplStatusuAddInstance(void);
-
-tEplKernel EplStatusuDelInstance(void);
-
-tEplKernel EplStatusuReset(void);
-
-tEplKernel EplStatusuRequestStatusResponse(unsigned int uiNodeId_p,
- tEplStatusuCbResponse pfnCbResponse_p);
-
-#endif // #ifndef _EPLSTATUSU_H_
+++ /dev/null
-/****************************************************************************
-
- (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
- www.systec-electronic.com
-
- Project: openPOWERLINK
-
- Description: include file for Epl Userspace-Timermodule
-
- 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: EplTimeru.h,v $
-
- $Author: D.Krueger $
-
- $Revision: 1.5 $ $Date: 2008/04/17 21:36:32 $
-
- $State: Exp $
-
- Build Environment:
- GCC V3.4
-
- -------------------------------------------------------------------------
-
- Revision History:
-
- 2006/07/06 k.t.: start of the implementation
-
-****************************************************************************/
-
-#ifndef _EPLTIMERU_H_
-#define _EPLTIMERU_H_
-
-#include "../EplTimer.h"
-#include "EplEventu.h"
-
-tEplKernel EplTimeruInit(void);
-
-tEplKernel EplTimeruAddInstance(void);
-
-tEplKernel EplTimeruDelInstance(void);
-
-tEplKernel EplTimeruSetTimerMs(tEplTimerHdl *pTimerHdl_p,
- unsigned long ulTime_p,
- tEplTimerArg Argument_p);
-
-tEplKernel EplTimeruModifyTimerMs(tEplTimerHdl *pTimerHdl_p,
- unsigned long ulTime_p,
- tEplTimerArg Argument_p);
-
-tEplKernel EplTimeruDeleteTimer(tEplTimerHdl *pTimerHdl_p);
-
-BOOL EplTimeruIsTimerActive(tEplTimerHdl TimerHdl_p);
-
-#endif // #ifndef _EPLTIMERU_H_