public inbox for ecos-patches@sourceware.org
 help / color / mirror / Atom feed
* 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
* 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

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  7:04 test of CAN callback stuff Alexey Shusharin
2007-08-24 13:51 ` Andrew Lunn
2007-08-24 14:28 cetoni GmbH - Uwe Kindler

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).