]> rtime.felk.cvut.cz Git - can-utils.git/commitdiff
Added CAN interface driver for low-cost CAN-Interfaces with ASCII protocol
authorOliver Hartkopp <socketcan@hartkopp.net>
Thu, 22 Feb 2007 12:47:37 +0000 (12:47 +0000)
committerOliver Hartkopp <socketcan@hartkopp.net>
Thu, 22 Feb 2007 12:47:37 +0000 (12:47 +0000)
via serial (or quasi serial via USB) lines.

This driver is partly derived from linux/net/driver/slip.c and uses a new
tty line discipline (N_SLCAN) analogue to N_SLIP to encapsulate can_frames
sent to a slc* netdevice for the serial line and vice versa.

As only the sending and receiving of can_frames is implemented, this driver
should work with the (serial/USB) CAN hardware from:
> www.canusb.com / www.can232.com / www.mictronic.com / www.canhack.de <

The sending and receiving frames format is pretty common. The other settings
and the 'open' command 'O' of the specific adapters may be set with a
terminal programm (like minicom) before switching the CAN data stream to
the slc* netdevice using the slcan_attach userspace tool.

Feel free to send patches / extensions to slcan.c / slcan_attach.c :)

ps. There had been no performances measurements until now. As long as the
data fit's through the 'serial' line it works obviously well. The slcan-driver
nor the Linux network layer will definitely have no problems to process
the received data. Remember the 'low-cost' hardware approach. We'll see ...

Makefile
slcan_attach.c [new file with mode: 0644]

index 5ee020f1e3765e49d24ada762e31ce7d47011317..f52defb1277dad5c9547fa0f9189100cd05eb373 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -43,7 +43,8 @@
 CFLAGS    = -O2 -Wall -Wno-parentheses -I../kernel/2.6/include \
            -fno-strict-aliasing
 
-PROGRAMS = candump cansniffer cansend canplayer cangen log2long log2asc asc2log
+PROGRAMS = candump cansniffer cansend canplayer cangen\
+          log2long log2asc asc2log slcan_attach
 
 all: $(PROGRAMS)
 
diff --git a/slcan_attach.c b/slcan_attach.c
new file mode 100644 (file)
index 0000000..57c6239
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ *  $Id$
+ */
+
+/*
+ * slcan_attach.c - userspace tool for serial line CAN interface driver SLCAN
+ *
+ * Copyright (c) 2002-2005 Volkswagen Group Electronic Research
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, the following disclaimer and
+ *    the referenced file 'COPYING'.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Volkswagen nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * Alternatively, provided that this notice is retained in full, this
+ * software may be distributed under the terms of the GNU General
+ * Public License ("GPL") version 2 as distributed in the 'COPYING'
+ * file from the main directory of the linux kernel source.
+ *
+ * The provided data structures and external interfaces from this code
+ * are not restricted to be used by modules with a GPL compatible license.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Send feedback to <socketcan-users@lists.berlios.de>
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <sys/ioctl.h>
+
+#define N_SLCAN 16 /* bad hack until it's not inside the Kernel */
+
+void usage(char *name)
+{
+       fprintf(stderr, "Usage: %s [-d] tty\n", name);
+       exit(1);
+}
+
+int main(int argc, char **argv)
+{
+       int fd;
+       int ldisc;
+       int detach = 0;
+       char *tty;
+       int opt;
+
+       while ((opt = getopt(argc, argv, "d")) != -1) {
+               switch (opt) {
+               case 'd':
+                       detach = 1;
+                       break;
+               default:
+                       usage(argv[0]);
+                       break;
+               }
+       }
+
+       if (argc - optind != 1)
+               usage(argv[0]);
+
+       tty = argv[optind];
+
+       if ((fd = open (tty, O_RDONLY | O_NOCTTY)) < 0) {
+               perror(tty);
+               exit(1);
+       }
+
+       ldisc = detach ? N_TTY : N_SLCAN;
+       if (ioctl (fd, TIOCSETD, &ldisc) < 0) {
+               perror("ioctl");
+               exit(1);
+       }
+
+       close(fd);
+
+       return 0;
+}