# HG changeset patch # User etisserant # Date 1202805895 -3600 # Node ID 7802a7d5584fc2d49105e348553a74efe084b7e4 # Parent 31dc4ec8710c94c8e93ee9ac9c263e36677dbeb1 Accepted Vladimir Chren linux kernelspace port patch. diff -r 31dc4ec8710c -r 7802a7d5584f CONTRIBUTORS --- a/CONTRIBUTORS Tue Feb 12 09:42:56 2008 +0100 +++ b/CONTRIBUTORS Tue Feb 12 09:44:55 2008 +0100 @@ -4,6 +4,8 @@ Leonid Tochinski ltochinski _at_ chattenassociates.com ( native win32 port (visual studio)) +Vladimir Chren (kernel space port) + Raphael Zulliger (author of slavelib project) Other unsorted contribs: diff -r 31dc4ec8710c -r 7802a7d5584f configure --- a/configure Tue Feb 12 09:42:56 2008 +0100 +++ b/configure Tue Feb 12 09:44:55 2008 +0100 @@ -104,6 +104,7 @@ --ld=*) LD=$optarg;; --arch=*) SUB_ARCH_NAME=$optarg;; --os=*) SUB_OS_NAME=$optarg;; + --kerneldir=*) SUB_KERNELDIR=$optarg;; --prefix=*) SUB_PREFIX=$optarg;; --target=*) SUB_TARGET=$optarg;; --can=*) SUB_CAN_DRIVER=$optarg;; @@ -135,6 +136,7 @@ echo " --ld=foo Use linker 'foo' instead of ld." echo " --arch=foo Use architecture 'foo' instead of trying to autodetect." echo " --os=foo Use operative system 'foo' instead of trying to autodetect." + echo " --kerneldir=foo Use 'foo' as kernel source directory instead of default" echo " --prefix=foo Use prefix 'foo' instead of default ${SUB_PREFIX}." echo " --target=foo Use 'foo' as build target." echo " \"unix\" for unix-like systems (Linux, Cygwin)" @@ -146,13 +148,14 @@ echo " \"peak_win32\" use win32 PcanLight Peak driver and library with Cygwin" echo " see http://www.peak-system.com/themen/download_gb.html" echo " \"virtual\" use unix pipe based virtual can driver" + echo " \"virtual_kernel\" use kernel module virtual can driver" echo " \"socket\" use socket-can " echo " see http://developer.berlios.de/projects/socketcan/" echo " \"lincan\" lincan driver" echo " see http://www.ocera.org/download/components/WP7/lincan-0.3.3.html" echo " \"can4linux\" can4linux driver" echo " see http://www.port.de/engl/canprod/hw_can4linux.html" - echo " --timers=foo Use 'foo' as TIMERS driver (can be either 'unix' or 'xeno')" + echo " --timers=foo Use 'foo' as TIMERS driver (can be 'unix', 'xeno' or 'kernel')" echo " --disable-dll Disable run-time dynamic linking of can, led and nvram drivers" echo " --enable-lss Enable the LSS services" echo " --enable-lss-fs Enable the LSS FastScan service" @@ -387,6 +390,14 @@ RTCAN_SOCKET=1 fi +if [ "$SUB_TIMERS_DRIVER" = "kernel" ]; then + DISABLE_DLL=1 + if [ "$SUB_KERNELDIR" = "" ]; then + # use directory of current kernel + SUB_KERNELDIR=/lib/modules/$(uname -r)/build + fi +fi + if [ "$SUB_TIMERS_DRIVER" = "none" ]; then SUB_TIMERS_DRIVER= fi @@ -670,14 +681,14 @@ # Target dependent Makefiles MAKEFILES=$MAKEFILES\ drivers/$SUB_TARGET/Makefile.in -if [ "$SUB_TARGET" = "unix" ]; then +if [ "$SUB_TARGET" = "unix" -a "$SUB_TIMERS_DRIVER" = "kernel" ]; then + MAKEFILES=$MAKEFILES\ +\ examples/kerneltest/Makefile.in + +elif [ "$SUB_TARGET" = "unix" ]; then MAKEFILES=$MAKEFILES\ \ examples/TestMasterSlave/Makefile.in\ -\ examples/TestMasterSlaveLSS/Makefile.in -fi - -if [ "$SUB_TARGET" = "unix" ]; then - MAKEFILES=$MAKEFILES\ +\ examples/TestMasterSlaveLSS/Makefile.in\ \ examples/TestMasterMicroMod/Makefile.in fi @@ -708,6 +719,7 @@ s:SUB_LD:${LD}: s:SUB_PROG_CFLAGS:${SUB_PROG_CFLAGS}: s:SUB_EXE_CFLAGS:${SUB_EXE_CFLAGS}: + s:SUB_KERNELDIR:${SUB_KERNELDIR}: s:SUB_PREFIX:${SUB_PREFIX}: s:SUB_OS_NAME:${SUB_OS_NAME}: s:SUB_ARCH_NAME:${SUB_ARCH_NAME}: diff -r 31dc4ec8710c -r 7802a7d5584f doc/manual/en/manual.tex --- a/doc/manual/en/manual.tex Tue Feb 12 09:42:56 2008 +0100 +++ b/doc/manual/en/manual.tex Tue Feb 12 09:44:55 2008 +0100 @@ -276,9 +276,15 @@ ./drivers/timers\_xeno Xenomai timers/threads (Linux only)} {\ttfamily +./drivers/timers\_kernel Linux kernel timer/threads} + +{\ttfamily ./drivers/timers\_unix Posix timers/threads (Linux, Cygwin)} {\ttfamily +./drivers/can\_virtual\_kernel Fake CAN network (kernel space)} + +{\ttfamily ./drivers/can\_peak\_linux PeakSystem CAN library interface} {\ttfamily @@ -429,6 +435,13 @@ \item One or more Peak system PC CAN interface and the last Peak Real Time Linux driver installed. \end{enumerate} + +\subsubsection{Linux kernel node} +To do a CANopen node running on PC-Linux in kernel space, you need: + +\paragraph{A working Linux distribution with pre-built 2.6.x.x kernel sources} +\paragraph{A CAN card driver compatible with CanFestival} + \subsubsection{CAN devices} Curently supported CAN devices and corresponding configure switch: @@ -461,7 +474,11 @@ Configure switch: {\ttfamily -{}-{}-can=virtual} +{}-{}-can=virtual (in user space)} + +{\ttfamily +{}-{}-can=virtual\_kernel (in kernel space)} + Virtual CAN interface use Unix pipes to emulate a virtual CAN network. Each message issued from a node is repeat to all other nodes. Currently @@ -486,6 +503,12 @@ {\ttfamily TestMasterSlave {}-l libcanfestival\_can\_peak.so {}-s 40 {}-m 41} +{\ttfamily +example/kerneltest} +It's based on TestMasterSlave example and has the same functionality. Uses virtual can driver as default too. After successfull installation you can insert the module by typing: + modprobe canf\_ktest +Module control is done by simple console 'canf\_ktest\_console' which is used to start/stop sending data. + \section{Windows Targets} CanFestival can be compiled and run on Windows platform. It is possible to use both Cygwin and win32 native runtime environment. @@ -994,6 +1017,16 @@ \bigskip +\subsection{kerneltest :} + +Example based on TestMasterSlave slightly modified to suit kernel space requisites. It will do the same as TestMasterSlave but in kernel space sending kernel messages (displayed by dmesg for example). It is designed as external kernel module implemented as character device. There is a shell script called 'insert.sh', which will insert the module and create a new device file /dev/canf\_ktest (used to sending commands to module). To actual sending commands you can use simple console named 'canf\_ktest\_console'. +The module is dependent on a another separate module 'canfestival.ko' implementing CanOpen stack which exports requisite functions. Canfestival.ko module is then dependent on CAN card driver module, by default CAN virtual driver will be loaded. After installing modules (make install), all dependencies are solved automatically by kernel. +To run the example type: +{\ttfamily + sh run.sh} +It will insert required modules, start console, and after quitting console it'll remove modules from kernel. + +\bigskip \subsection{TestMasterMicroMod } {\ttfamily diff -r 31dc4ec8710c -r 7802a7d5584f drivers/can_virtual_kernel/Makefile.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/can_virtual_kernel/Makefile.in Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,57 @@ +#! gmake + +# +# Copyright (C) 2006 Laurent Bessard +# +# This file is part of canfestival, a library implementing the canopen +# stack +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#ifneq ($(KERNELRELEASE),) +# Kbuild part of Makefile +TARGET = SUB_TARGET +CAN_DRIVER = SUB_CAN_DRIVER +TIMERS_DRIVER = SUB_TIMERS_DRIVER + +EXTRA_CFLAGS := -I$(src)/../../include +EXTRA_CFLAGS += -I$(src)/../../include/$(TARGET) +EXTRA_CFLAGS += -I$(src)/../../include/$(CAN_DRIVER) +EXTRA_CFLAGS += SUB_PROG_CFLAGS + +obj-m := can_virtual.o +can_virtual-objs = $(CAN_DRIVER).o + +#else +# Normal Makefile +PREFIX = SUB_PREFIX +KERNELDIR := SUB_KERNELDIR + +all: driver + +driver: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean + rm -f Module.symvers + +mrproper: clean + +install: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules_install + +#endif diff -r 31dc4ec8710c -r 7802a7d5584f drivers/can_virtual_kernel/can_virtual_kernel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/can_virtual_kernel/can_virtual_kernel.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,167 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* + Virtual CAN driver. + + Modification of drivers/can_virtual/can_virtual.c: + Rewritten from user-space library to kernel-space module with exported symbols +*/ + +#include +#include +#include +#include +#include +#include +#include + +#define NEED_PRINT_MESSAGE +#include "can_driver.h" +#include "def.h" + +MODULE_LICENSE("GPL"); + +#define MAX_NB_CAN_PIPES 16 + +typedef struct { + char used; + struct kfifo *pipe; + spinlock_t lock; + wait_queue_head_t w_queue; +} CANPipe; + +CANPipe canpipes[MAX_NB_CAN_PIPES] = {{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},}; + + +/*********functions which permit to communicate with the board****************/ +UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m) +{ + long ret = wait_event_interruptible (((CANPipe*)fd0)->w_queue, + kfifo_len (((CANPipe*)fd0)->pipe) >= sizeof(Message)); + + // interrupted by signal + if (ret == -ERESTARTSYS) + return 2; + + if (kfifo_get (((CANPipe*)fd0)->pipe, (unsigned char *)m, sizeof(Message)) != sizeof(Message)) + { + printk(KERN_NOTICE "can_virtual: error receiving data from kernel fifo.\n"); + return 1; + } + + return 0; +} + +UNS8 canSend_driver(CAN_HANDLE fd0, Message *m) +{ + int i; + + printk(KERN_INFO "%x->[ ", (CANPipe*)fd0 - &canpipes[0]); + for(i=0; i < MAX_NB_CAN_PIPES; i++) + { + if(canpipes[i].used && &canpipes[i] != (CANPipe*)fd0) + { + printk("%x ",i); + } + } + printk(" ]"); + print_message(m); + + // send to all readers, except myself + for(i=0; i < MAX_NB_CAN_PIPES; i++) + { + if(canpipes[i].used && &canpipes[i] != (CANPipe*)fd0) + { + unsigned int len; + len = kfifo_put (canpipes[i].pipe, (unsigned char *)m, sizeof(Message)); + if (len != sizeof(Message)) { + printk(KERN_NOTICE "can_virtual: error sending data to kernel fifo.\n"); + return 1; + } + + // wake up canReceive_driver() + wake_up_interruptible (&canpipes[i].w_queue); + } + } + + return 0; +} + +int TranslateBaudRate(char* optarg){ + if(!strcmp( optarg, "1M")) return (int)1000; + if(!strcmp( optarg, "500K")) return (int)500; + if(!strcmp( optarg, "250K")) return (int)250; + if(!strcmp( optarg, "125K")) return (int)125; + if(!strcmp( optarg, "100K")) return (int)100; + if(!strcmp( optarg, "50K")) return (int)50; + if(!strcmp( optarg, "20K")) return (int)20; + if(!strcmp( optarg, "10K")) return (int)10; + if(!strcmp( optarg, "5K")) return (int)5; + if(!strcmp( optarg, "none")) return 0; + return 0x0000; +} + +UNS8 canChangeBaudRate_driver( CAN_HANDLE fd0, char* baud) +{ + printk("%x-> changing to baud rate %s[%d]\n", (CANPipe*)fd0 - &canpipes[0],baud,TranslateBaudRate(baud)); + return 0; +} + + +CAN_HANDLE canOpen_driver(s_BOARD *board) +{ + int i; + for(i=0; i < MAX_NB_CAN_PIPES; i++) + { + if(!canpipes[i].used) + break; + } + + // initialize CANPipe structure + init_waitqueue_head(&canpipes[i].w_queue); + canpipes[i].lock = SPIN_LOCK_UNLOCKED; + canpipes[i].pipe = kfifo_alloc (10*sizeof(Message), GFP_KERNEL, &canpipes[i].lock); + + if (i==MAX_NB_CAN_PIPES || (PTR_ERR(canpipes[i].pipe) == -ENOMEM)) + { + printk (KERN_NOTICE "can_virtual: error initializing driver.\n"); + return (CAN_HANDLE)NULL; + } + + canpipes[i].used = 1; + return (CAN_HANDLE) &canpipes[i]; +} + +int canClose_driver(CAN_HANDLE fd0) +{ + ((CANPipe*)fd0)->used = 0; + kfifo_free (((CANPipe*)fd0)->pipe); + + return 0; +} + +EXPORT_SYMBOL(canOpen_driver); +EXPORT_SYMBOL(canClose_driver); +EXPORT_SYMBOL(canSend_driver); +EXPORT_SYMBOL(canReceive_driver); +EXPORT_SYMBOL(canChangeBaudRate_driver); diff -r 31dc4ec8710c -r 7802a7d5584f drivers/timers_kernel/Makefile.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/timers_kernel/Makefile.in Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,57 @@ +#! gmake + +# +# Copyright (C) 2006 Laurent Bessard +# +# This file is part of canfestival, a library implementing the canopen +# stack +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#ifneq ($(KERNELRELEASE),) +# Kbuild part of Makefile +TARGET = SUB_TARGET +CAN_DRIVER = SUB_CAN_DRIVER +TIMERS_DRIVER = SUB_TIMERS_DRIVER + +EXTRA_CFLAGS := -I$(src)/../../include +EXTRA_CFLAGS += -I$(src)/../../include/$(TARGET) +EXTRA_CFLAGS += -I$(src)/../../include/$(CAN_DRIVER) +EXTRA_CFLAGS += -I$(src)/../../include/$(TIMERS_DRIVER) +EXTRA_CFLAGS += SUB_PROG_CFLAGS + +obj-m := $(TIMERS_DRIVER).o + +#else +# Normal Makefile +PREFIX = SUB_PREFIX +KERNELDIR := SUB_KERNELDIR + +all: driver + +driver: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean + rm -f Module.symvers + +mrproper: clean + +install: + + +#endif \ No newline at end of file diff -r 31dc4ec8710c -r 7802a7d5584f drivers/timers_kernel/timers_kernel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/timers_kernel/timers_kernel.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,105 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include + +#include "timer.h" +#include "applicfg.h" + +static spinlock_t lock = SPIN_LOCK_UNLOCKED; + +static struct timer_list timer; + +static TIMEVAL last_time_read, + last_occured_alarm, + last_alarm_set; + + +void EnterMutex(void) +{ + spin_lock (&lock); +} + +void LeaveMutex(void) +{ + spin_unlock (&lock); +} + +void timer_notify(unsigned long data) +{ + last_occured_alarm = last_alarm_set; + + EnterMutex(); + TimeDispatch(); + LeaveMutex(); +} + +void StartTimerLoop(TimerCallback_t init_callback) +{ + getElapsedTime(); + last_alarm_set = last_time_read; + last_occured_alarm = last_alarm_set; + + init_timer(&timer); + timer.function = timer_notify; + + EnterMutex(); + // At first, TimeDispatch will call init_callback. + SetAlarm(NULL, 0, init_callback, 0, 0); + LeaveMutex(); +} + +void StopTimerLoop(void) +{ + EnterMutex(); + del_timer (&timer); + LeaveMutex(); +} + +void setTimer(TIMEVAL value) +{ + if (value == TIMEVAL_MAX) + return; + + last_alarm_set = last_time_read + value; + mod_timer (&timer, last_alarm_set); +} + +TIMEVAL getElapsedTime(void) +{ + last_time_read = jiffies; + + return (long)last_time_read - (long)last_occured_alarm; +} + +void CreateReceiveTask(CAN_PORT port, TASK_HANDLE *Thread, void* ReceiveLoopPtr) +{ + *Thread = kthread_run(ReceiveLoopPtr, port, "canReceiveLoop"); +} + +void WaitReceiveTaskEnd(TASK_HANDLE Thread) +{ + force_sig (SIGTERM, Thread); +} diff -r 31dc4ec8710c -r 7802a7d5584f drivers/unix/Makefile.in --- a/drivers/unix/Makefile.in Tue Feb 12 09:42:56 2008 +0100 +++ b/drivers/unix/Makefile.in Tue Feb 12 09:44:55 2008 +0100 @@ -21,9 +21,15 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +#ifneq ($(KERNELRELEASE),) +# Kbuild part of Makefile +obj-m := libcanfestival_$(TARGET).o +libcanfestival_$(TARGET)-objs := $(OBJS) + +#else +# Normal Makefile CC = SUB_CC OPT_CFLAGS = -O2 -CFLAGS = SUB_OPT_CFLAGS PROG_CFLAGS = SUB_PROG_CFLAGS OS_NAME = SUB_OS_NAME ARCH_NAME = SUB_ARCH_NAME @@ -49,9 +55,33 @@ all: driver +ifeq ($(TIMERS_DRIVER), timers_kernel) +OBJS := $(shell echo $(OBJS) | sed "s:$(TARGET)_::g") +EXTRA_CFLAGS := $(shell echo $(INCLUDES) | sed "s:-I:-I$(src)/:g") +EXTRA_CFLAGS += $(PROG_CFLAGS) +KERNELDIR := SUB_KERNELDIR +export TARGET +export OBJS +export EXTRA_CFLAGS + +driver: libcanfestival_$(TARGET) + +libcanfestival_$(TARGET): + @echo Building [libcanfestival_$(TARGET).o] + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean + rm -f Module.symvers + +install: + + +else +CFLAGS = SUB_OPT_CFLAGS + driver: $(OBJS) - %o: %c $(CC) $(CFLAGS) $(PROG_CFLAGS) ${PROGDEFINES} $(INCLUDES) -o $@ -c $< @@ -80,6 +110,7 @@ rm -f $(OBJS) rm -f libcanfestival_$(TARGET).a +endif mrproper: clean - +#endif diff -r 31dc4ec8710c -r 7802a7d5584f drivers/unix/unix.c --- a/drivers/unix/unix.c Tue Feb 12 09:42:56 2008 +0100 +++ b/drivers/unix/unix.c Tue Feb 12 09:44:55 2008 +0100 @@ -19,9 +19,13 @@ License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifndef __KERNEL__ #include #include #include +#else +#include +#endif #ifndef NOT_USE_DYNAMIC_LOADING #define DLL_CALL(funcname) (* funcname##_driver) @@ -171,7 +175,7 @@ LeaveMutex(); return (CAN_PORT)&canports[i]; }else{ - fprintf(stderr,"CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate); + MSG("CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate); return NULL; } } @@ -202,3 +206,10 @@ } return 1; // NOT OK } + + +#ifdef __KERNEL__ +EXPORT_SYMBOL (canOpen); +EXPORT_SYMBOL (canClose); +EXPORT_SYMBOL (canSend); +#endif diff -r 31dc4ec8710c -r 7802a7d5584f examples/Makefile.in --- a/examples/Makefile.in Tue Feb 12 09:42:56 2008 +0100 +++ b/examples/Makefile.in Tue Feb 12 09:44:55 2008 +0100 @@ -22,6 +22,7 @@ # TARGET = SUB_TARGET +TIMERS = SUB_TIMERS_DRIVER WX = SUB_WX ENABLE_LSS = SUB_ENABLE_LSS @@ -62,6 +63,12 @@ endef endif +ifeq ($(TIMERS),timers_kernel) +define build_command_seq + $(MAKE) -C kerneltest $@ +endef +endif + all: $(build_command_seq) diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/Makefile.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/Makefile.in Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,88 @@ +#! gmake + +# +# Copyright (C) 2006 Laurent Bessard +# +# This file is part of canfestival, a library implementing the canopen +# stack +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#ifneq ($(KERNELRELEASE),) +# Kbuild part of Makefile +TARGET = SUB_TARGET +CAN_DRIVER = SUB_CAN_DRIVER +TIMERS_DRIVER = SUB_TIMERS_DRIVER + +EXTRA_CFLAGS := -I$(src)/../../include +EXTRA_CFLAGS += -I$(src)/../../include/$(TARGET) +EXTRA_CFLAGS += -I$(src)/../../include/$(CAN_DRIVER) +EXTRA_CFLAGS += -I$(src)/../../include/$(TIMERS_DRIVER) +EXTRA_CFLAGS += SUB_PROG_CFLAGS + +OBJS := kernel_module.o +OBJS += TestSlave.o +OBJS += TestMaster.o +OBJS += Slave.o +OBJS += Master.o +OBJS += TestMasterSlave.o + +obj-m := canf_ktest.o +canf_ktest-objs := $(OBJS) + +#else +# Normal Makefile +CC = SUB_CC +PREFIX = SUB_PREFIX +KERNELDIR := SUB_KERNELDIR + +all: canf_ktest + +canf_ktest: canf_ktest_console TestSlave.c TestMaster.c + cat ../../drivers/can_virtual_kernel/Module.symvers > Module.symvers + cat ../../src/Module.symvers >> Module.symvers + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean + rm -f Module.symvers + rm -f console/canf_ktest_console + +mrproper: clean + rm -f TestSlave.c + rm -f TestMaster.c + +install: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules_install + mkdir -p $(PREFIX)/bin/ + cp console/canf_ktest_console $(PREFIX)/bin/ + /bin/sh insert.sh + +uninstall: + rm -f $(PREFIX)/bin/canf_ktest_console + +canf_ktest_console: console/console.c console/console.h + $(CC) console/console.c -o console/canf_ktest_console + +TestSlave.c: TestSlave.od + $(MAKE) -C ../../objdictgen gnosis + python ../../objdictgen/objdictgen.py TestSlave.od TestSlave.c + +TestMaster.c: TestMaster.od + $(MAKE) -C ../../objdictgen gnosis + python ../../objdictgen/objdictgen.py TestMaster.od TestMaster.c + +#endif diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/Master.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/Master.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,298 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "Master.h" +#include "Slave.h" +#include "TestMasterSlave.h" +#include "can_driver.h" + +extern s_BOARD MasterBoard; +/*****************************************************************************/ +void TestMaster_heartbeatError(CO_Data* d, UNS8 heartbeatID) +{ + eprintf("TestMaster_heartbeatError %d\n", heartbeatID); +} + +/******************************************************** + * ConfigureSlaveNode is responsible to + * - setup master RPDO 1 to receive TPDO 1 from id 2 + * - setup master RPDO 2 to receive TPDO 2 from id 2 + ********************************************************/ +void TestMaster_initialisation(CO_Data* d) +{ + UNS32 PDO1_COBID = 0x0182; + UNS32 PDO2_COBID = 0x0282; + UNS8 size = sizeof(UNS32); +// UNS32 SINC_cicle=0; +// UNS8 data_type = 0; + + eprintf("TestMaster_initialisation\n"); + + /***************************************** + * Define RPDOs to match slave ID=2 TPDOs* + *****************************************/ + writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ + 0x1400, /*UNS16 index*/ + 0x01, /*UNS8 subind*/ + &PDO1_COBID, /*void * pSourceData,*/ + &size, /* UNS8 * pExpectedSize*/ + RW); /* UNS8 checkAccess */ + + writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ + 0x1401, /*UNS16 index*/ + 0x01, /*UNS8 subind*/ + &PDO2_COBID, /*void * pSourceData,*/ + &size, /* UNS8 * pExpectedSize*/ + RW); /* UNS8 checkAccess */ + +} + +// Step counts number of times ConfigureSlaveNode is called +static int init_step = 0; + +/*Froward declaration*/ +static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId); + +/**/ +static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId) +{ + UNS32 abortCode; + if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED) + eprintf("Master : Failed in initializing slave %2.2x, step %d, AbortCode :%4.4x \n", nodeId, init_step, abortCode); + + /* Finalise last SDO transfer with this node */ + closeSDOtransfer(&TestMaster_Data, nodeId, SDO_CLIENT); + + ConfigureSlaveNode(d, nodeId); +} + +/******************************************************** + * ConfigureSlaveNode is responsible to + * - setup slave TPDO 1 transmit type + * - setup slave TPDO 2 transmit type + * - switch to operational mode + * - send NMT to slave + ******************************************************** + * This an example of : + * Network Dictionary Access (SDO) with Callback + * Slave node state change request (NMT) + ******************************************************** + * This is called first by TestMaster_post_SlaveBootup + * then it called again each time a SDO exchange is + * finished. + ********************************************************/ + +static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId) +{ + /* Master configure heartbeat producer time at 1000 ms + * for slave node-id 0x02 by DCF concise */ + + UNS8 Transmission_Type = 0x01; +// UNS32 abortCode; + UNS8 res; + eprintf("Master : ConfigureSlaveNode %2.2x\n", nodeId); + + switch(++init_step){ + case 1: /*First step : setup Slave's TPDO 1 to be transmitted on SYNC*/ + eprintf("Master : set slave %2.2x TPDO 1 transmit type\n", nodeId); + res = writeNetworkDictCallBack (d, /*CO_Data* d*/ + nodeId, /*UNS8 nodeId*/ + 0x1800, /*UNS16 index*/ + 0x02, /*UNS8 subindex*/ + 1, /*UNS8 count*/ + 0, /*UNS8 dataType*/ + &Transmission_Type,/*void *data*/ + CheckSDOAndContinue); /*SDOCallback_t Callback*/ + break; + + case 2: /*Second step*/ + eprintf("Master : set slave %2.2x TPDO 2 transmit type\n", nodeId); + writeNetworkDictCallBack (d, /*CO_Data* d*/ + nodeId, /*UNS8 nodeId*/ + 0x1801, /*UNS16 index*/ + 0x02, /*UNS16 index*/ + 1, /*UNS8 count*/ + 0, /*UNS8 dataType*/ + &Transmission_Type,/*void *data*/ + CheckSDOAndContinue); /*SDOCallback_t Callback*/ + break; + case 3: + + /****************************** START *******************************/ + + /* Put the master in operational mode */ + setState(d, Operational); + + /* Ask slave node to go in operational mode */ + masterSendNMTstateChange (d, nodeId, NMT_Start_Node); + + } +} + + +void TestMaster_preOperational(CO_Data* d) +{ + eprintf("TestMaster_preOperational\n"); +} + +void TestMaster_operational(CO_Data* d) +{ + eprintf("TestMaster_operational\n"); +} + +void TestMaster_stopped(CO_Data* d) +{ + eprintf("TestMaster_stopped\n"); +} + +void TestMaster_post_sync(CO_Data* d) +{ + eprintf("TestMaster_post_sync\n"); + eprintf("Master: %d %d %d %d %d %d %d %d %d %x %x %d %d\n", + MasterMap1, + MasterMap2, + MasterMap3, + MasterMap4, + MasterMap5, + MasterMap6, + MasterMap7, + MasterMap8, + MasterMap9, + MasterMap10, + MasterMap11, + MasterMap12, + MasterMap13); +} + +void TestMaster_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg) +{ + eprintf("Master received EMCY message. Node: %2.2x ErrorCode: %4.4x ErrorRegister: %2.2x\n", nodeID, errCode, errReg); +} + +char query_result = 0; +char waiting_answer = 0; + +static void CheckSDO(CO_Data* d, UNS8 nodeId) +{ + UNS32 abortCode; + if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED) + eprintf("Master : Failed in changing Slave's transmit type AbortCode :%4.4x \n", abortCode); + + /* Finalise last SDO transfer with this node */ + closeSDOtransfer(&TestMaster_Data, nodeId, SDO_CLIENT); +} + + +static int MasterSyncCount = 0; +void TestMaster_post_TPDO(CO_Data* d) +{ + eprintf("TestMaster_post_TPDO MasterSyncCount = %d \n", MasterSyncCount); +// +// { +// char zero = 0; +// if(MasterMap4 > 0x80){ +// writeNetworkDict ( +// &TestMaster_Data, +// TestSlave_Data->bDeviceNodeId, +// 0x2002, +// 0x00, +// 1, +// 0, +// &zero); +// } +// } + +#if 0 + if(waiting_answer){ + UNS32 abortCode; + UNS8 size; + switch(getReadResultNetworkDict ( + &TestMaster_Data, + 0x02, + &query_result, + &size, + &abortCode)) + { + case SDO_FINISHED: + /* Do something with result here !!*/ + eprintf("Got SDO answer (0x2002, 0x00), %d %d\n",query_result,size); + case SDO_ABORTED_RCV: + case SDO_ABORTED_INTERNAL: + case SDO_RESET: + waiting_answer = 0; + closeSDOtransfer( + &TestMaster_Data, + 0x02, + SDO_CLIENT); + break; + case SDO_DOWNLOAD_IN_PROGRESS: + case SDO_UPLOAD_IN_PROGRESS: + break; + } + }else if(MasterSyncCount % 10 == 0){ + readNetworkDict ( + &TestMaster_Data, + 0x02, + 0x2002, + 0x00, + 0); + waiting_answer = 1; + } +#endif + if(MasterSyncCount % 17 == 0){ + eprintf("Master : Ask RTR PDO (0x1402)\n"); + sendPDOrequest(&TestMaster_Data, 0x1402 ); + sendPDOrequest(&TestMaster_Data, 0x1403 ); + } + if(MasterSyncCount % 50 == 0){ + eprintf("Master : Change slave's transmit type to 0xFF\n"); + UNS8 transmitiontype = 0xFF; + writeNetworkDictCallBack (&TestMaster_Data, /*CO_Data* d*/ + 2, /*UNS8 nodeId*/ + 0x1802, /*UNS16 index*/ + 0x02, /*UNS16 index*/ + 1, /*UNS8 count*/ + 0, /*UNS8 dataType*/ + &transmitiontype,/*void *data*/ + CheckSDO); /*SDOCallback_t Callback*/ + } + if(MasterSyncCount % 50 == 25){ + eprintf("Master : Change slave's transmit type to 0x00\n"); + UNS8 transmitiontype = 0x00; + writeNetworkDictCallBack (&TestMaster_Data, /*CO_Data* d*/ + 2, /*UNS8 nodeId*/ + 0x1802, /*UNS16 index*/ + 0x02, /*UNS16 index*/ + 1, /*UNS8 count*/ + 0, /*UNS8 dataType*/ + &transmitiontype,/*void *data*/ + CheckSDO); /*SDOCallback_t Callback*/ + } + MasterSyncCount++; +} + +void TestMaster_post_SlaveBootup(CO_Data* d, UNS8 nodeid) +{ + eprintf("TestMaster_post_SlaveBootup %x\n", nodeid); + + ConfigureSlaveNode(d, nodeid); +} diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/Master.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/Master.h Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,15 @@ +#include "TestMaster.h" + +void TestMaster_heartbeatError(CO_Data* d, UNS8); + +UNS8 TestMaster_canSend(Message *); + +void TestMaster_initialisation(CO_Data* d); +void TestMaster_preOperational(CO_Data* d); +void TestMaster_operational(CO_Data* d); +void TestMaster_stopped(CO_Data* d); + +void TestMaster_post_sync(CO_Data* d); +void TestMaster_post_TPDO(CO_Data* d); +void TestMaster_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg); +void TestMaster_post_SlaveBootup(CO_Data* d, UNS8 nodeid); diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/Slave.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/Slave.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,117 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "Slave.h" +#include "Master.h" +#include "TestMasterSlave.h" +#include "can_driver.h" + +extern s_BOARD SlaveBoard; +/*****************************************************************************/ +void TestSlave_heartbeatError(CO_Data* d, UNS8 heartbeatID) +{ + eprintf("TestSlave_heartbeatError %d\n", heartbeatID); +} + +void TestSlave_initialisation(CO_Data* d) +{ + eprintf("TestSlave_initialisation\n"); +} + +void TestSlave_preOperational(CO_Data* d) +{ + eprintf("TestSlave_preOperational\n"); +} + +void TestSlave_operational(CO_Data* d) +{ + eprintf("TestSlave_operational\n"); +} + +void TestSlave_stopped(CO_Data* d) +{ + eprintf("TestSlave_stopped\n"); +} + +void TestSlave_post_sync(CO_Data* d) +{ + eprintf("TestSlave_post_sync\n"); + + SlaveMap1=1; + SlaveMap2=1; + SlaveMap3=0; + SlaveMap4=0; + SlaveMap5=1; + SlaveMap6=0; + SlaveMap7=1; + SlaveMap8=0; + SlaveMap9=16; + SlaveMap10 = 0xff00ff00; + SlaveMap11 = 0xabcd; + SlaveMap12 += SlaveMap12 > 0x80 ? 0 : 1; + eprintf("Slave: %d %d %d %d %d %d %d %d %d %x %x %d %d \n", + SlaveMap1, + SlaveMap2, + SlaveMap3, + SlaveMap4, + SlaveMap5, + SlaveMap6, + SlaveMap7, + SlaveMap8, + SlaveMap9, + SlaveMap10, + SlaveMap11, + SlaveMap12, + SlaveMap13); +} + +void TestSlave_post_TPDO(CO_Data* d) +{ + SlaveMap13 += 1; + eprintf("TestSlave_post_TPDO\n"); + + /* send an error and recover inmediately every 12 cycles */ + if(SlaveMap13 % 12 == 0) + { + EMCY_setError(&TestSlave_Data, 0x4200, 0x08, 0x0000); + EMCY_errorRecovered(&TestSlave_Data, 0x4200); + } +} + +void TestSlave_storeODSubIndex(CO_Data* d, UNS16 wIndex, UNS8 bSubindex) +{ + /*TODO : + * - call getODEntry for index and subindex, + * - save content to file, database, flash, nvram, ... + * + * To ease flash organisation, index of variable to store + * can be established by scanning d->objdict[d->ObjdictSize] + * for variables to store. + * + * */ + eprintf("TestSlave_storeODSubIndex : %4.4x %2.2x\n", wIndex, bSubindex); +} + +void TestSlave_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg) +{ + eprintf("Slave received EMCY message. Node: %2.2x ErrorCode: %4.4x ErrorRegister: %2.2x\n", nodeID, errCode, errReg); +} diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/Slave.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/Slave.h Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,15 @@ +#include "TestSlave.h" + +void TestSlave_heartbeatError(CO_Data* d, UNS8); + +UNS8 TestSlave_canSend(Message *); + +void TestSlave_initialisation(CO_Data* d); +void TestSlave_preOperational(CO_Data* d); +void TestSlave_operational(CO_Data* d); +void TestSlave_stopped(CO_Data* d); + +void TestSlave_post_sync(CO_Data* d); +void TestSlave_post_TPDO(CO_Data* d); +void TestSlave_storeODSubIndex(CO_Data* d, UNS16 wIndex, UNS8 bSubindex); +void TestSlave_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg); diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestMaster.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestMaster.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,527 @@ + +/* File generated by gen_cfile.py. Should not be modified. */ + +#include "TestMaster.h" + +/**************************************************************************/ +/* Declaration of the mapped variables */ +/**************************************************************************/ +UNS8 MasterMap1 = 0x0; /* Mapped at index 0x2000, subindex 0x00 */ +UNS8 MasterMap2 = 0x0; /* Mapped at index 0x2001, subindex 0x00 */ +UNS8 MasterMap3 = 0x0; /* Mapped at index 0x2002, subindex 0x00 */ +UNS8 MasterMap4 = 0x0; /* Mapped at index 0x2003, subindex 0x00 */ +UNS8 MasterMap5 = 0x0; /* Mapped at index 0x2004, subindex 0x00 */ +UNS8 MasterMap6 = 0x0; /* Mapped at index 0x2005, subindex 0x00 */ +UNS8 MasterMap7 = 0x0; /* Mapped at index 0x2006, subindex 0x00 */ +UNS8 MasterMap8 = 0x0; /* Mapped at index 0x2007, subindex 0x00 */ +UNS8 MasterMap9 = 0x0; /* Mapped at index 0x2008, subindex 0x00 */ +UNS32 MasterMap10 = 0x0; /* Mapped at index 0x2009, subindex 0x00 */ +UNS16 MasterMap11 = 0x0; /* Mapped at index 0x200A, subindex 0x00 */ +INTEGER16 MasterMap12 = 0x0; /* Mapped at index 0x200B, subindex 0x00 */ +INTEGER16 MasterMap13 = 0x0; /* Mapped at index 0x200C, subindex 0x00 */ + +/**************************************************************************/ +/* Declaration of the value range types */ +/**************************************************************************/ + +#define valueRange_EMC 0x9F /* Type for index 0x1003 subindex 0x00 (only set of value 0 is possible) */ +UNS32 TestMaster_valueRangeTest (UNS8 typeValue, void * value) +{ + switch (typeValue) { + case valueRange_EMC: + if (*(UNS8*)value != (UNS8)0) return OD_VALUE_RANGE_EXCEEDED; + break; + } + return 0; +} + +/**************************************************************************/ +/* The node id */ +/**************************************************************************/ +/* node_id default value.*/ +UNS8 TestMaster_bDeviceNodeId = 0x00; + +/**************************************************************************/ +/* Array of message processing information */ + +const UNS8 TestMaster_iam_a_slave = 0; + +TIMER_HANDLE TestMaster_heartBeatTimers[1] = {TIMER_NONE,}; + +/* +$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + + OBJECT DICTIONARY + +$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +*/ + +/* index 0x1000 : Device Type. */ + UNS32 TestMaster_obj1000 = 0x12D; /* 301 */ + subindex TestMaster_Index1000[] = + { + { RO, uint32, sizeof (UNS32), (void*)&TestMaster_obj1000 } + }; + +/* index 0x1001 : Error Register. */ + UNS8 TestMaster_obj1001 = 0x0; /* 0 */ + subindex TestMaster_Index1001[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_obj1001 } + }; + +/* index 0x1003 : Pre-defined Error Field */ + UNS8 TestMaster_highestSubIndex_obj1003 = 0; /* number of subindex - 1*/ + UNS32 TestMaster_obj1003[] = + { + 0x0 /* 0 */ + }; + ODCallback_t TestMaster_Index1003_callbacks[] = + { + NULL, + NULL, + }; + subindex TestMaster_Index1003[] = + { + { RW, valueRange_EMC, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1003 }, + { RO, uint32, sizeof (UNS32), (void*)&TestMaster_obj1003[0] } + }; + +/* index 0x1005 : SYNC COB ID. */ + UNS32 TestMaster_obj1005 = 0x40000080; /* 1073741952 */ + ODCallback_t TestMaster_Index1005_callbacks[] = + { + NULL, + }; + subindex TestMaster_Index1005[] = + { + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1005 } + }; + +/* index 0x1006 : Communication / Cycle Period. */ + UNS32 TestMaster_obj1006 = 0xC350; /* 50000 */ + ODCallback_t TestMaster_Index1006_callbacks[] = + { + NULL, + }; + subindex TestMaster_Index1006[] = + { + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1006 } + }; + +/* index 0x1010 : Store parameters. */ + UNS8 TestMaster_highestSubIndex_obj1010 = 4; /* number of subindex - 1*/ + UNS32 TestMaster_obj1010_Save_All_Parameters = 0x0; /* 0 */ + UNS32 TestMaster_obj1010_Save_Communication_Parameters = 0x0; /* 0 */ + UNS32 TestMaster_obj1010_Save_Application_Parameters = 0x0; /* 0 */ + UNS32 TestMaster_obj1010_Save_Manufacturer_Parameters = 0x0; /* 0 */ + subindex TestMaster_Index1010[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1010 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1010_Save_All_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1010_Save_Communication_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1010_Save_Application_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1010_Save_Manufacturer_Parameters } + }; + +/* index 0x1011 : Restore Default Parameters. */ + UNS8 TestMaster_highestSubIndex_obj1011 = 4; /* number of subindex - 1*/ + UNS32 TestMaster_obj1011_Restore_All_Default_Parameters = 0x0; /* 0 */ + UNS32 TestMaster_obj1011_Restore_Communication_Default_Parameters = 0x0; /* 0 */ + UNS32 TestMaster_obj1011_Restore_Application_Default_Parameters = 0x0; /* 0 */ + UNS32 TestMaster_obj1011_Restore_Manufacturer_Default_Parameters = 0x0; /* 0 */ + subindex TestMaster_Index1011[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1011 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1011_Restore_All_Default_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1011_Restore_Communication_Default_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1011_Restore_Application_Default_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1011_Restore_Manufacturer_Default_Parameters } + }; + +/* index 0x1014 : Emergency COB ID. */ + UNS32 TestMaster_obj1014 = 0x80; /* 128 */ + subindex TestMaster_Index1014[] = + { + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1014 } + }; + +/* index 0x1016 : Consumer Heartbeat Time. */ + UNS8 TestMaster_highestSubIndex_obj1016 = 1; /* number of subindex - 1*/ + UNS32 TestMaster_obj1016[] = + { + 0x205DC /* 132572 */ + }; + subindex TestMaster_Index1016[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1016 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1016[0] } + }; + +/* index 0x1017 : Producer Heartbeat Time */ + UNS16 TestMaster_obj1017 = 0x0; /* 0 */ + +/* index 0x1018 : Identity. */ + UNS8 TestMaster_highestSubIndex_obj1018 = 4; /* number of subindex - 1*/ + UNS32 TestMaster_obj1018_Vendor_ID = 0x0; /* 0 */ + UNS32 TestMaster_obj1018_Product_Code = 0x0; /* 0 */ + UNS32 TestMaster_obj1018_Revision_Number = 0x0; /* 0 */ + UNS32 TestMaster_obj1018_Serial_Number = 0x0; /* 0 */ + subindex TestMaster_Index1018[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1018 }, + { RO, uint32, sizeof (UNS32), (void*)&TestMaster_obj1018_Vendor_ID }, + { RO, uint32, sizeof (UNS32), (void*)&TestMaster_obj1018_Product_Code }, + { RO, uint32, sizeof (UNS32), (void*)&TestMaster_obj1018_Revision_Number }, + { RO, uint32, sizeof (UNS32), (void*)&TestMaster_obj1018_Serial_Number } + }; + +/* index 0x1280 : Client SDO 1 Parameter. */ + UNS8 TestMaster_highestSubIndex_obj1280 = 3; /* number of subindex - 1*/ + UNS32 TestMaster_obj1280_COB_ID_Client_to_Server_Transmit_SDO = 0x602; /* 1538 */ + UNS32 TestMaster_obj1280_COB_ID_Server_to_Client_Receive_SDO = 0x582; /* 1410 */ + UNS8 TestMaster_obj1280_Node_ID_of_the_SDO_Server = 0x2; /* 2 */ + subindex TestMaster_Index1280[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1280 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1280_COB_ID_Client_to_Server_Transmit_SDO }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1280_COB_ID_Server_to_Client_Receive_SDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1280_Node_ID_of_the_SDO_Server } + }; + +/* index 0x1400 : Receive PDO 1 Parameter. */ + UNS8 TestMaster_highestSubIndex_obj1400 = 5; /* number of subindex - 1*/ + UNS32 TestMaster_obj1400_COB_ID_used_by_PDO = 0x200; /* 512 */ + UNS8 TestMaster_obj1400_Transmission_Type = 0x1; /* 1 */ + UNS16 TestMaster_obj1400_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestMaster_obj1400_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestMaster_obj1400_Event_Timer = 0x0; /* 0 */ + subindex TestMaster_Index1400[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1400 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1400_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1400_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1400_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1400_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1400_Event_Timer } + }; + +/* index 0x1401 : Receive PDO 2 Parameter. */ + UNS8 TestMaster_highestSubIndex_obj1401 = 5; /* number of subindex - 1*/ + UNS32 TestMaster_obj1401_COB_ID_used_by_PDO = 0x300; /* 768 */ + UNS8 TestMaster_obj1401_Transmission_Type = 0x0; /* 0 */ + UNS16 TestMaster_obj1401_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestMaster_obj1401_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestMaster_obj1401_Event_Timer = 0x0; /* 0 */ + subindex TestMaster_Index1401[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1401 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1401_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1401_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1401_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1401_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1401_Event_Timer } + }; + +/* index 0x1402 : Receive PDO 3 Parameter. */ + UNS8 TestMaster_highestSubIndex_obj1402 = 5; /* number of subindex - 1*/ + UNS32 TestMaster_obj1402_COB_ID_used_by_PDO = 0x401; /* 1025 */ + UNS8 TestMaster_obj1402_Transmission_Type = 0x0; /* 0 */ + UNS16 TestMaster_obj1402_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestMaster_obj1402_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestMaster_obj1402_Event_Timer = 0x0; /* 0 */ + subindex TestMaster_Index1402[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1402 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1402_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1402_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1402_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1402_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1402_Event_Timer } + }; + +/* index 0x1403 : Receive PDO 4 Parameter. */ + UNS8 TestMaster_highestSubIndex_obj1403 = 5; /* number of subindex - 1*/ + UNS32 TestMaster_obj1403_COB_ID_used_by_PDO = 0x482; /* 1154 */ + UNS8 TestMaster_obj1403_Transmission_Type = 0x0; /* 0 */ + UNS16 TestMaster_obj1403_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestMaster_obj1403_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestMaster_obj1403_Event_Timer = 0x0; /* 0 */ + subindex TestMaster_Index1403[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1403 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1403_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1403_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1403_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_obj1403_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestMaster_obj1403_Event_Timer } + }; + +/* index 0x1600 : Receive PDO 1 Mapping. */ + UNS8 TestMaster_highestSubIndex_obj1600 = 10; /* number of subindex - 1*/ + UNS32 TestMaster_obj1600[] = + { + 0x20000001, /* 536870913 */ + 0x20010001, /* 536936449 */ + 0x20020001, /* 537001985 */ + 0x20030001, /* 537067521 */ + 0x20040001, /* 537133057 */ + 0x20050001, /* 537198593 */ + 0x20060001, /* 537264129 */ + 0x20070001, /* 537329665 */ + 0x20080008, /* 537395208 */ + 0x20090020 /* 537460768 */ + }; + subindex TestMaster_Index1600[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1600 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[0] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[1] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[2] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[3] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[4] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[5] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[6] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[7] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[8] }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1600[9] } + }; + +/* index 0x1601 : Receive PDO 2 Mapping. */ + UNS8 TestMaster_highestSubIndex_obj1601 = 1; /* number of subindex - 1*/ + UNS32 TestMaster_obj1601[] = + { + 0x200A0010 /* 537526288 */ + }; + subindex TestMaster_Index1601[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1601 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1601[0] } + }; + +/* index 0x1602 : Receive PDO 3 Mapping. */ + UNS8 TestMaster_highestSubIndex_obj1602 = 1; /* number of subindex - 1*/ + UNS32 TestMaster_obj1602[] = + { + 0x200B0010 /* 537591824 */ + }; + subindex TestMaster_Index1602[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1602 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1602[0] } + }; + +/* index 0x1603 : Receive PDO 4 Mapping. */ + UNS8 TestMaster_highestSubIndex_obj1603 = 1; /* number of subindex - 1*/ + UNS32 TestMaster_obj1603[] = + { + 0x200C0010 /* 537657360 */ + }; + subindex TestMaster_Index1603[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1603 }, + { RW, uint32, sizeof (UNS32), (void*)&TestMaster_obj1603[0] } + }; + +/* index 0x1F22 : Concise DCF. */ + UNS8 TestMaster_highestSubIndex_obj1F22 = 2; /* number of subindex - 1*/ + UNS8* TestMaster_obj1F22[] = + { + "", + "\x01\x00\x00\x00\x17\x10\x00\x02\x00\x00\x00\xe8\x03" + }; + subindex TestMaster_Index1F22[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestMaster_highestSubIndex_obj1F22 }, + { RW, domain, 0, (void*)&TestMaster_obj1F22[0] }, + { RW, domain, 13, (void*)&TestMaster_obj1F22[1] } + }; + +/* index 0x2000 : Mapped variable MasterMap1 */ + subindex TestMaster_Index2000[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap1 } + }; + +/* index 0x2001 : Mapped variable MasterMap2 */ + subindex TestMaster_Index2001[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap2 } + }; + +/* index 0x2002 : Mapped variable MasterMap3 */ + subindex TestMaster_Index2002[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap3 } + }; + +/* index 0x2003 : Mapped variable MasterMap4 */ + subindex TestMaster_Index2003[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap4 } + }; + +/* index 0x2004 : Mapped variable MasterMap5 */ + subindex TestMaster_Index2004[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap5 } + }; + +/* index 0x2005 : Mapped variable MasterMap6 */ + subindex TestMaster_Index2005[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap6 } + }; + +/* index 0x2006 : Mapped variable MasterMap7 */ + subindex TestMaster_Index2006[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap7 } + }; + +/* index 0x2007 : Mapped variable MasterMap8 */ + subindex TestMaster_Index2007[] = + { + { RW, boolean, sizeof (UNS8), (void*)&MasterMap8 } + }; + +/* index 0x2008 : Mapped variable MasterMap9 */ + subindex TestMaster_Index2008[] = + { + { RW, uint8, sizeof (UNS8), (void*)&MasterMap9 } + }; + +/* index 0x2009 : Mapped variable MasterMap10 */ + subindex TestMaster_Index2009[] = + { + { RW, uint32, sizeof (UNS32), (void*)&MasterMap10 } + }; + +/* index 0x200A : Mapped variable MasterMap11 */ + subindex TestMaster_Index200A[] = + { + { RW, uint16, sizeof (UNS16), (void*)&MasterMap11 } + }; + +/* index 0x200B : Mapped variable MasterMap12 */ + subindex TestMaster_Index200B[] = + { + { RW, int16, sizeof (INTEGER16), (void*)&MasterMap12 } + }; + +/* index 0x200C : Mapped variable MasterMap13 */ + subindex TestMaster_Index200C[] = + { + { RW, int16, sizeof (INTEGER16), (void*)&MasterMap13 } + }; + +const indextable TestMaster_objdict[] = +{ + { (subindex*)TestMaster_Index1000,sizeof(TestMaster_Index1000)/sizeof(TestMaster_Index1000[0]), 0x1000}, + { (subindex*)TestMaster_Index1001,sizeof(TestMaster_Index1001)/sizeof(TestMaster_Index1001[0]), 0x1001}, + { (subindex*)TestMaster_Index1005,sizeof(TestMaster_Index1005)/sizeof(TestMaster_Index1005[0]), 0x1005}, + { (subindex*)TestMaster_Index1006,sizeof(TestMaster_Index1006)/sizeof(TestMaster_Index1006[0]), 0x1006}, + { (subindex*)TestMaster_Index1010,sizeof(TestMaster_Index1010)/sizeof(TestMaster_Index1010[0]), 0x1010}, + { (subindex*)TestMaster_Index1011,sizeof(TestMaster_Index1011)/sizeof(TestMaster_Index1011[0]), 0x1011}, + { (subindex*)TestMaster_Index1014,sizeof(TestMaster_Index1014)/sizeof(TestMaster_Index1014[0]), 0x1014}, + { (subindex*)TestMaster_Index1016,sizeof(TestMaster_Index1016)/sizeof(TestMaster_Index1016[0]), 0x1016}, + { (subindex*)TestMaster_Index1018,sizeof(TestMaster_Index1018)/sizeof(TestMaster_Index1018[0]), 0x1018}, + { (subindex*)TestMaster_Index1280,sizeof(TestMaster_Index1280)/sizeof(TestMaster_Index1280[0]), 0x1280}, + { (subindex*)TestMaster_Index1400,sizeof(TestMaster_Index1400)/sizeof(TestMaster_Index1400[0]), 0x1400}, + { (subindex*)TestMaster_Index1401,sizeof(TestMaster_Index1401)/sizeof(TestMaster_Index1401[0]), 0x1401}, + { (subindex*)TestMaster_Index1402,sizeof(TestMaster_Index1402)/sizeof(TestMaster_Index1402[0]), 0x1402}, + { (subindex*)TestMaster_Index1403,sizeof(TestMaster_Index1403)/sizeof(TestMaster_Index1403[0]), 0x1403}, + { (subindex*)TestMaster_Index1600,sizeof(TestMaster_Index1600)/sizeof(TestMaster_Index1600[0]), 0x1600}, + { (subindex*)TestMaster_Index1601,sizeof(TestMaster_Index1601)/sizeof(TestMaster_Index1601[0]), 0x1601}, + { (subindex*)TestMaster_Index1602,sizeof(TestMaster_Index1602)/sizeof(TestMaster_Index1602[0]), 0x1602}, + { (subindex*)TestMaster_Index1603,sizeof(TestMaster_Index1603)/sizeof(TestMaster_Index1603[0]), 0x1603}, + { (subindex*)TestMaster_Index1F22,sizeof(TestMaster_Index1F22)/sizeof(TestMaster_Index1F22[0]), 0x1F22}, + { (subindex*)TestMaster_Index2000,sizeof(TestMaster_Index2000)/sizeof(TestMaster_Index2000[0]), 0x2000}, + { (subindex*)TestMaster_Index2001,sizeof(TestMaster_Index2001)/sizeof(TestMaster_Index2001[0]), 0x2001}, + { (subindex*)TestMaster_Index2002,sizeof(TestMaster_Index2002)/sizeof(TestMaster_Index2002[0]), 0x2002}, + { (subindex*)TestMaster_Index2003,sizeof(TestMaster_Index2003)/sizeof(TestMaster_Index2003[0]), 0x2003}, + { (subindex*)TestMaster_Index2004,sizeof(TestMaster_Index2004)/sizeof(TestMaster_Index2004[0]), 0x2004}, + { (subindex*)TestMaster_Index2005,sizeof(TestMaster_Index2005)/sizeof(TestMaster_Index2005[0]), 0x2005}, + { (subindex*)TestMaster_Index2006,sizeof(TestMaster_Index2006)/sizeof(TestMaster_Index2006[0]), 0x2006}, + { (subindex*)TestMaster_Index2007,sizeof(TestMaster_Index2007)/sizeof(TestMaster_Index2007[0]), 0x2007}, + { (subindex*)TestMaster_Index2008,sizeof(TestMaster_Index2008)/sizeof(TestMaster_Index2008[0]), 0x2008}, + { (subindex*)TestMaster_Index2009,sizeof(TestMaster_Index2009)/sizeof(TestMaster_Index2009[0]), 0x2009}, + { (subindex*)TestMaster_Index200A,sizeof(TestMaster_Index200A)/sizeof(TestMaster_Index200A[0]), 0x200A}, + { (subindex*)TestMaster_Index200B,sizeof(TestMaster_Index200B)/sizeof(TestMaster_Index200B[0]), 0x200B}, + { (subindex*)TestMaster_Index200C,sizeof(TestMaster_Index200C)/sizeof(TestMaster_Index200C[0]), 0x200C}, +}; + +const indextable * TestMaster_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks) +{ + int i; + *callbacks = NULL; + switch(wIndex){ + case 0x1000: i = 0;break; + case 0x1001: i = 1;break; + case 0x1005: i = 2;*callbacks = TestMaster_Index1005_callbacks; break; + case 0x1006: i = 3;*callbacks = TestMaster_Index1006_callbacks; break; + case 0x1010: i = 4;break; + case 0x1011: i = 5;break; + case 0x1014: i = 6;break; + case 0x1016: i = 7;break; + case 0x1018: i = 8;break; + case 0x1280: i = 9;break; + case 0x1400: i = 10;break; + case 0x1401: i = 11;break; + case 0x1402: i = 12;break; + case 0x1403: i = 13;break; + case 0x1600: i = 14;break; + case 0x1601: i = 15;break; + case 0x1602: i = 16;break; + case 0x1603: i = 17;break; + case 0x1F22: i = 18;break; + case 0x2000: i = 19;break; + case 0x2001: i = 20;break; + case 0x2002: i = 21;break; + case 0x2003: i = 22;break; + case 0x2004: i = 23;break; + case 0x2005: i = 24;break; + case 0x2006: i = 25;break; + case 0x2007: i = 26;break; + case 0x2008: i = 27;break; + case 0x2009: i = 28;break; + case 0x200A: i = 29;break; + case 0x200B: i = 30;break; + case 0x200C: i = 31;break; + default: + *errorCode = OD_NO_SUCH_OBJECT; + return NULL; + } + *errorCode = OD_SUCCESSFUL; + return &TestMaster_objdict[i]; +} + +/* + * To count at which received SYNC a PDO must be sent. + * Even if no pdoTransmit are defined, at least one entry is computed + * for compilations issues. + */ +s_PDO_status TestMaster_PDO_status[1] = {s_PDO_status_Initializer}; + +quick_index TestMaster_firstIndex = { + 0, /* SDO_SVR */ + 9, /* SDO_CLT */ + 10, /* PDO_RCV */ + 14, /* PDO_RCV_MAP */ + 0, /* PDO_TRS */ + 0 /* PDO_TRS_MAP */ +}; + +quick_index TestMaster_lastIndex = { + 0, /* SDO_SVR */ + 9, /* SDO_CLT */ + 13, /* PDO_RCV */ + 17, /* PDO_RCV_MAP */ + 0, /* PDO_TRS */ + 0 /* PDO_TRS_MAP */ +}; + +UNS16 TestMaster_ObjdictSize = sizeof(TestMaster_objdict)/sizeof(TestMaster_objdict[0]); + +CO_Data TestMaster_Data = CANOPEN_NODE_DATA_INITIALIZER(TestMaster); + diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestMaster.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestMaster.h Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,29 @@ + +/* File generated by gen_cfile.py. Should not be modified. */ + +#ifndef TESTMASTER_H +#define TESTMASTER_H + +#include "data.h" + +/* Prototypes of function provided by object dictionnary */ +UNS32 TestMaster_valueRangeTest (UNS8 typeValue, void * value); +const indextable * TestMaster_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks); + +/* Master node data struct */ +extern CO_Data TestMaster_Data; +extern UNS8 MasterMap1; /* Mapped at index 0x2000, subindex 0x00*/ +extern UNS8 MasterMap2; /* Mapped at index 0x2001, subindex 0x00*/ +extern UNS8 MasterMap3; /* Mapped at index 0x2002, subindex 0x00*/ +extern UNS8 MasterMap4; /* Mapped at index 0x2003, subindex 0x00*/ +extern UNS8 MasterMap5; /* Mapped at index 0x2004, subindex 0x00*/ +extern UNS8 MasterMap6; /* Mapped at index 0x2005, subindex 0x00*/ +extern UNS8 MasterMap7; /* Mapped at index 0x2006, subindex 0x00*/ +extern UNS8 MasterMap8; /* Mapped at index 0x2007, subindex 0x00*/ +extern UNS8 MasterMap9; /* Mapped at index 0x2008, subindex 0x00*/ +extern UNS32 MasterMap10; /* Mapped at index 0x2009, subindex 0x00*/ +extern UNS16 MasterMap11; /* Mapped at index 0x200A, subindex 0x00*/ +extern INTEGER16 MasterMap12; /* Mapped at index 0x200B, subindex 0x00*/ +extern INTEGER16 MasterMap13; /* Mapped at index 0x200C, subindex 0x00*/ + +#endif // TESTMASTER_H diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestMaster.od --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestMaster.od Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,5945 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap1 + + + + + + + MasterMap1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap2 + + + + + + + MasterMap2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap3 + + + + + + + MasterMap3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap4 + + + + + + + MasterMap4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap5 + + + + + + + MasterMap5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap6 + + + + + + + MasterMap6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap7 + + + + + + + MasterMap7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap8 + + + + + + + MasterMap8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap9 + + + + + + + MasterMap9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap10 + + + + + + + MasterMap10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap11 + + + + + + + MasterMap11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap12 + + + + + + + MasterMap12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasterMap13 + + + + + + + MasterMap13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DS-401 +master + +TestMaster + diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestMasterSlave.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestMasterSlave.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,103 @@ +#include "canfestival.h" + +#include "Master.h" +#include "Slave.h" +#include "TestMasterSlave.h" + + +static UNS32 OnMasterMap1Update(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) +{ + eprintf("OnSlaveMap1Update:%d\n", SlaveMap1); + return 0; +} + +s_BOARD SlaveBoard = {"0", "125K"}; +s_BOARD MasterBoard = {"1", "125K"}; + +/*************************** INIT *****************************************/ +static void InitNodes(CO_Data* d, UNS32 id) +{ + /****************************** INITIALISATION SLAVE *******************************/ + if(strcmp(SlaveBoard.baudrate, "none")) { + setNodeId(&TestSlave_Data, 0x02); + + setState(&TestSlave_Data, Initialisation); + } + + /****************************** INITIALISATION MASTER *******************************/ + if(strcmp(MasterBoard.baudrate, "none")){ + RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update); + + // Defining the node Id + setNodeId(&TestMaster_Data, 0x01); + + setState(&TestMaster_Data, Initialisation); + } +} + +int TestMasterSlave_start (void) +{ + if(strcmp(SlaveBoard.baudrate, "none")){ + + TestSlave_Data.heartbeatError = TestSlave_heartbeatError; + TestSlave_Data.initialisation = TestSlave_initialisation; + TestSlave_Data.preOperational = TestSlave_preOperational; + TestSlave_Data.operational = TestSlave_operational; + TestSlave_Data.stopped = TestSlave_stopped; + TestSlave_Data.post_sync = TestSlave_post_sync; + TestSlave_Data.post_TPDO = TestSlave_post_TPDO; + TestSlave_Data.storeODSubIndex = TestSlave_storeODSubIndex; + TestSlave_Data.post_emcy = TestSlave_post_emcy; + + if(!canOpen(&SlaveBoard,&TestSlave_Data)){ + eprintf("Cannot open Slave Board (%s,%s)\n",SlaveBoard.busname, SlaveBoard.baudrate); + return 1; + } + } + if(strcmp(MasterBoard.baudrate, "none")){ + + TestMaster_Data.heartbeatError = TestMaster_heartbeatError; + TestMaster_Data.initialisation = TestMaster_initialisation; + TestMaster_Data.preOperational = TestMaster_preOperational; + TestMaster_Data.operational = TestMaster_operational; + TestMaster_Data.stopped = TestMaster_stopped; + TestMaster_Data.post_sync = TestMaster_post_sync; + TestMaster_Data.post_TPDO = TestMaster_post_TPDO; + TestMaster_Data.post_emcy = TestMaster_post_emcy; + TestMaster_Data.post_SlaveBootup=TestMaster_post_SlaveBootup; + + if(!canOpen(&MasterBoard,&TestMaster_Data)){ + eprintf("Cannot open Master Board (%s,%s)\n",MasterBoard.busname, MasterBoard.baudrate); + if(strcmp(MasterBoard.baudrate, "none")) canClose(&TestMaster_Data); + return 1; + } + } + + // Start timer thread + StartTimerLoop(&InitNodes); + + return 0; +} + +void TestMasterSlave_stop (void) +{ + eprintf("Finishing.\n"); + + EnterMutex(); + masterSendNMTstateChange (&TestMaster_Data, 0x02, NMT_Reset_Node); + LeaveMutex(); + + // Stop master + EnterMutex(); + setState(&TestMaster_Data, Stopped); + LeaveMutex(); + + // Stop timer thread + StopTimerLoop(); + + // Close CAN devices (and can threads) + if(strcmp(SlaveBoard.baudrate, "none")) canClose(&TestSlave_Data); + if(strcmp(MasterBoard.baudrate, "none")) canClose(&TestMaster_Data); + + eprintf("End.\n"); +} diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestMasterSlave.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestMasterSlave.h Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,31 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef TESTMASTERSLAVE_H +#define TESTMASTERSLAVE_H + +#define eprintf(...) printk (KERN_INFO __VA_ARGS__) + +int TestMasterSlave_start (void); +void TestMasterSlave_stop (void); + +#endif diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestSlave.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestSlave.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,626 @@ + +/* File generated by gen_cfile.py. Should not be modified. */ + +#include "TestSlave.h" + +/**************************************************************************/ +/* Declaration of the mapped variables */ +/**************************************************************************/ +UNS8 SlaveMap1 = 0x0; /* Mapped at index 0x2000, subindex 0x00 */ +UNS8 SlaveMap2 = 0x0; /* Mapped at index 0x2001, subindex 0x00 */ +UNS8 SlaveMap3 = 0x0; /* Mapped at index 0x2002, subindex 0x00 */ +UNS8 SlaveMap4 = 0x0; /* Mapped at index 0x2003, subindex 0x00 */ +UNS8 SlaveMap5 = 0x0; /* Mapped at index 0x2004, subindex 0x00 */ +UNS8 SlaveMap6 = 0x0; /* Mapped at index 0x2005, subindex 0x00 */ +UNS8 SlaveMap7 = 0x0; /* Mapped at index 0x2006, subindex 0x00 */ +UNS8 SlaveMap8 = 0x0; /* Mapped at index 0x2007, subindex 0x00 */ +UNS8 SlaveMap9 = 0x0; /* Mapped at index 0x2008, subindex 0x00 */ +UNS32 SlaveMap10 = 0x0; /* Mapped at index 0x2009, subindex 0x00 */ +UNS16 SlaveMap11 = 0x0; /* Mapped at index 0x200A, subindex 0x00 */ +INTEGER16 SlaveMap12 = 0x0; /* Mapped at index 0x200B, subindex 0x00 */ +INTEGER16 SlaveMap13 = 0x4D2; /* Mapped at index 0x200C, subindex 0x00 */ + +/**************************************************************************/ +/* Declaration of the value range types */ +/**************************************************************************/ + +#define valueRange_EMC 0x9F /* Type for index 0x1003 subindex 0x00 (only set of value 0 is possible) */ +UNS32 TestSlave_valueRangeTest (UNS8 typeValue, void * value) +{ + switch (typeValue) { + case valueRange_EMC: + if (*(UNS8*)value != (UNS8)0) return OD_VALUE_RANGE_EXCEEDED; + break; + } + return 0; +} + +/**************************************************************************/ +/* The node id */ +/**************************************************************************/ +/* node_id default value.*/ +UNS8 TestSlave_bDeviceNodeId = 0x00; + +/**************************************************************************/ +/* Array of message processing information */ + +const UNS8 TestSlave_iam_a_slave = 1; + +TIMER_HANDLE TestSlave_heartBeatTimers[1]; + +/* +$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + + OBJECT DICTIONARY + +$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +*/ + +/* index 0x1000 : Device Type. */ + UNS32 TestSlave_obj1000 = 0x12D; /* 301 */ + subindex TestSlave_Index1000[] = + { + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1000 } + }; + +/* index 0x1001 : Error Register. */ + UNS8 TestSlave_obj1001 = 0x0; /* 0 */ + subindex TestSlave_Index1001[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_obj1001 } + }; + +/* index 0x1003 : Pre-defined Error Field. */ + UNS8 TestSlave_highestSubIndex_obj1003 = 0; /* number of subindex - 1*/ + UNS32 TestSlave_obj1003[] = + { + 0x0, /* 0 */ + 0x0, /* 0 */ + 0x0, /* 0 */ + 0x0, /* 0 */ + 0x0, /* 0 */ + 0x0, /* 0 */ + 0x0, /* 0 */ + 0x0 /* 0 */ + }; + ODCallback_t TestSlave_Index1003_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1003[] = + { + { RW, valueRange_EMC, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1003 }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[0] }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[1] }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[2] }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[3] }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[4] }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[5] }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[6] }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1003[7] } + }; + +/* index 0x1005 : SYNC COB ID. */ + UNS32 TestSlave_obj1005 = 0x80; /* 128 */ + ODCallback_t TestSlave_Index1005_callbacks[] = + { + NULL, + }; + subindex TestSlave_Index1005[] = + { + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1005 } + }; + +/* index 0x1006 : Communication / Cycle Period. */ + UNS32 TestSlave_obj1006 = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1006_callbacks[] = + { + NULL, + }; + subindex TestSlave_Index1006[] = + { + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1006 } + }; + +/* index 0x1010 : Store parameters. */ + UNS8 TestSlave_highestSubIndex_obj1010 = 4; /* number of subindex - 1*/ + UNS32 TestSlave_obj1010_Save_All_Parameters = 0x0; /* 0 */ + UNS32 TestSlave_obj1010_Save_Communication_Parameters = 0x0; /* 0 */ + UNS32 TestSlave_obj1010_Save_Application_Parameters = 0x0; /* 0 */ + UNS32 TestSlave_obj1010_Save_Manufacturer_Parameters = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1010_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1010[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1010 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1010_Save_All_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1010_Save_Communication_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1010_Save_Application_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1010_Save_Manufacturer_Parameters } + }; + +/* index 0x1011 : Restore Default Parameters. */ + UNS8 TestSlave_highestSubIndex_obj1011 = 4; /* number of subindex - 1*/ + UNS32 TestSlave_obj1011_Restore_All_Default_Parameters = 0x0; /* 0 */ + UNS32 TestSlave_obj1011_Restore_Communication_Default_Parameters = 0x0; /* 0 */ + UNS32 TestSlave_obj1011_Restore_Application_Default_Parameters = 0x0; /* 0 */ + UNS32 TestSlave_obj1011_Restore_Manufacturer_Default_Parameters = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1011_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1011[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1011 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1011_Restore_All_Default_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1011_Restore_Communication_Default_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1011_Restore_Application_Default_Parameters }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1011_Restore_Manufacturer_Default_Parameters } + }; + +/* index 0x1014 : Emergency COB ID. */ + UNS32 TestSlave_obj1014 = 0x80; /* 128 */ + subindex TestSlave_Index1014[] = + { + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1014 } + }; + +/* index 0x1016 : Consumer Heartbeat Time */ + UNS8 TestSlave_highestSubIndex_obj1016 = 0; + UNS32 TestSlave_obj1016[]={0}; + +/* index 0x1017 : Producer Heartbeat Time. */ + UNS16 TestSlave_obj1017 = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1017_callbacks[] = + { + NULL, + }; + subindex TestSlave_Index1017[] = + { + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1017 } + }; + +/* index 0x1018 : Identity. */ + UNS8 TestSlave_highestSubIndex_obj1018 = 4; /* number of subindex - 1*/ + UNS32 TestSlave_obj1018_Vendor_ID = 0x12345678; /* 305419896 */ + UNS32 TestSlave_obj1018_Product_Code = 0x90123456; /* 2417112150 */ + UNS32 TestSlave_obj1018_Revision_Number = 0x78901234; /* 2022707764 */ + UNS32 TestSlave_obj1018_Serial_Number = 0x56789012; /* 1450741778 */ + subindex TestSlave_Index1018[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1018 }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1018_Vendor_ID }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1018_Product_Code }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1018_Revision_Number }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1018_Serial_Number } + }; + +/* index 0x1200 : Server SDO Parameter. */ + UNS8 TestSlave_highestSubIndex_obj1200 = 2; /* number of subindex - 1*/ + UNS32 TestSlave_obj1200_COB_ID_Client_to_Server_Receive_SDO = 0x600; /* 1536 */ + UNS32 TestSlave_obj1200_COB_ID_Server_to_Client_Transmit_SDO = 0x580; /* 1408 */ + subindex TestSlave_Index1200[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1200 }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1200_COB_ID_Client_to_Server_Receive_SDO }, + { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1200_COB_ID_Server_to_Client_Transmit_SDO } + }; + +/* index 0x1800 : Transmit PDO 1 Parameter. */ + UNS8 TestSlave_highestSubIndex_obj1800 = 5; /* number of subindex - 1*/ + UNS32 TestSlave_obj1800_COB_ID_used_by_PDO = 0x180; /* 384 */ + UNS8 TestSlave_obj1800_Transmission_Type = 0x0; /* 0 */ + UNS16 TestSlave_obj1800_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestSlave_obj1800_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestSlave_obj1800_Event_Timer = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1800_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1800[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1800 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1800_COB_ID_used_by_PDO }, + { RW|TO_BE_SAVE, uint8, sizeof (UNS8), (void*)&TestSlave_obj1800_Transmission_Type }, + { RW|TO_BE_SAVE, uint16, sizeof (UNS16), (void*)&TestSlave_obj1800_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1800_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1800_Event_Timer } + }; + +/* index 0x1801 : Transmit PDO 2 Parameter. */ + UNS8 TestSlave_highestSubIndex_obj1801 = 5; /* number of subindex - 1*/ + UNS32 TestSlave_obj1801_COB_ID_used_by_PDO = 0x280; /* 640 */ + UNS8 TestSlave_obj1801_Transmission_Type = 0x0; /* 0 */ + UNS16 TestSlave_obj1801_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestSlave_obj1801_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestSlave_obj1801_Event_Timer = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1801_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1801[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1801 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1801_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1801_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1801_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1801_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1801_Event_Timer } + }; + +/* index 0x1802 : Transmit PDO 3 Parameter. */ + UNS8 TestSlave_highestSubIndex_obj1802 = 5; /* number of subindex - 1*/ + UNS32 TestSlave_obj1802_COB_ID_used_by_PDO = 0x380; /* 896 */ + UNS8 TestSlave_obj1802_Transmission_Type = 0xFF; /* 255 */ + UNS16 TestSlave_obj1802_Inhibit_Time = 0x1388; /* 5000 */ + UNS8 TestSlave_obj1802_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestSlave_obj1802_Event_Timer = 0x3E8; /* 1000 */ + ODCallback_t TestSlave_Index1802_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1802[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1802 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1802_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1802_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1802_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1802_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1802_Event_Timer } + }; + +/* index 0x1803 : Transmit PDO 4 Parameter. */ + UNS8 TestSlave_highestSubIndex_obj1803 = 5; /* number of subindex - 1*/ + UNS32 TestSlave_obj1803_COB_ID_used_by_PDO = 0x480; /* 1152 */ + UNS8 TestSlave_obj1803_Transmission_Type = 0xFC; /* 252 */ + UNS16 TestSlave_obj1803_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestSlave_obj1803_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestSlave_obj1803_Event_Timer = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1803_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1803[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1803 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1803_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1803_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1803_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1803_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1803_Event_Timer } + }; + +/* index 0x1804 : Transmit PDO 5 Parameter. */ + UNS8 TestSlave_highestSubIndex_obj1804 = 5; /* number of subindex - 1*/ + UNS32 TestSlave_obj1804_COB_ID_used_by_PDO = 0x401; /* 1025 */ + UNS8 TestSlave_obj1804_Transmission_Type = 0xFD; /* 253 */ + UNS16 TestSlave_obj1804_Inhibit_Time = 0x0; /* 0 */ + UNS8 TestSlave_obj1804_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestSlave_obj1804_Event_Timer = 0x0; /* 0 */ + ODCallback_t TestSlave_Index1804_callbacks[] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + }; + subindex TestSlave_Index1804[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1804 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1804_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1804_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1804_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1804_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1804_Event_Timer } + }; + +/* index 0x1A00 : Transmit PDO 1 Mapping. */ + UNS8 TestSlave_highestSubIndex_obj1A00 = 10; /* number of subindex - 1*/ + UNS32 TestSlave_obj1A00[] = + { + 0x20000001, /* 536870913 */ + 0x20010001, /* 536936449 */ + 0x20020001, /* 537001985 */ + 0x20030001, /* 537067521 */ + 0x20040001, /* 537133057 */ + 0x20050001, /* 537198593 */ + 0x20060001, /* 537264129 */ + 0x20070001, /* 537329665 */ + 0x20080008, /* 537395208 */ + 0x20090020 /* 537460768 */ + }; + subindex TestSlave_Index1A00[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1A00 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[0] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[1] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[2] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[3] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[4] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[5] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[6] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[7] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[8] }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A00[9] } + }; + +/* index 0x1A01 : Transmit PDO 2 Mapping. */ + UNS8 TestSlave_highestSubIndex_obj1A01 = 1; /* number of subindex - 1*/ + UNS32 TestSlave_obj1A01[] = + { + 0x200A0010 /* 537526288 */ + }; + subindex TestSlave_Index1A01[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1A01 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A01[0] } + }; + +/* index 0x1A02 : Transmit PDO 3 Mapping. */ + UNS8 TestSlave_highestSubIndex_obj1A02 = 1; /* number of subindex - 1*/ + UNS32 TestSlave_obj1A02[] = + { + 0x200B0010 /* 537591824 */ + }; + subindex TestSlave_Index1A02[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1A02 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A02[0] } + }; + +/* index 0x1A03 : Transmit PDO 4 Mapping. */ + UNS8 TestSlave_highestSubIndex_obj1A03 = 1; /* number of subindex - 1*/ + UNS32 TestSlave_obj1A03[] = + { + 0x200C0010 /* 537657360 */ + }; + subindex TestSlave_Index1A03[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1A03 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A03[0] } + }; + +/* index 0x1A04 : Transmit PDO 5 Mapping. */ + UNS8 TestSlave_highestSubIndex_obj1A04 = 1; /* number of subindex - 1*/ + UNS32 TestSlave_obj1A04[] = + { + 0x200C0010 /* 537657360 */ + }; + subindex TestSlave_Index1A04[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1A04 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A04[0] } + }; + +/* index 0x2000 : Mapped variable SlaveMap1 */ + subindex TestSlave_Index2000[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap1 } + }; + +/* index 0x2001 : Mapped variable SlaveMap2 */ + subindex TestSlave_Index2001[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap2 } + }; + +/* index 0x2002 : Mapped variable SlaveMap3 */ + subindex TestSlave_Index2002[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap3 } + }; + +/* index 0x2003 : Mapped variable SlaveMap4 */ + subindex TestSlave_Index2003[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap4 } + }; + +/* index 0x2004 : Mapped variable SlaveMap5 */ + subindex TestSlave_Index2004[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap5 } + }; + +/* index 0x2005 : Mapped variable SlaveMap6 */ + subindex TestSlave_Index2005[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap6 } + }; + +/* index 0x2006 : Mapped variable SlaveMap7 */ + subindex TestSlave_Index2006[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap7 } + }; + +/* index 0x2007 : Mapped variable SlaveMap8 */ + subindex TestSlave_Index2007[] = + { + { RW, boolean, sizeof (UNS8), (void*)&SlaveMap8 } + }; + +/* index 0x2008 : Mapped variable SlaveMap9 */ + subindex TestSlave_Index2008[] = + { + { RW, uint8, sizeof (UNS8), (void*)&SlaveMap9 } + }; + +/* index 0x2009 : Mapped variable SlaveMap10 */ + subindex TestSlave_Index2009[] = + { + { RW, uint32, sizeof (UNS32), (void*)&SlaveMap10 } + }; + +/* index 0x200A : Mapped variable SlaveMap11 */ + subindex TestSlave_Index200A[] = + { + { RW, uint16, sizeof (UNS16), (void*)&SlaveMap11 } + }; + +/* index 0x200B : Mapped variable SlaveMap12 */ + subindex TestSlave_Index200B[] = + { + { RW, int16, sizeof (INTEGER16), (void*)&SlaveMap12 } + }; + +/* index 0x200C : Mapped variable SlaveMap13 */ + subindex TestSlave_Index200C[] = + { + { RW, int16, sizeof (INTEGER16), (void*)&SlaveMap13 } + }; + +const indextable TestSlave_objdict[] = +{ + { (subindex*)TestSlave_Index1000,sizeof(TestSlave_Index1000)/sizeof(TestSlave_Index1000[0]), 0x1000}, + { (subindex*)TestSlave_Index1001,sizeof(TestSlave_Index1001)/sizeof(TestSlave_Index1001[0]), 0x1001}, + { (subindex*)TestSlave_Index1003,sizeof(TestSlave_Index1003)/sizeof(TestSlave_Index1003[0]), 0x1003}, + { (subindex*)TestSlave_Index1005,sizeof(TestSlave_Index1005)/sizeof(TestSlave_Index1005[0]), 0x1005}, + { (subindex*)TestSlave_Index1006,sizeof(TestSlave_Index1006)/sizeof(TestSlave_Index1006[0]), 0x1006}, + { (subindex*)TestSlave_Index1010,sizeof(TestSlave_Index1010)/sizeof(TestSlave_Index1010[0]), 0x1010}, + { (subindex*)TestSlave_Index1011,sizeof(TestSlave_Index1011)/sizeof(TestSlave_Index1011[0]), 0x1011}, + { (subindex*)TestSlave_Index1014,sizeof(TestSlave_Index1014)/sizeof(TestSlave_Index1014[0]), 0x1014}, + { (subindex*)TestSlave_Index1017,sizeof(TestSlave_Index1017)/sizeof(TestSlave_Index1017[0]), 0x1017}, + { (subindex*)TestSlave_Index1018,sizeof(TestSlave_Index1018)/sizeof(TestSlave_Index1018[0]), 0x1018}, + { (subindex*)TestSlave_Index1200,sizeof(TestSlave_Index1200)/sizeof(TestSlave_Index1200[0]), 0x1200}, + { (subindex*)TestSlave_Index1800,sizeof(TestSlave_Index1800)/sizeof(TestSlave_Index1800[0]), 0x1800}, + { (subindex*)TestSlave_Index1801,sizeof(TestSlave_Index1801)/sizeof(TestSlave_Index1801[0]), 0x1801}, + { (subindex*)TestSlave_Index1802,sizeof(TestSlave_Index1802)/sizeof(TestSlave_Index1802[0]), 0x1802}, + { (subindex*)TestSlave_Index1803,sizeof(TestSlave_Index1803)/sizeof(TestSlave_Index1803[0]), 0x1803}, + { (subindex*)TestSlave_Index1804,sizeof(TestSlave_Index1804)/sizeof(TestSlave_Index1804[0]), 0x1804}, + { (subindex*)TestSlave_Index1A00,sizeof(TestSlave_Index1A00)/sizeof(TestSlave_Index1A00[0]), 0x1A00}, + { (subindex*)TestSlave_Index1A01,sizeof(TestSlave_Index1A01)/sizeof(TestSlave_Index1A01[0]), 0x1A01}, + { (subindex*)TestSlave_Index1A02,sizeof(TestSlave_Index1A02)/sizeof(TestSlave_Index1A02[0]), 0x1A02}, + { (subindex*)TestSlave_Index1A03,sizeof(TestSlave_Index1A03)/sizeof(TestSlave_Index1A03[0]), 0x1A03}, + { (subindex*)TestSlave_Index1A04,sizeof(TestSlave_Index1A04)/sizeof(TestSlave_Index1A04[0]), 0x1A04}, + { (subindex*)TestSlave_Index2000,sizeof(TestSlave_Index2000)/sizeof(TestSlave_Index2000[0]), 0x2000}, + { (subindex*)TestSlave_Index2001,sizeof(TestSlave_Index2001)/sizeof(TestSlave_Index2001[0]), 0x2001}, + { (subindex*)TestSlave_Index2002,sizeof(TestSlave_Index2002)/sizeof(TestSlave_Index2002[0]), 0x2002}, + { (subindex*)TestSlave_Index2003,sizeof(TestSlave_Index2003)/sizeof(TestSlave_Index2003[0]), 0x2003}, + { (subindex*)TestSlave_Index2004,sizeof(TestSlave_Index2004)/sizeof(TestSlave_Index2004[0]), 0x2004}, + { (subindex*)TestSlave_Index2005,sizeof(TestSlave_Index2005)/sizeof(TestSlave_Index2005[0]), 0x2005}, + { (subindex*)TestSlave_Index2006,sizeof(TestSlave_Index2006)/sizeof(TestSlave_Index2006[0]), 0x2006}, + { (subindex*)TestSlave_Index2007,sizeof(TestSlave_Index2007)/sizeof(TestSlave_Index2007[0]), 0x2007}, + { (subindex*)TestSlave_Index2008,sizeof(TestSlave_Index2008)/sizeof(TestSlave_Index2008[0]), 0x2008}, + { (subindex*)TestSlave_Index2009,sizeof(TestSlave_Index2009)/sizeof(TestSlave_Index2009[0]), 0x2009}, + { (subindex*)TestSlave_Index200A,sizeof(TestSlave_Index200A)/sizeof(TestSlave_Index200A[0]), 0x200A}, + { (subindex*)TestSlave_Index200B,sizeof(TestSlave_Index200B)/sizeof(TestSlave_Index200B[0]), 0x200B}, + { (subindex*)TestSlave_Index200C,sizeof(TestSlave_Index200C)/sizeof(TestSlave_Index200C[0]), 0x200C}, +}; + +const indextable * TestSlave_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks) +{ + int i; + *callbacks = NULL; + switch(wIndex){ + case 0x1000: i = 0;break; + case 0x1001: i = 1;break; + case 0x1003: i = 2;*callbacks = TestSlave_Index1003_callbacks; break; + case 0x1005: i = 3;*callbacks = TestSlave_Index1005_callbacks; break; + case 0x1006: i = 4;*callbacks = TestSlave_Index1006_callbacks; break; + case 0x1010: i = 5;*callbacks = TestSlave_Index1010_callbacks; break; + case 0x1011: i = 6;*callbacks = TestSlave_Index1011_callbacks; break; + case 0x1014: i = 7;break; + case 0x1017: i = 8;*callbacks = TestSlave_Index1017_callbacks; break; + case 0x1018: i = 9;break; + case 0x1200: i = 10;break; + case 0x1800: i = 11;*callbacks = TestSlave_Index1800_callbacks; break; + case 0x1801: i = 12;*callbacks = TestSlave_Index1801_callbacks; break; + case 0x1802: i = 13;*callbacks = TestSlave_Index1802_callbacks; break; + case 0x1803: i = 14;*callbacks = TestSlave_Index1803_callbacks; break; + case 0x1804: i = 15;*callbacks = TestSlave_Index1804_callbacks; break; + case 0x1A00: i = 16;break; + case 0x1A01: i = 17;break; + case 0x1A02: i = 18;break; + case 0x1A03: i = 19;break; + case 0x1A04: i = 20;break; + case 0x2000: i = 21;break; + case 0x2001: i = 22;break; + case 0x2002: i = 23;break; + case 0x2003: i = 24;break; + case 0x2004: i = 25;break; + case 0x2005: i = 26;break; + case 0x2006: i = 27;break; + case 0x2007: i = 28;break; + case 0x2008: i = 29;break; + case 0x2009: i = 30;break; + case 0x200A: i = 31;break; + case 0x200B: i = 32;break; + case 0x200C: i = 33;break; + default: + *errorCode = OD_NO_SUCH_OBJECT; + return NULL; + } + *errorCode = OD_SUCCESSFUL; + return &TestSlave_objdict[i]; +} + +/* + * To count at which received SYNC a PDO must be sent. + * Even if no pdoTransmit are defined, at least one entry is computed + * for compilations issues. + */ +s_PDO_status TestSlave_PDO_status[5] = {s_PDO_status_Initializer,s_PDO_status_Initializer,s_PDO_status_Initializer,s_PDO_status_Initializer,s_PDO_status_Initializer}; + +quick_index TestSlave_firstIndex = { + 10, /* SDO_SVR */ + 0, /* SDO_CLT */ + 0, /* PDO_RCV */ + 0, /* PDO_RCV_MAP */ + 11, /* PDO_TRS */ + 16 /* PDO_TRS_MAP */ +}; + +quick_index TestSlave_lastIndex = { + 10, /* SDO_SVR */ + 0, /* SDO_CLT */ + 0, /* PDO_RCV */ + 0, /* PDO_RCV_MAP */ + 15, /* PDO_TRS */ + 20 /* PDO_TRS_MAP */ +}; + +UNS16 TestSlave_ObjdictSize = sizeof(TestSlave_objdict)/sizeof(TestSlave_objdict[0]); + +CO_Data TestSlave_Data = CANOPEN_NODE_DATA_INITIALIZER(TestSlave); + diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestSlave.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestSlave.h Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,36 @@ + +/* File generated by gen_cfile.py. Should not be modified. */ + +#ifndef TESTSLAVE_H +#define TESTSLAVE_H + +#include "data.h" + +/* Prototypes of function provided by object dictionnary */ +UNS32 TestSlave_valueRangeTest (UNS8 typeValue, void * value); +const indextable * TestSlave_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks); + +/* Master node data struct */ +extern CO_Data TestSlave_Data; +extern ODCallback_t Store_parameters_callbacks[]; /* Callbacks of index0x1010 */ +extern ODCallback_t Restore_Default_Parameters_callbacks[]; /* Callbacks of index0x1011 */ +extern ODCallback_t Transmit_PDO_1_Parameter_callbacks[]; /* Callbacks of index0x1800 */ +extern ODCallback_t Transmit_PDO_2_Parameter_callbacks[]; /* Callbacks of index0x1801 */ +extern ODCallback_t Transmit_PDO_3_Parameter_callbacks[]; /* Callbacks of index0x1802 */ +extern ODCallback_t Transmit_PDO_4_Parameter_callbacks[]; /* Callbacks of index0x1803 */ +extern ODCallback_t Transmit_PDO_5_Parameter_callbacks[]; /* Callbacks of index0x1804 */ +extern UNS8 SlaveMap1; /* Mapped at index 0x2000, subindex 0x00*/ +extern UNS8 SlaveMap2; /* Mapped at index 0x2001, subindex 0x00*/ +extern UNS8 SlaveMap3; /* Mapped at index 0x2002, subindex 0x00*/ +extern UNS8 SlaveMap4; /* Mapped at index 0x2003, subindex 0x00*/ +extern UNS8 SlaveMap5; /* Mapped at index 0x2004, subindex 0x00*/ +extern UNS8 SlaveMap6; /* Mapped at index 0x2005, subindex 0x00*/ +extern UNS8 SlaveMap7; /* Mapped at index 0x2006, subindex 0x00*/ +extern UNS8 SlaveMap8; /* Mapped at index 0x2007, subindex 0x00*/ +extern UNS8 SlaveMap9; /* Mapped at index 0x2008, subindex 0x00*/ +extern UNS32 SlaveMap10; /* Mapped at index 0x2009, subindex 0x00*/ +extern UNS16 SlaveMap11; /* Mapped at index 0x200A, subindex 0x00*/ +extern INTEGER16 SlaveMap12; /* Mapped at index 0x200B, subindex 0x00*/ +extern INTEGER16 SlaveMap13; /* Mapped at index 0x200C, subindex 0x00*/ + +#endif // TESTSLAVE_H diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/TestSlave.od --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/TestSlave.od Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,890 @@ + + + + + +TestSlave + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EVENT + + + + + + + + + 5000*100 µC = 500 ms + + + + + + + + + + + + + + + + + + 1000 ms + + + + + + + + + + + + + + RTR_SYNC + + + + + + + + + + + + + + RTR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap2 + + + + + + + SlaveMap2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap3 + + + + + + + SlaveMap3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap4 + + + + + + + SlaveMap4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap5 + + + + + + + SlaveMap5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap6 + + + + + + + SlaveMap6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap7 + + + + + + + SlaveMap7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap8 + + + + + + + SlaveMap8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap9 + + + + + + + SlaveMap9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap10 + + + + + + + SlaveMap10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap11 + + + + + + + SlaveMap11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap12 + + + + + + + SlaveMap12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap13 + + + + + + + SlaveMap13 + + + + + + + + + + + +slave + + + diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/console/console.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/console/console.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include + +#include "console.h" + + +void showhelp(void) { + printf("\nCanFestival kernel test example console\n\n"); + + printf("start - start example\n"); + printf("end - end example\n"); + printf("quit - quit console\n"); + printf("\n"); +} + +int main(int argc,char *argv[]) +{ + int canf_ktest_dev, cmd; + char command[10]; + char device_path[20] = "/dev/"; + + // create absolute path name for device + strcat (device_path, DEVICE_NAME); + + canf_ktest_dev = open (device_path, O_WRONLY); + + if (canf_ktest_dev == -1) { + perror ("Opening device"); + return 1; + } + + showhelp(); + + while (1) { + printf("> "); + scanf ("%s", &command); + + if (strcmp(command,"start") == 0) + cmd = CMD_START; + + else if (strcmp(command,"end") == 0) + cmd = CMD_STOP; + + else if (strcmp(command,"quit") == 0) + break; + + else { + printf("Bad command\n"); + continue; + } + + write(canf_ktest_dev, &cmd, sizeof(cmd)); + } + + close(canf_ktest_dev); + return 0; +} diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/console/console.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/console/console.h Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,9 @@ +#ifndef __canftest_console_h__ +#define __canftest_console_h__ + +#define DEVICE_NAME "canf_ktest" + +#define CMD_START '1' +#define CMD_STOP '2' + +#endif // __canftest_console.h__ diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/insert.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/insert.sh Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,27 @@ +#!/bin/sh + +module="canf_ktest" +device="canf_ktest" +mode="664" + +# insert neccessary modules +/sbin/insmod ../../drivers/can_virtual_kernel/can_virtual.ko +/sbin/insmod ../../src/canfestival.ko + +# insert module with all arguments we got +# and use a pathname, as newer modutils don't look in . by default +/sbin/insmod ./$module.ko $* || exit 1 + +# remove stale nodes +rm -f /dev/${device} + +# create device file +major=$(awk "\$2==\"$device\" {print \$1; exit}" /proc/devices) +mknod /dev/${device} c $major 0 + +# give appropriate group/permissions, and change the group. +# Not all distributions have staff, some have "wheel" instead. +group="staff" +grep -q '^staff:' /etc/group || group="wheel" +chgrp $group /dev/${device} +chmod $mode /dev/${device} diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/kernel_module.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/kernel_module.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,133 @@ +#include +#include +#include +#include +#include + +#include "TestMasterSlave.h" +#include "console/console.h" + +#define minor 0 + +MODULE_LICENSE("GPL"); + +static dev_t canftest_dev; +static struct cdev *canftest_cdev; +static struct task_struct *thread_start_p, *thread_stop_p; +static DECLARE_MUTEX (canftest_mutex); +static int canftest_stopped = 1; + +// handler processing write() requests from user-space +ssize_t canftest_write(struct file *filp, const char __user *buf, size_t count, + loff_t *f_pos) +{ + int cmd; + + // get integer from user-space + if (get_user (cmd, buf)) + return -EFAULT; + + // process integer as command + switch (cmd) { + case CMD_START: + wake_up_process (thread_start_p); + break; + case CMD_STOP: + if (canftest_stopped) break; + wake_up_process (thread_stop_p); + break; + // ignore new line character + case 10: + break; + default: + printk("canftest: bad command %d\n", cmd); + break; + } + + return count; +} + +// register write() handler +static struct file_operations canftest_fops = { + .owner = THIS_MODULE, + .write = canftest_write, +}; + +// start TestMasterSlave example +int thread_start (void* data) +{ + int ret=0; + + down_interruptible (&canftest_mutex); + + ret=TestMasterSlave_start(); + + // if started + if (ret == 0) { + canftest_stopped = 0; + + // increment module usage count + try_module_get(THIS_MODULE); + } + + up (&canftest_mutex); + + return ret; +} + +// finish TestMasterSlave example +int thread_stop (void* data) +{ + down_interruptible (&canftest_mutex); + + TestMasterSlave_stop(); + canftest_stopped = 1; + + // decrement usage count + module_put(THIS_MODULE); + + up (&canftest_mutex); + + return 0; +} + +int init_module(void) +{ + int ret, major; + + // get major device number dynamically + ret = alloc_chrdev_region(&canftest_dev, minor, 1, DEVICE_NAME); + major = MAJOR(canftest_dev); + if (ret < 0) { + printk(KERN_WARNING "canftest: can't get major %d\n", major); + return ret; + } + + canftest_cdev = cdev_alloc( ); + canftest_cdev->owner = THIS_MODULE; + canftest_cdev->ops = &canftest_fops; + + // register new character device + ret = cdev_add (canftest_cdev, canftest_dev, 1); + if (ret) { + printk(KERN_WARNING "canftest: error %d adding char device\n", ret); + return ret; + } + + thread_start_p = kthread_create (thread_start, NULL, "canftest_start"); + thread_stop_p = kthread_create (thread_stop, NULL, "canftest_stop"); + + if (PTR_ERR(thread_start_p) == -ENOMEM || PTR_ERR(thread_stop_p) == -ENOMEM) { + printk(KERN_WARNING "canftest: error creating threads\n"); + return -ENOMEM; + } + + return 0; +} + +void cleanup_module(void) +{ + // unregister major device number and character device + unregister_chrdev_region(canftest_dev, 1); + cdev_del(canftest_cdev); +} diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/remove.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/remove.sh Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,11 @@ +#!/bin/sh + +module="canf_ktest" +device="canf_ktest" + +/sbin/rmmod $module || exit 1 +/sbin/rmmod canfestival +/sbin/rmmod can_virtual + +rm -f /dev/${device} + diff -r 31dc4ec8710c -r 7802a7d5584f examples/kerneltest/run.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/kerneltest/run.sh Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,7 @@ +#!/bin/sh + +/bin/sh insert.sh + +console/canf_ktest_console + +/bin/sh remove.sh diff -r 31dc4ec8710c -r 7802a7d5584f include/can_driver.h --- a/include/can_driver.h Tue Feb 12 09:42:56 2008 +0100 +++ b/include/can_driver.h Tue Feb 12 09:44:55 2008 +0100 @@ -53,28 +53,28 @@ #if defined DEBUG_MSG_CONSOLE_ON || defined NEED_PRINT_MESSAGE #include "def.h" -#define _P(fc) case fc: printf(#fc" ");break; +#define _P(fc) case fc: MSG(#fc" ");break; static inline void print_message(Message *m) { int i; UNS8 fc; - printf("id:%02x ", m->cob_id & 0x7F); + MSG("id:%02x ", m->cob_id & 0x7F); fc = m->cob_id >> 7; switch(fc) { case SYNC: if(m->cob_id == 0x080) - printf("SYNC "); + MSG("SYNC "); else - printf("EMCY "); + MSG("EMCY "); break; #ifdef CO_ENABLE_LSS case LSS: if(m->cob_id == 0x7E5) - printf("MLSS "); + MSG("MLSS "); else - printf("SLSS "); + MSG("SLSS "); break; #endif _P(TIME_STAMP) @@ -114,11 +114,11 @@ _P(ABORT_TRANSFER_REQUEST) } } - printf(" rtr:%d", m->rtr); - printf(" len:%d", m->len); + MSG(" rtr:%d", m->rtr); + MSG(" len:%d", m->len); for (i = 0 ; i < m->len ; i++) - printf(" %02x", m->data[i]); - printf("\n"); + MSG(" %02x", m->data[i]); + MSG("\n"); } #endif diff -r 31dc4ec8710c -r 7802a7d5584f include/timers_kernel/timerscfg.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/timers_kernel/timerscfg.h Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,39 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __TIMERSCFG_H__ +#define __TIMERSCFG_H__ + +#include +#include + +/* Time unit : clock ticks (jiffies) */ +/* Time resolution : ticks per second (architecture-dependent value 'HZ' defined in linux/param.h) */ + +#define TIMEVAL unsigned long +#define TIMEVAL_MAX (~(TIMEVAL)0) >> 1 +#define MS_TO_TIMEVAL(ms) ( (ms * HZ) / 1000 ) +#define US_TO_TIMEVAL(us) ( (us * HZ) / 1000000) + +#define TASK_HANDLE struct task_struct* + +#endif diff -r 31dc4ec8710c -r 7802a7d5584f include/unix/applicfg.h --- a/include/unix/applicfg.h Tue Feb 12 09:42:56 2008 +0100 +++ b/include/unix/applicfg.h Tue Feb 12 09:44:55 2008 +0100 @@ -23,9 +23,13 @@ #ifndef __APPLICFG_LINUX__ #define __APPLICFG_LINUX__ +#ifndef __KERNEL__ #include #include #include +#else +#include +#endif /* Define the architecture : little_endian or big_endian ----------------------------------------------------- @@ -72,15 +76,18 @@ /* Definition of error and warning macros */ /* -------------------------------------- */ -#if defined DEBUG_ERR_CONSOLE_ON || defined DEBUG_WAR_CONSOLE_ON -#include +#ifndef __KERNEL__ +# include +# define MSG(...) printf (__VA_ARGS__) +#else +# define MSG(...) printk (__VA_ARGS__) #endif /* Definition of MSG_ERR */ /* --------------------- */ #ifdef DEBUG_ERR_CONSOLE_ON # define MSG_ERR(num, str, val) \ - printf("%s,%d : 0X%x %s 0X%x \n",__FILE__, __LINE__,num, str, val); + MSG("%s,%d : 0X%x %s 0X%x \n",__FILE__, __LINE__,num, str, val); #else # define MSG_ERR(num, str, val) #endif @@ -89,7 +96,7 @@ /* --------------------- */ #ifdef DEBUG_WAR_CONSOLE_ON # define MSG_WAR(num, str, val) \ - printf("%s,%d : 0X%x %s 0X%x \n",__FILE__, __LINE__,num, str, val); + MSG("%s,%d : 0X%x %s 0X%x \n",__FILE__, __LINE__,num, str, val); #else # define MSG_WAR(num, str, val) #endif diff -r 31dc4ec8710c -r 7802a7d5584f include/unix/canfestival.h --- a/include/unix/canfestival.h Tue Feb 12 09:42:56 2008 +0100 +++ b/include/unix/canfestival.h Tue Feb 12 09:44:55 2008 +0100 @@ -10,7 +10,10 @@ #include "data.h" #include "timers_driver.h" +#ifndef __KERNEL__ #include +#endif + typedef void* LIB_HANDLE; UNS8 UnLoadCanDriver(LIB_HANDLE handle); diff -r 31dc4ec8710c -r 7802a7d5584f objdictgen/doc/manual_en.pdf Binary file objdictgen/doc/manual_en.pdf has changed diff -r 31dc4ec8710c -r 7802a7d5584f src/Makefile.in --- a/src/Makefile.in Tue Feb 12 09:42:56 2008 +0100 +++ b/src/Makefile.in Tue Feb 12 09:44:55 2008 +0100 @@ -21,6 +21,13 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +#ifneq ($(KERNELRELEASE),) +# Kbuild part of Makefile +obj-m := canfestival.o +canfestival-objs := $(OBJS) + +#else +# Normal Makefile CC = SUB_CC PROG_CFLAGS = SUB_PROG_CFLAGS OS_NAME = SUB_OS_NAME @@ -55,10 +62,40 @@ # # # # Options # # # # +all: canfestival + +ifeq ($(TIMERS_DRIVER), timers_kernel) +OBJS := $(shell echo $(OBJS) | sed "s:$(TARGET)_::g") +OBJS += symbols.o +OBJS += ../drivers/unix/libcanfestival_$(TARGET).o +EXTRA_CFLAGS := $(shell echo $(INCLUDES) | sed "s:-I:-I$(src)/:g") +EXTRA_CFLAGS += $(PROG_CFLAGS) +KERNELDIR := SUB_KERNELDIR +export OBJS +export EXTRA_CFLAGS + +canfestival: + @echo " " + @echo "*********************************************" + @echo "**Building [libcanfestival.o]" + @echo "*********************************************" + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean + rm -f Module.symvers + +install: + $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules_install + mkdir -p $(PREFIX)/include/canfestival + cp ../include/*.h $(PREFIX)/include/canfestival + +uninstall: + rm -rf $(PREFIX)/include/canfestival + +else CFLAGS = SUB_OPT_CFLAGS -all: canfestival - canfestival: libcanfestival.a libcanfestival.a: $(OBJS) @@ -89,5 +126,7 @@ clean: rm -f $(OBJS) libcanfestival.a +endif mrproper: clean +#endif diff -r 31dc4ec8710c -r 7802a7d5584f src/symbols.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/symbols.c Tue Feb 12 09:44:55 2008 +0100 @@ -0,0 +1,130 @@ +#include +#include "data.h" +#include "can_driver.h" +#include "dcf.h" +#include "nmtSlave.h" +#include "timers_driver.h" + +// CanFestival symbols available to other kernel modules + +// dcf.h +EXPORT_SYMBOL (send_consise_dcf); + +// emcy.h +EXPORT_SYMBOL (_post_emcy); +EXPORT_SYMBOL (EMCY_setError); +EXPORT_SYMBOL (EMCY_errorRecovered); +EXPORT_SYMBOL (emergencyInit); +EXPORT_SYMBOL (emergencyStop); +EXPORT_SYMBOL (proceedEMCY); + +// lifegrd.h +EXPORT_SYMBOL (_heartbeatError); +EXPORT_SYMBOL (_post_SlaveBootup); +EXPORT_SYMBOL (getNodeState); +EXPORT_SYMBOL (heartbeatInit); +EXPORT_SYMBOL (heartbeatStop); +EXPORT_SYMBOL (proceedNODE_GUARD); + +// lss.h +#ifdef CO_ENABLE_LSS +EXPORT_SYMBOL (startLSS); +EXPORT_SYMBOL (stopLSS); +EXPORT_SYMBOL (sendLSS); +EXPORT_SYMBOL (sendLSSMessage); +EXPORT_SYMBOL (proceedLSS_Master); +EXPORT_SYMBOL (proceedLSS_Slave); +EXPORT_SYMBOL (configNetworkNode); +EXPORT_SYMBOL (configNetworkNodeCallBack); +EXPORT_SYMBOL (getConfigResultNetworkNode); +#endif + +// nmtMaster.h +EXPORT_SYMBOL (masterSendNMTstateChange); +EXPORT_SYMBOL (masterSendNMTnodeguard); +EXPORT_SYMBOL (masterRequestNodeState); + +// nmtSlave.h +EXPORT_SYMBOL (proceedNMTstateChange); +EXPORT_SYMBOL (slaveSendBootUp); + +// objacces.h +EXPORT_SYMBOL (_storeODSubIndex); +EXPORT_SYMBOL (accessDictionaryError); +EXPORT_SYMBOL (getODentry); +EXPORT_SYMBOL (setODentry); +EXPORT_SYMBOL (writeLocalDict); +EXPORT_SYMBOL (scanIndexOD); +EXPORT_SYMBOL (RegisterSetODentryCallBack); + +// pdo.h +EXPORT_SYMBOL (buildPDO); +EXPORT_SYMBOL (sendPDOrequest); +EXPORT_SYMBOL (proceedPDO); +EXPORT_SYMBOL (sendPDOevent); +EXPORT_SYMBOL (_sendPDOevent); +EXPORT_SYMBOL (PDOInit); +EXPORT_SYMBOL (PDOStop); +EXPORT_SYMBOL (PDOEventTimerAlarm); +EXPORT_SYMBOL (PDOInhibitTimerAlarm); +EXPORT_SYMBOL (CopyBits); + +// sdo.h +EXPORT_SYMBOL (SDOTimeoutAlarm); +EXPORT_SYMBOL (resetSDO); +EXPORT_SYMBOL (SDOlineToObjdict); +EXPORT_SYMBOL (objdictToSDOline); +EXPORT_SYMBOL (lineToSDO); +EXPORT_SYMBOL (SDOtoLine); +EXPORT_SYMBOL (failedSDO); +EXPORT_SYMBOL (resetSDOline); +EXPORT_SYMBOL (initSDOline); +EXPORT_SYMBOL (getSDOfreeLine); +EXPORT_SYMBOL (getSDOlineOnUse); +EXPORT_SYMBOL (closeSDOtransfer); +EXPORT_SYMBOL (getSDOlineRestBytes); +EXPORT_SYMBOL (setSDOlineRestBytes); +EXPORT_SYMBOL (sendSDO); +EXPORT_SYMBOL (sendSDOabort); +EXPORT_SYMBOL (proceedSDO); +EXPORT_SYMBOL (writeNetworkDict); +EXPORT_SYMBOL (writeNetworkDictCallBack); +EXPORT_SYMBOL (readNetworkDict); +EXPORT_SYMBOL (readNetworkDictCallback); +EXPORT_SYMBOL (getReadResultNetworkDict); +EXPORT_SYMBOL (getWriteResultNetworkDict); + +// states.h +EXPORT_SYMBOL (_initialisation); +EXPORT_SYMBOL (_preOperational); +EXPORT_SYMBOL (_operational); +EXPORT_SYMBOL (_stopped); +EXPORT_SYMBOL (canDispatch); +EXPORT_SYMBOL (getState); +EXPORT_SYMBOL (setState); +EXPORT_SYMBOL (getNodeId); +EXPORT_SYMBOL (setNodeId); + +// sync.h +EXPORT_SYMBOL (startSYNC); +EXPORT_SYMBOL (stopSYNC); +EXPORT_SYMBOL (_post_sync); +EXPORT_SYMBOL (_post_TPDO); +EXPORT_SYMBOL (sendSYNC); +EXPORT_SYMBOL (sendSYNCMessage); +EXPORT_SYMBOL (proceedSYNC); + +// timer.h +EXPORT_SYMBOL (SetAlarm); +EXPORT_SYMBOL (DelAlarm); +EXPORT_SYMBOL (TimeDispatch); +EXPORT_SYMBOL (setTimer); +EXPORT_SYMBOL (getElapsedTime); + +// timers_driver.h +EXPORT_SYMBOL (EnterMutex); +EXPORT_SYMBOL (LeaveMutex); +EXPORT_SYMBOL (WaitReceiveTaskEnd); +EXPORT_SYMBOL (StartTimerLoop); +EXPORT_SYMBOL (StopTimerLoop); +EXPORT_SYMBOL (CreateReceiveTask);