35 #define CAN_RECV rt_dev_recv |
35 #define CAN_RECV rt_dev_recv |
36 #define CAN_SEND rt_dev_send |
36 #define CAN_SEND rt_dev_send |
37 #define CAN_BIND rt_dev_bind |
37 #define CAN_BIND rt_dev_bind |
38 #define CAN_IOCTL rt_dev_ioctl |
38 #define CAN_IOCTL rt_dev_ioctl |
39 #else |
39 #else |
40 #include "af_can.h" |
40 #include <sys/socket.h> |
|
41 #include <sys/ioctl.h> |
|
42 #include "linux/can.h" |
|
43 #include "linux/can/raw.h" |
|
44 #include "net/if.h" |
|
45 #define PF_CAN 29 |
|
46 #define AF_CAN PF_CAN |
|
47 //#include "af_can.h" |
41 #define CAN_IFNAME "can%s" |
48 #define CAN_IFNAME "can%s" |
42 #define CAN_SOCKET socket |
49 #define CAN_SOCKET socket |
43 #define CAN_CLOSE close |
50 #define CAN_CLOSE close |
44 #define CAN_RECV recv |
51 #define CAN_RECV recv |
45 #define CAN_SEND send |
52 #define CAN_SEND send |
53 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m) |
60 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m) |
54 { |
61 { |
55 int res; |
62 int res; |
56 struct can_frame frame; |
63 struct can_frame frame; |
57 |
64 |
58 res = CAN_RECV(fd0, &frame, sizeof(frame), 0); |
65 res = CAN_RECV(*(int*)fd0, &frame, sizeof(frame), 0); |
59 if (res < 0) |
66 if (res < 0) |
60 return 1; |
67 return 1; |
61 |
68 |
62 m->cob_id.w = frame.can_id & CAN_EFF_MASK; |
69 m->cob_id.w = frame.can_id & CAN_EFF_MASK; |
63 m->len = frame.can_dlc; |
70 m->len = frame.can_dlc; |
84 if (m->rtr) |
91 if (m->rtr) |
85 frame.can_id |= CAN_RTR_FLAG; |
92 frame.can_id |= CAN_RTR_FLAG; |
86 else |
93 else |
87 memcpy(frame.data, m->data, 8); |
94 memcpy(frame.data, m->data, 8); |
88 |
95 |
89 res = CAN_SEND(fd0, &frame, sizeof(frame), 0); |
96 res = CAN_SEND(*(int*)fd0, &frame, sizeof(frame), 0); |
90 if (res < 0) |
97 if (res < 0) |
91 return 1; |
98 return 1; |
92 |
99 |
93 return 0; |
100 return 0; |
94 } |
101 } |
95 |
102 |
96 /***************************************************************************/ |
103 /***************************************************************************/ |
97 CAN_HANDLE canOpen_driver(s_BOARD *board) |
104 CAN_HANDLE canOpen_driver(s_BOARD *board) |
98 { |
105 { |
99 CAN_HANDLE fd0; |
|
100 struct ifreq ifr; |
106 struct ifreq ifr; |
101 struct sockaddr_can addr; |
107 struct sockaddr_can addr; |
102 int err; |
108 int err; |
|
109 CAN_HANDLE fd0 = malloc(sizeof(int)); |
103 |
110 |
104 fd0 = CAN_SOCKET(PF_CAN, SOCK_RAW, 0); |
111 *(int*)fd0 = CAN_SOCKET(PF_CAN, SOCK_RAW, 0); |
105 if(fd0 < 0){ |
112 if(*(int*)fd0 < 0){ |
106 fprintf(stderr,"Socket creation failed.\n"); |
113 fprintf(stderr,"Socket creation failed.\n"); |
107 goto error_ret; |
114 goto error_ret; |
108 } |
115 } |
109 |
116 |
110 snprintf(ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname); |
117 snprintf(ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname); |
111 err = CAN_IOCTL(fd0, SIOCGIFINDEX, &ifr); |
118 err = CAN_IOCTL(*(int*)fd0, SIOCGIFINDEX, &ifr); |
112 if (err) { |
119 if (err) { |
113 fprintf(stderr, "Unknown device: %s\n", ifr.ifr_name); |
120 fprintf(stderr, "Unknown device: %s\n", ifr.ifr_name); |
114 goto error_close; |
121 goto error_close; |
115 } |
122 } |
116 |
123 |
117 addr.can_family = AF_CAN; |
124 addr.can_family = AF_CAN; |
118 addr.can_ifindex = ifr.ifr_ifindex; |
125 addr.can_ifindex = ifr.ifr_ifindex; |
119 err = CAN_BIND(fd0, (struct sockaddr *)&addr, |
126 err = CAN_BIND(*(int*)fd0, (struct sockaddr *)&addr, |
120 sizeof(addr)); |
127 sizeof(addr)); |
121 if (err) { |
128 if (err) { |
122 fprintf(stderr, "Binding failed.\n"); |
129 fprintf(stderr, "Binding failed.\n"); |
123 goto error_close; |
130 goto error_close; |
124 } |
131 } |