]> rtime.felk.cvut.cz Git - linux-lin.git/commitdiff
lin_config: Basic sllin frame cache configuration
authorRostislav Lisovy <lisovy@gmail.com>
Fri, 20 Jul 2012 12:50:05 +0000 (14:50 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Fri, 20 Jul 2012 12:50:05 +0000 (14:50 +0200)
lin_config/src/Makefile
lin_config/src/lin_config.c
lin_config/src/pcl_config.c
lin_config/src/pcl_config.h
lin_config/src/sllin_config.c

index 7e95d781f840d4cedcdf7dbfe90a41e09c69b982..db5003159903642cd4c0a289419f0b5e07b252e5 100644 (file)
@@ -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
index 96b56d1d2d7f41e91ef91530d6c695502b530825..a42d3e8b2a272bc13dcc6535eac97915b2759002 100644 (file)
@@ -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();
 
index 03ccae16c9025b0fbf75e0749228fea58221b6b8..1b313e8902dcefb0b54b2af426e62e795c51aa23 100644 (file)
@@ -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;
index 70b1b16e4e217b7dd1ddf577943eff237837b334..061bb8d11578982d977c6061b719add2ac846f53 100644 (file)
@@ -4,9 +4,6 @@
 #include <inttypes.h>
 #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
index 06751c5662249418866af6e524c6361757630087..ffb02f5c78026749fe6dade4219a3d45392bfed3 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/can/bcm.h>
 
 #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;
 }