46 #endif |
46 #endif |
47 //#include "af_can.h" |
47 //#include "af_can.h" |
48 #define CAN_IFNAME "can%s" |
48 #define CAN_IFNAME "can%s" |
49 #endif |
49 #endif |
50 |
50 |
51 #define CAN_SOCKET socket |
|
52 #define CAN_CLOSE close |
|
53 #define CAN_RECV recv |
|
54 #define CAN_SEND send |
|
55 #define CAN_BIND bind |
|
56 #define CAN_IOCTL ioctl |
|
57 #define CAN_SETSOCKOPT setsockopt |
|
58 #define CAN_ERRNO(err) errno |
|
59 |
|
60 #include "can_driver.h" |
51 #include "can_driver.h" |
61 |
52 |
62 /*********functions which permit to communicate with the board****************/ |
53 /*********functions which permit to communicate with the board****************/ |
63 UNS8 |
54 UNS8 |
64 canReceive_driver (CAN_HANDLE fd0, Message * m) |
55 canReceive_driver (CAN_HANDLE fd0, Message * m) |
65 { |
56 { |
66 int res; |
57 int res; |
67 struct can_frame frame; |
58 struct can_frame frame; |
68 |
59 |
69 res = CAN_RECV (*(int *) fd0, &frame, sizeof (frame), 0); |
60 res = recv (*(int *) fd0, &frame, sizeof (frame), 0); |
70 if (res < 0) |
61 if (res < 0) |
71 { |
62 { |
72 fprintf (stderr, "Recv failed: %s\n", strerror (CAN_ERRNO (res))); |
63 fprintf (stderr, "Recv failed: %s\n", strerror (errno)); |
73 return 1; |
64 return 1; |
74 } |
65 } |
75 |
66 |
76 m->cob_id = frame.can_id & CAN_EFF_MASK; |
67 m->cob_id = frame.can_id & CAN_EFF_MASK; |
77 m->len = frame.can_dlc; |
68 m->len = frame.can_dlc; |
176 if(!fd0) |
167 if(!fd0) |
177 { |
168 { |
178 return NULL; |
169 return NULL; |
179 } |
170 } |
180 |
171 |
181 *(int *) fd0 = CAN_SOCKET (PF_CAN, SOCK_RAW, CAN_RAW); |
172 *(int *) fd0 = socket (PF_CAN, SOCK_RAW, CAN_RAW); |
182 if (*(int *) fd0 < 0) |
173 if (*(int *) fd0 < 0) |
183 { |
174 { |
184 fprintf (stderr, "Socket creation failed: %s\n", |
175 fprintf (stderr, "Socket creation failed: %s\n", |
185 strerror (CAN_ERRNO (*(int *) fd0))); |
176 strerror (errno)); |
186 goto error_ret; |
177 goto error_ret; |
187 } |
178 } |
188 |
179 |
189 if (*board->busname >= '0' && *board->busname <= '9') |
180 if (*board->busname >= '0' && *board->busname <= '9') |
190 snprintf (ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname); |
181 snprintf (ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname); |
191 else |
182 else |
192 strncpy (ifr.ifr_name, board->busname, IFNAMSIZ); |
183 strncpy (ifr.ifr_name, board->busname, IFNAMSIZ); |
193 err = CAN_IOCTL (*(int *) fd0, SIOCGIFINDEX, &ifr); |
184 err = ioctl (*(int *) fd0, SIOCGIFINDEX, &ifr); |
194 if (err) |
185 if (err) |
195 { |
186 { |
196 fprintf (stderr, "Getting IF index for %s failed: %s\n", |
187 fprintf (stderr, "Getting IF index for %s failed: %s\n", |
197 ifr.ifr_name, strerror (CAN_ERRNO (err))); |
188 ifr.ifr_name, strerror (errno)); |
198 goto error_close; |
189 goto error_close; |
199 } |
190 } |
200 |
191 |
201 { |
192 { |
202 int loopback = 1; |
193 int loopback = 1; |
203 err = CAN_SETSOCKOPT(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_LOOPBACK, |
194 err = setsockopt(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_LOOPBACK, |
204 &loopback, sizeof(loopback)); |
195 &loopback, sizeof(loopback)); |
205 if (err) { |
196 if (err) { |
206 fprintf(stderr, "setsockopt: %s\n", strerror (CAN_ERRNO (err))); |
197 fprintf(stderr, "setsockopt: %s\n", strerror (errno)); |
207 goto error_close; |
198 goto error_close; |
208 } |
199 } |
209 } |
200 } |
210 |
201 |
211 #ifndef RTCAN_SOCKET /*CAN_RAW_RECV_OWN_MSGS not supported in rtsocketcan*/ |
202 #ifndef RTCAN_SOCKET /*CAN_RAW_RECV_OWN_MSGS not supported in rtsocketcan*/ |
212 { |
203 { |
213 int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */ |
204 int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */ |
214 err = CAN_SETSOCKOPT(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, |
205 err = setsockopt(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, |
215 &recv_own_msgs, sizeof(recv_own_msgs)); |
206 &recv_own_msgs, sizeof(recv_own_msgs)); |
216 if (err) { |
207 if (err) { |
217 fprintf(stderr, "setsockopt: %s\n", strerror (CAN_ERRNO (err))); |
208 fprintf(stderr, "setsockopt: %s\n", strerror (errno)); |
218 goto error_close; |
209 goto error_close; |
219 } |
210 } |
220 } |
211 } |
221 #endif |
212 #endif |
222 |
213 |
223 addr.can_family = AF_CAN; |
214 addr.can_family = AF_CAN; |
224 addr.can_ifindex = ifr.ifr_ifindex; |
215 addr.can_ifindex = ifr.ifr_ifindex; |
225 err = CAN_BIND (*(int *) fd0, (struct sockaddr *) &addr, sizeof (addr)); |
216 err = bind (*(int *) fd0, (struct sockaddr *) &addr, sizeof (addr)); |
226 if (err) |
217 if (err) |
227 { |
218 { |
228 fprintf (stderr, "Binding failed: %s\n", strerror (CAN_ERRNO (err))); |
219 fprintf (stderr, "Binding failed: %s\n", strerror (errno)); |
229 goto error_close; |
220 goto error_close; |
230 } |
221 } |
231 |
222 |
232 #ifdef RTCAN_SOCKET |
223 #ifdef RTCAN_SOCKET |
233 tx_timeout = 10000000; /* XXX Timeout is temporarily set to 10 ms */ |
224 tx_timeout = 10000000; /* XXX Timeout is temporarily set to 10 ms */ |
234 err = CAN_IOCTL (*(int *) fd0, RTCAN_RTIOC_SND_TIMEOUT, &tx_timeout); |
225 err = ioctl (*(int *) fd0, RTCAN_RTIOC_SND_TIMEOUT, &tx_timeout); |
235 if (err) |
226 if (err) |
236 { |
227 { |
237 fprintf (stderr, |
228 fprintf (stderr, |
238 "Setting TX timeout %d failed: %s\n", |
229 "Setting TX timeout %d failed: %s\n", |
239 *baudrate, strerror (CAN_ERRNO (err))); |
230 *baudrate, strerror (errno)); |
240 goto error_close; |
231 goto error_close; |
241 } |
232 } |
242 |
233 |
243 baudrate = (can_baudrate_t *) & ifr.ifr_ifru; |
234 baudrate = (can_baudrate_t *) & ifr.ifr_ifru; |
244 *baudrate = TranslateBaudRate (board->baudrate); |
235 *baudrate = TranslateBaudRate (board->baudrate); |
245 if (!*baudrate) |
236 if (!*baudrate) |
246 goto error_close; |
237 goto error_close; |
247 |
238 |
248 err = CAN_IOCTL (*(int *) fd0, SIOCSCANBAUDRATE, &ifr); |
239 err = ioctl (*(int *) fd0, SIOCSCANBAUDRATE, &ifr); |
249 if (err) |
240 if (err) |
250 { |
241 { |
251 fprintf (stderr, |
242 fprintf (stderr, |
252 "Setting baudrate %d failed: %s\n", |
243 "Setting baudrate %d failed: %s\n", |
253 *baudrate, strerror (CAN_ERRNO (err))); |
244 *baudrate, strerror (errno)); |
254 goto error_close; |
245 goto error_close; |
255 } |
246 } |
256 |
247 |
257 mode = (can_mode_t *) & ifr.ifr_ifru; |
248 mode = (can_mode_t *) & ifr.ifr_ifru; |
258 *mode = CAN_MODE_START; |
249 *mode = CAN_MODE_START; |
259 err = CAN_IOCTL (*(int *) fd0, SIOCSCANMODE, &ifr); |
250 err = ioctl (*(int *) fd0, SIOCSCANMODE, &ifr); |
260 if (err) |
251 if (err) |
261 { |
252 { |
262 fprintf (stderr, "Starting CAN device failed: %s\n", |
253 fprintf (stderr, "Starting CAN device failed: %s\n", |
263 strerror (CAN_ERRNO (err))); |
254 strerror (errno)); |
264 goto error_close; |
255 goto error_close; |
265 } |
256 } |
266 #endif |
257 #endif |
267 |
258 |
268 return fd0; |
259 return fd0; |
269 |
260 |
270 error_close: |
261 error_close: |
271 CAN_CLOSE (*(int *) fd0); |
262 close (*(int *) fd0); |
272 |
263 |
273 error_ret: |
264 error_ret: |
274 free (fd0); |
265 free (fd0); |
275 return NULL; |
266 return NULL; |
276 } |
267 } |