From 79cc51a867d27bfc6f22ebf5c38a9624194ee6a5 Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Thu, 22 Feb 2007 12:47:37 +0000 Subject: [PATCH] Added CAN interface driver for low-cost CAN-Interfaces with ASCII protocol 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 | 3 +- slcan_attach.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 slcan_attach.c diff --git a/Makefile b/Makefile index 5ee020f..f52defb 100644 --- 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 index 0000000..57c6239 --- /dev/null +++ b/slcan_attach.c @@ -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 + * + */ + +#include +#include +#include +#include +#include +#include + +#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; +} -- 2.7.4