drivers/can_lincan/can_lincan.c
changeset 477 ec7654f71964
parent 384 83793fc7ce48
child 631 08b6b903f84a
equal deleted inserted replaced
476:08cdcb021beb 477:ec7654f71964
    35 {
    35 {
    36   int res;
    36   int res;
    37   struct canmsg_t canmsg;
    37   struct canmsg_t canmsg;
    38 
    38 
    39   canmsg.flags = 0; /* Ensure standard receive, not required for LinCAN>=0.3.1 */
    39   canmsg.flags = 0; /* Ensure standard receive, not required for LinCAN>=0.3.1 */
    40 
       
    41   do{
    40   do{
    42     res = read(fd0,&canmsg,sizeof(canmsg_t));
    41     res = read(fd0,&canmsg,sizeof(canmsg_t));
    43     if((res<0)&&(errno == -EAGAIN)) res = 0;
    42     if((res<0)&&(errno == -EAGAIN)) res = 0;
    44   }while(res==0);
    43   }while(res==0);
    45 
    44 
    88 
    87 
    89   return 0;
    88   return 0;
    90 }
    89 }
    91 
    90 
    92 /***************************************************************************/
    91 /***************************************************************************/
    93 UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
    92 int TranslateBaudeRate(char* optarg){
       
    93 	if(!strcmp( optarg, "1M")) return 1000000;
       
    94 	if(!strcmp( optarg, "500K")) return 500000;
       
    95 	if(!strcmp( optarg, "250K")) return 250000;
       
    96 	if(!strcmp( optarg, "125K")) return 125000;
       
    97 	if(!strcmp( optarg, "100K")) return 100000;
       
    98 	if(!strcmp( optarg, "50K")) return 50000;
       
    99 	if(!strcmp( optarg, "20K")) return 20000;
       
   100 	if(!strcmp( optarg, "none")) return 0;
       
   101 	return 0x0000;
       
   102 }
       
   103 
       
   104 /***************************************************************************/
       
   105 UNS8 canChangeBaudRate_driver( CAN_HANDLE fd0, char* baud)
    94 {
   106 {
    95 	printf("canChangeBaudRate not yet supported by this driver\n");
   107 	struct can_baudparams_t params;
    96 	return 0;
   108 
       
   109 	params.baudrate = TranslateBaudeRate(baud);
       
   110 	if(params.baudrate == 0)
       
   111 		return 0;
       
   112 	params.flags = -1;	// use driver defaults
       
   113 	params.sjw = -1;	// use driver defaults
       
   114 	params.sample_pt = -1;	// use driver defaults
       
   115 	if(ioctl((int)fd0, CONF_BAUDPARAMS, &params) < 0)
       
   116 	{
       
   117 		fprintf(stderr, "canOpen_driver (lincan): IOCTL set speed failed\n");
       
   118 		return 0;
       
   119 	}
       
   120 	return 1;
    97 }
   121 }
    98 
   122 
    99 /***************************************************************************/
   123 /***************************************************************************/
   100 static const char lnx_can_dev_prefix[] = "/dev/can";
   124 static const char lnx_can_dev_prefix[] = "/dev/can";
   101 
   125 
   102 CAN_HANDLE canOpen_driver(s_BOARD *board)
   126 CAN_HANDLE canOpen_driver(s_BOARD *board)
   103 {
   127 {
   104   int name_len = strlen(board->busname);
   128 	int name_len = strlen(board->busname);
   105   int prefix_len = strlen(lnx_can_dev_prefix);
   129 	int prefix_len = strlen(lnx_can_dev_prefix);
   106   char dev_name[prefix_len+name_len+1];
   130 	char dev_name[prefix_len+name_len+1];
   107   int o_flags = 0;
   131 	struct can_baudparams_t params;
   108   CAN_HANDLE fd0;
   132 	int o_flags = 0;
       
   133 	int fd;
   109 
   134 
   110   fd0=malloc(sizeof(*fd0));
   135 	/*o_flags = O_NONBLOCK;*/
   111   if(fd0==NULL)
       
   112     return NULL;
       
   113 
   136 
   114   /*o_flags = O_NONBLOCK;*/
   137 	memcpy(dev_name,lnx_can_dev_prefix,prefix_len);
       
   138 	memcpy(dev_name+prefix_len,board->busname,name_len);
       
   139 	dev_name[prefix_len+name_len] = 0;
       
   140 	printf("dev_name %s\n", dev_name);
   115 
   141 
   116   memcpy(dev_name,lnx_can_dev_prefix,prefix_len);
   142 	fd = open(dev_name, O_RDWR|o_flags);
   117   memcpy(dev_name+prefix_len,board->busname,name_len);
   143 	if(fd < 0)
   118   dev_name[prefix_len+name_len] = 0;
   144 	{
       
   145 		fprintf(stderr,"!!! Board %s is unknown. See can_lincan.c\n", board->busname);
       
   146 		goto error_ret;
       
   147 	}
       
   148 	printf("fd = %d\n", fd);
   119 
   149 
   120   fd0 = open(dev_name, O_RDWR|o_flags);
   150 	// set baudrate
   121   if(fd0 < 0){
   151 	params.baudrate = TranslateBaudeRate(board->baudrate);
   122     fprintf(stderr,"!!! Board %s is unknown. See can_lincan.c\n", board->busname);
   152 	if(params.baudrate == 0)
   123     goto error_ret;
   153 		goto error_ret;
   124   }
   154 	params.flags = -1;	// use driver defaults
       
   155 	params.sjw = -1;	// use driver defaults
       
   156 	params.sample_pt = -1;	// use driver defaults
       
   157 	if(ioctl(fd, CONF_BAUDPARAMS, &params) < 0)
       
   158 	{
       
   159 		fprintf(stderr, "canOpen_driver (lincan): IOCTL set speed failed\n");
       
   160 		goto error_ret;
       
   161 	}
   125 
   162 
   126   return fd0;
   163 	return (CAN_HANDLE)fd;
   127 
   164 
   128  error_ret:
   165 error_ret:
   129   free(fd0);
   166 	return NULL;
   130   return NULL;
       
   131 }
   167 }
   132 
   168 
   133 /***************************************************************************/
   169 /***************************************************************************/
   134 int canClose_driver(CAN_HANDLE fd0)
   170 int canClose_driver(CAN_HANDLE fd0)
   135 {
   171 {