/** * 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); }
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; }
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 ); }
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; }