Example #1
0
/**
 * Channels and their descriptors are numbered starting from zero.
 * So I need to increment by 1 the handle returned by CANLIB because
 * CANfestival CAN_HANDLEs with value zero are considered NOT VALID. 
 * 
 * The baud rate could be given directly as bit/s
 * or using one of the BAUD_* constants defined
 * in canlib.h
 */ 
CAN_HANDLE canOpen_driver(s_BOARD *board)
{
int fd0 = -1;
int channel, baud;
canStatus retval = canOK;

    fd0--;

    sscanf(board->busname, "%d", &channel);  

    baud = TranslateBaudRate(board->baudrate);

    if (baud == 0)
    {
        sscanf(board->baudrate, "%d", &baud);
    }

    fd0 = canOpenChannel(channel, canWANT_EXCLUSIVE|canWANT_EXTENDED);
    if (fd0 < 0)
    {
  	    fprintf(stderr, "canOpen_driver (Kvaser) : error opening channel %d\n", channel);
        return (CAN_HANDLE)(fd0+1);
    }
    canBusOff(fd0);

    /* values for tseg1, tseg2, sjw, noSamp and  syncmode
     * come from canlib example "simplewrite.c". The doc
     * says that default values will be taken if baud is one of
     * the BAUD_* values
     */ 
    retval = canSetBusParams(fd0, baud, 4, 3, 1, 1, 0);
    if (retval != canOK)
    {
  	    fprintf(stderr, "canOpen_driver (Kvaser) :  canSetBusParams() error, returned value = %d, baud=%d, \n", retval, baud);
        canClose((int)fd0);
        return (CAN_HANDLE)retval;
    }
    
    canSetBusOutputControl(fd0, canDRIVER_NORMAL);
    if (retval != canOK)
    {
  	    fprintf(stderr, "canOpen_driver (Kvaser) :  canSetBusOutputControl() error, returned value = %d\n", retval);
        canClose((int)fd0);
        return (CAN_HANDLE)retval;
    }



    
    retval = canBusOn(fd0);
    if (retval != canOK)
    {
  	    fprintf(stderr, "canOpen_driver (Kvaser) :  canBusOn() error, returned value = %d\n", retval);
        canClose((int)fd0);
        return (CAN_HANDLE)retval;
    }
    
    return (CAN_HANDLE)(fd0+1);

}
Example #2
0
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;
}
Example #3
0
UNS8 canChangeBaudRate_driver( CAN_HANDLE fd0, char* baud)
{
int baudrate;
canStatus retval = canOK;


    baudrate = TranslateBaudRate(baud);
    if (baudrate == 0)
    {
        sscanf(baud, "%d", &baudrate);
    }


    fprintf(stderr, "%x-> changing to baud rate %s[%d]\n", (int)fd0, baud, baudrate); 
    
    canBusOff((int)fd0);

    /* values for tseg1, tseg2, sjw, noSamp and  syncmode
     * come from canlib example "simplewrite.c". The doc
     * says that default values will be taken if baud is one of
     * the BAUD_* values
     */ 
    retval = canSetBusParams((int)fd0, baudrate, 4, 3, 1, 1, 0);
    if (retval != canOK)
    {
  	    fprintf(stderr, "canChangeBaudRate_driver (Kvaser) :  canSetBusParams() error, returned value = %d, baud=%d, \n", retval, baud);
        canClose((int)fd0);
        return (UNS8)retval;
    }
    
    canSetBusOutputControl((int)fd0, canDRIVER_NORMAL);
    if (retval != canOK)
    {
  	    fprintf(stderr, "canChangeBaudRate_driver (Kvaser) :  canSetBusOutputControl() error, returned value = %d\n", retval);
        canClose((int)fd0);
        return (UNS8)retval;
    }
    
    retval = canBusOn((int)fd0);
    if (retval != canOK)
    {
  	    fprintf(stderr, "canChangeBaudRate_driver (Kvaser) :  canBusOn() error, returned value = %d\n", retval);
        canClose((int)fd0);
        return (UNS8)retval;
    }

    return 0;
}
int co_pcican_configure_selected_channel( const int fd, s_BOARD *board, const unsigned int direction )
{
	co_pcican_config_t board_config;
	unsigned int selectedChannel;

	if( fd < 0 )
	{
		MSG("can_copcican_linux: co_pcican_configure_selected_channel(): invalid file descriptor\n");
		return -1;
	}

	if( board == NULL )
	{
		MSG("can_copcican_linux: co_pcican_configure_selected_channel(): board is NULL\n");
		return -1;
	}

	if( board->baudrate == NULL )
	{
		MSG("can_copcican_linux: co_pcican_configure_selected_channel(): baudrate is NULL\n");
		return -1;
	}

	switch( direction )
	{
	case RX: selectedChannel = selectedChannelRx;
	break;
	case TX: selectedChannel = selectedChannelTx;
	break;
	default: selectedChannel = 0xff;
	}

	if( selectedChannel >= NUM_CAN_CHANNELS )
	{
		MSG("can_copcican_linux: co_pcican_configure_selected_channel(): invalid channel selected\n");
		return -1;
	}

	memset( &board_config, 0x00, sizeof(co_pcican_config_t) );
	board_config.opcode   = CMDQ_OPC_SET_CONFIG_CHANNEL;
	board_config.param[0] = selectedChannel;
	board_config.param[1] = TranslateBaudRate( board->baudrate );

	return ioctl( fd, CAN_CONFIG, &board_config );
}
Example #5
0
CAN_HANDLE canOpen_driver(s_BOARD *board)
{
  int name_len = strlen(board->busname);
  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 fd0;
  int res;

  
  /*o_flags = O_NONBLOCK;*/

  memcpy(dev_name,lnx_can_dev_prefix,prefix_len);
  memcpy(dev_name+prefix_len,board->busname,name_len);
  dev_name[prefix_len+name_len] = 0;

  fd0 = open(dev_name, O_RDWR|o_flags);
  if(fd0 == -1){
    fprintf(stderr,"!!! %s is unknown. See can4linux.c\n", dev_name);
    goto error_ret;
  }
  
  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);

  return (CAN_HANDLE)fd0;

 error_ret:
  return NULL;
}
UNS8 canChangeBaudRate_driver( CAN_HANDLE fd0, char* baud)
{
    printk("%x-> changing to baud rate %s[%d]\n", (CANPipe*)fd0 - &canpipes[0],baud,TranslateBaudRate(baud)); 
    return 0;
}