drivers/can_socket/can_socket.c
changeset 187 d3930d3f1323
parent 145 e747d2e26af0
child 189 1c1d1893f1c9
equal deleted inserted replaced
186:5220b201fac7 187:d3930d3f1323
    35 #define CAN_RECV       rt_dev_recv
    35 #define CAN_RECV       rt_dev_recv
    36 #define CAN_SEND       rt_dev_send
    36 #define CAN_SEND       rt_dev_send
    37 #define CAN_BIND       rt_dev_bind
    37 #define CAN_BIND       rt_dev_bind
    38 #define CAN_IOCTL      rt_dev_ioctl
    38 #define CAN_IOCTL      rt_dev_ioctl
    39 #else
    39 #else
    40 #include "af_can.h"
    40 #include <sys/socket.h>
       
    41 #include <sys/ioctl.h>
       
    42 #include "linux/can.h"
       
    43 #include "linux/can/raw.h"
       
    44 #include "net/if.h"
       
    45 #define PF_CAN 29
       
    46 #define AF_CAN PF_CAN
       
    47 //#include "af_can.h"
    41 #define CAN_IFNAME     "can%s"
    48 #define CAN_IFNAME     "can%s"
    42 #define CAN_SOCKET     socket
    49 #define CAN_SOCKET     socket
    43 #define CAN_CLOSE      close
    50 #define CAN_CLOSE      close
    44 #define CAN_RECV       recv
    51 #define CAN_RECV       recv
    45 #define CAN_SEND       send
    52 #define CAN_SEND       send
    53 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m)
    60 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m)
    54 {
    61 {
    55        int res;
    62        int res;
    56        struct can_frame frame;
    63        struct can_frame frame;
    57 
    64 
    58        res = CAN_RECV(fd0, &frame, sizeof(frame), 0);
    65        res = CAN_RECV(*(int*)fd0, &frame, sizeof(frame), 0);
    59        if (res < 0)
    66        if (res < 0)
    60                return 1;
    67                return 1;
    61 
    68 
    62        m->cob_id.w = frame.can_id & CAN_EFF_MASK;
    69        m->cob_id.w = frame.can_id & CAN_EFF_MASK;
    63        m->len      = frame.can_dlc;
    70        m->len      = frame.can_dlc;
    84        if (m->rtr)
    91        if (m->rtr)
    85                frame.can_id |= CAN_RTR_FLAG;
    92                frame.can_id |= CAN_RTR_FLAG;
    86        else
    93        else
    87                memcpy(frame.data, m->data, 8);
    94                memcpy(frame.data, m->data, 8);
    88 
    95 
    89        res = CAN_SEND(fd0, &frame, sizeof(frame), 0);
    96        res = CAN_SEND(*(int*)fd0, &frame, sizeof(frame), 0);
    90        if (res < 0)
    97        if (res < 0)
    91                return 1;
    98                return 1;
    92 
    99 
    93        return 0;
   100        return 0;
    94 }
   101 }
    95 
   102 
    96 /***************************************************************************/
   103 /***************************************************************************/
    97 CAN_HANDLE canOpen_driver(s_BOARD *board)
   104 CAN_HANDLE canOpen_driver(s_BOARD *board)
    98 {
   105 {
    99        CAN_HANDLE fd0;
       
   100        struct ifreq ifr;
   106        struct ifreq ifr;
   101        struct sockaddr_can addr;
   107        struct sockaddr_can addr;
   102        int err;
   108        int err;
       
   109        CAN_HANDLE fd0 = malloc(sizeof(int));
   103 
   110 
   104        fd0 = CAN_SOCKET(PF_CAN, SOCK_RAW, 0);
   111        *(int*)fd0 = CAN_SOCKET(PF_CAN, SOCK_RAW, 0);
   105        if(fd0 < 0){
   112        if(*(int*)fd0 < 0){
   106                fprintf(stderr,"Socket creation failed.\n");
   113                fprintf(stderr,"Socket creation failed.\n");
   107                goto error_ret;
   114                goto error_ret;
   108        }
   115        }
   109 
   116 
   110        snprintf(ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname);
   117        snprintf(ifr.ifr_name, IFNAMSIZ, CAN_IFNAME, board->busname);
   111        err = CAN_IOCTL(fd0, SIOCGIFINDEX, &ifr);
   118        err = CAN_IOCTL(*(int*)fd0, SIOCGIFINDEX, &ifr);
   112        if (err) {
   119        if (err) {
   113                fprintf(stderr, "Unknown device: %s\n", ifr.ifr_name);
   120                fprintf(stderr, "Unknown device: %s\n", ifr.ifr_name);
   114                goto error_close;
   121                goto error_close;
   115        }
   122        }
   116 
   123 
   117        addr.can_family  = AF_CAN;
   124        addr.can_family  = AF_CAN;
   118        addr.can_ifindex = ifr.ifr_ifindex;
   125        addr.can_ifindex = ifr.ifr_ifindex;
   119        err = CAN_BIND(fd0, (struct sockaddr *)&addr,
   126        err = CAN_BIND(*(int*)fd0, (struct sockaddr *)&addr,
   120                              sizeof(addr));
   127                              sizeof(addr));
   121        if (err) {
   128        if (err) {
   122                fprintf(stderr, "Binding failed.\n");
   129                fprintf(stderr, "Binding failed.\n");
   123                goto error_close;
   130                goto error_close;
   124        }
   131        }
   127 
   134 
   128  error_close:
   135  error_close:
   129        CAN_CLOSE(fd0);
   136        CAN_CLOSE(fd0);
   130 
   137 
   131  error_ret:
   138  error_ret:
       
   139        free(fd0);
   132        return NULL;
   140        return NULL;
   133 }
   141 }
   134 
   142 
   135 /***************************************************************************/
   143 /***************************************************************************/
   136 int canClose_driver(CAN_HANDLE fd0)
   144 int canClose_driver(CAN_HANDLE fd0)
   137 {
   145 {
   138        if (fd0) {
   146        if (fd0) {
   139                CAN_CLOSE(fd0);
   147                CAN_CLOSE(*(int*)fd0);
       
   148                free(fd0);
   140        }
   149        }
   141        return 0;
   150        return 0;
   142 }
   151 }