30 #include <fcntl.h> |
30 #include <fcntl.h> |
31 |
31 |
32 #include "can4linux.h" |
32 #include "can4linux.h" |
33 #include "can_driver.h" |
33 #include "can_driver.h" |
34 |
34 |
35 struct timeval init_time,current_time; |
35 //struct timeval init_time,current_time; |
36 |
36 |
37 /*********functions which permit to communicate with the board****************/ |
37 /*********functions which permit to communicate with the board****************/ |
38 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m) |
38 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m) |
39 { |
39 { |
40 int res,i; |
40 int res,i; |
41 canmsg_t canmsg; |
41 canmsg_t canmsg; |
42 long int time_period; |
42 //long int time_period; |
43 |
43 |
44 canmsg.flags = 0; |
44 canmsg.flags = 0; |
45 do{ |
45 do{ |
46 res = read(fd0,&canmsg,1); |
46 res = read(fd0,&canmsg,1); |
47 if((res<0)&&(errno == -EAGAIN)) res = 0; |
47 if((res<0)&&(errno == -EAGAIN)) res = 0; |
102 return 1; |
102 return 1; |
103 |
103 |
104 return 0; |
104 return 0; |
105 } |
105 } |
106 |
106 |
107 /***************************************************************************/ |
|
108 int set_bitrate( CAN_HANDLE fd, int baud) |
|
109 { |
|
110 Config_par_t cfg; |
|
111 volatile Command_par_t cmd; |
|
112 |
|
113 cmd.cmd = CMD_STOP; |
|
114 ioctl(fd, COMMAND, &cmd); |
|
115 |
|
116 cfg.target = CONF_TIMING; |
|
117 cfg.val1 = baud; |
|
118 ioctl(fd, CONFIG, &cfg); |
|
119 |
|
120 cmd.cmd = CMD_START; |
|
121 ioctl(fd, COMMAND, &cmd); |
|
122 return 0; |
|
123 } |
|
124 |
107 |
125 /***************************************************************************/ |
108 /***************************************************************************/ |
126 int TranslateBaudeRate(char* optarg){ |
109 int TranslateBaudRate(char* optarg){ |
127 if(!strcmp( optarg, "1M")) return (int)1000; |
110 if(!strcmp( optarg, "1M")) return (int)1000; |
128 if(!strcmp( optarg, "500K")) return (int)500; |
111 if(!strcmp( optarg, "500K")) return (int)500; |
129 if(!strcmp( optarg, "250K")) return (int)250; |
112 if(!strcmp( optarg, "250K")) return (int)250; |
130 if(!strcmp( optarg, "125K")) return (int)125; |
113 if(!strcmp( optarg, "125K")) return (int)125; |
131 if(!strcmp( optarg, "100K")) return (int)100; |
114 if(!strcmp( optarg, "100K")) return (int)100; |
132 if(!strcmp( optarg, "50K")) return (int)50; |
115 if(!strcmp( optarg, "50K")) return (int)50; |
133 if(!strcmp( optarg, "20K")) return (int)20; |
116 if(!strcmp( optarg, "20K")) return (int)20; |
134 if(!strcmp( optarg, "10K")) return (int)10; |
117 if(!strcmp( optarg, "10K")) return (int)10; |
135 if(!strcmp( optarg, "5K")) return (int)5; |
118 if(!strcmp( optarg, "5K")) return (int)5; |
136 if(!strcmp( optarg, "none")) return 0; |
119 return 0; |
137 return 0x0000; |
120 } |
|
121 |
|
122 UNS8 _canChangeBaudRate( CAN_HANDLE fd, int baud) |
|
123 { |
|
124 Config_par_t cfg; |
|
125 volatile Command_par_t cmd; |
|
126 |
|
127 cmd.cmd = CMD_STOP; |
|
128 ioctl(fd, COMMAND, &cmd); |
|
129 |
|
130 cfg.target = CONF_TIMING; |
|
131 cfg.val1 = baud; |
|
132 ioctl(fd, CONFIG, &cfg); |
|
133 |
|
134 cmd.cmd = CMD_START; |
|
135 ioctl(fd, COMMAND, &cmd); |
|
136 |
|
137 return 0; |
|
138 } |
|
139 |
|
140 UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud) |
|
141 { |
|
142 int temp=TranslateBaudRate(baud); |
|
143 |
|
144 if(temp==0)return 1; |
|
145 _canChangeBaudRate(fd, temp); |
|
146 printf("Baudrate changed to=>%s\n", baud); |
|
147 return 0; |
138 } |
148 } |
139 |
149 |
140 /***************************************************************************/ |
150 /***************************************************************************/ |
141 static const char lnx_can_dev_prefix[] = "/dev/can"; |
151 static const char lnx_can_dev_prefix[] = "/dev/can"; |
142 |
152 |
144 { |
154 { |
145 int name_len = strlen(board->busname); |
155 int name_len = strlen(board->busname); |
146 int prefix_len = strlen(lnx_can_dev_prefix); |
156 int prefix_len = strlen(lnx_can_dev_prefix); |
147 char dev_name[prefix_len+name_len+1]; |
157 char dev_name[prefix_len+name_len+1]; |
148 int o_flags = 0; |
158 int o_flags = 0; |
149 int baud = TranslateBaudeRate(board->baudrate); |
159 //int baud = TranslateBaudeRate(board->baudrate); |
150 int fd0; |
160 int fd0; |
|
161 int res; |
151 |
162 |
152 |
163 |
153 /*o_flags = O_NONBLOCK;*/ |
164 /*o_flags = O_NONBLOCK;*/ |
154 |
165 |
155 memcpy(dev_name,lnx_can_dev_prefix,prefix_len); |
166 memcpy(dev_name,lnx_can_dev_prefix,prefix_len); |
160 if(fd0 <= 0){ |
171 if(fd0 <= 0){ |
161 fprintf(stderr,"!!! %s is unknown. See can4linux.c\n", dev_name); |
172 fprintf(stderr,"!!! %s is unknown. See can4linux.c\n", dev_name); |
162 goto error_ret; |
173 goto error_ret; |
163 } |
174 } |
164 |
175 |
165 set_bitrate((CAN_HANDLE)fd0, baud); |
176 res=TranslateBaudRate(board->baudrate); |
|
177 if(res == 0){ |
|
178 fprintf(stderr,"!!! %s baudrate not supported. See can4linux.c\n", board->baudrate); |
|
179 goto error_ret; |
|
180 } |
|
181 |
|
182 _canChangeBaudRate( (CAN_HANDLE)fd0, res); |
166 |
183 |
167 printf("CAN device dev/can%s opened. Baudrate=>%s\n",board->busname, board->baudrate); |
184 printf("CAN device dev/can%s opened. Baudrate=>%s\n",board->busname, board->baudrate); |
168 |
185 |
169 return (CAN_HANDLE)fd0; |
186 return (CAN_HANDLE)fd0; |
170 |
187 |