From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22204 invoked by alias); 24 Aug 2007 07:04:37 -0000 Received: (qmail 21947 invoked by uid 22791); 24 Aug 2007 07:04:28 -0000 X-Spam-Status: No, hits=-1.3 required=5.0 tests=AWL,BAYES_00,DK_POLICY_SIGNSOME,SARE_FREE_WEBM_RuMail,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx30.mail.ru (HELO mx30.mail.ru) (194.67.23.238) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 24 Aug 2007 07:04:22 +0000 Received: from [87.103.226.250] (port=35595 helo=[10.0.0.3]) by mx30.mail.ru with asmtp id 1IOTDP-0008NQ-00 for ecos-patches@sourceware.org; Fri, 24 Aug 2007 11:04:19 +0400 Subject: test of CAN callback stuff From: Alexey Shusharin To: ecos-patches@sourceware.org Content-Type: multipart/mixed; boundary="=-0eFX6S+gV8v2fIB1kNX2" Date: Fri, 24 Aug 2007 07:04:00 -0000 Message-Id: <1187938865.27128.12.camel@killix> Mime-Version: 1.0 X-Mailer: Evolution 2.10.2 (2.10.2-2.fc7) 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/msg00052.txt.bz2 --=-0eFX6S+gV8v2fIB1kNX2 Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 272 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 --=-0eFX6S+gV8v2fIB1kNX2 Content-Disposition: attachment; filename=canloop_callback_test.patch Content-Type: text/x-patch; name=canloop_callback_test.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 9534 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 + + * 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 * 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 + +#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 --=-0eFX6S+gV8v2fIB1kNX2 Content-Disposition: attachment; filename=iocan_callback_struct.patch Content-Type: text/x-patch; name=iocan_callback_struct.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 979 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; --=-0eFX6S+gV8v2fIB1kNX2--