From 9bf2e4c9892766dfa64e978fb17057b638659d57 Mon Sep 17 00:00:00 2001 From: Craig Small Date: Thu, 10 May 2001 10:44:45 +0000 Subject: synced to klaus code --- dmascc/Makefile | 399 +++++++++++++++++++++++++++++++++++++++++++++++++++ dmascc/README.dmascc | 63 +++++--- dmascc/dmascc_cfg.c | 264 +++++++++++++++++++++++++--------- 3 files changed, 641 insertions(+), 85 deletions(-) create mode 100644 dmascc/Makefile (limited to 'dmascc') diff --git a/dmascc/Makefile b/dmascc/Makefile new file mode 100644 index 0000000..1a062ca --- /dev/null +++ b/dmascc/Makefile @@ -0,0 +1,399 @@ +# Generated automatically from Makefile.in by configure. +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = .. +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/ax25-tools +pkglibdir = $(libdir)/ax25-tools +pkgincludedir = $(includedir)/ax25-tools + +top_builddir = .. + +ACLOCAL = aclocal +AUTOCONF = autoconf +AUTOMAKE = automake +AUTOHEADER = autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL_PROGRAM} +transform = s,x,x, + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +AWK = mawk +AX25IO_LIB = +AX25_LIB = -lax25 +CC = gcc +CXX = c++ +DMASCC = +FLTK_LIB = -lfltk -lGL -lSM -lICE -lXi -lXext -lX11 +MAKEINFO = /home/csmall/ax25/ax25-tools/missing makeinfo +NCURSES_LIB = -lncurses +PACKAGE = ax25-tools +UTIL_LIB = -lutil +VERSION = 0.0.8cvs +Z_LIB = -lz + +sbin_PROGRAMS = dmascc_cfg + +dmascc_cfg_SOURCE = dmascc_cfg.c + +man_MANS = dmascc_cfg.1 + +EXTRA_DIST = $(man_MANS) $(doc_DATA) + +docdir = $(datadir)/doc/ax25-tools +doc_DATA = README.dmascc +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(sbin_PROGRAMS) + + +DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I.. +CPPFLAGS = +LDFLAGS = +LIBS = +X_CFLAGS = -I/usr/X11R6/include +X_LIBS = -L/usr/X11R6/lib +X_EXTRA_LIBS = +X_PRE_LIBS = -lSM -lICE +dmascc_cfg_SOURCES = dmascc_cfg.c +dmascc_cfg_OBJECTS = dmascc_cfg.o +dmascc_cfg_LDADD = $(LDADD) +dmascc_cfg_DEPENDENCIES = +dmascc_cfg_LDFLAGS = +CFLAGS = -g -O2 -Wall +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DATA = $(doc_DATA) + +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +DEP_FILES = .deps/dmascc_cfg.P +SOURCES = dmascc_cfg.c +OBJECTS = dmascc_cfg.o + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu dmascc/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-sbinPROGRAMS: + +clean-sbinPROGRAMS: + -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) + +distclean-sbinPROGRAMS: + +maintainer-clean-sbinPROGRAMS: + +install-sbinPROGRAMS: $(sbin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(sbindir) + @list='$(sbin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-sbinPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(sbin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +dmascc_cfg: $(dmascc_cfg_OBJECTS) $(dmascc_cfg_DEPENDENCIES) + @rm -f dmascc_cfg + $(LINK) $(dmascc_cfg_LDFLAGS) $(dmascc_cfg_OBJECTS) $(dmascc_cfg_LDADD) $(LIBS) + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 + +install-docDATA: $(doc_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(docdir) + @list='$(doc_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p; \ + fi; fi; \ + done + +uninstall-docDATA: + @$(NORMAL_UNINSTALL) + list='$(doc_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(docdir)/$$p; \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = dmascc + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu dmascc/Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + +DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) + +-include $(DEP_FILES) + +mostlyclean-depend: + +clean-depend: + +distclean-depend: + -rm -rf .deps + +maintainer-clean-depend: + +%.o: %.c + @echo '$(COMPILE) -c $<'; \ + $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.c + @echo '$(LTCOMPILE) -c $<'; \ + $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: install-sbinPROGRAMS +install-exec: install-exec-am + +install-data-am: install-man install-docDATA +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-sbinPROGRAMS uninstall-man uninstall-docDATA +uninstall: uninstall-am +all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man1 \ + $(DESTDIR)$(docdir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-sbinPROGRAMS mostlyclean-compile \ + mostlyclean-tags mostlyclean-depend mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-sbinPROGRAMS clean-compile clean-tags clean-depend \ + clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-sbinPROGRAMS distclean-compile distclean-tags \ + distclean-depend distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-sbinPROGRAMS \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-depend maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS \ +clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \ +install-sbinPROGRAMS mostlyclean-compile distclean-compile \ +clean-compile maintainer-clean-compile install-man1 uninstall-man1 \ +install-man uninstall-man uninstall-docDATA install-docDATA tags \ +mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \ +distdir mostlyclean-depend distclean-depend clean-depend \ +maintainer-clean-depend info-am info dvi-am dvi check check-am \ +installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +installconf: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/dmascc/README.dmascc b/dmascc/README.dmascc index fcd7746..1945616 100644 --- a/dmascc/README.dmascc +++ b/dmascc/README.dmascc @@ -1,3 +1,5 @@ +$Id: README.dmascc,v 1.2 2001/05/10 10:44:45 csmall Exp $ + The dmascc_cfg utility ====================== @@ -14,18 +16,19 @@ Options: --show Show all configurable parameters for this port. May be specified at any time by any user. -All other options change parameters and thus may only be specified - - by root - - when the interface is down +All other options change parameters and thus may only be specified by root +and only when the interface is down. + +f ... floating-point argument, i ... integer argument. ---speed Set frequency of baud rate generator. A value of 0 disables +--frequency f Set frequency of baud rate generator. A value of 0 disables the baud rate generator and the digital PLL. Use the --show option to check whether the frequency you selected could be approximated with sufficient accuracy. --nrzi 0 | 1 0 selects NRZ mode, 1 selects NRZI mode. ---clocks Set clock mode. You may OR together three choices (other +--clocks i Set clock mode. You may OR together three choices (other values are not supported and may cause strange results): TX clock pin: 0x00 input @@ -45,25 +48,49 @@ All other options change parameters and thus may only be specified * Not allowed on PI2 Port A if J3 is installed. # TX clock pin must be configured as input - + Speed must be equal to 32 times the baud rate. + + The BRG frequency must be equal to 32 times the baud rate. + +--txdelay f Set the transmit delay (in ms). + +--txpause f Set the delay (in ms) between two transmitted packets. + This parameter sometimes helps to reduce RX FIFO overruns, + if the receiving station has a slower CPU than the + transmitting station and cannot re-initialize the SCC's + receiver quickly enough. ---txdelay Set transmit delay in ms (0 < f < 2500). +--txtimeout f Set the time (in ms), after which the transmitter may + not squeeze in another packet, but rather has to go + off-air. ---txtime Set maximum time in s the transmitter may be active - (0 < f). +--txtail f Set the time (in ms) between the end of the last packet + and the RTS line actually going inactive. ---sqdelay Set squelch delay in ms (0 < f < 2500). +--rtsoff f Set the DCD settling time (in ms) after switching off the + transmitter. During this period the DCD line is being + ignored. This parameter is especially useful for the + S5SCC/DMA, which frequently generates short DCD pulses + after switching from TX to RX. ---slottime Set slot time in ms (0 < f < 2500). +--dcdon f Set the DCD settling time (in ms) after the DCD line has + become active. This parameter should be < txdelay. ---waittime Set the minimum time in ms between transmitter off and - transmitter on (0 < f < 2500). +--dcdoff f Set the DCD settling time (in ms) after the DCD line has + become inactive. This parameter should be >= rtsoff. ---persist Set persistence parameter (0 <= i <= 255). +--slottime f Set the slot time (in ms). ---dma Set DMA channel (0, 1, or 3). 0 disables DMA. +--persist i Set the persistence parameter (1 <= i <= 256). After the + DCD off settling time has expired, the driver waits + random(0..255)/persist*slottime before activating the + RTS line. Integer arithmetic is being performed; + persist==256 thus means zero delay in any case (which only + makes sense in a two-station scenario). - ... floating-point argument, ... integer argument. -Parameters are not checked for validity. The driver or the kernel may crash -if you specify invalid values. +--waittime f Set the minimum time (in ms) before a station may start + transmitting again (after the RTS off settling time has + expired). This value should be larger than + 255/persist*slottime. +--dma i Set the DMA channel (-1, 0, 1, or 3). -1 disables DMA. + 0 is only valid on the S5SCC/DMA. Remember, DMA can be + used only on channel A (dmascc0, dmascc2, and so on). diff --git a/dmascc/dmascc_cfg.c b/dmascc/dmascc_cfg.c index 4cece3d..47b4ac2 100644 --- a/dmascc/dmascc_cfg.c +++ b/dmascc/dmascc_cfg.c @@ -1,8 +1,8 @@ /* - * $Id: dmascc_cfg.c,v 0.7 1997/12/02 11:31:21 oe1kib Exp $ + * $Id: dmascc_cfg.c,v 1.2 2001/05/10 10:44:45 csmall Exp $ * * Configuration utility for dmascc driver - * Copyright (C) 1997 Klaus Kudielka + * Copyright (C) 1997,2000 Klaus Kudielka * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,36 +26,68 @@ #include #include #include -#include -#include +#include #include -void usage(char *name) +/* Ioctls */ +#define SIOCGSCCPARAM SIOCDEVPRIVATE +#define SIOCSSCCPARAM (SIOCDEVPRIVATE+1) + +/* Frequency of timer 0 */ +#define TMR_0_HZ 25600 + +/* Configurable parameters */ +struct scc_param { + int pclk_hz; /* frequency of BRG input (don't change) */ + int brg_tc; /* BRG terminal count; BRG disabled if < 0 */ + int nrzi; /* 0 (nrz), 1 (nrzi) */ + int clocks; /* see dmascc_cfg documentation */ + int txdelay; /* [1/TMR_0_HZ] */ + int txtimeout; /* [1/HZ] */ + int txtail; /* [1/TMR_0_HZ] */ + int waittime; /* [1/TMR_0_HZ] */ + int slottime; /* [1/TMR_0_HZ] */ + int persist; /* 1 ... 256 */ + int dma; /* -1 (disable), 0, 1, 3 */ + int txpause; /* [1/TMR_0_HZ] */ + int rtsoff; /* [1/TMR_0_HZ] */ + int dcdon; /* [1/TMR_0_HZ] */ + int dcdoff; /* [1/TMR_0_HZ] */ + int reserved[35]; +}; + +void usage(void) { fprintf(stderr, - "usage: %s [ options ... ]\n\n" - "options: --show show configuration\n" - " --speed set baud rate\n" - " --nrzi 0 | 1 set NRZ or NRZI encoding\n" - " --clocks set clock mode\n" - " --txdelay set transmit delay in ms\n" - " --txtime set maximum transmit time in s\n" - " --sqdelay set squelch delay in ms\n" - " --slottime set slot time in ms\n" - " --waittime set wait time after transmit in ms\n" - " --persist set persistence parameter\n" - " --dma set DMA channel\n", name); + "usage: dmascc_cfg [ options ... ]\n\n" + "options: --show show updated configuration\n" + " --frequency f frequency of baud rate generator in Hz\n" + " --nrzi n NRZ (0) or NRZI (1) encoding\n" + " --clocks n clock mode (see manual page)\n" + " --txdelay t transmit delay in ms\n" + " --txpause t inter-packet delay in ms\n" + " --txtimeout t stop transmitting packets after t ms\n" + " --txtail t transmit tail in ms\n" + " --rtsoff t DCD settling time in ms (after RTS off)\n" + " --dcdon t DCD settling time in ms (after DCD on)\n" + " --dcdoff t DCD settling time in ms (after DCD off)\n" + " --slottime t slot time in ms\n" + " --persist n persistence parameter (1..256)\n" + " --waittime t wait time after transmit in ms\n" + " --dma n " + "DMA channel: -1 (no DMA), 0 (S5SCC/DMA only), 1, 3\n" + ); } int main(int argc, char *argv[]) { - int sk, show = 0, set = 0, error = 0; + int sk, show = 0, set = 0, old = 0, secondary; struct ifreq ifr; struct scc_param param; - char **option, *end; + char **option, *end, *error = NULL; if (argc < 2) { - usage(argv[0]); + usage(); return 1; } @@ -64,6 +96,14 @@ int main(int argc, char *argv[]) return 2; } + memset(¶m, 0, sizeof(param)); + param.txpause = -1; + + if strncmp(argv[1], "dmascc", 6) { + fprintf(stderr, "invalid interface name.\n"); + return 5; + } + strncpy(ifr.ifr_name, argv[1], IFNAMSIZ); ifr.ifr_data = (caddr_t) ¶m; if (ioctl(sk, SIOCGSCCPARAM, &ifr) < 0) { @@ -72,91 +112,173 @@ int main(int argc, char *argv[]) return 3; } + if (param.txpause == -1) { + param.txpause = 0; + old = 1; + } + + secondary = argv[1][strlen(argv[1])-1]%2; + option = argv + 2; while (!error && *option != NULL) { if (!strcmp(*option, "--show")) { show = 1; option++; - } else if (!strcmp(*option, "--speed")) { + } else if (!strcmp(*option, "--frequency")) { option++; if (*option != NULL) { - double speed; + double f; set = 1; - speed = strtod(*option++, &end); - if (*end) error = 1; else { - if (speed <= 0.0) param.brg_tc = -1; - else param.brg_tc = param.pclk_hz / (speed * 2) - 2; - if (param.brg_tc > 0xffff) param.brg_tc = -1; + f = strtod(*option++, &end); + if (*end) error = "frequency not a number"; + else { + if (f < 0.0) error = "frequency < 0"; + else if (f == 0.0) param.brg_tc = -1; + else { + param.brg_tc = param.pclk_hz / (f * 2) - 2; + if (param.brg_tc > 0xffff) error = "frequency too low"; + if (param.brg_tc < 0) error = "frequency too high"; + } } - } else error = 1; + } else error = "--frequency requires parameter"; } else if (!strcmp(*option, "--nrzi")) { option++; if (*option != NULL) { set = 1; param.nrzi = strtol(*option++, &end, 0); - if (*end) error = 1; - } else error = 1; + if (*end || param.nrzi < 0 || param.nrzi > 1) + error = "nrzi must be 0 or 1"; + } else error = "--nrzi requires parameter"; } else if (!strcmp(*option, "--clocks")) { option++; if (*option != NULL) { set = 1; param.clocks = strtol(*option++, &end, 0); - if (*end) error = 1; - } else error = 1; + if (*end) error = "clock mode not a number"; + else if ((param.clocks & ~0x7f)) error = "invalid clock mode"; + } else error = "--clocks requires parameter"; } else if (!strcmp(*option, "--txdelay")) { option++; if (*option != NULL) { set = 1; param.txdelay = TMR_0_HZ * strtod(*option++, &end) / 1000.0; - if (*end) error = 1; - } else error = 1; - } else if (!strcmp(*option, "--txtime")) { + if (*end) error = "txdelay not a number"; + else if (param.txdelay < 0) error = "txdelay < 0"; + else if (param.txdelay > 0xffff) error = "txdelay too large"; + } else error = "--txdelay requires parameter"; + } else if (!strcmp(*option, "--txpause")) { option++; if (*option != NULL) { set = 1; - param.txtime = HZ * strtod(*option++, &end); - if (*end) error = 1; - } else error = 1; - } else if (!strcmp(*option, "--sqdelay")) { + param.txpause = TMR_0_HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "txpause not a number"; + else if (param.txpause < 0) error = "txpause < 0"; + else if (param.txpause > 0xffff) error = "txpause too large"; + if (old && param.txpause != 0) + fprintf(stderr, "warning: old driver; txpause not supported.\n"); + } else error = "--txpause requires parameter"; + } else if (!strcmp(*option, "--txtimeout")) { option++; if (*option != NULL) { set = 1; - param.sqdelay = TMR_0_HZ * strtod(*option++, &end) / 1000.0; - if (*end) error = 1; - } else error = 1; - } else if (!strcmp(*option, "--slottime")) { + param.txtimeout = HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "txtimeout not a number"; + else if (param.txtimeout < 0) error = "txtimeout < 0"; + } else error = "--txtimeout requires parameter"; + } else if (!strcmp(*option, "--txtail")) { option++; if (*option != NULL) { set = 1; - param.slottime = TMR_0_HZ * strtod(*option++, &end) / 1000.0; - if (*end) error = 1; - } else error = 1; - } else if (!strcmp(*option, "--waittime")) { + param.txtail = TMR_0_HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "txtail not a number"; + else if (param.txtail < 0) error = "txtail < 0"; + else if (param.txtail > 0xffff) error = "txtail too large"; + } else error = "--txtail requires parameter"; + } else if (!strcmp(*option, "--rtsoff")) { option++; if (*option != NULL) { set = 1; - param.waittime = TMR_0_HZ * strtod(*option++, &end) / 1000.0; - if (*end) error = 1; - } else error = 1; + param.rtsoff = TMR_0_HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "rtsoff not a number"; + else if (param.rtsoff < 0) error = "rtsoff < 0"; + else if (param.rtsoff > 0xffff) error = "rtsoff too large"; + if (old && param.rtsoff != 0) + fprintf(stderr, "warning: old driver; rtsoff not supported.\n"); + } else error = "--rtsoff requires parameter"; + } else if (!strcmp(*option, "--dcdon")) { + option++; + if (*option != NULL) { + set = 1; + param.dcdon = TMR_0_HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "dcdon not a number"; + else if (param.dcdon < 0) error = "dcdon < 0"; + else if (param.dcdon > 0xffff) error = "dcdon too large"; + if (old && param.dcdon != 0) + fprintf(stderr, "warning: old driver; dcdon not supported.\n"); + } else error = "--dcdon requires parameter"; + } else if (!strcmp(*option, "--dcdoff")) { + option++; + if (*option != NULL) { + set = 1; + param.dcdoff = TMR_0_HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "dcdoff not a number"; + else if (param.dcdoff < 0) error = "dcdoff < 0"; + else if (param.dcdoff > 0xffff) error = "dcdoff too large"; + if (old && param.dcdoff != 0) + fprintf(stderr, "warning: old driver; dcdoff not supported.\n"); + } else error = "--dcdoff requires parameter"; + } else if (!strcmp(*option, "--slottime")) { + option++; + if (*option != NULL) { + set = 1; + param.slottime = TMR_0_HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "slottime not a number"; + else if (param.slottime < 0) error = "slottime < 0"; + else if (param.slottime > 0xffff) error = "slottime too large"; + } else error = "--slottime requires parameter"; } else if (!strcmp(*option, "--persist")) { option++; if (*option != NULL) { set = 1; param.persist = strtol(*option++, &end, 0); - if (*end) error = 1; - } else error = 1; + if (*end) error = "persist not a number"; + else if (param.persist < 1) error = "persist < 1"; + else if (param.persist > 256) error = "persist > 256"; + } else error = "--persist requires parameter"; + } else if (!strcmp(*option, "--waittime")) { + option++; + if (*option != NULL) { + set = 1; + param.waittime = TMR_0_HZ * strtod(*option++, &end) / 1000.0; + if (*end) error = "waittime not a number"; + else if (param.waittime < 0) error = "waittime < 0"; + else if (param.waittime > 0xffff) error = "waittime too large"; + } else error = "--waittime requires parameter"; } else if (!strcmp(*option, "--dma")) { option++; if (*option != NULL) { + int dma = param.dma; set = 1; param.dma = strtol(*option++, &end, 0); - if (*end) error = 1; - } else error = 1; - } else error = 1; + if (*end) error = "DMA channel not a number"; + else if (secondary && param.dma != -1) + error = "SCC port B must have DMA disabled"; + else if (param.dma < -1 || param.dma == 2 || param.dma > 3) + error = "invalid DMA channel"; + else if (param.pclk_hz != 9830400 && param.dma == 0) + error = "only S5SCC/DMA supports DMA channel 0"; + else if (old && param.dma == 0) + error = "old driver; DMA channel 0 not supported"; + else if (old && param.dma == -1 && dma > 0) + error = "old driver; reload module or reboot to disable DMA"; + else if (old && param.dma == -1 && dma == 0) + param.dma = 0; + } else error = "--dma requires parameter"; + } else error = "invalid option"; } if (error) { - usage(argv[0]); + fprintf(stderr, "usage error: %s.\n", error); close(sk); return 1; } @@ -170,20 +292,28 @@ int main(int argc, char *argv[]) } if (show) { - double speed; - if (param.brg_tc < 0) speed = 0.0; - else speed = ((double) param.pclk_hz) / ( 2 * (param.brg_tc + 2)); - printf("speed = %.2f\nnrzi = %d\nclocks = 0x%02X\n" - "txdelay = %.2f ms\ntxtime = %.2f s\nsqdelay = %.2f ms\n" - "slottime = %.2f ms\nwaittime = %.2f ms\npersist = %d\n" - "dma = %d\n", - speed, param.nrzi, param.clocks, + double f; + if (param.brg_tc < 0) f = 0.0; + else f = ((double) param.pclk_hz) / ( 2 * (param.brg_tc + 2)); + printf("dmascc_cfg %s \\\n--frequency %.2f --nrzi %d --clocks 0x%02X " + "--txdelay %.2f \\\n--txpause %.2f --txtimeout %.2f " + "--txtail %.2f --rtsoff %.2f \\\n--dcdon %.2f --dcdoff %.2f " + "--slottime %.2f --persist %d \\\n--waittime %.2f --dma %d\n", + argv[1], + f, + param.nrzi, + param.clocks, param.txdelay * 1000.0 / TMR_0_HZ, - (double) param.txtime / HZ, - param.sqdelay * 1000.0 / TMR_0_HZ, + param.txpause * 1000.0 / TMR_0_HZ, + param.txtimeout * 1000.0 / HZ, + param.txtail * 1000.0 / TMR_0_HZ, + param.rtsoff * 1000.0 / TMR_0_HZ, + param.dcdon * 1000.0 / TMR_0_HZ, + param.dcdoff * 1000.0 / TMR_0_HZ, param.slottime * 1000.0 / TMR_0_HZ, + param.persist, param.waittime * 1000.0 / TMR_0_HZ, - param.persist, param.dma); + (old && param.dma == 0) ? -1 : param.dma); } close(sk); -- cgit v1.2.3