From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7411 invoked by alias); 24 Aug 2007 13:51:03 -0000 Received: (qmail 7044 invoked by uid 22791); 24 Aug 2007 13:50:58 -0000 X-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00,DK_POLICY_SIGNSOME,SPF_HELO_PASS,SPF_PASS,TW_TX X-Spam-Check-By: sourceware.org Received: from londo.lunn.ch (HELO londo.lunn.ch) (80.238.139.98) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 24 Aug 2007 13:50:50 +0000 Received: from lunn by londo.lunn.ch with local (Exim 3.36 #1 (Debian)) id 1IOZYk-0000Aq-00; Fri, 24 Aug 2007 15:50:46 +0200 Date: Fri, 24 Aug 2007 13:51:00 -0000 From: Andrew Lunn To: Alexey Shusharin Cc: eCos Patches Subject: Re: test of CAN callback stuff Message-ID: <20070824135046.GT31057@lunn.ch> References: <1187938865.27128.12.camel@killix> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Y7xTucakfITjPcLV" Content-Disposition: inline In-Reply-To: <1187938865.27128.12.camel@killix> User-Agent: Mutt/1.5.16 (2007-06-11) X-Virus-Checked: Checked by ClamAV on sourceware.org X-IsSubscribed: yes Mailing-List: contact ecos-patches-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: ecos-patches-owner@ecos.sourceware.org X-SW-Source: 2007-08/txt/msg00054.txt.bz2 --Y7xTucakfITjPcLV Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1074 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: 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: Line: 181, File: /home/lunn/eCos/anoncvs-clean/packages/devs/can/loop/current/tests/can_txevent.c EXIT: 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 --Y7xTucakfITjPcLV Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="canloop.diff" Content-length: 12667 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 + + * doc/synth_test.ecm: Import file for running the tests on synth. + +2007-08-24 Alexey Shusharin + + * 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 * 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 + +#include // test macros +#include // assertion macros +#include + +// Package requirements +#if defined(CYGPKG_IO_CAN) && defined(CYGPKG_KERNEL) + +#include +#include +#include + +// Package option requirements +#if defined(CYGFUN_KERNEL_API_C) + +#include // CYGNUM_HAL_STACK_SIZE_TYPICAL +#include + +// 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 --Y7xTucakfITjPcLV--