From e465aa765d515dc596b4c53cddd35b17b1168cac Mon Sep 17 00:00:00 2001 From: Rostislav Lisovy Date: Fri, 20 Jul 2012 14:50:05 +0200 Subject: [PATCH] lin_config: Basic sllin frame cache configuration --- lin_config/src/Makefile | 3 ++- lin_config/src/lin_config.c | 3 +++ lin_config/src/pcl_config.c | 2 +- lin_config/src/pcl_config.h | 3 --- lin_config/src/sllin_config.c | 50 +++++++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/lin_config/src/Makefile b/lin_config/src/Makefile index 7e95d78..db50031 100644 --- a/lin_config/src/Makefile +++ b/lin_config/src/Makefile @@ -1,6 +1,7 @@ CC=gcc -CFLAGS=-std=gnu99 -Wall -pedantic $(DEBUG) `xml2-config --cflags` +CFLAGS=-std=gnu99 -Wall -pedantic $(DEBUG) `xml2-config --cflags` -I$(INCLUDE) LIBS=`xml2-config --libs` +INCLUDE=../../linux_lin_git/sllin DEBUG=-ggdb objects = linc_parse_xml.o pcl_config.o sllin_config.o lin_config.o diff --git a/lin_config/src/lin_config.c b/lin_config/src/lin_config.c index 96b56d1..a42d3e8 100644 --- a/lin_config/src/lin_config.c +++ b/lin_config/src/lin_config.c @@ -30,6 +30,8 @@ #include "sllin_config.h" #include "lin_config.h" +#include "linux/lin_bus.h" + struct linc_lin_state linc_lin_state; @@ -133,6 +135,7 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } + // FIXME free() linc_lin_state? /* Sleep to keep the line discipline active. */ pause(); diff --git a/lin_config/src/pcl_config.c b/lin_config/src/pcl_config.c index 03ccae1..1b313e8 100644 --- a/lin_config/src/pcl_config.c +++ b/lin_config/src/pcl_config.c @@ -206,7 +206,7 @@ void pcl_set_slave_id_and_data_configuration(int tty, struct linc_lin_state *lin for (i = 0; i < 0x3F; i++) { int len; - if (linc_lin_state->frame_entry[i].status == PCL_ACTIVE) { + if (linc_lin_state->frame_entry[i].status == 1) { /* Is Active */ pkt.stx = PCL_STX; pkt.seq_no = 0x0; pkt.seq_frlen = linc_lin_state->frame_entry[i].data_len + 2; diff --git a/lin_config/src/pcl_config.h b/lin_config/src/pcl_config.h index 70b1b16..061bb8d 100644 --- a/lin_config/src/pcl_config.h +++ b/lin_config/src/pcl_config.h @@ -4,9 +4,6 @@ #include #include "lin_config.h" -#define PCL_ACTIVE 1 -#define PCL_UNACTIVE 0 - #define PCL_PKT_MAX_SIZE 16 #define PCL_HEADERS_SIZE 2 /* There are 2 bytes of headers */ #define PCL_CHECKSUM_SIZE 1 diff --git a/lin_config/src/sllin_config.c b/lin_config/src/sllin_config.c index 06751c5..ffb02f5 100644 --- a/lin_config/src/sllin_config.c +++ b/lin_config/src/sllin_config.c @@ -15,6 +15,7 @@ #include #include "lin_config.h" +#include "linux/lin_bus.h" #define SLLIN_LDISC 25 struct bcm_msg { @@ -37,7 +38,56 @@ void sllin_ms_to_timeval(int ms, struct timeval *tv) int sllin_cache_config(struct linc_lin_state *linc_lin_state, struct sllin_connection *sllin_connection) { + int i; + struct ifreq ifr; + struct sockaddr_can addr; + struct can_frame frame; + int s; + int ret; + + /* Create the socket */ + s = socket(PF_CAN, SOCK_RAW, CAN_RAW); + if (s < 0) { + perror("socket()"); + return -1; + } + + /* Locate the interface you wish to use */ + strcpy(ifr.ifr_name, sllin_connection->iface); + ioctl(s, SIOCGIFINDEX, &ifr); /* ifr.ifr_ifindex gets filled + * with that device's index */ + + /* Select that CAN interface, and bind the socket to it. */ + addr.can_family = AF_CAN; + addr.can_ifindex = ifr.ifr_ifindex; + ret = bind(s, (struct sockaddr*)&addr, sizeof(addr)); + if (ret < 0) { + perror("bind()"); + return -1; + } + + for (i = 0; i < 0x3F; i++) { + if (linc_lin_state->frame_entry[i].status == 1) { /* Is active */ + frame.can_dlc = linc_lin_state->frame_entry[i].data_len; + frame.can_id = i; /* LIN ID */ + frame.data[0] = linc_lin_state->frame_entry[i].data[0]; /* Data */ + frame.data[1] = linc_lin_state->frame_entry[i].data[1]; /* Data */ + frame.data[2] = linc_lin_state->frame_entry[i].data[2]; /* Data */ + frame.data[3] = linc_lin_state->frame_entry[i].data[3]; /* Data */ + frame.data[4] = linc_lin_state->frame_entry[i].data[4]; /* Data */ + frame.data[5] = linc_lin_state->frame_entry[i].data[5]; /* Data */ + frame.data[6] = linc_lin_state->frame_entry[i].data[6]; /* Data */ + frame.data[7] = linc_lin_state->frame_entry[i].data[7]; /* Data */ + + frame.can_id |= LIN_CTRL_FRAME | LIN_CACHE_RESPONSE; + ret = write(s, &frame, sizeof(frame)); + printf("configuring frame cache; ret = %d\n", ret); + //if (ret ...) + //read_response(tty); + } + } + close(s); return 0; } -- 2.39.2