Another points with the PCAN-USB netdev method :

First you need to rename the /etc/modprobe.d/pcan in /etc/modprobe.d/pcan.conf (because the driver's installation don't put the .conf extension) and into this file you can add the bitrate at the end of the line start by install, for example :

    install pcan /sbin/modprobe --ignore-install pcan bitrate=0x472F

if you want a 50kbaud for pcanusb bitrate.
(If your pcan driver is already loaded, you need to unload and reload it, with depmod -r pcan and depmod pcan)

Second step :
    sudo ifconfig can0 up

after this second step an ifconfig will display to you the can0 interfaces and it will be ready to use.

Vincent BRACH.

Hello,

I'm trying to use the peak CAN/USB adapter. I've been using the chardev
device, but am trying to switch to the netdev method.
Hello,
I actually do the same jobs as you for the pcan(usb).

First: warning : In NETDEV mode compilation of the pcan driver access to
/dev/pcan32 (for example) work for writing but not any more for reading
! (it's notify in the pcan documentation).
As far as I can tell this means that I've installed the driver and device 
correctly.
As I have no idea how to use the netdev method I have no way of reading/writing 
CAN Frames.
Is there an example I can download someplace? Documentation I can read?
Normally, in the Linux documentation directory you'll find everything
you need to use SocketCAN (browse to linux/Documentation/networking/can.txt)

A basic sample code for you :

#include<fcntl.h>
#include<linux/socket.h>
#include<linux/if.h>
#include<linux/can.h>
#include<linux/can/raw.h>
#include<linux/can/error.h>

in main for example :

      // #define NON_BLOCK 1  // Uncomment if you want non blocking
socket (for read/write)
      int sfd;
      struct sockaddr_can addr;
      struct ifreq ifr;

      // open part SocketCAN
      sfd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
      if(sfd<0){
          perror("socket : ");
          return -1;
      }
#if NON_BLOCK // Define socket as non-blocking socket
      fcntl(sfd, F_SETFL , O_NONBLOCK);
#endif

      strcpy(ifr.ifr_name, "can0"); // "can0" is the name of the CAN
network interface
      ioctl(sfd, SIOCGIFINDEX,&ifr);

      addr.can_family = AF_CAN;
      addr.can_ifindex = ifr.ifr_ifindex;

      // Bind the socket
      if(bind(sfd, (struct sockaddr *)&addr, sizeof(addr))<0){
          perror("bind: ");
          close(sfd);
          return -1;
      }

      // Part if you want the CAN_ERROR frames for reading
      can_err_mask_t err_mask = CAN_ERR_MASK;
      setsockopt(sfd, SOL_CAN_RAW, CAN_RAW_ERR_FILTER,&err_mask,
sizeof(err_mask));

      //-- To send and receive frame: --
      ssize_t nbytes=0;

      // Frame to send (example)
      struct can_frame frame_wr = {
          .can_id=0x264,
          .can_dlc=2,
          .data = { 0x11, 0x22 },
      };
      struct can_frame frame_rd;

      nbytes = write(sfd,&frame_wr, sizeof(struct can_frame)); // Send a
CAN frame
      ....
      // You can you select or other standard API for waiting CAN frame
to read for example..
      ....
      nbytes = read(sfd,&frame_rd, sizeof(struct can_frame)); // Read a
CAN frame

      ...
      // Close the SocketCAN
      close(sfd);


It work perfectly with a PCAN USB and other CAN driver that allow using
SocketCAN

I hope this example will help you,

Vincent BRACH


_______________________________________________
Socketcan-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-users

Reply via email to