drivers/can_can4linux/can_can4linux.c
changeset 384 83793fc7ce48
parent 365 9b76e0881beb
child 471 bea45a091214
equal deleted inserted replaced
383:7d8afedb8769 384:83793fc7ce48
    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