]> 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 11e7e69d5e65a34d82988453c279afdc59550272..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{
@@ -54,7 +54,7 @@ UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m)
                /* There is no mark for extended messages in CanFestival */;
        }
                
-       m->cob_id.w = canmsg.id;
+       m->cob_id = canmsg.id;
        m->len = canmsg.length;
        if(canmsg.flags&MSG_RTR){
                m->rtr = 1;
@@ -66,8 +66,8 @@ UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m)
        
        /*gettimeofday(&current_time,NULL);
        time_period=(current_time.tv_sec - init_time.tv_sec)* 1000000 + current_time.tv_usec - init_time.tv_usec;
-       printf("%3ld.%3ld.%3ld - Receive ID: %lx ->",time_period/1000000,(time_period%1000000)/1000,time_period%1000,m->cob_id.w);
-       printf("Receive ID: %lx ->",m->cob_id.w);
+       printf("%3ld.%3ld.%3ld - Receive ID: %lx ->",time_period/1000000,(time_period%1000000)/1000,time_period%1000,m->cob_id);
+       printf("Receive ID: %lx ->",m->cob_id);
        for(i=0; i<canmsg.length;i++)printf("%x, ", m->data[i]);
        printf("\n");*/
  
@@ -81,7 +81,7 @@ UNS8 canSend_driver(CAN_HANDLE fd0, Message *m)
   canmsg_t canmsg;
 
   canmsg.flags = 0;
-  canmsg.id = m->cob_id.w;
+  canmsg.id = m->cob_id;
   canmsg.length = m->len;
   if(m->rtr){
     canmsg.flags |= MSG_RTR;
@@ -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);
+}
+
+