]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - drivers/can_can4linux/can_can4linux.c
Applied James patch that fixes can_cn4linux.c file descriptor handling and make it...
[CanFestival-3.git] / drivers / can_can4linux / can_can4linux.c
index 3c2d7e2393d6301da7c26c679f559f17092805be..cc949b6def9d2cea40ed8bdca579bea95397c44e 100755 (executable)
@@ -32,14 +32,14 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #include "can4linux.h" 
 #include "can_driver.h"
 
-struct timeval init_time,current_time;
+//struct timeval init_time,current_time;
 
 /*********functions which permit to communicate with the board****************/
 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m)
 {
   int res,i;
   canmsg_t canmsg;
-  long int time_period;
+  //long int time_period;
 
        canmsg.flags = 0; 
        do{
@@ -104,37 +104,47 @@ UNS8 canSend_driver(CAN_HANDLE fd0, Message *m)
   return 0;
 }
 
+
 /***************************************************************************/
-int    set_bitrate( CAN_HANDLE fd, int baud)
+int TranslateBaudRate(char* optarg){
+       if(!strcmp( optarg, "1M")) return (int)1000;
+       if(!strcmp( optarg, "500K")) return (int)500;
+       if(!strcmp( optarg, "250K")) return (int)250;
+       if(!strcmp( optarg, "125K")) return (int)125;
+       if(!strcmp( optarg, "100K")) return (int)100;
+       if(!strcmp( optarg, "50K")) return (int)50;
+       if(!strcmp( optarg, "20K")) return (int)20;
+       if(!strcmp( optarg, "10K")) return (int)10;
+       if(!strcmp( optarg, "5K")) return (int)5;
+       return 0;
+}
+
+UNS8 _canChangeBaudRate( CAN_HANDLE fd, int baud)
 {
     Config_par_t  cfg; 
     volatile Command_par_t cmd;
-
+    
     cmd.cmd = CMD_STOP;
     ioctl(fd, COMMAND, &cmd);
 
-    cfg.target = CONF_TIMING; 
-    cfg.val1   = baud;
+       cfg.target = CONF_TIMING; 
+    cfg.val1  = baud;
     ioctl(fd, CONFIG, &cfg);
 
     cmd.cmd = CMD_START;
     ioctl(fd, COMMAND, &cmd);
+    
     return 0;
 }
 
-/***************************************************************************/
-int TranslateBaudeRate(char* optarg){
-       if(!strcmp( optarg, "1M")) return (int)1000;
-       if(!strcmp( optarg, "500K")) return (int)500;
-       if(!strcmp( optarg, "250K")) return (int)250;
-       if(!strcmp( optarg, "125K")) return (int)125;
-       if(!strcmp( optarg, "100K")) return (int)100;
-       if(!strcmp( optarg, "50K")) return (int)50;
-       if(!strcmp( optarg, "20K")) return (int)20;
-       if(!strcmp( optarg, "10K")) return (int)10;
-       if(!strcmp( optarg, "5K")) return (int)5;
-       if(!strcmp( optarg, "none")) return 0;
-       return 0x0000;
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+    int temp=TranslateBaudRate(baud);
+
+    if(temp==0)return 1;
+    _canChangeBaudRate(fd, temp);
+    printf("Baudrate changed to=>%s\n", baud);
+    return 0;
 }
 
 /***************************************************************************/
@@ -146,8 +156,9 @@ CAN_HANDLE canOpen_driver(s_BOARD *board)
   int prefix_len = strlen(lnx_can_dev_prefix);
   char dev_name[prefix_len+name_len+1];
   int o_flags = 0;
-  int baud = TranslateBaudeRate(board->baudrate);
+  //int baud = TranslateBaudeRate(board->baudrate);
   int fd0;
+  int res;
 
   
   /*o_flags = O_NONBLOCK;*/
@@ -157,12 +168,18 @@ CAN_HANDLE canOpen_driver(s_BOARD *board)
   dev_name[prefix_len+name_len] = 0;
 
   fd0 = open(dev_name, O_RDWR|o_flags);
-  if(fd0 <= 0){
+  if(fd0 == -1){
     fprintf(stderr,"!!! %s is unknown. See can4linux.c\n", dev_name);
     goto error_ret;
   }
   
-  set_bitrate((CAN_HANDLE)fd0, baud);
+  res=TranslateBaudRate(board->baudrate);
+  if(res == 0){
+    fprintf(stderr,"!!! %s baudrate not supported. See can4linux.c\n", board->baudrate);
+    goto error_ret;
+  }
+       
+  _canChangeBaudRate( (CAN_HANDLE)fd0, res);
 
   printf("CAN device dev/can%s opened. Baudrate=>%s\n",board->busname, board->baudrate);
 
@@ -175,8 +192,16 @@ CAN_HANDLE canOpen_driver(s_BOARD *board)
 /***************************************************************************/
 int canClose_driver(CAN_HANDLE fd0)
 {
-  if((int)fd0<=0)
-    return -1;
-  close(fd0);
-  return 0;
+  if((int)fd0 != -1) {
+      return close((int)fd0);
+  }
+
+  return -1;
 }
+
+int canfd_driver(CAN_HANDLE fd0)
+{
+        return ((int)fd0);
+}
+
+