drivers/can_socket/can_socket.c
author fbeaulier
Tue, 16 Aug 2011 14:15:52 +0200
changeset 663 70fc3603e36f
parent 631 08b6b903f84a
child 796 1c87f7a8cb8a
permissions -rw-r--r--
timers_unix.c : remove sigint and sigterm catch
sdo : Allow multiple servers
The sdo transfer struct is not anymore referenced by server's node id but by
client or server number in the OD. Node id is not relevant in SDO transfert.
47
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     1
/*
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     2
This file is part of CanFestival, a library implementing CanOpen Stack.
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     3
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     4
Copyright (C): Edouard TISSERANT and Francis DUPIN
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     5
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     6
See COPYING file for copyrights details.
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     7
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     8
This library is free software; you can redistribute it and/or
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
     9
modify it under the terms of the GNU Lesser General Public
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    10
License as published by the Free Software Foundation; either
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    11
version 2.1 of the License, or (at your option) any later version.
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    12
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    13
This library is distributed in the hope that it will be useful,
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    14
but WITHOUT ANY WARRANTY; without even the implied warranty of
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    16
Lesser General Public License for more details.
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    17
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    18
You should have received a copy of the GNU Lesser General Public
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    19
License along with this library; if not, write to the Free Software
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    20
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    21
*/
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    22
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    23
#include <stdio.h>
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    24
#include <string.h>
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    25
#include <stdlib.h>
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    26
#include <stddef.h>		/* for NULL */
192
9dd6f17ef7e5 Wolfgang enhancements for RT-socket-CAN support
etisserant
parents: 189
diff changeset
    27
#include <errno.h>
47
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    28
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    29
#include "config.h"
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    30
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    31
#ifdef RTCAN_SOCKET
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    32
#include "rtdm/rtcan.h"
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    33
#define CAN_IFNAME     "rtcan%s"
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    34
#define CAN_SOCKET     rt_dev_socket
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    35
#define CAN_CLOSE      rt_dev_close
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    36
#define CAN_RECV       rt_dev_recv
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    37
#define CAN_SEND       rt_dev_send
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    38
#define CAN_BIND       rt_dev_bind
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    39
#define CAN_IOCTL      rt_dev_ioctl
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
    40
#define CAN_SETSOCKOPT rt_dev_setsockopt
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    41
#define CAN_ERRNO(err) (-err)
47
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    42
#else
631
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
    43
#include <unistd.h>
187
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    44
#include <sys/socket.h>
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    45
#include <sys/ioctl.h>
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    46
#include "linux/can.h"
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    47
#include "linux/can/raw.h"
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    48
#include "net/if.h"
631
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
    49
#ifndef PF_CAN
187
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    50
#define PF_CAN 29
631
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
    51
#endif
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
    52
#ifndef AF_CAN
187
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    53
#define AF_CAN PF_CAN
631
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
    54
#endif
187
d3930d3f1323 Fixed can_socket compilation bugs
etisserant
parents: 145
diff changeset
    55
//#include "af_can.h"
47
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    56
#define CAN_IFNAME     "can%s"
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    57
#define CAN_SOCKET     socket
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    58
#define CAN_CLOSE      close
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    59
#define CAN_RECV       recv
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    60
#define CAN_SEND       send
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    61
#define CAN_BIND       bind
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    62
#define CAN_IOCTL      ioctl
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    63
#define CAN_ERRNO(err) errno
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
    64
#define CAN_SETSOCKOPT setsockopt
47
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    65
#endif
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    66
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    67
#include "can_driver.h"
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    68
8a1047ab51f4 SOCKET-CAN support added. Many thanks to Jan Kiszka !
etisserant
parents:
diff changeset
    69
/*********functions which permit to communicate with the board****************/
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    70
UNS8
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    71
canReceive_driver (CAN_HANDLE fd0, Message * m)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    72
{
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    73
  int res;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    74
  struct can_frame frame;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    75
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    76
  res = CAN_RECV (*(int *) fd0, &frame, sizeof (frame), 0);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    77
  if (res < 0)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    78
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    79
      fprintf (stderr, "Recv failed: %s\n", strerror (CAN_ERRNO (res)));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    80
      return 1;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    81
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    82
365
9b76e0881beb Changed cob_id from struct{UNS32} to UNS16
etisserant
parents: 330
diff changeset
    83
  m->cob_id = frame.can_id & CAN_EFF_MASK;
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    84
  m->len = frame.can_dlc;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    85
  if (frame.can_id & CAN_RTR_FLAG)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    86
    m->rtr = 1;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    87
  else
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    88
    m->rtr = 0;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    89
  memcpy (m->data, frame.data, 8);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    90
330
04b92f78d7bb debug=MSG -> print CAN messages
etisserant
parents: 301
diff changeset
    91
#if defined DEBUG_MSG_CONSOLE_ON
454
bc000083297a - add RTAI support
greg
parents: 384
diff changeset
    92
  MSG("in : ");
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
    93
  print_message(m);
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
    94
#endif
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    95
  return 0;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    96
}
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    97
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    98
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
    99
/***************************************************************************/
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   100
UNS8
631
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
   101
canSend_driver (CAN_HANDLE fd0, Message const * m)
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   102
{
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   103
  int res;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   104
  struct can_frame frame;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   105
365
9b76e0881beb Changed cob_id from struct{UNS32} to UNS16
etisserant
parents: 330
diff changeset
   106
  frame.can_id = m->cob_id;
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   107
  if (frame.can_id >= 0x800)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   108
    frame.can_id |= CAN_EFF_FLAG;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   109
  frame.can_dlc = m->len;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   110
  if (m->rtr)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   111
    frame.can_id |= CAN_RTR_FLAG;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   112
  else
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   113
    memcpy (frame.data, m->data, 8);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   114
330
04b92f78d7bb debug=MSG -> print CAN messages
etisserant
parents: 301
diff changeset
   115
#if defined DEBUG_MSG_CONSOLE_ON
454
bc000083297a - add RTAI support
greg
parents: 384
diff changeset
   116
  MSG("out : ");
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   117
  print_message(m);
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   118
#endif
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   119
  res = CAN_SEND (*(int *) fd0, &frame, sizeof (frame), 0);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   120
  if (res < 0)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   121
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   122
      fprintf (stderr, "Send failed: %s\n", strerror (CAN_ERRNO (res)));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   123
      return 1;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   124
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   125
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   126
  return 0;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   127
}
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   128
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   129
/***************************************************************************/
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   130
#ifdef RTCAN_SOCKET
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   131
int
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   132
TranslateBaudRate (const char *optarg)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   133
{
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   134
  int baudrate;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   135
  int val, len;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   136
  char *pos = NULL;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   137
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   138
  len = strlen (optarg);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   139
  if (!len)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   140
    return 0;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   141
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   142
  switch ((int) optarg[len - 1])
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   143
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   144
    case 'M':
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   145
      baudrate = 1000000;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   146
      break;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   147
    case 'K':
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   148
      baudrate = 1000;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   149
      break;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   150
    default:
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   151
      baudrate = 1;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   152
      break;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   153
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   154
  if ((sscanf (optarg, "%i", &val)) == 1)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   155
    baudrate *= val;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   156
  else
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   157
    baudrate = 0;;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   158
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   159
  return baudrate;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   160
}
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   161
#endif
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   162
384
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   163
UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   164
{
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   165
	printf("canChangeBaudRate not yet supported by this driver\n");
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   166
	return 0;
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   167
}
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   168
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   169
/***************************************************************************/
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   170
CAN_HANDLE
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   171
canOpen_driver (s_BOARD * board)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   172
{
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   173
  struct ifreq ifr;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   174
  struct sockaddr_can addr;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   175
  int err;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   176
  CAN_HANDLE fd0 = malloc (sizeof (int));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   177
#ifdef RTCAN_SOCKET
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   178
  can_baudrate_t *baudrate;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   179
  can_mode_t *mode;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   180
#endif
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   181
631
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
   182
  if(!fd0)
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
   183
    {
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
   184
      return NULL;
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
   185
    }
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 603
diff changeset
   186
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   187
  *(int *) fd0 = CAN_SOCKET (PF_CAN, SOCK_RAW, CAN_RAW);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   188
  if (*(int *) fd0 < 0)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   189
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   190
      fprintf (stderr, "Socket creation failed: %s\n",
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   191
	       strerror (CAN_ERRNO (*(int *) fd0)));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   192
      goto error_ret;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   193
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   194
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   195
  if (*board->busname >= '0' && *board->busname <= '9')
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   196
    snprintf (ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   197
  else
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   198
    strncpy (ifr.ifr_name, board->busname, IFNAMSIZ);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   199
  err = CAN_IOCTL (*(int *) fd0, SIOCGIFINDEX, &ifr);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   200
  if (err)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   201
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   202
      fprintf (stderr, "Getting IF index for %s failed: %s\n",
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   203
	       ifr.ifr_name, strerror (CAN_ERRNO (err)));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   204
      goto error_close;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   205
    }
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   206
  
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   207
  {
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   208
    int loopback = 1;
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   209
    err = CAN_SETSOCKOPT(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_LOOPBACK,
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   210
               &loopback, sizeof(loopback));
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   211
    if (err) {
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   212
        fprintf(stderr, "rt_dev_setsockopt: %s\n", strerror (CAN_ERRNO (err)));
603
4dc76e662412 Fixed typo in can_socket.c
edouard
parents: 596
diff changeset
   213
        goto error_close;
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   214
    }
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   215
  }
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   216
  
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   217
#ifndef RTCAN_SOCKET /*CAN_RAW_RECV_OWN_MSGS not supported in rtsocketcan*/
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   218
  {
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   219
    int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   220
    err = CAN_SETSOCKOPT(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   221
               &recv_own_msgs, sizeof(recv_own_msgs));
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   222
    if (err) {
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   223
        fprintf(stderr, "rt_dev_setsockopt: %s\n", strerror (CAN_ERRNO (err)));
603
4dc76e662412 Fixed typo in can_socket.c
edouard
parents: 596
diff changeset
   224
        goto error_close;
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   225
    }
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   226
  }
596
cb69a65bb88d Fiwed use of socketopt accross RT and non-RT implementation of SocketCan
edouard
parents: 454
diff changeset
   227
#endif
290
43c3b2bf3e32 Added debug message printing. Added socket option : CAN_RAW_LOOPBACK=1 and CAN_RAW_RECV_OWN_MSGS=0.
etisserant
parents: 196
diff changeset
   228
  
196
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   229
  addr.can_family = AF_CAN;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   230
  addr.can_ifindex = ifr.ifr_ifindex;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   231
  err = CAN_BIND (*(int *) fd0, (struct sockaddr *) &addr, sizeof (addr));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   232
  if (err)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   233
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   234
      fprintf (stderr, "Binding failed: %s\n", strerror (CAN_ERRNO (err)));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   235
      goto error_close;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   236
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   237
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   238
#ifdef RTCAN_SOCKET
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   239
  baudrate = (can_baudrate_t *) & ifr.ifr_ifru;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   240
  *baudrate = TranslateBaudRate (board->baudrate);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   241
  if (!*baudrate)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   242
    goto error_close;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   243
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   244
  err = CAN_IOCTL (*(int *) fd0, SIOCSCANBAUDRATE, &ifr);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   245
  if (err)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   246
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   247
      fprintf (stderr,
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   248
	       "Setting baudrate %d failed: %s\n",
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   249
	       *baudrate, strerror (CAN_ERRNO (err)));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   250
      goto error_close;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   251
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   252
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   253
  mode = (can_mode_t *) & ifr.ifr_ifru;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   254
  *mode = CAN_MODE_START;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   255
  err = CAN_IOCTL (*(int *) fd0, SIOCSCANMODE, &ifr);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   256
  if (err)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   257
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   258
      fprintf (stderr, "Starting CAN device failed: %s\n",
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   259
	       strerror (CAN_ERRNO (err)));
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   260
      goto error_close;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   261
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   262
#endif
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   263
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   264
  return fd0;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   265
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   266
error_close:
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   267
  CAN_CLOSE (*(int *) fd0);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   268
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   269
error_ret:
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   270
  free (fd0);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   271
  return NULL;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   272
}
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   273
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   274
/***************************************************************************/
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   275
int
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   276
canClose_driver (CAN_HANDLE fd0)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   277
{
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   278
  if (fd0)
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   279
    {
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   280
      CAN_CLOSE (*(int *) fd0);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   281
      free (fd0);
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   282
    }
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   283
  return 0;
65aa7a664f6f Applied wolfgang changes, and re-indented socket_can.c file
etisserant
parents: 192
diff changeset
   284
}