1 //==========================================================================
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //==========================================================================
41 //#####DESCRIPTIONBEGIN####
43 // Author(s): Uwe Kindler
44 // Contributors: Uwe Kindler
46 // Description: FlexCAN test of standby and wake
47 //####DESCRIPTIONEND####
50 //===========================================================================
52 //===========================================================================
53 #include <pkgconf/system.h>
55 #include <cyg/infra/testcase.h> // test macros
56 #include <cyg/infra/cyg_ass.h> // assertion macros
57 #include <cyg/infra/diag.h>
59 // Package requirements
60 #if defined(CYGPKG_IO_CAN) && defined(CYGPKG_KERNEL)
62 #include <pkgconf/kernel.h>
63 #include <cyg/io/io.h>
64 #include <cyg/io/canio.h>
66 // Package option requirements
67 #if defined(CYGFUN_KERNEL_API_C)
69 #include <cyg/hal/hal_arch.h> // CYGNUM_HAL_STACK_SIZE_TYPICAL
70 #include <cyg/kernel/kapi.h>
73 //===========================================================================
75 //===========================================================================
76 typedef struct st_thread_data
79 long stack[CYGNUM_HAL_STACK_SIZE_TYPICAL];
84 //===========================================================================
86 //===========================================================================
87 cyg_thread_entry_t can0_thread;
88 thread_data_t can0_thread_data;
91 cyg_io_handle_t hDrvFlexCAN;
94 //===========================================================================
96 //===========================================================================
97 #include "can_test_aux.inl" // include CAN test auxiliary functions
100 //===========================================================================
102 //===========================================================================
103 void can0_thread(cyg_addrword_t data)
106 cyg_can_event rx_event1;
107 cyg_can_event rx_event2;
108 cyg_can_msgbuf_info msgbox_info;
113 diag_printf("Test of FlexCAN standby mode with selfwakeup\n"
114 "As soon as a message arrives the FlexCAN modul\n"
115 "will leave standby and generates a leave standby event.\n"
116 "Each time you send a message you should see LSTY first\n"
117 "for \"leaving standby\" and then \"RX\" for the\n"
118 "RX event that caused the leave standby event. You can send\n"
119 "a CAN data frame with any ID\n");
121 diag_printf("!!! This test can be stopped by sending a data frame with ID 0x100 !!!\n\n");
123 len = sizeof(msgbox_info);
124 if (ENOERR != cyg_io_get_config(hDrvFlexCAN, CYG_IO_GET_CONFIG_CAN_MSGBUF_INFO ,&msgbox_info, &len))
126 CYG_TEST_FAIL_FINISH("Error writing config of /dev/can0");
130 diag_printf("Message boxes available: %d free: %d\n",
131 msgbox_info.count, msgbox_info.free);
137 // now we set FlexCAN into standby mode
139 mode = CYGNUM_CAN_MODE_STANDBY;
141 if (ENOERR != cyg_io_set_config(hDrvFlexCAN, CYG_IO_SET_CONFIG_CAN_MODE ,&mode, &len))
143 CYG_TEST_FAIL_FINISH("Error writing config of /dev/can0");
147 // now check if FlexCAN modul is really in standby mode
150 if (ENOERR != cyg_io_get_config(hDrvFlexCAN, CYG_IO_GET_CONFIG_CAN_STATE ,&state, &len))
152 CYG_TEST_FAIL_FINISH("Error reading config of /dev/can0");
156 if (state != CYGNUM_CAN_STATE_STANDBY)
158 CYG_TEST_FAIL_FINISH("Error stopping FlexCAN /dev/can0");
162 // as soon as a message arrives the FlexCAN modul leaves standby mode
163 // and we should receive a CYGNUM_CAN_EVENT_LEAVING_STANDBY event but
164 // we will also receive a RX event because a message arrived
166 len = sizeof(rx_event1);
167 if (ENOERR != cyg_io_read(hDrvFlexCAN, &rx_event1, &len))
169 CYG_TEST_FAIL_FINISH("Error reading from /dev/can0");
172 len = sizeof(rx_event2);
173 if (ENOERR != cyg_io_read(hDrvFlexCAN, &rx_event2, &len))
175 CYG_TEST_FAIL_FINISH("Error reading from /dev/can0");
178 print_can_flags(rx_event1.flags, "");
179 print_can_flags(rx_event2.flags, "");
182 // The first event we receive should be a leaving standby event because
183 // first flexcan leaves standby and then a message will be received
185 if (!(rx_event1.flags & CYGNUM_CAN_EVENT_LEAVING_STANDBY))
187 CYG_TEST_FAIL_FINISH("CYGNUM_CAN_EVENT_LEAVING_STANDBY event expexted /dev/can0");
190 if (rx_event2.msg.id == 0x100)
192 CYG_TEST_PASS_FINISH("flexcan_wake test OK");
204 // open flexcan device driver
206 if (ENOERR != cyg_io_lookup("/dev/can0", &hDrvFlexCAN))
208 CYG_TEST_FAIL_FINISH("Error opening /dev/can0");
213 // create the two threads which access the CAN device driver
214 // a reader thread with a higher priority and a writer thread
215 // with a lower priority
217 cyg_thread_create(4, can0_thread,
220 (void *) can0_thread_data.stack,
222 &can0_thread_data.hdl,
223 &can0_thread_data.obj);
225 cyg_thread_resume(can0_thread_data.hdl);
227 cyg_scheduler_start();
230 #else // CYGFUN_KERNEL_API_C
231 #define N_A_MSG "Needs kernel C API"
234 #else // CYGPKG_IO_CAN && CYGPKG_KERNEL
235 #define N_A_MSG "Needs IO/CAN and Kernel"
243 CYG_TEST_NA( N_A_MSG);
247 // EOF flexcan_wake.c