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 ...
pull/7/head
Oliver Hartkopp 2007-02-22 12:47:37 +00:00
parent aca93c6867
commit 79cc51a867
2 changed files with 104 additions and 1 deletions

View File

@ -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)

102
slcan_attach.c 100644
View File

@ -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;
}