annotate packages/devs/can/loop/current/tests/can_overrun2.c @ 2059:f929becf4af2

CAN driver, from Uwe Kindler
author gthomas
date Thu, 25 Aug 2005 13:40:35 +0000
parents
children 1ca46bebd705
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2059
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
1 //==========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
2 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
3 // can_overrun2.c
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
4 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
5 // Test CAN device RX overrun events
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
6 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
7 //==========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
9 // -------------------------------------------
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
12 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
14 // the terms of the GNU General Public License as published by the Free
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
16 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
20 // for more details.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
21 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
22 // You should have received a copy of the GNU General Public License along
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
25 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
27 // or inline functions from this file, or you compile this file and link it
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
28 // with other works to produce a work based on this file, this file does not
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
30 // License. However the source code for this file must still be made available
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
32 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
34 // this file might be covered by the GNU General Public License.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
35 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
37 // at http://sources.redhat.com/ecos/ecos-license/
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
38 // -------------------------------------------
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
40 //==========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
42 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
43 // Author(s): Uwe Kindler
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
44 // Contributors: Uwe Kindler
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
45 // Date: 2005-08-07
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
46 // Description: Simple read/write test of CAN driver
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
47 //####DESCRIPTIONEND####
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
48
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
49
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
50 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
51 // INCLUDES
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
52 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
53 #include <pkgconf/system.h>
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
54
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
55 #include <cyg/infra/testcase.h> // test macros
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
56 #include <cyg/infra/cyg_ass.h> // assertion macros
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
57 #include <cyg/infra/diag.h>
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
58
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
59 // Package requirements
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
60 #if defined(CYGPKG_IO_CAN) && defined(CYGPKG_KERNEL)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
61
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
62 #include <pkgconf/kernel.h>
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
63 #include <cyg/io/io.h>
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
64 #include <cyg/io/canio.h>
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
65
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
66 // Package option requirements
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
67 #if defined(CYGFUN_KERNEL_API_C)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
68
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
69 #include <cyg/hal/hal_arch.h> // CYGNUM_HAL_STACK_SIZE_TYPICAL
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
70 #include <cyg/kernel/kapi.h>
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
71
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
72
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
73 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
74 // DATA TYPES
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
75 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
76 typedef struct st_thread_data
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
77 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
78 cyg_thread obj;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
79 long stack[CYGNUM_HAL_STACK_SIZE_TYPICAL];
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
80 cyg_handle_t hdl;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
81 } thread_data_t;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
82
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
83
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
84 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
85 // LOCAL DATA
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
86 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
87 cyg_thread_entry_t can0_thread;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
88 thread_data_t can0_thread_data;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
89
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
90 cyg_thread_entry_t can1_thread;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
91 thread_data_t can1_thread_data;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
92
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
93
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
94 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
95 // LOCAL FUNCTIONS
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
96 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
97 #include "can_test_aux.inl" // include CAN test auxiliary functions
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
98
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
99
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
100 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
101 // WRITER THREAD
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
102 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
103 void can0_thread(cyg_addrword_t data)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
104 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
105 cyg_io_handle_t hCAN0;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
106 cyg_uint8 i;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
107 cyg_uint32 len;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
108 cyg_uint32 rx_bufsize;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
109 cyg_can_buf_info_t tx_buf_info;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
110 cyg_can_event rx_event;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
111 cyg_can_message tx_msg =
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
112 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
113 0x000, // CAN identifier
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
114 {0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7}, // 8 data bytes
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
115 CYGNUM_CAN_ID_STD, // standard frame
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
116 CYGNUM_CAN_FRAME_DATA, // data frame
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
117 2, // data length code
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
118 };
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
119
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
120 if (ENOERR != cyg_io_lookup("/dev/can0", &hCAN0))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
121 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
122 CYG_TEST_FAIL_FINISH("Error opening /dev/can0");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
123 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
124
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
125 len = sizeof(tx_buf_info);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
126 if (ENOERR != cyg_io_get_config(hCAN0, CYG_IO_GET_CONFIG_CAN_BUFFER_INFO ,&tx_buf_info, &len))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
127 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
128 CYG_TEST_FAIL_FINISH("Error reading config of /dev/can0");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
129 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
130
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
131 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
132 // Before we can write the CAN messages, we need to know the buffer size of the
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
133 // receiver. The receiver will tell us this buffer size with one single CAN
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
134 // message
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
135 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
136 len = sizeof(rx_event);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
137
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
138 if (ENOERR != cyg_io_read(hCAN0, &rx_event, &len))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
139 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
140 CYG_TEST_FAIL_FINISH("Error reading from /dev/can0");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
141 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
142
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
143 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
144 // we expect a RX event here - we treat any other flag as an error
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
145 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
146 if (!(rx_event.flags & CYGNUM_CAN_EVENT_RX) || (rx_event.flags & !CYGNUM_CAN_EVENT_RX))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
147 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
148 CYG_TEST_FAIL_FINISH("Unexpected RX event for /dev/can0");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
149 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
150
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
151 rx_bufsize = *((cyg_uint32 *)rx_event.msg.data);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
152
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
153 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
154 // now we send exactly one CAN message more than there is space in the receive buffer
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
155 // this should cause an RX ovverun in receive buffer
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
156 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
157 diag_printf("/dev/can0: Sending %d CAN messages\n", rx_bufsize);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
158 for (i = 0; i <= rx_bufsize; ++i)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
159 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
160 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
161 // we store the message number as CAN id and in first data byte so
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
162 // a receiver can check this later
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
163 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
164 tx_msg.id = 0x000 + i;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
165 tx_msg.data[0] = i;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
166 len = sizeof(tx_msg);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
167
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
168 if (ENOERR != cyg_io_write(hCAN0, &tx_msg, &len))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
169 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
170 CYG_TEST_FAIL_FINISH("Error writing to /dev/can0");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
171 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
172 else
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
173 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
174 print_can_msg(&tx_msg, "");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
175 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
176 } // for (i = 0; i <= rx_bufsize; ++i)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
177
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
178 cyg_thread_suspend(cyg_thread_self());
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
179 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
180
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
181
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
182 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
183 // READER THREAD
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
184 //===========================================================================
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
185 void can1_thread(cyg_addrword_t data)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
186 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
187 cyg_io_handle_t hCAN1;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
188 cyg_uint8 i;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
189 cyg_uint32 len;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
190 cyg_can_buf_info_t rx_buf_info;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
191 cyg_can_event rx_event;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
192 cyg_can_message tx_msg;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
193
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
194 if (ENOERR != cyg_io_lookup("/dev/can1", &hCAN1))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
195 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
196 CYG_TEST_FAIL_FINISH("Error opening /dev/can1");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
197 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
198
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
199 len = sizeof(rx_buf_info);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
200 if (ENOERR != cyg_io_get_config(hCAN1, CYG_IO_GET_CONFIG_CAN_BUFFER_INFO ,&rx_buf_info, &len))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
201 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
202 CYG_TEST_FAIL_FINISH("Error reading config of /dev/can1");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
203 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
204
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
205 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
206 // first we send the size of our receive buffer to the writer
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
207 // we setup tx message now
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
208 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
209 tx_msg.id = 0x000;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
210 tx_msg.ext = CYGNUM_CAN_ID_STD;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
211 tx_msg.rtr = CYGNUM_CAN_FRAME_DATA;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
212 tx_msg.dlc = sizeof(rx_buf_info.rx_bufsize);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
213
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
214 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
215 // we store size of rx buffer in CAN message. We do not need to care about
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
216 // endianess here because this is a loopback driver test and we will receive
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
217 // our own messages
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
218 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
219 *((cyg_uint32 *)tx_msg.data) = rx_buf_info.rx_bufsize;
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
220 len = sizeof(tx_msg);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
221
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
222 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
223 // as soon as we send a CAN message, thread 0 will resume because it is waiting
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
224 // for a message
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
225 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
226 diag_printf("/dev/can1: Sending size of RX buffer %d\n", rx_buf_info.rx_bufsize);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
227 if (ENOERR != cyg_io_write(hCAN1, &tx_msg, &len))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
228 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
229 CYG_TEST_FAIL_FINISH("Error writing to /dev/can1");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
230 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
231 cyg_thread_delay(10); // let thread 0 run
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
232
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
233 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
234 // now we check if we received CAN messages - if receive buffer is not full
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
235 // the we have an error here because we expect a full receive buffer
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
236 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
237 len = sizeof(rx_buf_info);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
238 if (ENOERR != cyg_io_get_config(hCAN1, CYG_IO_GET_CONFIG_CAN_BUFFER_INFO ,&rx_buf_info, &len))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
239 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
240 CYG_TEST_FAIL_FINISH("Error reading config of /dev/can1");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
241 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
242
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
243 if (rx_buf_info.rx_bufsize != rx_buf_info.rx_count)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
244 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
245 CYG_TEST_FAIL_FINISH("RX buffer of /dev/can1 does not contain number of expected messages");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
246 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
247
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
248 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
249 // now we wait for messages from /dev/can0
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
250 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
251 diag_printf("/dev/can1: Receiving %d CAN messages\n", rx_buf_info.rx_count);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
252 for (i = 0; i < rx_buf_info.rx_count; ++i)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
253 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
254 len = sizeof(rx_event);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
255 if (ENOERR != cyg_io_read(hCAN1, &rx_event, &len))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
256 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
257 CYG_TEST_FAIL_FINISH("Error reading from /dev/can0");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
258 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
259 else
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
260 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
261 if (rx_event.flags & CYGNUM_CAN_EVENT_RX)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
262 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
263 print_can_msg(&rx_event.msg, "");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
264 if (rx_event.msg.data[0] != (i + 1))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
265 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
266 CYG_TEST_FAIL_FINISH("Received /dev/can1 RX event contains invalid data");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
267 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
268 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
269 else
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
270 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
271 CYG_TEST_FAIL_FINISH("Unexpected CAN event for /dev/can1");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
272 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
273
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
274 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
275 // now check if any other flag is set
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
276 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
277 if (rx_event.flags & CYGNUM_CAN_EVENT_OVERRUN_RX)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
278 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
279 diag_printf("RX queue overrun successfully indicated for /dev/can1\n");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
280
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
281 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
282 // if TX events are supported then we have already a TX event in receive queue because
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
283 // we sent a message and the RX queue overrun will occur one message earlier
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
284 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
285 #if defined(CYGOPT_IO_CAN_TX_EVENT_SUPPORT)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
286 if (i < (rx_buf_info.rx_bufsize - 2))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
287 #else
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
288 if (i < (rx_buf_info.rx_bufsize - 1))
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
289 #endif
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
290 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
291 CYG_TEST_FAIL_FINISH("RX queue overrun occured too early for /dev/can1");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
292 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
293 else
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
294 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
295 CYG_TEST_PASS_FINISH("can_overrun2 test OK");
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
296 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
297 } // if (rx_event.flags & CYGNUM_CAN_EVENT_OVERRUN_RX)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
298 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
299
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
300 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
301 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
302
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
303
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
304
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
305 void
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
306 cyg_start(void)
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
307 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
308 CYG_TEST_INIT();
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
309
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
310 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
311 // create the two threads which access the CAN device driver
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
312 //
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
313 cyg_thread_create(4, can0_thread,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
314 (cyg_addrword_t) 0,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
315 "can0_thread",
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
316 (void *) can0_thread_data.stack,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
317 1024 * sizeof(long),
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
318 &can0_thread_data.hdl,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
319 &can0_thread_data.obj);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
320
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
321 cyg_thread_create(5, can1_thread,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
322 (cyg_addrword_t) can0_thread_data.hdl,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
323 "can1_thread",
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
324 (void *) can1_thread_data.stack,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
325 1024 * sizeof(long),
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
326 &can1_thread_data.hdl,
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
327 &can1_thread_data.obj);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
328
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
329 cyg_thread_resume(can0_thread_data.hdl);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
330 cyg_thread_resume(can1_thread_data.hdl);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
331
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
332 cyg_scheduler_start();
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
333 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
334
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
335 #else // CYGFUN_KERNEL_API_C
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
336 #define N_A_MSG "Needs kernel C API"
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
337 #endif
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
338
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
339 #else // CYGPKG_IO_CAN && CYGPKG_KERNEL
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
340 #define N_A_MSG "Needs IO/CAN and Kernel"
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
341 #endif
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
342
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
343 #ifdef N_A_MSG
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
344 void
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
345 cyg_start( void )
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
346 {
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
347 CYG_TEST_INIT();
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
348 CYG_TEST_NA( N_A_MSG);
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
349 }
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
350 #endif // N_A_MSG
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
351
f929becf4af2 CAN driver, from Uwe Kindler
gthomas
parents:
diff changeset
352 // EOF serial4.c