drivers/can_socket/can_socket.c
changeset 804 4657af9ede34
parent 802 82e8646d08f5
child 805 570e3a444023
equal deleted inserted replaced
803:cb315e75b3bd 804:4657af9ede34
    46 #endif
    46 #endif
    47 //#include "af_can.h"
    47 //#include "af_can.h"
    48 #define CAN_IFNAME     "can%s"
    48 #define CAN_IFNAME     "can%s"
    49 #endif
    49 #endif
    50 
    50 
    51 #define CAN_SOCKET     socket
       
    52 #define CAN_CLOSE      close
       
    53 #define CAN_RECV       recv
       
    54 #define CAN_SEND       send
       
    55 #define CAN_BIND       bind
       
    56 #define CAN_IOCTL      ioctl
       
    57 #define CAN_SETSOCKOPT setsockopt
       
    58 #define CAN_ERRNO(err) errno
       
    59 
       
    60 #include "can_driver.h"
    51 #include "can_driver.h"
    61 
    52 
    62 /*********functions which permit to communicate with the board****************/
    53 /*********functions which permit to communicate with the board****************/
    63 UNS8
    54 UNS8
    64 canReceive_driver (CAN_HANDLE fd0, Message * m)
    55 canReceive_driver (CAN_HANDLE fd0, Message * m)
    65 {
    56 {
    66   int res;
    57   int res;
    67   struct can_frame frame;
    58   struct can_frame frame;
    68 
    59 
    69   res = CAN_RECV (*(int *) fd0, &frame, sizeof (frame), 0);
    60   res = recv (*(int *) fd0, &frame, sizeof (frame), 0);
    70   if (res < 0)
    61   if (res < 0)
    71     {
    62     {
    72       fprintf (stderr, "Recv failed: %s\n", strerror (CAN_ERRNO (res)));
    63       fprintf (stderr, "Recv failed: %s\n", strerror (errno));
    73       return 1;
    64       return 1;
    74     }
    65     }
    75 
    66 
    76   m->cob_id = frame.can_id & CAN_EFF_MASK;
    67   m->cob_id = frame.can_id & CAN_EFF_MASK;
    77   m->len = frame.can_dlc;
    68   m->len = frame.can_dlc;
   107 
    98 
   108 #if defined DEBUG_MSG_CONSOLE_ON
    99 #if defined DEBUG_MSG_CONSOLE_ON
   109   MSG("out : ");
   100   MSG("out : ");
   110   print_message(m);
   101   print_message(m);
   111 #endif
   102 #endif
   112   res = CAN_SEND (*(int *) fd0, &frame, sizeof (frame), 0);
   103   res = send (*(int *) fd0, &frame, sizeof (frame), 0);
   113   if (res < 0)
   104   if (res < 0)
   114     {
   105     {
   115       fprintf (stderr, "Send failed: %s\n", strerror (CAN_ERRNO (res)));
   106       fprintf (stderr, "Send failed: %s\n", strerror (errno));
   116       return 1;
   107       return 1;
   117     }
   108     }
   118 
   109 
   119   return 0;
   110   return 0;
   120 }
   111 }
   176   if(!fd0)
   167   if(!fd0)
   177     {
   168     {
   178       return NULL;
   169       return NULL;
   179     }
   170     }
   180 
   171 
   181   *(int *) fd0 = CAN_SOCKET (PF_CAN, SOCK_RAW, CAN_RAW);
   172   *(int *) fd0 = socket (PF_CAN, SOCK_RAW, CAN_RAW);
   182   if (*(int *) fd0 < 0)
   173   if (*(int *) fd0 < 0)
   183     {
   174     {
   184       fprintf (stderr, "Socket creation failed: %s\n",
   175       fprintf (stderr, "Socket creation failed: %s\n",
   185 	       strerror (CAN_ERRNO (*(int *) fd0)));
   176 	       strerror (errno));
   186       goto error_ret;
   177       goto error_ret;
   187     }
   178     }
   188 
   179 
   189   if (*board->busname >= '0' && *board->busname <= '9')
   180   if (*board->busname >= '0' && *board->busname <= '9')
   190     snprintf (ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname);
   181     snprintf (ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname);
   191   else
   182   else
   192     strncpy (ifr.ifr_name, board->busname, IFNAMSIZ);
   183     strncpy (ifr.ifr_name, board->busname, IFNAMSIZ);
   193   err = CAN_IOCTL (*(int *) fd0, SIOCGIFINDEX, &ifr);
   184   err = ioctl (*(int *) fd0, SIOCGIFINDEX, &ifr);
   194   if (err)
   185   if (err)
   195     {
   186     {
   196       fprintf (stderr, "Getting IF index for %s failed: %s\n",
   187       fprintf (stderr, "Getting IF index for %s failed: %s\n",
   197 	       ifr.ifr_name, strerror (CAN_ERRNO (err)));
   188 	       ifr.ifr_name, strerror (errno));
   198       goto error_close;
   189       goto error_close;
   199     }
   190     }
   200   
   191   
   201   {
   192   {
   202     int loopback = 1;
   193     int loopback = 1;
   203     err = CAN_SETSOCKOPT(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_LOOPBACK,
   194     err = setsockopt(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_LOOPBACK,
   204                &loopback, sizeof(loopback));
   195                &loopback, sizeof(loopback));
   205     if (err) {
   196     if (err) {
   206         fprintf(stderr, "setsockopt: %s\n", strerror (CAN_ERRNO (err)));
   197         fprintf(stderr, "setsockopt: %s\n", strerror (errno));
   207         goto error_close;
   198         goto error_close;
   208     }
   199     }
   209   }
   200   }
   210   
   201   
   211 #ifndef RTCAN_SOCKET /*CAN_RAW_RECV_OWN_MSGS not supported in rtsocketcan*/
   202 #ifndef RTCAN_SOCKET /*CAN_RAW_RECV_OWN_MSGS not supported in rtsocketcan*/
   212   {
   203   {
   213     int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */
   204     int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */
   214     err = CAN_SETSOCKOPT(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
   205     err = setsockopt(*(int *)fd0, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
   215                &recv_own_msgs, sizeof(recv_own_msgs));
   206                &recv_own_msgs, sizeof(recv_own_msgs));
   216     if (err) {
   207     if (err) {
   217         fprintf(stderr, "setsockopt: %s\n", strerror (CAN_ERRNO (err)));
   208         fprintf(stderr, "setsockopt: %s\n", strerror (errno));
   218         goto error_close;
   209         goto error_close;
   219     }
   210     }
   220   }
   211   }
   221 #endif
   212 #endif
   222   
   213   
   223   addr.can_family = AF_CAN;
   214   addr.can_family = AF_CAN;
   224   addr.can_ifindex = ifr.ifr_ifindex;
   215   addr.can_ifindex = ifr.ifr_ifindex;
   225   err = CAN_BIND (*(int *) fd0, (struct sockaddr *) &addr, sizeof (addr));
   216   err = bind (*(int *) fd0, (struct sockaddr *) &addr, sizeof (addr));
   226   if (err)
   217   if (err)
   227     {
   218     {
   228       fprintf (stderr, "Binding failed: %s\n", strerror (CAN_ERRNO (err)));
   219       fprintf (stderr, "Binding failed: %s\n", strerror (errno));
   229       goto error_close;
   220       goto error_close;
   230     }
   221     }
   231 
   222 
   232 #ifdef RTCAN_SOCKET
   223 #ifdef RTCAN_SOCKET
   233   tx_timeout = 10000000;    /* XXX Timeout is temporarily set to 10 ms */
   224   tx_timeout = 10000000;    /* XXX Timeout is temporarily set to 10 ms */
   234   err = CAN_IOCTL (*(int *) fd0, RTCAN_RTIOC_SND_TIMEOUT, &tx_timeout);
   225   err = ioctl (*(int *) fd0, RTCAN_RTIOC_SND_TIMEOUT, &tx_timeout);
   235   if (err)
   226   if (err)
   236     {
   227     {
   237       fprintf (stderr,
   228       fprintf (stderr,
   238           "Setting TX timeout %d failed: %s\n",
   229           "Setting TX timeout %d failed: %s\n",
   239           *baudrate, strerror (CAN_ERRNO (err)));
   230           *baudrate, strerror (errno));
   240       goto error_close;
   231       goto error_close;
   241     }
   232     }
   242 
   233 
   243   baudrate = (can_baudrate_t *) & ifr.ifr_ifru;
   234   baudrate = (can_baudrate_t *) & ifr.ifr_ifru;
   244   *baudrate = TranslateBaudRate (board->baudrate);
   235   *baudrate = TranslateBaudRate (board->baudrate);
   245   if (!*baudrate)
   236   if (!*baudrate)
   246     goto error_close;
   237     goto error_close;
   247 
   238 
   248   err = CAN_IOCTL (*(int *) fd0, SIOCSCANBAUDRATE, &ifr);
   239   err = ioctl (*(int *) fd0, SIOCSCANBAUDRATE, &ifr);
   249   if (err)
   240   if (err)
   250     {
   241     {
   251       fprintf (stderr,
   242       fprintf (stderr,
   252 	       "Setting baudrate %d failed: %s\n",
   243 	       "Setting baudrate %d failed: %s\n",
   253 	       *baudrate, strerror (CAN_ERRNO (err)));
   244 	       *baudrate, strerror (errno));
   254       goto error_close;
   245       goto error_close;
   255     }
   246     }
   256 
   247 
   257   mode = (can_mode_t *) & ifr.ifr_ifru;
   248   mode = (can_mode_t *) & ifr.ifr_ifru;
   258   *mode = CAN_MODE_START;
   249   *mode = CAN_MODE_START;
   259   err = CAN_IOCTL (*(int *) fd0, SIOCSCANMODE, &ifr);
   250   err = ioctl (*(int *) fd0, SIOCSCANMODE, &ifr);
   260   if (err)
   251   if (err)
   261     {
   252     {
   262       fprintf (stderr, "Starting CAN device failed: %s\n",
   253       fprintf (stderr, "Starting CAN device failed: %s\n",
   263 	       strerror (CAN_ERRNO (err)));
   254 	       strerror (errno));
   264       goto error_close;
   255       goto error_close;
   265     }
   256     }
   266 #endif
   257 #endif
   267 
   258 
   268   return fd0;
   259   return fd0;
   269 
   260 
   270 error_close:
   261 error_close:
   271   CAN_CLOSE (*(int *) fd0);
   262   close (*(int *) fd0);
   272 
   263 
   273 error_ret:
   264 error_ret:
   274   free (fd0);
   265   free (fd0);
   275   return NULL;
   266   return NULL;
   276 }
   267 }
   279 int
   270 int
   280 canClose_driver (CAN_HANDLE fd0)
   271 canClose_driver (CAN_HANDLE fd0)
   281 {
   272 {
   282   if (fd0)
   273   if (fd0)
   283     {
   274     {
   284       CAN_CLOSE (*(int *) fd0);
   275       shutdown (*(int *) fd0, SHUT_RDWR);
       
   276       close (*(int *) fd0);
   285       free (fd0);
   277       free (fd0);
   286     }
   278     }
   287   return 0;
   279   return 0;
   288 }
   280 }