etisserant@145: /* etisserant@145: This file is part of CanFestival, a library implementing CanOpen Stack. etisserant@145: etisserant@145: Copyright (C): Edouard TISSERANT and Francis DUPIN etisserant@145: etisserant@145: See COPYING file for copyrights details. etisserant@145: etisserant@145: This library is free software; you can redistribute it and/or etisserant@145: modify it under the terms of the GNU Lesser General Public etisserant@145: License as published by the Free Software Foundation; either etisserant@145: version 2.1 of the License, or (at your option) any later version. etisserant@145: etisserant@145: This library is distributed in the hope that it will be useful, etisserant@145: but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@145: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@145: Lesser General Public License for more details. etisserant@145: etisserant@145: You should have received a copy of the GNU Lesser General Public etisserant@145: License along with this library; if not, write to the Free Software etisserant@145: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@145: */ etisserant@145: etisserant@145: #include etisserant@145: #include etisserant@145: #include etisserant@145: #include greg@454: #include etisserant@145: etisserant@145: /* driver pcan pci for Peak board */ etisserant@145: //#include "libpcan.h" etisserant@145: //#include "pcan.h" etisserant@145: etisserant@145: #include "libpcan.h" // for CAN_HANDLE etisserant@145: etisserant@145: #include "can_driver.h" etisserant@145: etisserant@145: // Define for rtr CAN message etisserant@145: #define CAN_INIT_TYPE_ST_RTR MSGTYPE_STANDARD | MSGTYPE_RTR etisserant@145: etisserant@145: /*********functions which permit to communicate with the board****************/ etisserant@145: UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m) etisserant@145: { etisserant@145: UNS8 data; etisserant@145: TPCANMsg peakMsg; etisserant@145: if ((errno = CAN_Read(fd0, & peakMsg))) { // Blocks until no new message or error. etisserant@145: if(errno != -EIDRM && errno != -EPERM) // error is not "Can Port closed while reading" etisserant@145: { etisserant@162: perror("canReceive_driver (Peak_Linux) : error of reading.\n"); etisserant@145: } etisserant@145: return 1; etisserant@145: } etisserant@365: m->cob_id = peakMsg.ID; etisserant@145: if (peakMsg.MSGTYPE == CAN_INIT_TYPE_ST) /* bits of MSGTYPE_*/ etisserant@145: m->rtr = 0; etisserant@145: else etisserant@145: m->rtr = 1; etisserant@145: m->len = peakMsg.LEN; /* count of data bytes (0..8) */ etisserant@145: for(data = 0 ; data < peakMsg.LEN ; data++) etisserant@145: m->data[data] = peakMsg.DATA[data]; /* data bytes, up to 8 */ etisserant@441: etisserant@441: #if defined DEBUG_MSG_CONSOLE_ON greg@454: MSG("in : "); etisserant@441: print_message(m); etisserant@441: #endif etisserant@145: etisserant@145: return 0; etisserant@145: } etisserant@145: etisserant@145: /***************************************************************************/ edouard@631: UNS8 canSend_driver(CAN_HANDLE fd0, Message const *m) etisserant@145: { etisserant@145: UNS8 data; etisserant@145: TPCANMsg peakMsg; etisserant@365: peakMsg.ID=m -> cob_id; /* 11/29 bit code */ etisserant@145: if(m->rtr == 0) etisserant@145: peakMsg.MSGTYPE = CAN_INIT_TYPE_ST; /* bits of MSGTYPE_*/ etisserant@145: else { etisserant@145: peakMsg.MSGTYPE = CAN_INIT_TYPE_ST_RTR; /* bits of MSGTYPE_*/ etisserant@145: } etisserant@145: peakMsg.LEN = m->len; etisserant@145: /* count of data bytes (0..8) */ etisserant@145: for(data = 0 ; data < m->len; data ++) etisserant@145: peakMsg.DATA[data] = m->data[data]; /* data bytes, up to 8 */ etisserant@145: etisserant@441: #if defined DEBUG_MSG_CONSOLE_ON greg@454: MSG("out : "); etisserant@441: print_message(m); etisserant@441: #endif etisserant@145: if((errno = CAN_Write(fd0, & peakMsg))) { etisserant@162: perror("canSend_driver (Peak_Linux) : error of writing.\n"); etisserant@145: return 1; etisserant@145: } etisserant@145: return 0; etisserant@145: etisserant@145: } etisserant@145: etisserant@145: etisserant@145: /***************************************************************************/ etisserant@145: int TranslateBaudeRate(char* optarg){ etisserant@145: if(!strcmp( optarg, "1M")) return CAN_BAUD_1M; etisserant@145: if(!strcmp( optarg, "500K")) return CAN_BAUD_500K; etisserant@145: if(!strcmp( optarg, "250K")) return CAN_BAUD_250K; etisserant@145: if(!strcmp( optarg, "125K")) return CAN_BAUD_125K; etisserant@145: if(!strcmp( optarg, "100K")) return CAN_BAUD_100K; etisserant@145: if(!strcmp( optarg, "50K")) return CAN_BAUD_50K; etisserant@145: if(!strcmp( optarg, "20K")) return CAN_BAUD_20K; etisserant@145: if(!strcmp( optarg, "10K")) return CAN_BAUD_10K; etisserant@145: if(!strcmp( optarg, "5K")) return CAN_BAUD_5K; etisserant@145: if(!strcmp( optarg, "none")) return 0; etisserant@145: return 0x0000; etisserant@145: } etisserant@145: groke6@384: UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud) groke6@384: { groke6@384: printf("canChangeBaudRate not yet supported by this driver\n"); groke6@384: return 0; groke6@384: } groke6@384: etisserant@145: /***************************************************************************/ etisserant@145: CAN_HANDLE canOpen_driver(s_BOARD *board) etisserant@145: { etisserant@145: HANDLE fd0 = NULL; etisserant@145: char busname[64]; etisserant@145: char* pEnd; etisserant@145: int baudrate; etisserant@145: etisserant@145: if(strtol(board->busname, &pEnd,0) >= 0) etisserant@145: { etisserant@145: sprintf(busname,"/dev/pcan%s",board->busname); etisserant@145: fd0 = LINUX_CAN_Open(busname, O_RDWR); etisserant@145: } etisserant@145: etisserant@162: if(fd0 && (baudrate = TranslateBaudeRate(board->baudrate))) etisserant@162: { etisserant@145: CAN_Init(fd0, baudrate, CAN_INIT_TYPE_ST); etisserant@162: }else{ etisserant@162: fprintf(stderr, "canOpen_driver (Peak_Linux) : error opening %s\n", busname); etisserant@162: } etisserant@145: etisserant@145: return (CAN_HANDLE)fd0; etisserant@145: } etisserant@145: etisserant@145: /***************************************************************************/ etisserant@145: int canClose_driver(CAN_HANDLE fd0) etisserant@145: { etisserant@145: CAN_Close(fd0); etisserant@145: return 0; etisserant@145: }