Ktam3874/pitx software guide – Kontron KTAM3874-pITX User Manual
Page 76

KTD-S0057-I
Page 72 Linux® Programming Examples (DebianTM)
KTAM3874/pITX Software Guide
#include <net/if.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#define CAN0_INDEX
0
#define CAN1_INDEX
1
#define MAX_CAN_DEV
1
#define MAX_CAN_LEN
8
#define MAX_CAN_SSF
0x7FFUL
/* CAN 2.0A */
#define DEF_ERR_MASK
0x1FFUL
#define WAIT_TIME
10000
/* 10 ms */
#define MAX_NAME_LEN
8
static int skt;
static const char *dev_name = "can%d";
int init_can_bus (canid_t id_min, canid_t id_max)
{
can_err_mask_t err_mask = DEF_ERR_MASK;
struct sockaddr_can addr;
struct can_filter rfilter;
if ((skt = socket (PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
return
-1;
if (setsockopt (skt, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof (err_mask)) < 0)
return
-1;
if (id_min && id_max)
{
/* Define an identifier filter */
if ((id_min > id_max) || (id_min > MAX_CAN_SSF) || (id_max > MAX_CAN_SSF))
return
-1;
rfilter.can_id = id_min;
rfilter.can_mask = (~ (id_max - id_min)) & MAX_CAN_SSF;
if (setsockopt (skt, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof (rfilter)) < 0)
return
-1;
}
addr.can_family = AF_CAN;
addr.can_ifindex = 0;
/* Bind all controllers */
return bind (skt, (struct sockaddr *) &addr, sizeof (addr));
}
int close_can_bus (void)
{
close
(skt);
}