diff options
105 files changed, 0 insertions, 50482 deletions
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 58274ca5e63..7b500a88060 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -95,8 +95,6 @@ source "drivers/staging/mimio/Kconfig" source "drivers/staging/frontier/Kconfig" -source "drivers/staging/epl/Kconfig" - source "drivers/staging/android/Kconfig" source "drivers/staging/dream/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 0bf10ac04d0..1ac7c8f23d0 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -30,7 +30,6 @@ obj-$(CONFIG_RTL8192SU) += rtl8192su/ 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/ diff --git a/drivers/staging/epl/Benchmark.h b/drivers/staging/epl/Benchmark.h deleted file mode 100644 index 4cc01bd12a1..00000000000 --- a/drivers/staging/epl/Benchmark.h +++ /dev/null @@ -1,425 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/Debug.h b/drivers/staging/epl/Debug.h deleted file mode 100644 index 851a22213ad..00000000000 --- a/drivers/staging/epl/Debug.h +++ /dev/null @@ -1,694 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/Edrv8139.c b/drivers/staging/epl/Edrv8139.c deleted file mode 100644 index 44e3f7b144b..00000000000 --- a/drivers/staging/epl/Edrv8139.c +++ /dev/null @@ -1,1246 +0,0 @@ -/**************************************************************************** - - (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; -} diff --git a/drivers/staging/epl/EdrvFec.h b/drivers/staging/epl/EdrvFec.h deleted file mode 100644 index 56728d1e95e..00000000000 --- a/drivers/staging/epl/EdrvFec.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EdrvSim.h b/drivers/staging/epl/EdrvSim.h deleted file mode 100644 index 191ec1457d2..00000000000 --- a/drivers/staging/epl/EdrvSim.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/Epl.h b/drivers/staging/epl/Epl.h deleted file mode 100644 index 7f22b04022b..00000000000 --- a/drivers/staging/epl/Epl.h +++ /dev/null @@ -1,272 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplAmi.h b/drivers/staging/epl/EplAmi.h deleted file mode 100644 index 3b46ea11442..00000000000 --- a/drivers/staging/epl/EplAmi.h +++ /dev/null @@ -1,323 +0,0 @@ -/**************************************************************************** - - (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). diff --git a/drivers/staging/epl/EplApiGeneric.c b/drivers/staging/epl/EplApiGeneric.c deleted file mode 100644 index c4419569183..00000000000 --- a/drivers/staging/epl/EplApiGeneric.c +++ /dev/null @@ -1,2054 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplApiLinux.h b/drivers/staging/epl/EplApiLinux.h deleted file mode 100644 index 92cd12532a6..00000000000 --- a/drivers/staging/epl/EplApiLinux.h +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplApiLinuxKernel.c b/drivers/staging/epl/EplApiLinuxKernel.c deleted file mode 100644 index cb3e275e3aa..00000000000 --- a/drivers/staging/epl/EplApiLinuxKernel.c +++ /dev/null @@ -1,1173 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplApiProcessImage.c b/drivers/staging/epl/EplApiProcessImage.c deleted file mode 100644 index 7d55086a8e4..00000000000 --- a/drivers/staging/epl/EplApiProcessImage.c +++ /dev/null @@ -1,328 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplCfg.h b/drivers/staging/epl/EplCfg.h deleted file mode 100644 index 38e958a042a..00000000000 --- a/drivers/staging/epl/EplCfg.h +++ /dev/null @@ -1,196 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplDef.h b/drivers/staging/epl/EplDef.h deleted file mode 100644 index 1dc8108449c..00000000000 --- a/drivers/staging/epl/EplDef.h +++ /dev/null @@ -1,355 +0,0 @@ -/**************************************************************************** - - (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’s ability to perform isochronous functions BOOLEAN - O - Y -#define EPL_D_DLL_CNFeatureMultiplex_BOOL // node’s ability to perform control of multiplexed isochronous communication BOOLEAN - O - N -#define EPL_D_DLL_FeatureCN_BOOL // node’s ability to perform CN functions BOOLEAN O O Y Y -#define EPL_D_DLL_FeatureMN_BOOL // node’s ability to perform MN functions BOOLEAN M O - N -#define EPL_D_DLL_MNFeatureMultiplex_BOOL // MN’s ability to perform control of multiplexed isochronous communication BOOLEAN O - Y - -#define EPL_D_DLL_MNFeaturePResTx_BOOL // MN’s 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’t 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_ diff --git a/drivers/staging/epl/EplDll.h b/drivers/staging/epl/EplDll.h deleted file mode 100644 index b960199bd0e..00000000000 --- a/drivers/staging/epl/EplDll.h +++ /dev/null @@ -1,205 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplDllCal.h b/drivers/staging/epl/EplDllCal.h deleted file mode 100644 index 70b27b1b676..00000000000 --- a/drivers/staging/epl/EplDllCal.h +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplDllk.c b/drivers/staging/epl/EplDllk.c deleted file mode 100644 index 0572c3d0aef..00000000000 --- a/drivers/staging/epl/EplDllk.c +++ /dev/null @@ -1,4052 +0,0 @@ -/**************************************************************************** - - (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29 - www.systec-electronic.com - - Project: openPOWERLINK - - Description: source file for kernel DLL 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 diff --git a/drivers/staging/epl/EplDllkCal.c b/drivers/staging/epl/EplDllkCal.c deleted file mode 100644 index 0e283d5d018..00000000000 --- a/drivers/staging/epl/EplDllkCal.c +++ /dev/null @@ -1,1260 +0,0 @@ -/**************************************************************************** - - (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29 - www.systec-electronic.com - - Project: openPOWERLINK - - Description: source file for kernel DLL Communication Abstraction Layer module - - License: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of SYSTEC electronic GmbH nor the names of its - contributors may be used to endorse or promote products derived - from this software without prior written permission. For written - permission, please contact info@systec-electronic.com. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - Severability Clause: - - If a provision of this License is or becomes illegal, invalid or - unenforceable in any jurisdiction, that shall not affect: - 1. the validity or enforceability in that jurisdiction of any other - provision of this License; or - 2. the validity or enforceability in other jurisdictions of that or - any other provision of this License. - - ------------------------------------------------------------------------- - - $RCSfile: EplDllkCal.c,v $ - - $Author: D.Krueger $ - - $Revision: 1.7 $ $Date: 2008/11/13 17:13:09 $ - - $State: Exp $ - - Build Environment: - GCC V3.4 - - ------------------------------------------------------------------------- - - Revision History: - - 2006/06/15 d.k.: start of the implementation, version 1.00 - -****************************************************************************/ - -#include "kernel/EplDllkCal.h" -#include "kernel/EplDllk.h" -#include "kernel/EplEventk.h" - -#include "EplDllCal.h" -#ifndef EPL_NO_FIFO -#include "SharedBuff.h" -#endif - -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0) -/***************************************************************************/ -/* */ -/* */ -/* G L O B A L D E F I N I T I O N S */ -/* */ -/* */ -/***************************************************************************/ - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -//--------------------------------------------------------------------------- -// local types -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// modul globale vars -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- - -/***************************************************************************/ -/* */ -/* */ -/* C L A S S EplDllkCal */ -/* */ -/* */ -/***************************************************************************/ -// -// Description: -// -// -/***************************************************************************/ - -//=========================================================================// -// // -// P R I V A T E D E F I N I T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -#define EPL_DLLKCAL_MAX_QUEUES 5 // CnGenReq, CnNmtReq, {MnGenReq, MnNmtReq}, MnIdentReq, MnStatusReq - -//--------------------------------------------------------------------------- -// local types -//--------------------------------------------------------------------------- - -typedef struct { -#ifndef EPL_NO_FIFO -// tShbInstance m_ShbInstanceRx; // FIFO for Rx ASnd frames - tShbInstance m_ShbInstanceTxNmt; // FIFO for Tx frames with NMT request priority - tShbInstance m_ShbInstanceTxGen; // FIFO for Tx frames with generic priority -#else - unsigned int m_uiFrameSizeNmt; - u8 m_abFrameNmt[1500]; - unsigned int m_uiFrameSizeGen; - u8 m_abFrameGen[1500]; -#endif - - tEplDllkCalStatistics m_Statistics; - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0) - // IdentRequest queue with CN node IDs - unsigned int m_auiQueueIdentReq[EPL_D_NMT_MaxCNNumber_U8 + 1]; // 1 entry is reserved to distinguish between full and empty - unsigned int m_uiWriteIdentReq; - unsigned int m_uiReadIdentReq; - - // StatusRequest queue with CN node IDs - unsigned int m_auiQueueStatusReq[EPL_D_NMT_MaxCNNumber_U8 + 1]; // 1 entry is reserved to distinguish between full and empty - unsigned int m_uiWriteStatusReq; - unsigned int m_uiReadStatusReq; - - unsigned int m_auiQueueCnRequests[254 * 2]; - // first 254 entries represent the generic requests of the corresponding node - // second 254 entries represent the NMT requests of the corresponding node - unsigned int m_uiNextQueueCnRequest; - unsigned int m_uiNextRequestQueue; -#endif - -} tEplDllkCalInstance; - -//--------------------------------------------------------------------------- -// local vars -//--------------------------------------------------------------------------- - -// if no dynamic memory allocation shall be used -// define structures statically -static tEplDllkCalInstance EplDllkCalInstance_g; - -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- - -//=========================================================================// -// // -// P U B L I C F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAddInstance() -// -// Description: add and initialize new instance of DLL CAL module -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAddInstance(void) -{ - tEplKernel Ret = kEplSuccessful; -#ifndef EPL_NO_FIFO - tShbError ShbError; - unsigned int fShbNewCreated; - -/* ShbError = ShbCirAllocBuffer (EPL_DLLCAL_BUFFER_SIZE_RX, EPL_DLLCAL_BUFFER_ID_RX, - &EplDllkCalInstance_g.m_ShbInstanceRx, &fShbNewCreated); - // returns kShbOk, kShbOpenMismatch, kShbOutOfMem or kShbInvalidArg - - if (ShbError != kShbOk) - { - Ret = kEplNoResource; - } -*/ - ShbError = - ShbCirAllocBuffer(EPL_DLLCAL_BUFFER_SIZE_TX_NMT, - EPL_DLLCAL_BUFFER_ID_TX_NMT, - &EplDllkCalInstance_g.m_ShbInstanceTxNmt, - &fShbNewCreated); - // returns kShbOk, kShbOpenMismatch, kShbOutOfMem or kShbInvalidArg - - if (ShbError != kShbOk) { - Ret = kEplNoResource; - } - -/* ShbError = ShbCirSetSignalHandlerNewData (EplDllkCalInstance_g.m_ShbInstanceTxNmt, EplDllkCalTxNmtSignalHandler, kShbPriorityNormal); - // returns kShbOk, kShbAlreadySignaling or kShbInvalidArg - - if (ShbError != kShbOk) - { - Ret = kEplNoResource; - } -*/ - ShbError = - ShbCirAllocBuffer(EPL_DLLCAL_BUFFER_SIZE_TX_GEN, - EPL_DLLCAL_BUFFER_ID_TX_GEN, - &EplDllkCalInstance_g.m_ShbInstanceTxGen, - &fShbNewCreated); - // returns kShbOk, kShbOpenMismatch, kShbOutOfMem or kShbInvalidArg - - if (ShbError != kShbOk) { - Ret = kEplNoResource; - } - -/* ShbError = ShbCirSetSignalHandlerNewData (EplDllkCalInstance_g.m_ShbInstanceTxGen, EplDllkCalTxGenSignalHandler, kShbPriorityNormal); - // returns kShbOk, kShbAlreadySignaling or kShbInvalidArg - - if (ShbError != kShbOk) - { - Ret = kEplNoResource; - } -*/ -#else - EplDllkCalInstance_g.m_uiFrameSizeNmt = 0; - EplDllkCalInstance_g.m_uiFrameSizeGen = 0; -#endif - - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalDelInstance() -// -// Description: deletes instance of DLL CAL module -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalDelInstance(void) -{ - tEplKernel Ret = kEplSuccessful; -#ifndef EPL_NO_FIFO - tShbError ShbError; - -/* ShbError = ShbCirReleaseBuffer (EplDllkCalInstance_g.m_ShbInstanceRx); - if (ShbError != kShbOk) - { - Ret = kEplNoResource; - } - EplDllkCalInstance_g.m_ShbInstanceRx = NULL; -*/ - ShbError = ShbCirReleaseBuffer(EplDllkCalInstance_g.m_ShbInstanceTxNmt); - if (ShbError != kShbOk) { - Ret = kEplNoResource; - } - EplDllkCalInstance_g.m_ShbInstanceTxNmt = NULL; - - ShbError = ShbCirReleaseBuffer(EplDllkCalInstance_g.m_ShbInstanceTxGen); - if (ShbError != kShbOk) { - Ret = kEplNoResource; - } - EplDllkCalInstance_g.m_ShbInstanceTxGen = NULL; - -#else - EplDllkCalInstance_g.m_uiFrameSizeNmt = 0; - EplDllkCalInstance_g.m_uiFrameSizeGen = 0; -#endif - - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalProcess -// -// Description: process the passed configuration -// -// Parameters: pEvent_p = event containing configuration options -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalProcess(tEplEvent * pEvent_p) -{ - tEplKernel Ret = kEplSuccessful; - - switch (pEvent_p->m_EventType) { - case kEplEventTypeDllkServFilter: - { - tEplDllCalAsndServiceIdFilter *pServFilter; - - pServFilter = - (tEplDllCalAsndServiceIdFilter *) pEvent_p->m_pArg; - Ret = - EplDllkSetAsndServiceIdFilter(pServFilter-> - m_ServiceId, - pServFilter-> - m_Filter); - break; - } - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0) - case kEplEventTypeDllkIssueReq: - { - tEplDllCalIssueRequest *pIssueReq; - - pIssueReq = (tEplDllCalIssueRequest *) pEvent_p->m_pArg; - Ret = - EplDllkCalIssueRequest(pIssueReq->m_Service, - pIssueReq->m_uiNodeId, - pIssueReq->m_bSoaFlag1); - break; - } - - case kEplEventTypeDllkAddNode: - { - tEplDllNodeInfo *pNodeInfo; - - pNodeInfo = (tEplDllNodeInfo *) pEvent_p->m_pArg; - Ret = EplDllkAddNode(pNodeInfo); - break; - } - - case kEplEventTypeDllkDelNode: - { - unsigned int *puiNodeId; - - puiNodeId = (unsigned int *)pEvent_p->m_pArg; - Ret = EplDllkDeleteNode(*puiNodeId); - break; - } - - case kEplEventTypeDllkSoftDelNode: - { - unsigned int *puiNodeId; - - puiNodeId = (unsigned int *)pEvent_p->m_pArg; - Ret = EplDllkSoftDeleteNode(*puiNodeId); - break; - } -#endif - - case kEplEventTypeDllkIdentity: - { - tEplDllIdentParam *pIdentParam; - - pIdentParam = (tEplDllIdentParam *) pEvent_p->m_pArg; - if (pIdentParam->m_uiSizeOfStruct > pEvent_p->m_uiSize) { - pIdentParam->m_uiSizeOfStruct = - pEvent_p->m_uiSize; - } - Ret = EplDllkSetIdentity(pIdentParam); - break; - } - - case kEplEventTypeDllkConfig: - { - tEplDllConfigParam *pConfigParam; - - pConfigParam = (tEplDllConfigParam *) pEvent_p->m_pArg; - if (pConfigParam->m_uiSizeOfStruct > pEvent_p->m_uiSize) { - pConfigParam->m_uiSizeOfStruct = - pEvent_p->m_uiSize; - } - Ret = EplDllkConfig(pConfigParam); - break; - } - - default: - break; - } - -//Exit: - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncGetTxCount() -// -// Description: returns count of Tx frames of FIFO with highest priority -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAsyncGetTxCount(tEplDllAsyncReqPriority * pPriority_p, - unsigned int *puiCount_p) -{ - tEplKernel Ret = kEplSuccessful; -#ifndef EPL_NO_FIFO - tShbError ShbError; - unsigned long ulFrameCount; - - // get frame count of Tx FIFO with NMT request priority - ShbError = - ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxNmt, - &ulFrameCount); - // returns kShbOk, kShbInvalidArg - - // error handling - if (ShbError != kShbOk) { - Ret = kEplNoResource; - goto Exit; - } - - if (ulFrameCount > - EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt) { - EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt = - ulFrameCount; - } - - if (ulFrameCount != 0) { // NMT requests are in queue - *pPriority_p = kEplDllAsyncReqPrioNmt; - *puiCount_p = (unsigned int)ulFrameCount; - goto Exit; - } - // get frame count of Tx FIFO with generic priority - ShbError = - ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxGen, - &ulFrameCount); - // returns kShbOk, kShbInvalidArg - - // error handling - if (ShbError != kShbOk) { - Ret = kEplNoResource; - goto Exit; - } - - if (ulFrameCount > - EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen) { - EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen = - ulFrameCount; - } - - *pPriority_p = kEplDllAsyncReqPrioGeneric; - *puiCount_p = (unsigned int)ulFrameCount; - - Exit: -#else - if (EplDllkCalInstance_g.m_uiFrameSizeNmt > 0) { - *pPriority_p = kEplDllAsyncReqPrioNmt; - *puiCount_p = 1; - } else if (EplDllkCalInstance_g.m_uiFrameSizeGen > 0) { - *pPriority_p = kEplDllAsyncReqPrioGeneric; - *puiCount_p = 1; - } else { - *pPriority_p = kEplDllAsyncReqPrioGeneric; - *puiCount_p = 0; - } -#endif - - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncGetTxFrame() -// -// Description: returns Tx frames from FIFO with specified priority -// -// Parameters: pFrame_p = IN: pointer to buffer -// puiFrameSize_p = IN: max size of buffer -// OUT: actual size of frame -// Priority_p = IN: priority -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAsyncGetTxFrame(void *pFrame_p, - unsigned int *puiFrameSize_p, - tEplDllAsyncReqPriority Priority_p) -{ - tEplKernel Ret = kEplSuccessful; -#ifndef EPL_NO_FIFO - tShbError ShbError; - unsigned long ulFrameSize; - - switch (Priority_p) { - case kEplDllAsyncReqPrioNmt: // NMT request priority - ShbError = - ShbCirReadDataBlock(EplDllkCalInstance_g.m_ShbInstanceTxNmt, - (u8 *) pFrame_p, *puiFrameSize_p, - &ulFrameSize); - // returns kShbOk, kShbDataTruncated, kShbInvalidArg, kShbNoReadableData - break; - - default: // generic priority - ShbError = - ShbCirReadDataBlock(EplDllkCalInstance_g.m_ShbInstanceTxGen, - (u8 *) pFrame_p, *puiFrameSize_p, - &ulFrameSize); - // returns kShbOk, kShbDataTruncated, kShbInvalidArg, kShbNoReadableData - break; - - } - - // error handling - if (ShbError != kShbOk) { - if (ShbError == kShbNoReadableData) { - Ret = kEplDllAsyncTxBufferEmpty; - } else { // other error - Ret = kEplNoResource; - } - goto Exit; - } - - *puiFrameSize_p = (unsigned int)ulFrameSize; - - Exit: -#else - switch (Priority_p) { - case kEplDllAsyncReqPrioNmt: // NMT request priority - *puiFrameSize_p = - min(*puiFrameSize_p, EplDllkCalInstance_g.m_uiFrameSizeNmt); - EPL_MEMCPY(pFrame_p, EplDllkCalInstance_g.m_abFrameNmt, - *puiFrameSize_p); - EplDllkCalInstance_g.m_uiFrameSizeNmt = 0; - break; - - default: // generic priority - *puiFrameSize_p = - min(*puiFrameSize_p, EplDllkCalInstance_g.m_uiFrameSizeGen); - EPL_MEMCPY(pFrame_p, EplDllkCalInstance_g.m_abFrameGen, - *puiFrameSize_p); - EplDllkCalInstance_g.m_uiFrameSizeGen = 0; - break; - } - -#endif - - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncFrameReceived() -// -// Description: passes ASnd frame to receive FIFO. -// It will be called only for frames with registered AsndServiceIds. -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAsyncFrameReceived(tEplFrameInfo * pFrameInfo_p) -{ - tEplKernel Ret = kEplSuccessful; - tEplEvent Event; - - Event.m_EventSink = kEplEventSinkDlluCal; - Event.m_EventType = kEplEventTypeAsndRx; - Event.m_pArg = pFrameInfo_p->m_pFrame; - Event.m_uiSize = pFrameInfo_p->m_uiFrameSize; - // pass NetTime of frame to userspace - Event.m_NetTime = pFrameInfo_p->m_NetTime; - - Ret = EplEventkPost(&Event); - if (Ret != kEplSuccessful) { - EplDllkCalInstance_g.m_Statistics.m_ulCurRxFrameCount++; - } else { - EplDllkCalInstance_g.m_Statistics.m_ulMaxRxFrameCount++; - } - - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncSend() -// -// Description: puts the given frame into the transmit FIFO with the specified -// priority. -// -// Parameters: pFrameInfo_p = frame info structure -// Priority_p = priority -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAsyncSend(tEplFrameInfo * pFrameInfo_p, - tEplDllAsyncReqPriority Priority_p) -{ - tEplKernel Ret = kEplSuccessful; - tEplEvent Event; -#ifndef EPL_NO_FIFO - tShbError ShbError; - - switch (Priority_p) { - case kEplDllAsyncReqPrioNmt: // NMT request priority - ShbError = - ShbCirWriteDataBlock(EplDllkCalInstance_g. - m_ShbInstanceTxNmt, - pFrameInfo_p->m_pFrame, - pFrameInfo_p->m_uiFrameSize); - // returns kShbOk, kShbExceedDataSizeLimit, kShbBufferFull, kShbInvalidArg - break; - - default: // generic priority - ShbError = - ShbCirWriteDataBlock(EplDllkCalInstance_g. - m_ShbInstanceTxGen, - pFrameInfo_p->m_pFrame, - pFrameInfo_p->m_uiFrameSize); - // returns kShbOk, kShbExceedDataSizeLimit, kShbBufferFull, kShbInvalidArg - break; - - } - - // error handling - switch (ShbError) { - case kShbOk: - break; - - case kShbExceedDataSizeLimit: - Ret = kEplDllAsyncTxBufferFull; - break; - - case kShbBufferFull: - Ret = kEplDllAsyncTxBufferFull; - break; - - case kShbInvalidArg: - default: - Ret = kEplNoResource; - break; - } - -#else - - switch (Priority_p) { - case kEplDllAsyncReqPrioNmt: // NMT request priority - if (EplDllkCalInstance_g.m_uiFrameSizeNmt == 0) { - EPL_MEMCPY(EplDllkCalInstance_g.m_abFrameNmt, - pFrameInfo_p->m_pFrame, - pFrameInfo_p->m_uiFrameSize); - EplDllkCalInstance_g.m_uiFrameSizeNmt = - pFrameInfo_p->m_uiFrameSize; - } else { - Ret = kEplDllAsyncTxBufferFull; - goto Exit; - } - break; - - default: // generic priority - if (EplDllkCalInstance_g.m_uiFrameSizeGen == 0) { - EPL_MEMCPY(EplDllkCalInstance_g.m_abFrameGen, - pFrameInfo_p->m_pFrame, - pFrameInfo_p->m_uiFrameSize); - EplDllkCalInstance_g.m_uiFrameSizeGen = - pFrameInfo_p->m_uiFrameSize; - } else { - Ret = kEplDllAsyncTxBufferFull; - goto Exit; - } - break; - } - -#endif - - // post event to DLL - Event.m_EventSink = kEplEventSinkDllk; - Event.m_EventType = kEplEventTypeDllkFillTx; - EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime)); - Event.m_pArg = &Priority_p; - Event.m_uiSize = sizeof(Priority_p); - Ret = EplEventkPost(&Event); - -#ifdef EPL_NO_FIFO - Exit: -#endif - - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncClearBuffer() -// -// Description: clears the transmit buffer -// -// Parameters: (none) -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAsyncClearBuffer(void) -{ - tEplKernel Ret = kEplSuccessful; -#ifndef EPL_NO_FIFO - tShbError ShbError; - - ShbError = - ShbCirResetBuffer(EplDllkCalInstance_g.m_ShbInstanceTxNmt, 1000, - NULL); - ShbError = - ShbCirResetBuffer(EplDllkCalInstance_g.m_ShbInstanceTxGen, 1000, - NULL); - -#else - EplDllkCalInstance_g.m_uiFrameSizeNmt = 0; - EplDllkCalInstance_g.m_uiFrameSizeGen = 0; -#endif - -// EPL_MEMSET(&EplDllkCalInstance_g.m_Statistics, 0, sizeof (tEplDllkCalStatistics)); - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncClearQueues() -// -// Description: clears the transmit buffer -// -// Parameters: (none) -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0) -tEplKernel EplDllkCalAsyncClearQueues(void) -{ - tEplKernel Ret = kEplSuccessful; - - // clear MN asynchronous queues - EplDllkCalInstance_g.m_uiNextQueueCnRequest = 0; - EplDllkCalInstance_g.m_uiNextRequestQueue = 0; - EplDllkCalInstance_g.m_uiReadIdentReq = 0; - EplDllkCalInstance_g.m_uiWriteIdentReq = 0; - EplDllkCalInstance_g.m_uiReadStatusReq = 0; - EplDllkCalInstance_g.m_uiWriteStatusReq = 0; - - return Ret; -} -#endif - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalGetStatistics() -// -// Description: returns statistics of the asynchronous queues. -// -// Parameters: ppStatistics = statistics structure -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalGetStatistics(tEplDllkCalStatistics ** ppStatistics) -{ - tEplKernel Ret = kEplSuccessful; -#ifndef EPL_NO_FIFO - tShbError ShbError; - - ShbError = - ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxNmt, - &EplDllkCalInstance_g.m_Statistics. - m_ulCurTxFrameCountNmt); - ShbError = - ShbCirGetReadBlockCount(EplDllkCalInstance_g.m_ShbInstanceTxGen, - &EplDllkCalInstance_g.m_Statistics. - m_ulCurTxFrameCountGen); -// ShbError = ShbCirGetReadBlockCount (EplDllkCalInstance_g.m_ShbInstanceRx, &EplDllkCalInstance_g.m_Statistics.m_ulCurRxFrameCount); - -#else - if (EplDllkCalInstance_g.m_uiFrameSizeNmt > 0) { - EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountNmt = 1; - } else { - EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountNmt = 0; - } - if (EplDllkCalInstance_g.m_uiFrameSizeGen > 0) { - EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountGen = 1; - } else { - EplDllkCalInstance_g.m_Statistics.m_ulCurTxFrameCountGen = 0; - } -#endif - - *ppStatistics = &EplDllkCalInstance_g.m_Statistics; - return Ret; -} - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0) - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalIssueRequest() -// -// Description: issues a StatusRequest or a IdentRequest to the specified node. -// -// Parameters: Service_p = request service ID -// uiNodeId_p = node ID -// bSoaFlag1_p = flag1 for this node (transmit in SoA and PReq) -// If 0xFF this flag is ignored. -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalIssueRequest(tEplDllReqServiceId Service_p, - unsigned int uiNodeId_p, u8 bSoaFlag1_p) -{ - tEplKernel Ret = kEplSuccessful; - - if (bSoaFlag1_p != 0xFF) { - Ret = EplDllkSetFlag1OfNode(uiNodeId_p, bSoaFlag1_p); - if (Ret != kEplSuccessful) { - goto Exit; - } - } - // add node to appropriate request queue - switch (Service_p) { - case kEplDllReqServiceIdent: - { - if (((EplDllkCalInstance_g.m_uiWriteIdentReq + - 1) % - tabentries(EplDllkCalInstance_g. - m_auiQueueIdentReq)) - == EplDllkCalInstance_g.m_uiReadIdentReq) { // queue is full - Ret = kEplDllAsyncTxBufferFull; - goto Exit; - } - EplDllkCalInstance_g. - m_auiQueueIdentReq[EplDllkCalInstance_g. - m_uiWriteIdentReq] = uiNodeId_p; - EplDllkCalInstance_g.m_uiWriteIdentReq = - (EplDllkCalInstance_g.m_uiWriteIdentReq + - 1) % - tabentries(EplDllkCalInstance_g.m_auiQueueIdentReq); - break; - } - - case kEplDllReqServiceStatus: - { - if (((EplDllkCalInstance_g.m_uiWriteStatusReq + - 1) % - tabentries(EplDllkCalInstance_g. - m_auiQueueStatusReq)) - == EplDllkCalInstance_g.m_uiReadStatusReq) { // queue is full - Ret = kEplDllAsyncTxBufferFull; - goto Exit; - } - EplDllkCalInstance_g. - m_auiQueueStatusReq[EplDllkCalInstance_g. - m_uiWriteStatusReq] = - uiNodeId_p; - EplDllkCalInstance_g.m_uiWriteStatusReq = - (EplDllkCalInstance_g.m_uiWriteStatusReq + - 1) % - tabentries(EplDllkCalInstance_g. - m_auiQueueStatusReq); - break; - } - - default: - { - Ret = kEplDllInvalidParam; - goto Exit; - } - } - - Exit: - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncGetSoaRequest() -// -// Description: returns next request for SoA. This function is called by DLLk module. -// -// Parameters: pReqServiceId_p = pointer to request service ID -// IN: available request for MN NMT or generic request queue (Flag2.PR) -// or kEplDllReqServiceNo if queues are empty -// OUT: next request -// puiNodeId_p = OUT: pointer to node ID of next request -// = EPL_C_ADR_INVALID, if request is self addressed -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAsyncGetSoaRequest(tEplDllReqServiceId * pReqServiceId_p, - unsigned int *puiNodeId_p) -{ - tEplKernel Ret = kEplSuccessful; - unsigned int uiCount; - -// *pReqServiceId_p = kEplDllReqServiceNo; - - for (uiCount = EPL_DLLKCAL_MAX_QUEUES; uiCount > 0; uiCount--) { - switch (EplDllkCalInstance_g.m_uiNextRequestQueue) { - case 0: - { // CnGenReq - for (; - EplDllkCalInstance_g. - m_uiNextQueueCnRequest < - (tabentries - (EplDllkCalInstance_g. - m_auiQueueCnRequests) / 2); - EplDllkCalInstance_g. - m_uiNextQueueCnRequest++) { - if (EplDllkCalInstance_g.m_auiQueueCnRequests[EplDllkCalInstance_g.m_uiNextQueueCnRequest] > 0) { // non empty queue found - // remove one request from queue - EplDllkCalInstance_g. - m_auiQueueCnRequests - [EplDllkCalInstance_g. - m_uiNextQueueCnRequest]--; - *puiNodeId_p = - EplDllkCalInstance_g. - m_uiNextQueueCnRequest + 1; - *pReqServiceId_p = - kEplDllReqServiceUnspecified; - EplDllkCalInstance_g. - m_uiNextQueueCnRequest++; - if (EplDllkCalInstance_g.m_uiNextQueueCnRequest >= (tabentries(EplDllkCalInstance_g.m_auiQueueCnRequests) / 2)) { // last node reached - // continue with CnNmtReq queue at next SoA - EplDllkCalInstance_g. - m_uiNextRequestQueue - = 1; - } - goto Exit; - } - } - // all CnGenReq queues are empty -> continue with CnNmtReq queue - EplDllkCalInstance_g.m_uiNextRequestQueue = 1; - break; - } - - case 1: - { // CnNmtReq - for (; - EplDllkCalInstance_g. - m_uiNextQueueCnRequest < - tabentries(EplDllkCalInstance_g. - m_auiQueueCnRequests); - EplDllkCalInstance_g. - m_uiNextQueueCnRequest++) { - if (EplDllkCalInstance_g.m_auiQueueCnRequests[EplDllkCalInstance_g.m_uiNextQueueCnRequest] > 0) { // non empty queue found - // remove one request from queue - EplDllkCalInstance_g. - m_auiQueueCnRequests - [EplDllkCalInstance_g. - m_uiNextQueueCnRequest]--; - *puiNodeId_p = - EplDllkCalInstance_g. - m_uiNextQueueCnRequest + 1 - - (tabentries - (EplDllkCalInstance_g. - m_auiQueueCnRequests) / - 2); - *pReqServiceId_p = - kEplDllReqServiceNmtRequest; - EplDllkCalInstance_g. - m_uiNextQueueCnRequest++; - if (EplDllkCalInstance_g.m_uiNextQueueCnRequest > tabentries(EplDllkCalInstance_g.m_auiQueueCnRequests)) { // last node reached - // restart CnGenReq queue - EplDllkCalInstance_g. - m_uiNextQueueCnRequest - = 0; - // continue with MnGenReq queue at next SoA - EplDllkCalInstance_g. - m_uiNextRequestQueue - = 2; - } - goto Exit; - } - } - // restart CnGenReq queue - EplDllkCalInstance_g.m_uiNextQueueCnRequest = 0; - // all CnNmtReq queues are empty -> continue with MnGenReq queue - EplDllkCalInstance_g.m_uiNextRequestQueue = 2; - break; - } - - case 2: - { // MnNmtReq and MnGenReq - // next queue will be MnIdentReq queue - EplDllkCalInstance_g.m_uiNextRequestQueue = 3; - if (*pReqServiceId_p != kEplDllReqServiceNo) { - *puiNodeId_p = EPL_C_ADR_INVALID; // DLLk must exchange this with the actual node ID - goto Exit; - } - break; - } - - case 3: - { // MnIdentReq - // next queue will be MnStatusReq queue - EplDllkCalInstance_g.m_uiNextRequestQueue = 4; - if (EplDllkCalInstance_g.m_uiReadIdentReq != EplDllkCalInstance_g.m_uiWriteIdentReq) { // queue is not empty - *puiNodeId_p = - EplDllkCalInstance_g. - m_auiQueueIdentReq - [EplDllkCalInstance_g. - m_uiReadIdentReq]; - EplDllkCalInstance_g.m_uiReadIdentReq = - (EplDllkCalInstance_g. - m_uiReadIdentReq + - 1) % - tabentries(EplDllkCalInstance_g. - m_auiQueueIdentReq); - *pReqServiceId_p = - kEplDllReqServiceIdent; - goto Exit; - } - break; - } - - case 4: - { // MnStatusReq - // next queue will be CnGenReq queue - EplDllkCalInstance_g.m_uiNextRequestQueue = 0; - if (EplDllkCalInstance_g.m_uiReadStatusReq != EplDllkCalInstance_g.m_uiWriteStatusReq) { // queue is not empty - *puiNodeId_p = - EplDllkCalInstance_g. - m_auiQueueStatusReq - [EplDllkCalInstance_g. - m_uiReadStatusReq]; - EplDllkCalInstance_g.m_uiReadStatusReq = - (EplDllkCalInstance_g. - m_uiReadStatusReq + - 1) % - tabentries(EplDllkCalInstance_g. - m_auiQueueStatusReq); - *pReqServiceId_p = - kEplDllReqServiceStatus; - goto Exit; - } - break; - } - - } - } - - Exit: - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplDllkCalAsyncSetPendingRequests() -// -// Description: sets the pending asynchronous frame requests of the specified node. -// This will add the node to the asynchronous request scheduler. -// -// Parameters: uiNodeId_p = node ID -// AsyncReqPrio_p = asynchronous request priority -// uiCount_p = count of asynchronous frames -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplDllkCalAsyncSetPendingRequests(unsigned int uiNodeId_p, - tEplDllAsyncReqPriority - AsyncReqPrio_p, - unsigned int uiCount_p) -{ - tEplKernel Ret = kEplSuccessful; - - // add node to appropriate request queue - switch (AsyncReqPrio_p) { - case kEplDllAsyncReqPrioNmt: - { - uiNodeId_p--; - if (uiNodeId_p >= - (tabentries - (EplDllkCalInstance_g.m_auiQueueCnRequests) / 2)) { - Ret = kEplDllInvalidParam; - goto Exit; - } - uiNodeId_p += - tabentries(EplDllkCalInstance_g. - m_auiQueueCnRequests) / 2; - EplDllkCalInstance_g.m_auiQueueCnRequests[uiNodeId_p] = - uiCount_p; - break; - } - - default: - { - uiNodeId_p--; - if (uiNodeId_p >= - (tabentries - (EplDllkCalInstance_g.m_auiQueueCnRequests) / 2)) { - Ret = kEplDllInvalidParam; - goto Exit; - } - EplDllkCalInstance_g.m_auiQueueCnRequests[uiNodeId_p] = - uiCount_p; - break; - } - } - - Exit: - return Ret; -} -#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0) - -//=========================================================================// -// // -// P R I V A T E F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// Callback handler for new data signaling -//--------------------------------------------------------------------------- - -#ifndef EPL_NO_FIFO -/*static void EplDllkCalTxNmtSignalHandler ( - tShbInstance pShbRxInstance_p, - unsigned long ulDataSize_p) -{ -tEplKernel Ret = kEplSuccessful; -tEplEvent Event; -tEplDllAsyncReqPriority Priority; -#ifndef EPL_NO_FIFO -tShbError ShbError; -unsigned long ulBlockCount; - - ShbError = ShbCirGetReadBlockCount (EplDllkCalInstance_g.m_ShbInstanceTxNmt, &ulBlockCount); - if (ulBlockCount > EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt) - { - EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountNmt = ulBlockCount; - } - -#endif - - // post event to DLL - Priority = kEplDllAsyncReqPrioNmt; - Event.m_EventSink = kEplEventSinkDllk; - Event.m_EventType = kEplEventTypeDllkFillTx; - EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime)); - Event.m_pArg = &Priority; - Event.m_uiSize = sizeof(Priority); - Ret = EplEventkPost(&Event); - -} - -static void EplDllkCalTxGenSignalHandler ( - tShbInstance pShbRxInstance_p, - unsigned long ulDataSize_p) -{ -tEplKernel Ret = kEplSuccessful; -tEplEvent Event; -tEplDllAsyncReqPriority Priority; -#ifndef EPL_NO_FIFO -tShbError ShbError; -unsigned long ulBlockCount; - - ShbError = ShbCirGetReadBlockCount (EplDllkCalInstance_g.m_ShbInstanceTxGen, &ulBlockCount); - if (ulBlockCount > EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen) - { - EplDllkCalInstance_g.m_Statistics.m_ulMaxTxFrameCountGen = ulBlockCount; - } - -#endif - - // post event to DLL - Priority = kEplDllAsyncReqPrioGeneric; - Event.m_EventSink = kEplEventSinkDllk; - Event.m_EventType = kEplEventTypeDllkFillTx; - EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime)); - Event.m_pArg = &Priority; - Event.m_uiSize = sizeof(Priority); - Ret = EplEventkPost(&Event); - -} -*/ -#endif - -#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0) - -// EOF diff --git a/drivers/staging/epl/EplDlluCal.c b/drivers/staging/epl/EplDlluCal.c deleted file mode 100644 index f96fe84c497..00000000000 --- a/drivers/staging/epl/EplDlluCal.c +++ /dev/null @@ -1,529 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplErrDef.h b/drivers/staging/epl/EplErrDef.h deleted file mode 100644 index 2aee12cfd28..00000000000 --- a/drivers/staging/epl/EplErrDef.h +++ /dev/null @@ -1,294 +0,0 @@ -/**************************************************************************** - - (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). diff --git a/drivers/staging/epl/EplErrorHandlerk.c b/drivers/staging/epl/EplErrorHandlerk.c deleted file mode 100644 index 6baed04ef11..00000000000 --- a/drivers/staging/epl/EplErrorHandlerk.c +++ /dev/null @@ -1,810 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplEvent.h b/drivers/staging/epl/EplEvent.h deleted file mode 100644 index 910bd69a18c..00000000000 --- a/drivers/staging/epl/EplEvent.h +++ /dev/null @@ -1,279 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplEventk.c b/drivers/staging/epl/EplEventk.c deleted file mode 100644 index ef36815c798..00000000000 --- a/drivers/staging/epl/EplEventk.c +++ /dev/null @@ -1,853 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplEventu.c b/drivers/staging/epl/EplEventu.c deleted file mode 100644 index 3ae2841ad02..00000000000 --- a/drivers/staging/epl/EplEventu.c +++ /dev/null @@ -1,813 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplFrame.h b/drivers/staging/epl/EplFrame.h deleted file mode 100644 index ba1ae9e9e90..00000000000 --- a/drivers/staging/epl/EplFrame.h +++ /dev/null @@ -1,344 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplIdentu.c b/drivers/staging/epl/EplIdentu.c deleted file mode 100644 index 93d5a40a2f7..00000000000 --- a/drivers/staging/epl/EplIdentu.c +++ /dev/null @@ -1,486 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplInc.h b/drivers/staging/epl/EplInc.h deleted file mode 100644 index f91797a3687..00000000000 --- a/drivers/staging/epl/EplInc.h +++ /dev/null @@ -1,370 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplInstDef.h b/drivers/staging/epl/EplInstDef.h deleted file mode 100644 index 29ab7fb7888..00000000000 --- a/drivers/staging/epl/EplInstDef.h +++ /dev/null @@ -1,363 +0,0 @@ -/**************************************************************************** - - (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). diff --git a/drivers/staging/epl/EplLed.h b/drivers/staging/epl/EplLed.h deleted file mode 100644 index 6a29aed303a..00000000000 --- a/drivers/staging/epl/EplLed.h +++ /dev/null @@ -1,92 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplNmt.h b/drivers/staging/epl/EplNmt.h deleted file mode 100644 index e351b55eea6..00000000000 --- a/drivers/staging/epl/EplNmt.h +++ /dev/null @@ -1,230 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplNmtCnu.c b/drivers/staging/epl/EplNmtCnu.c deleted file mode 100644 index c27ca8f8c2f..00000000000 --- a/drivers/staging/epl/EplNmtCnu.c +++ /dev/null @@ -1,701 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplNmtMnu.c b/drivers/staging/epl/EplNmtMnu.c deleted file mode 100644 index d19434f5f6f..00000000000 --- a/drivers/staging/epl/EplNmtMnu.c +++ /dev/null @@ -1,2828 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplNmtk.c b/drivers/staging/epl/EplNmtk.c deleted file mode 100644 index 609d5c02bde..00000000000 --- a/drivers/staging/epl/EplNmtk.c +++ /dev/null @@ -1,1840 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplNmtkCal.c b/drivers/staging/epl/EplNmtkCal.c deleted file mode 100644 index 4453c09838c..00000000000 --- a/drivers/staging/epl/EplNmtkCal.c +++ /dev/null @@ -1,147 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplNmtu.c b/drivers/staging/epl/EplNmtu.c deleted file mode 100644 index 9ac2e8e4845..00000000000 --- a/drivers/staging/epl/EplNmtu.c +++ /dev/null @@ -1,706 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplNmtuCal.c b/drivers/staging/epl/EplNmtuCal.c deleted file mode 100644 index 92164c57ea1..00000000000 --- a/drivers/staging/epl/EplNmtuCal.c +++ /dev/null @@ -1,158 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplObd.c b/drivers/staging/epl/EplObd.c deleted file mode 100644 index 1e463234d81..00000000000 --- a/drivers/staging/epl/EplObd.c +++ /dev/null @@ -1,3192 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplObd.h b/drivers/staging/epl/EplObd.h deleted file mode 100644 index 6bb5a278068..00000000000 --- a/drivers/staging/epl/EplObd.h +++ /dev/null @@ -1,456 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplObdMacro.h b/drivers/staging/epl/EplObdMacro.h deleted file mode 100644 index fc325bfd604..00000000000 --- a/drivers/staging/epl/EplObdMacro.h +++ /dev/null @@ -1,354 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplObdkCal.c b/drivers/staging/epl/EplObdkCal.c deleted file mode 100644 index 02bd72224ab..00000000000 --- a/drivers/staging/epl/EplObdkCal.c +++ /dev/null @@ -1,146 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplObdu.c b/drivers/staging/epl/EplObdu.c deleted file mode 100644 index 5f1d9986254..00000000000 --- a/drivers/staging/epl/EplObdu.c +++ /dev/null @@ -1,506 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplObduCal.c b/drivers/staging/epl/EplObduCal.c deleted file mode 100644 index 55612cff821..00000000000 --- a/drivers/staging/epl/EplObduCal.c +++ /dev/null @@ -1,543 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplPdo.h b/drivers/staging/epl/EplPdo.h deleted file mode 100644 index 0b3ad5bc7d5..00000000000 --- a/drivers/staging/epl/EplPdo.h +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplPdok.c b/drivers/staging/epl/EplPdok.c deleted file mode 100644 index db9b3f08384..00000000000 --- a/drivers/staging/epl/EplPdok.c +++ /dev/null @@ -1,669 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplPdokCal.c b/drivers/staging/epl/EplPdokCal.c deleted file mode 100644 index f44c4757800..00000000000 --- a/drivers/staging/epl/EplPdokCal.c +++ /dev/null @@ -1,266 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplPdou.c b/drivers/staging/epl/EplPdou.c deleted file mode 100644 index d6d06242d74..00000000000 --- a/drivers/staging/epl/EplPdou.c +++ /dev/null @@ -1,565 +0,0 @@ -/**************************************************************************** - - (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29 - www.systec-electronic.com - - Project: openPOWERLINK - - Description: source file for user PDO module - Currently, this module just implements a OD callback function - to check if the PDO configuration is valid. - - License: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of SYSTEC electronic GmbH nor the names of its - contributors may be used to endorse or promote products derived - from this software without prior written permission. For written - permission, please contact info@systec-electronic.com. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - Severability Clause: - - If a provision of this License is or becomes illegal, invalid or - unenforceable in any jurisdiction, that shall not affect: - 1. the validity or enforceability in that jurisdiction of any other - provision of this License; or - 2. the validity or enforceability in other jurisdictions of that or - any other provision of this License. - - ------------------------------------------------------------------------- - - $RCSfile: EplPdou.c,v $ - - $Author: D.Krueger $ - - $Revision: 1.5 $ $Date: 2008/10/17 15:32:32 $ - - $State: Exp $ - - Build Environment: - GCC V3.4 - - ------------------------------------------------------------------------- - - Revision History: - - 2006/05/22 d.k.: start of the implementation, version 1.00 - -****************************************************************************/ - -#include "EplInc.h" -//#include "user/EplPdouCal.h" -#include "user/EplObdu.h" -#include "user/EplPdou.h" -#include "EplSdoAc.h" - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOU)) != 0) - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0) && (EPL_OBD_USE_KERNEL == FALSE) -#error "EPL PDOu module needs EPL module OBDU or OBDK!" -#endif - -/***************************************************************************/ -/* */ -/* */ -/* G L O B A L D E F I N I T I O N S */ -/* */ -/* */ -/***************************************************************************/ - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -#define EPL_PDOU_OBD_IDX_RX_COMM_PARAM 0x1400 -#define EPL_PDOU_OBD_IDX_RX_MAPP_PARAM 0x1600 -#define EPL_PDOU_OBD_IDX_TX_COMM_PARAM 0x1800 -#define EPL_PDOU_OBD_IDX_TX_MAPP_PARAM 0x1A00 -#define EPL_PDOU_OBD_IDX_MAPP_PARAM 0x0200 -#define EPL_PDOU_OBD_IDX_MASK 0xFF00 -#define EPL_PDOU_PDO_ID_MASK 0x00FF - -//--------------------------------------------------------------------------- -// local types -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// modul globale vars -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- - -/***************************************************************************/ -/* */ -/* */ -/* C L A S S EplPdou */ -/* */ -/* */ -/***************************************************************************/ -// -// Description: -// -// -/***************************************************************************/ - -//=========================================================================// -// // -// P R I V A T E D E F I N I T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local types -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local vars -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- - -static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam *pParam_p, - unsigned int uiIndex_p); - -static void EplPdouDecodeObjectMapping(u64 qwObjectMapping_p, - unsigned int *puiIndex_p, - unsigned int *puiSubIndex_p, - unsigned int *puiBitOffset_p, - unsigned int *puiBitSize_p); - -static tEplKernel EplPdouCheckObjectMapping(u64 qwObjectMapping_p, - tEplObdAccess AccessType_p, - u32 * pdwAbortCode_p, - unsigned int *puiPdoSize_p); - -//=========================================================================// -// // -// P U B L I C F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: EplPdouAddInstance() -// -// Description: add and initialize new instance of EPL stack -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplPdouAddInstance(void) -{ - - return kEplSuccessful; -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouDelInstance() -// -// Description: deletes an instance of EPL stack -// -// Parameters: none -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplPdouDelInstance(void) -{ - - return kEplSuccessful; -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouCbObdAccess -// -// Description: callback function for OD accesses -// -// Parameters: pParam_p = OBD parameter -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -tEplKernel EplPdouCbObdAccess(tEplObdCbParam *pParam_p) -{ - tEplKernel Ret = kEplSuccessful; - unsigned int uiPdoId; - unsigned int uiIndexType; - tEplObdSize ObdSize; - u8 bObjectCount; - u64 qwObjectMapping; - tEplObdAccess AccessType; - u8 bMappSubindex; - unsigned int uiCurPdoSize; - u16 wMaxPdoSize; - unsigned int uiSubIndex; - - // fetch PDO ID - uiPdoId = pParam_p->m_uiIndex & EPL_PDOU_PDO_ID_MASK; - - // fetch object index type - uiIndexType = pParam_p->m_uiIndex & EPL_PDOU_OBD_IDX_MASK; - - if (pParam_p->m_ObdEvent != kEplObdEvPreWrite) { // read accesses, post write events etc. are OK - pParam_p->m_dwAbortCode = 0; - goto Exit; - } - // check index type - switch (uiIndexType) { - case EPL_PDOU_OBD_IDX_RX_COMM_PARAM: - // RPDO communication parameter accessed - case EPL_PDOU_OBD_IDX_TX_COMM_PARAM: - { // TPDO communication parameter accessed - Ret = EplPdouCheckPdoValidity(pParam_p, - (EPL_PDOU_OBD_IDX_MAPP_PARAM - | pParam_p->m_uiIndex)); - if (Ret != kEplSuccessful) { // PDO is valid or does not exist - goto Exit; - } - - goto Exit; - } - - case EPL_PDOU_OBD_IDX_RX_MAPP_PARAM: - { // RPDO mapping parameter accessed - - AccessType = kEplObdAccWrite; - break; - } - - case EPL_PDOU_OBD_IDX_TX_MAPP_PARAM: - { // TPDO mapping parameter accessed - - AccessType = kEplObdAccRead; - break; - } - - default: - { // this callback function is only for - // PDO mapping and communication parameters - pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR; - goto Exit; - } - } - - // RPDO and TPDO mapping parameter accessed - - if (pParam_p->m_uiSubIndex == 0) { // object mapping count accessed - - // PDO is enabled or disabled - bObjectCount = *((u8 *) pParam_p->m_pArg); - - if (bObjectCount == 0) { // PDO shall be disabled - - // that is always possible - goto Exit; - } - // PDO shall be enabled - // it should have been disabled for this operation - Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex); - if (Ret != kEplSuccessful) { // PDO is valid or does not exist - goto Exit; - } - - if (AccessType == kEplObdAccWrite) { - uiSubIndex = 0x04; // PReqActPayloadLimit_U16 - } else { - uiSubIndex = 0x05; // PResActPayloadLimit_U16 - } - - // fetch maximum PDO size from Object 1F98h: NMT_CycleTiming_REC - ObdSize = sizeof(wMaxPdoSize); - Ret = - EplObduReadEntry(0x1F98, uiSubIndex, &wMaxPdoSize, - &ObdSize); - if (Ret != kEplSuccessful) { // other fatal error occured - pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR; - goto Exit; - } - // check all objectmappings - for (bMappSubindex = 1; bMappSubindex <= bObjectCount; - bMappSubindex++) { - // read object mapping from OD - ObdSize = sizeof(qwObjectMapping); // u64 - Ret = EplObduReadEntry(pParam_p->m_uiIndex, - bMappSubindex, &qwObjectMapping, - &ObdSize); - if (Ret != kEplSuccessful) { // other fatal error occured - pParam_p->m_dwAbortCode = - EPL_SDOAC_GENERAL_ERROR; - goto Exit; - } - // check object mapping - Ret = EplPdouCheckObjectMapping(qwObjectMapping, - AccessType, - &pParam_p-> - m_dwAbortCode, - &uiCurPdoSize); - if (Ret != kEplSuccessful) { // illegal object mapping - goto Exit; - } - - if (uiCurPdoSize > wMaxPdoSize) { // mapping exceeds object size - pParam_p->m_dwAbortCode = - EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoVarNotFound; - } - - } - - } else { // ObjectMapping - Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex); - if (Ret != kEplSuccessful) { // PDO is valid or does not exist - goto Exit; - } - // check existence of object and validity of object length - - qwObjectMapping = *((u64 *) pParam_p->m_pArg); - - Ret = EplPdouCheckObjectMapping(qwObjectMapping, - AccessType, - &pParam_p->m_dwAbortCode, - &uiCurPdoSize); - - } - - Exit: - return Ret; -} - -//=========================================================================// -// // -// P R I V A T E F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: EplPdouCheckPdoValidity -// -// Description: check if PDO is valid -// -// Parameters: pParam_p = OBD parameter -// -// Returns: tEplKernel = error code -// -// -// State: -// -//--------------------------------------------------------------------------- - -static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam *pParam_p, - unsigned int uiIndex_p) -{ - tEplKernel Ret = kEplSuccessful; - tEplObdSize ObdSize; - u8 bObjectCount; - - ObdSize = 1; - // read number of mapped objects from OD; this indicates if the PDO is valid - Ret = EplObduReadEntry(uiIndex_p, 0x00, &bObjectCount, &ObdSize); - if (Ret != kEplSuccessful) { // other fatal error occured - pParam_p->m_dwAbortCode = - EPL_SDOAC_GEN_INTERNAL_INCOMPATIBILITY; - goto Exit; - } - // entry read successfully - if (bObjectCount != 0) { // PDO in OD is still valid - pParam_p->m_dwAbortCode = EPL_SDOAC_GEN_PARAM_INCOMPATIBILITY; - Ret = kEplPdoNotExist; - goto Exit; - } - - Exit: - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouDecodeObjectMapping -// -// Description: decodes the given object mapping entry into index, subindex, -// bit offset and bit size. -// -// Parameters: qwObjectMapping_p = object mapping entry -// puiIndex_p = [OUT] pointer to object index -// puiSubIndex_p = [OUT] pointer to subindex -// puiBitOffset_p = [OUT] pointer to bit offset -// puiBitSize_p = [OUT] pointer to bit size -// -// Returns: (void) -// -// State: -// -//--------------------------------------------------------------------------- - -static void EplPdouDecodeObjectMapping(u64 qwObjectMapping_p, - unsigned int *puiIndex_p, - unsigned int *puiSubIndex_p, - unsigned int *puiBitOffset_p, - unsigned int *puiBitSize_p) -{ - *puiIndex_p = (unsigned int) - (qwObjectMapping_p & 0x000000000000FFFFLL); - - *puiSubIndex_p = (unsigned int) - ((qwObjectMapping_p & 0x0000000000FF0000LL) >> 16); - - *puiBitOffset_p = (unsigned int) - ((qwObjectMapping_p & 0x0000FFFF00000000LL) >> 32); - - *puiBitSize_p = (unsigned int) - ((qwObjectMapping_p & 0xFFFF000000000000LL) >> 48); - -} - -//--------------------------------------------------------------------------- -// -// Function: EplPdouCheckObjectMapping -// -// Description: checks the given object mapping entry. -// -// Parameters: qwObjectMapping_p = object mapping entry -// AccessType_p = access type to mapped object: -// write = RPDO and read = TPDO -// puiPdoSize_p = [OUT] pointer to covered PDO size -// (offset + size) in byte; -// 0 if mapping failed -// pdwAbortCode_p = [OUT] pointer to SDO abort code; -// 0 if mapping is possible -// -// Returns: tEplKernel = error code -// -// State: -// -//--------------------------------------------------------------------------- - -static tEplKernel EplPdouCheckObjectMapping(u64 qwObjectMapping_p, - tEplObdAccess AccessType_p, - u32 * pdwAbortCode_p, - unsigned int *puiPdoSize_p) -{ - tEplKernel Ret = kEplSuccessful; - tEplObdSize ObdSize; - unsigned int uiIndex; - unsigned int uiSubIndex; - unsigned int uiBitOffset; - unsigned int uiBitSize; - tEplObdAccess AccessType; - BOOL fNumerical; - - if (qwObjectMapping_p == 0) { // discard zero value - *puiPdoSize_p = 0; - goto Exit; - } - // decode object mapping - EplPdouDecodeObjectMapping(qwObjectMapping_p, - &uiIndex, - &uiSubIndex, &uiBitOffset, &uiBitSize); - - if ((uiBitOffset & 0x7) != 0x0) { // bit mapping is not supported - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoGranularityMismatch; - goto Exit; - } - - if ((uiBitSize & 0x7) != 0x0) { // bit mapping is not supported - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoGranularityMismatch; - goto Exit; - } - // check access type - Ret = EplObduGetAccessType(uiIndex, uiSubIndex, &AccessType); - if (Ret != kEplSuccessful) { // entry doesn't exist - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST; - goto Exit; - } - - if ((AccessType & kEplObdAccPdo) == 0) { // object is not mappable - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE; - Ret = kEplPdoVarNotFound; - goto Exit; - } - - if ((AccessType & AccessType_p) == 0) { // object is not writeable (RPDO) or readable (TPDO) respectively - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE; - Ret = kEplPdoVarNotFound; - goto Exit; - } - - ObdSize = EplObduGetDataSize(uiIndex, uiSubIndex); - if (ObdSize < (uiBitSize >> 3)) { // object does not exist or has smaller size - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoVarNotFound; - } - - Ret = EplObduIsNumerical(uiIndex, uiSubIndex, &fNumerical); - if (Ret != kEplSuccessful) { // entry doesn't exist - *pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST; - goto Exit; - } - - if ((fNumerical != FALSE) - && ((uiBitSize >> 3) != ObdSize)) { - // object is numerical, - // therefor size has to fit, but it does not. - *pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR; - Ret = kEplPdoVarNotFound; - goto Exit; - } - // calucaled needed PDO size - *puiPdoSize_p = (uiBitOffset >> 3) + (uiBitSize >> 3); - - Exit: - return Ret; -} - -#endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOU)) != 0) - -// EOF diff --git a/drivers/staging/epl/EplSdo.h b/drivers/staging/epl/EplSdo.h deleted file mode 100644 index 8002e0cc4d9..00000000000 --- a/drivers/staging/epl/EplSdo.h +++ /dev/null @@ -1,241 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplSdoAc.h b/drivers/staging/epl/EplSdoAc.h deleted file mode 100644 index 400fb38ce3e..00000000000 --- a/drivers/staging/epl/EplSdoAc.h +++ /dev/null @@ -1,111 +0,0 @@ -/**************************************************************************** - - (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). diff --git a/drivers/staging/epl/EplSdoAsndu.c b/drivers/staging/epl/EplSdoAsndu.c deleted file mode 100644 index aa8bdef317c..00000000000 --- a/drivers/staging/epl/EplSdoAsndu.c +++ /dev/null @@ -1,483 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplSdoAsySequ.c b/drivers/staging/epl/EplSdoAsySequ.c deleted file mode 100644 index 256d7086634..00000000000 --- a/drivers/staging/epl/EplSdoAsySequ.c +++ /dev/null @@ -1,2522 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplSdoComu.c b/drivers/staging/epl/EplSdoComu.c deleted file mode 100644 index bf35afab152..00000000000 --- a/drivers/staging/epl/EplSdoComu.c +++ /dev/null @@ -1,3345 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplSdoUdpu.c b/drivers/staging/epl/EplSdoUdpu.c deleted file mode 100644 index c8e950fa835..00000000000 --- a/drivers/staging/epl/EplSdoUdpu.c +++ /dev/null @@ -1,650 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplStatusu.c b/drivers/staging/epl/EplStatusu.c deleted file mode 100644 index b291399af10..00000000000 --- a/drivers/staging/epl/EplStatusu.c +++ /dev/null @@ -1,377 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplTarget.h b/drivers/staging/epl/EplTarget.h deleted file mode 100644 index e76d21ff9d9..00000000000 --- a/drivers/staging/epl/EplTarget.h +++ /dev/null @@ -1,140 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplTimer.h b/drivers/staging/epl/EplTimer.h deleted file mode 100644 index d1a73eaf65c..00000000000 --- a/drivers/staging/epl/EplTimer.h +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/EplTimeruLinuxKernel.c b/drivers/staging/epl/EplTimeruLinuxKernel.c deleted file mode 100644 index ff80fc80d02..00000000000 --- a/drivers/staging/epl/EplTimeruLinuxKernel.c +++ /dev/null @@ -1,446 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/EplVersion.h b/drivers/staging/epl/EplVersion.h deleted file mode 100644 index 75570d56b86..00000000000 --- a/drivers/staging/epl/EplVersion.h +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** - - (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). diff --git a/drivers/staging/epl/Kconfig b/drivers/staging/epl/Kconfig deleted file mode 100644 index 9f939d5874a..00000000000 --- a/drivers/staging/epl/Kconfig +++ /dev/null @@ -1,6 +0,0 @@ -config EPL - tristate "openPOWERLINK protocol stack" - depends on NET && HIGH_RES_TIMERS && X86 - default N - ---help--- - Enable support for the openPOWERLINK network protocol stack. diff --git a/drivers/staging/epl/Makefile b/drivers/staging/epl/Makefile deleted file mode 100644 index a2c824187d2..00000000000 --- a/drivers/staging/epl/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -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 \ diff --git a/drivers/staging/epl/SharedBuff.c b/drivers/staging/epl/SharedBuff.c deleted file mode 100644 index 2b10c375f3e..00000000000 --- a/drivers/staging/epl/SharedBuff.c +++ /dev/null @@ -1,1762 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/SharedBuff.h b/drivers/staging/epl/SharedBuff.h deleted file mode 100644 index 4edbd0b2bd5..00000000000 --- a/drivers/staging/epl/SharedBuff.h +++ /dev/null @@ -1,187 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/ShbIpc-LinuxKernel.c b/drivers/staging/epl/ShbIpc-LinuxKernel.c deleted file mode 100644 index 12d1eccde25..00000000000 --- a/drivers/staging/epl/ShbIpc-LinuxKernel.c +++ /dev/null @@ -1,944 +0,0 @@ -/**************************************************************************** - - (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; - } - - } - } - -} - diff --git a/drivers/staging/epl/ShbIpc.h b/drivers/staging/epl/ShbIpc.h deleted file mode 100644 index 285f096e771..00000000000 --- a/drivers/staging/epl/ShbIpc.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/ShbLinuxKernel.h b/drivers/staging/epl/ShbLinuxKernel.h deleted file mode 100644 index 812702add4f..00000000000 --- a/drivers/staging/epl/ShbLinuxKernel.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/SocketLinuxKernel.c b/drivers/staging/epl/SocketLinuxKernel.c deleted file mode 100644 index 562bc4a3e56..00000000000 --- a/drivers/staging/epl/SocketLinuxKernel.c +++ /dev/null @@ -1,197 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/SocketLinuxKernel.h b/drivers/staging/epl/SocketLinuxKernel.h deleted file mode 100644 index 6e1d6198960..00000000000 --- a/drivers/staging/epl/SocketLinuxKernel.h +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/TimerHighReskX86.c b/drivers/staging/epl/TimerHighReskX86.c deleted file mode 100644 index d6897de4f14..00000000000 --- a/drivers/staging/epl/TimerHighReskX86.c +++ /dev/null @@ -1,510 +0,0 @@ -/**************************************************************************** - - (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; -} diff --git a/drivers/staging/epl/VirtualEthernetLinux.c b/drivers/staging/epl/VirtualEthernetLinux.c deleted file mode 100644 index 7b7cce1b36e..00000000000 --- a/drivers/staging/epl/VirtualEthernetLinux.c +++ /dev/null @@ -1,348 +0,0 @@ -/**************************************************************************** - - (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) diff --git a/drivers/staging/epl/amix86.c b/drivers/staging/epl/amix86.c deleted file mode 100644 index d40ad918d3b..00000000000 --- a/drivers/staging/epl/amix86.c +++ /dev/null @@ -1,861 +0,0 @@ -/**************************************************************************** - - (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). diff --git a/drivers/staging/epl/demo_main.c b/drivers/staging/epl/demo_main.c deleted file mode 100644 index 7ad10fc2b1d..00000000000 --- a/drivers/staging/epl/demo_main.c +++ /dev/null @@ -1,947 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/edrv.h b/drivers/staging/epl/edrv.h deleted file mode 100644 index 62b4e77e069..00000000000 --- a/drivers/staging/epl/edrv.h +++ /dev/null @@ -1,167 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/global.h b/drivers/staging/epl/global.h deleted file mode 100644 index 8c52d97ec9c..00000000000 --- a/drivers/staging/epl/global.h +++ /dev/null @@ -1,144 +0,0 @@ -/**************************************************************************** - - 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. diff --git a/drivers/staging/epl/kernel/EplDllk.h b/drivers/staging/epl/kernel/EplDllk.h deleted file mode 100644 index a97920ab884..00000000000 --- a/drivers/staging/epl/kernel/EplDllk.h +++ /dev/null @@ -1,153 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplDllkCal.h b/drivers/staging/epl/kernel/EplDllkCal.h deleted file mode 100644 index ddec1d5e8cc..00000000000 --- a/drivers/staging/epl/kernel/EplDllkCal.h +++ /dev/null @@ -1,129 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplErrorHandlerk.h b/drivers/staging/epl/kernel/EplErrorHandlerk.h deleted file mode 100644 index 185b597d6e5..00000000000 --- a/drivers/staging/epl/kernel/EplErrorHandlerk.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplEventk.h b/drivers/staging/epl/kernel/EplEventk.h deleted file mode 100644 index 0c2a60f7207..00000000000 --- a/drivers/staging/epl/kernel/EplEventk.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplNmtk.h b/drivers/staging/epl/kernel/EplNmtk.h deleted file mode 100644 index 5dc8a373159..00000000000 --- a/drivers/staging/epl/kernel/EplNmtk.h +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplObdk.h b/drivers/staging/epl/kernel/EplObdk.h deleted file mode 100644 index 78c4d961342..00000000000 --- a/drivers/staging/epl/kernel/EplObdk.h +++ /dev/null @@ -1,156 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplPdok.h b/drivers/staging/epl/kernel/EplPdok.h deleted file mode 100644 index 24bfc3f73e9..00000000000 --- a/drivers/staging/epl/kernel/EplPdok.h +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplPdokCal.h b/drivers/staging/epl/kernel/EplPdokCal.h deleted file mode 100644 index 8a31edfdb4f..00000000000 --- a/drivers/staging/epl/kernel/EplPdokCal.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplTimerHighResk.h b/drivers/staging/epl/kernel/EplTimerHighResk.h deleted file mode 100644 index a2124ee49f7..00000000000 --- a/drivers/staging/epl/kernel/EplTimerHighResk.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/EplTimerk.h b/drivers/staging/epl/kernel/EplTimerk.h deleted file mode 100644 index 47c5f47b8aa..00000000000 --- a/drivers/staging/epl/kernel/EplTimerk.h +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/kernel/VirtualEthernet.h b/drivers/staging/epl/kernel/VirtualEthernet.h deleted file mode 100644 index 4a42cce66ca..00000000000 --- a/drivers/staging/epl/kernel/VirtualEthernet.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/proc_fs.c b/drivers/staging/epl/proc_fs.c deleted file mode 100644 index e48949d9ddf..00000000000 --- a/drivers/staging/epl/proc_fs.c +++ /dev/null @@ -1,410 +0,0 @@ -/**************************************************************************** - - (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; -} diff --git a/drivers/staging/epl/proc_fs.h b/drivers/staging/epl/proc_fs.h deleted file mode 100644 index 0586f499553..00000000000 --- a/drivers/staging/epl/proc_fs.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplCfgMau.h b/drivers/staging/epl/user/EplCfgMau.h deleted file mode 100644 index 4ac770f1310..00000000000 --- a/drivers/staging/epl/user/EplCfgMau.h +++ /dev/null @@ -1,276 +0,0 @@ -/**************************************************************************** - - (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 diff --git a/drivers/staging/epl/user/EplDllu.h b/drivers/staging/epl/user/EplDllu.h deleted file mode 100644 index 890f83759ca..00000000000 --- a/drivers/staging/epl/user/EplDllu.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplDlluCal.h b/drivers/staging/epl/user/EplDlluCal.h deleted file mode 100644 index bc9126b1627..00000000000 --- a/drivers/staging/epl/user/EplDlluCal.h +++ /dev/null @@ -1,106 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplEventu.h b/drivers/staging/epl/user/EplEventu.h deleted file mode 100644 index ab85205b239..00000000000 --- a/drivers/staging/epl/user/EplEventu.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplIdentu.h b/drivers/staging/epl/user/EplIdentu.h deleted file mode 100644 index 057c9029e98..00000000000 --- a/drivers/staging/epl/user/EplIdentu.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplLedu.h b/drivers/staging/epl/user/EplLedu.h deleted file mode 100644 index ca9eb431100..00000000000 --- a/drivers/staging/epl/user/EplLedu.h +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplNmtCnu.h b/drivers/staging/epl/user/EplNmtCnu.h deleted file mode 100644 index 7d230297f43..00000000000 --- a/drivers/staging/epl/user/EplNmtCnu.h +++ /dev/null @@ -1,92 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplNmtMnu.h b/drivers/staging/epl/user/EplNmtMnu.h deleted file mode 100644 index 5e5e0cda324..00000000000 --- a/drivers/staging/epl/user/EplNmtMnu.h +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplNmtu.h b/drivers/staging/epl/user/EplNmtu.h deleted file mode 100644 index c1fca80f5a0..00000000000 --- a/drivers/staging/epl/user/EplNmtu.h +++ /dev/null @@ -1,139 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplNmtuCal.h b/drivers/staging/epl/user/EplNmtuCal.h deleted file mode 100644 index b9850372a4a..00000000000 --- a/drivers/staging/epl/user/EplNmtuCal.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplObdu.h b/drivers/staging/epl/user/EplObdu.h deleted file mode 100644 index 086371276cf..00000000000 --- a/drivers/staging/epl/user/EplObdu.h +++ /dev/null @@ -1,169 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplObduCal.h b/drivers/staging/epl/user/EplObduCal.h deleted file mode 100644 index 07277777219..00000000000 --- a/drivers/staging/epl/user/EplObduCal.h +++ /dev/null @@ -1,126 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplPdou.h b/drivers/staging/epl/user/EplPdou.h deleted file mode 100644 index b8c832b09db..00000000000 --- a/drivers/staging/epl/user/EplPdou.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplSdoAsndu.h b/drivers/staging/epl/user/EplSdoAsndu.h deleted file mode 100644 index a62d4c97870..00000000000 --- a/drivers/staging/epl/user/EplSdoAsndu.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplSdoAsySequ.h b/drivers/staging/epl/user/EplSdoAsySequ.h deleted file mode 100644 index cc862de1a5b..00000000000 --- a/drivers/staging/epl/user/EplSdoAsySequ.h +++ /dev/null @@ -1,100 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplSdoComu.h b/drivers/staging/epl/user/EplSdoComu.h deleted file mode 100644 index 4eee6fa6974..00000000000 --- a/drivers/staging/epl/user/EplSdoComu.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplSdoUdpu.h b/drivers/staging/epl/user/EplSdoUdpu.h deleted file mode 100644 index 13e2a278c11..00000000000 --- a/drivers/staging/epl/user/EplSdoUdpu.h +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplStatusu.h b/drivers/staging/epl/user/EplStatusu.h deleted file mode 100644 index 0fd3ebb76dc..00000000000 --- a/drivers/staging/epl/user/EplStatusu.h +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** - - (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_ diff --git a/drivers/staging/epl/user/EplTimeru.h b/drivers/staging/epl/user/EplTimeru.h deleted file mode 100644 index 5c447485245..00000000000 --- a/drivers/staging/epl/user/EplTimeru.h +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** - - (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_ |