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
parent
aca93c6867
commit
79cc51a867
3
Makefile
3
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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
Loading…
Reference in New Issue