public inbox for ecos-patches@sourceware.org
 help / color / mirror / Atom feed
* Re: test of CAN callback stuff
@ 2007-08-24 14:28 cetoni GmbH - Uwe Kindler
  0 siblings, 0 replies; 3+ messages in thread
From: cetoni GmbH - Uwe Kindler @ 2007-08-24 14:28 UTC (permalink / raw)
  To: ecos-patches, Andrew Lunn

Hello Andrew,

this two errors are not really CAN specific. The loopback driver overrun 
test simply reads the size of the RX queue and then sends exact the 
number of events that fit into the RX queue. After sending the messages, 
it simply checks if the message queue is completely filled before it 
sends one additional message that produces an overrun event.

I think the proiblem is that the check if the queue is completely filled 
immediatelly follows the sending procedure. On the synth target this 
check maybe comes faster then the RX queue could receive all events. A 
small cyg_thread_delay() before the check may solve this. I cannot check 
this because I do not use synth target and on my real hardware this test 
does not fail.

Regards,

Dipl. Inf. (FH)
Uwe Kindler
Software Engineering

--

cetoni GmbH
Am Wiesenring 6
D-07554 Korbussen

Tel.: +49 (0) 36602 338 28
Fax:  +49 (0) 36602 338 11
uwe.kindler@cetoni.de
www.cetoni.de

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: test of CAN callback stuff
  2007-08-24  7:04 Alexey Shusharin
@ 2007-08-24 13:51 ` Andrew Lunn
  0 siblings, 0 replies; 3+ messages in thread
From: Andrew Lunn @ 2007-08-24 13:51 UTC (permalink / raw)
  To: Alexey Shusharin; +Cc: eCos Patches

[-- Attachment #1: Type: text/plain, Size: 1074 bytes --]

On Fri, Aug 24, 2007 at 02:01:05PM +0700, Alexey Shusharin wrote:
> Hi
> 
> First patch is a test of callback stuff for CAN loop driver.

Thanks for the test case. It has been committed.

I also added an ecosconfig import file which can be used with the
synth target. It includes the io can support and the loopback
device. It also sets the options which i think need setting. With this
setup i can run all the tests. However two of the tests fail.

can_overrun1 fails with:

FAIL:<Number of events in /dev/can0 RX queue differs from queue size> Line: 171, File: /home/lunn/eCos/anoncvs-clean/packages/devs/can/loop/current/tests/can_overrun1.c

and can_txevent fails with:

RX bufsize: 32    events in RX buffer: 0
FAIL:<Receive queue of /dev/can0 not completely filled.> Line: 181, File: /home/lunn/eCos/anoncvs-clean/packages/devs/can/loop/current/tests/can_txevent.c
EXIT:<done>

Could somebody with a better understanding of the CAN code take a look
at this. Is my configuration wrong? Is the test wrong? Is the loop back
driver broken?

       Thanks
          Andrew

[-- Attachment #2: canloop.diff --]
[-- Type: text/x-diff, Size: 12667 bytes --]

Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/can/loop/current/ChangeLog,v
retrieving revision 1.4
diff -u -w -r1.4 ChangeLog
--- ChangeLog	10 Aug 2007 14:08:12 -0000	1.4
+++ ChangeLog	24 Aug 2007 13:44:20 -0000
@@ -1,3 +1,12 @@
+2007-08-24  Andrew Lunn <andrew.lunn>
+
+	* doc/synth_test.ecm: Import file for running the tests on synth.
+	
+2007-08-24  Alexey Shusharin <mrfinch@mail.ru>
+	
+	* tests/can_callback.c: Added test of CAN callback on event
+	* cdl/can_loop.cdl: Added can_callback.c into tests list
+	
 2007-08-09  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* src/loop_can.c: Change all CYGPKG_IO_CAN_* to CYGPKG_DEVS_CAN_*
Index: cdl/can_loop.cdl
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/can/loop/current/cdl/can_loop.cdl,v
retrieving revision 1.3
diff -u -w -r1.3 can_loop.cdl
--- cdl/can_loop.cdl	3 Jul 2007 14:42:18 -0000	1.3
+++ cdl/can_loop.cdl	24 Aug 2007 13:44:20 -0000
@@ -131,7 +131,7 @@
         cdl_option CYGPKG_DEVS_CAN_LOOP_TESTS {
             display "CAN loop device driver tests"
             flavor  data
-            calculated { "tests/can_rdwr tests/can_timeout tests/can_txevent tests/can_overrun1 tests/can_overrun2 tests/can_nonblock"}         
+            calculated { "tests/can_rdwr tests/can_timeout tests/can_txevent tests/can_overrun1 tests/can_overrun2 tests/can_nonblock tests/can_callback" }         
             description   "
                 This option specifies the set of tests for the CAN loop device drivers."
         }
Index: doc/README
===================================================================
RCS file: doc/README
diff -N doc/README
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ doc/README	24 Aug 2007 13:44:20 -0000
@@ -0,0 +1,2 @@
+The file synth_test.ecm can be used to configure a synthetic target
+work tree to enable the various options to allow the tests to be run.
\ No newline at end of file
Index: doc/synth_test.ecm
===================================================================
RCS file: doc/synth_test.ecm
diff -N doc/synth_test.ecm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ doc/synth_test.ecm	24 Aug 2007 13:44:20 -0000
@@ -0,0 +1,66 @@
+cdl_savefile_version 1;
+cdl_savefile_command cdl_savefile_version {};
+cdl_savefile_command cdl_savefile_command {};
+cdl_savefile_command cdl_configuration { description hardware template package };
+cdl_savefile_command cdl_package { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_component { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_option { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_interface { value_source user_value wizard_value inferred_value };
+
+cdl_configuration eCos {
+    description "" ;
+    hardware    linux ;
+    template    default ;
+    package -hardware CYGPKG_HAL_SYNTH current ;
+    package -hardware CYGPKG_HAL_SYNTH_I386 current ;
+    package -hardware CYGPKG_DEVS_FLASH_SYNTH current ;
+    package -hardware CYGPKG_DEVS_ETH_ECOSYNTH current ;
+    package -hardware CYGPKG_DEVS_WATCHDOG_SYNTH current ;
+    package -hardware CYGPKG_DEVS_WALLCLOCK_SYNTH current ;
+    package -template CYGPKG_HAL current ;
+    package -template CYGPKG_IO current ;
+    package -template CYGPKG_IO_SERIAL current ;
+    package -template CYGPKG_INFRA current ;
+    package -template CYGPKG_KERNEL current ;
+    package -template CYGPKG_MEMALLOC current ;
+    package -template CYGPKG_ISOINFRA current ;
+    package -template CYGPKG_LIBC current ;
+    package -template CYGPKG_LIBC_I18N current ;
+    package -template CYGPKG_LIBC_SETJMP current ;
+    package -template CYGPKG_LIBC_SIGNALS current ;
+    package -template CYGPKG_LIBC_STARTUP current ;
+    package -template CYGPKG_LIBC_STDIO current ;
+    package -template CYGPKG_LIBC_STDLIB current ;
+    package -template CYGPKG_LIBC_STRING current ;
+    package -template CYGPKG_LIBC_TIME current ;
+    package -template CYGPKG_LIBM current ;
+    package -template CYGPKG_IO_WALLCLOCK current ;
+    package -template CYGPKG_ERROR current ;
+    package CYGPKG_IO_CAN current ;
+    package CYGPKG_DEVS_CAN_LOOP current ;
+};
+
+cdl_component CYGPKG_DEVS_CAN_LOOP_CAN0 {
+    user_value 1
+};
+
+cdl_component CYGPKG_DEVS_CAN_LOOP_CAN1 {
+    user_value 1
+};
+
+cdl_option CYGOPT_IO_CAN_TX_EVENT_SUPPORT {
+    user_value 1
+};
+
+cdl_option CYGOPT_IO_CAN_SUPPORT_NONBLOCKING {
+    user_value 1
+};
+
+cdl_option CYGOPT_IO_CAN_SUPPORT_CALLBACK {
+    user_value 1
+};
+
+cdl_component CYGOPT_IO_CAN_SUPPORT_TIMEOUTS {
+    user_value 1
+};
+
Index: tests/can_callback.c
===================================================================
RCS file: tests/can_callback.c
diff -N tests/can_callback.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ tests/can_callback.c	24 Aug 2007 13:44:20 -0000
@@ -0,0 +1,241 @@
+//==========================================================================
+//
+//        can_callback.c
+//
+//        CAN driver test of callback on event
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos 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 General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     Uwe Kindler, Alexey Shusharin
+// Contributors:  Uwe Kindler, Alexey Shusharin
+// Date:          2007-08-23
+// Description:   CAN driver test of callback on event
+//####DESCRIPTIONEND####
+
+
+//===========================================================================
+//                                INCLUDES
+//===========================================================================
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // test macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+#include <cyg/infra/diag.h>
+
+// Package requirements
+#if defined(CYGPKG_IO_CAN) && defined(CYGPKG_KERNEL)
+
+#include <pkgconf/kernel.h>
+#include <cyg/io/io.h>
+#include <cyg/io/canio.h>
+
+// Package option requirements
+#if defined(CYGFUN_KERNEL_API_C)
+
+#include <cyg/hal/hal_arch.h>           // CYGNUM_HAL_STACK_SIZE_TYPICAL
+#include <cyg/kernel/kapi.h>
+
+// Package option requirements
+#if defined(CYGOPT_IO_CAN_SUPPORT_CALLBACK)
+
+//===========================================================================
+//                               DATA TYPES
+//===========================================================================
+typedef struct st_thread_data
+{
+    cyg_thread   obj;
+    long         stack[CYGNUM_HAL_STACK_SIZE_TYPICAL];
+    cyg_handle_t hdl;
+} thread_data_t;
+
+
+//===========================================================================
+//                              LOCAL DATA
+//===========================================================================
+cyg_thread_entry_t can_thread;
+thread_data_t      can_thread_data;
+
+cyg_mutex_t can_lock;
+cyg_cond_t can_wait;
+
+cyg_io_handle_t    hCAN0;
+cyg_io_handle_t    hCAN1;
+
+//===========================================================================
+//                          LOCAL FUNCTIONS
+//===========================================================================
+#include "can_test_aux.inl" // include CAN test auxiliary functions
+
+
+//===========================================================================
+//                           CALLBACK FUNCTION
+//===========================================================================
+
+static void callback_func(cyg_uint16 flags, CYG_ADDRWORD data)
+{
+    if (data == ((CYG_ADDRWORD) hCAN0) && (flags & CYGNUM_CAN_EVENT_RX))
+    {
+        // Wake up thread
+        cyg_cond_signal(&can_wait);
+    }
+}
+
+//===========================================================================
+//                             READER THREAD 
+//===========================================================================
+void can_thread(cyg_addrword_t data)
+{
+    cyg_uint32              len;
+    cyg_can_callback_cfg    callback_cfg;
+    cyg_can_message         tx_msg;
+    cyg_bool_t              wait_res;
+    
+    //
+    // open CAN0 device driver
+    //
+    if (ENOERR != cyg_io_lookup("/dev/can0", &hCAN0)) 
+    {
+        CYG_TEST_FAIL_FINISH("Error opening /dev/can0");
+    }
+    
+    //
+    // open CAN1 device driver
+    //
+    if (ENOERR != cyg_io_lookup("/dev/can1", &hCAN1)) 
+    {
+        CYG_TEST_FAIL_FINISH("Error opening /dev/can1");
+    }
+    
+    //
+    // configure CAN0 callback
+    //
+    len = sizeof(callback_cfg);
+    callback_cfg.flag_mask = 0xFFFF;
+    callback_cfg.data = (CYG_ADDRWORD) hCAN0;
+    callback_cfg.callback_func = callback_func;
+    
+    if (ENOERR != cyg_io_set_config(hCAN0, CYG_IO_SET_CONFIG_CAN_CALLBACK,
+            &callback_cfg, &len))
+    {
+        CYG_TEST_FAIL_FINISH("Error writing config of /dev/can0");
+    }
+    
+    //
+    // transmit message from CAN1 to CAN0
+    //
+    tx_msg.id  = 0x001;
+    tx_msg.ext = CYGNUM_CAN_ID_STD;
+    tx_msg.rtr = CYGNUM_CAN_FRAME_DATA;
+    tx_msg.dlc = 0;
+    len = sizeof(tx_msg); 
+    
+    if (ENOERR != cyg_io_write(hCAN1, &tx_msg, &len))
+    {
+        CYG_TEST_FAIL_FINISH("Error writing message to /dev/can1");
+    }
+    
+    //
+    // Wait CAN0 callback
+    //
+    cyg_mutex_lock(&can_lock);
+    
+    wait_res = cyg_cond_timed_wait(&can_wait, 100);
+    
+    cyg_mutex_unlock(&can_lock);
+    
+    //
+    // If result of wait is a signal operation, test is successed
+    // If timeout - test is failed, because callback_func() hasn't been
+    // called with correct parameters
+    //
+    if(wait_res)
+    {
+        CYG_TEST_PASS_FINISH("can_callback test OK");
+    }
+    else
+    {
+        CYG_TEST_FAIL_FINISH("can_callback test FAILED");
+    }
+}
+
+
+void
+cyg_start(void)
+{
+    CYG_TEST_INIT();
+    
+    cyg_mutex_init(&can_lock);
+    cyg_cond_init(&can_wait, &can_lock);
+    
+    //
+    // create the main thread
+    //
+    cyg_thread_create(4, can_thread, 
+                        (cyg_addrword_t) 0,
+                        "can_thread", 
+                        (void *) can_thread_data.stack, 
+                        1024 * sizeof(long),
+                        &can_thread_data.hdl, 
+                        &can_thread_data.obj);
+                        
+    cyg_thread_resume(can_thread_data.hdl);
+    
+    cyg_scheduler_start();
+}
+
+#else // #if defined(CYGOPT_IO_CAN_SUPPORT_CALLBACK)
+#define N_A_MSG "Needs callback support"
+#endif
+
+#else // CYGFUN_KERNEL_API_C
+#define N_A_MSG "Needs kernel C API"
+#endif
+
+#else // CYGPKG_IO_CAN && CYGPKG_KERNEL
+#define N_A_MSG "Needs IO/CAN and Kernel"
+#endif
+
+#ifdef N_A_MSG
+void
+cyg_start( void )
+{
+    CYG_TEST_INIT();
+    CYG_TEST_NA( N_A_MSG);
+}
+#endif // N_A_MSG
+
+// EOF can_callback.c

^ permalink raw reply	[flat|nested] 3+ messages in thread

* test of CAN callback stuff
@ 2007-08-24  7:04 Alexey Shusharin
  2007-08-24 13:51 ` Andrew Lunn
  0 siblings, 1 reply; 3+ messages in thread
From: Alexey Shusharin @ 2007-08-24  7:04 UTC (permalink / raw)
  To: ecos-patches

[-- Attachment #1: Type: text/plain, Size: 272 bytes --]

Hi

First patch is a test of callback stuff for CAN loop driver.

And the second is a correction of data type of user parameter in
callback function. The reason is that CYG_ADDRWORD defined in cyg_type.h
instead kapi.h (as cyg_addrword_t).

Best regards
Alexey Shusharin


[-- Attachment #2: canloop_callback_test.patch --]
[-- Type: text/x-patch, Size: 9534 bytes --]

diff -bur -P /opt/ecos-repo/cvs/ecos/packages/devs/can/loop/current/cdl/can_loop.cdl ./devs/can/loop/current/cdl/can_loop.cdl
--- /opt/ecos-repo/cvs/ecos/packages/devs/can/loop/current/cdl/can_loop.cdl	2007-07-03 21:42:18.000000000 +0700
+++ ./devs/can/loop/current/cdl/can_loop.cdl	2007-08-24 10:33:36.000000000 +0700
@@ -131,7 +131,7 @@
         cdl_option CYGPKG_DEVS_CAN_LOOP_TESTS {
             display "CAN loop device driver tests"
             flavor  data
-            calculated { "tests/can_rdwr tests/can_timeout tests/can_txevent tests/can_overrun1 tests/can_overrun2 tests/can_nonblock"}         
+            calculated { "tests/can_rdwr tests/can_timeout tests/can_txevent tests/can_overrun1 tests/can_overrun2 tests/can_nonblock tests/can_callback"}
             description   "
                 This option specifies the set of tests for the CAN loop device drivers."
         }
diff -bur -P /opt/ecos-repo/cvs/ecos/packages/devs/can/loop/current/ChangeLog ./devs/can/loop/current/ChangeLog
--- /opt/ecos-repo/cvs/ecos/packages/devs/can/loop/current/ChangeLog	2007-08-13 09:27:08.000000000 +0700
+++ ./devs/can/loop/current/ChangeLog	2007-08-24 13:44:06.000000000 +0700
@@ -1,3 +1,9 @@
+2007-08-24  Alexey Shusharin <mrfinch@mail.ru>
+	
+	* tests/can_callback.c: Added test of CAN callback on event stuff
+	
+	* cdl/can_loop.cdl: Added can_callback.c into tests list
+	
 2007-08-09  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* src/loop_can.c: Change all CYGPKG_IO_CAN_* to CYGPKG_DEVS_CAN_*
diff -bur -P /opt/ecos-repo/cvs/ecos/packages/devs/can/loop/current/tests/can_callback.c ./devs/can/loop/current/tests/can_callback.c
--- /opt/ecos-repo/cvs/ecos/packages/devs/can/loop/current/tests/can_callback.c	1970-01-01 06:00:00.000000000 +0600
+++ ./devs/can/loop/current/tests/can_callback.c	2007-08-24 13:26:19.000000000 +0700
@@ -0,0 +1,241 @@
+//==========================================================================
+//
+//        can_callback.c
+//
+//        CAN driver test of callback on event
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos 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 General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     Uwe Kindler, Alexey Shusharin
+// Contributors:  Uwe Kindler, Alexey Shusharin
+// Date:          2007-08-23
+// Description:   CAN driver test of callback on event
+//####DESCRIPTIONEND####
+
+
+//===========================================================================
+//                                INCLUDES
+//===========================================================================
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // test macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+#include <cyg/infra/diag.h>
+
+// Package requirements
+#if defined(CYGPKG_IO_CAN) && defined(CYGPKG_KERNEL)
+
+#include <pkgconf/kernel.h>
+#include <cyg/io/io.h>
+#include <cyg/io/canio.h>
+
+// Package option requirements
+#if defined(CYGFUN_KERNEL_API_C)
+
+#include <cyg/hal/hal_arch.h>           // CYGNUM_HAL_STACK_SIZE_TYPICAL
+#include <cyg/kernel/kapi.h>
+
+// Package option requirements
+#if defined(CYGOPT_IO_CAN_SUPPORT_CALLBACK)
+
+//===========================================================================
+//                               DATA TYPES
+//===========================================================================
+typedef struct st_thread_data
+{
+    cyg_thread   obj;
+    long         stack[CYGNUM_HAL_STACK_SIZE_TYPICAL];
+    cyg_handle_t hdl;
+} thread_data_t;
+
+
+//===========================================================================
+//                              LOCAL DATA
+//===========================================================================
+cyg_thread_entry_t can_thread;
+thread_data_t      can_thread_data;
+
+cyg_mutex_t can_lock;
+cyg_cond_t can_wait;
+
+cyg_io_handle_t    hCAN0;
+cyg_io_handle_t    hCAN1;
+
+//===========================================================================
+//                          LOCAL FUNCTIONS
+//===========================================================================
+#include "can_test_aux.inl" // include CAN test auxiliary functions
+
+
+//===========================================================================
+//                           CALLBACK FUNCTION
+//===========================================================================
+
+static void callback_func(cyg_uint16 flags, CYG_ADDRWORD data)
+{
+    if(data == ((CYG_ADDRWORD) hCAN0) && (flags & CYGNUM_CAN_EVENT_RX))
+    {
+        // Wake up thread
+        cyg_cond_signal(&can_wait);
+    }
+}
+
+//===========================================================================
+//                             READER THREAD 
+//===========================================================================
+void can_thread(cyg_addrword_t data)
+{
+    cyg_uint32              len;
+    cyg_can_callback_cfg    callback_cfg;
+    cyg_can_message         tx_msg;
+    cyg_bool_t              wait_res;
+    
+    //
+    // open CAN0 device driver
+    //
+    if (ENOERR != cyg_io_lookup("/dev/can0", &hCAN0)) 
+    {
+        CYG_TEST_FAIL_FINISH("Error opening /dev/can0");
+    }
+    
+    //
+    // open CAN1 device driver
+    //
+    if (ENOERR != cyg_io_lookup("/dev/can1", &hCAN1)) 
+    {
+        CYG_TEST_FAIL_FINISH("Error opening /dev/can1");
+    }
+    
+    //
+    // configure CAN0 callback
+    //
+    len = sizeof(callback_cfg);
+    callback_cfg.flag_mask = 0xFFFF;
+    callback_cfg.data = (CYG_ADDRWORD) hCAN0;
+    callback_cfg.callback_func = callback_func;
+    
+    if (ENOERR != cyg_io_set_config(hCAN0, CYG_IO_SET_CONFIG_CAN_CALLBACK,
+            &callback_cfg, &len))
+    {
+        CYG_TEST_FAIL_FINISH("Error writing config of /dev/can0");
+    }
+    
+    //
+    // transmit message from CAN1 to CAN0
+    //
+    tx_msg.id  = 0x001;
+    tx_msg.ext = CYGNUM_CAN_ID_STD;
+    tx_msg.rtr = CYGNUM_CAN_FRAME_DATA;
+    tx_msg.dlc = 0;
+    len = sizeof(tx_msg); 
+    
+    if (ENOERR != cyg_io_write(hCAN1, &tx_msg, &len))
+    {
+        CYG_TEST_FAIL_FINISH("Error writing message to /dev/can1");
+    }
+    
+    //
+    // Wait CAN0 callback
+    //
+    cyg_mutex_lock(&can_lock);
+    
+    wait_res = cyg_cond_timed_wait(&can_wait, 100);
+    
+    cyg_mutex_unlock(&can_lock);
+    
+    //
+    // If result of wait is a signal operation, test is successed
+    // If timeout - test is failed, because callback_func() hasn't been
+    // called with correct parameters
+    //
+    if(wait_res)
+    {
+        CYG_TEST_PASS_FINISH("can_callback test OK");
+    }
+    else
+    {
+        CYG_TEST_FAIL_FINISH("can_callback test FAILED");
+    }
+}
+
+
+void
+cyg_start(void)
+{
+    CYG_TEST_INIT();
+    
+    cyg_mutex_init(&can_lock);
+    cyg_cond_init(&can_wait, &can_lock);
+    
+    //
+    // create the main thread
+    //
+    cyg_thread_create(4, can_thread, 
+                        (cyg_addrword_t) 0,
+                        "can_thread", 
+                        (void *) can_thread_data.stack, 
+                        1024 * sizeof(long),
+                        &can_thread_data.hdl, 
+                        &can_thread_data.obj);
+                        
+    cyg_thread_resume(can_thread_data.hdl);
+    
+    cyg_scheduler_start();
+}
+
+#else // #if defined(CYGOPT_IO_CAN_SUPPORT_CALLBACK)
+#define N_A_MSG "Needs callback support"
+#endif
+
+#else // CYGFUN_KERNEL_API_C
+#define N_A_MSG "Needs kernel C API"
+#endif
+
+#else // CYGPKG_IO_CAN && CYGPKG_KERNEL
+#define N_A_MSG "Needs IO/CAN and Kernel"
+#endif
+
+#ifdef N_A_MSG
+void
+cyg_start( void )
+{
+    CYG_TEST_INIT();
+    CYG_TEST_NA( N_A_MSG);
+}
+#endif // N_A_MSG
+
+// EOF can_callback.c

[-- Attachment #3: iocan_callback_struct.patch --]
[-- Type: text/x-patch, Size: 979 bytes --]

diff -bur /opt/ecos-repo/cvs/ecos/packages/io/can/current/include/canio.h ./io/can/current/include/canio.h
--- /opt/ecos-repo/cvs/ecos/packages/io/can/current/include/canio.h	2007-08-23 13:38:38.000000000 +0700
+++ ./io/can/current/include/canio.h	2007-08-23 16:57:59.000000000 +0700
@@ -331,7 +331,7 @@
 // Callback configuration structure.
 //
 
-typedef void (*cyg_can_event_cb_t)(cyg_uint16, cyg_addrword_t);
+typedef void (*cyg_can_event_cb_t)(cyg_uint16, CYG_ADDRWORD);
 //
 // flag_mask should be set with a combination of CYGNUM_CAN_EVENT_* flags.
 // If one of these events happens, the callback function will be called,
@@ -341,7 +341,7 @@
 {
     cyg_can_event_cb_t callback_func;              // callback function
     cyg_uint16  flag_mask;                         // flags mask
-    cyg_addrword_t data;                           // data passed to callback
+    CYG_ADDRWORD data;                             // data passed to callback
 } cyg_can_callback_cfg;
 
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-08-24 14:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-08-24 14:28 test of CAN callback stuff cetoni GmbH - Uwe Kindler
  -- strict thread matches above, loose matches on Subject: below --
2007-08-24  7:04 Alexey Shusharin
2007-08-24 13:51 ` Andrew Lunn

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).