294 lines
7.4 KiB
C
294 lines
7.4 KiB
C
/* $Id: actctrl.c,v 1.4 2007/03/05 18:04:34 keil Exp $
|
|
|
|
* IBM Active 2000 ISDN driver for Linux. (Control-Utility)
|
|
*
|
|
* Copyright 1994,95 by Fritz Elfert (fritz@isdn4linux.de)
|
|
*
|
|
* 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
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
* $Log: actctrl.c,v $
|
|
* Revision 1.4 2007/03/05 18:04:34 keil
|
|
* Small fixes to avoid warnings with newer gcc
|
|
*
|
|
* Revision 1.3 2002/01/31 18:50:51 paul
|
|
* #include <stdlib.h> for prototypes against warnings.
|
|
*
|
|
* Revision 1.2 1999/09/06 08:03:23 fritz
|
|
* Changed my mail-address.
|
|
*
|
|
* Revision 1.1 1997/09/25 21:41:37 fritz
|
|
* Added actctrl.
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <linux/isdn.h>
|
|
#include "act2000.h"
|
|
|
|
char *cmd;
|
|
char *ctrldev;
|
|
int arg_ofs;
|
|
|
|
void
|
|
usage()
|
|
{
|
|
#if 0
|
|
fprintf(stderr, "usage: %s [-d driverId] io [port] [irq] (get/set hw-io)\n", cmd);
|
|
#endif
|
|
fprintf(stderr, " or: %s [-d driverId] add [bus [port [irq [id]]]] (Add a new card\n", cmd);
|
|
fprintf(stderr, " or: %s [-d driverId] load <bootcode> (load firmware)\n", cmd);
|
|
fprintf(stderr, " or: %s [-d driverId] dproto <1tr6|euro> [msn's] (set D-channel protocol)\n", cmd);
|
|
#if 0
|
|
fprintf(stderr, " or: %s [-d driverId] dbg <num> (devel Func)\n", cmd);
|
|
#endif
|
|
exit(-1);
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
int fd;
|
|
FILE *code;
|
|
int ac;
|
|
int a;
|
|
u_char buf[500000];
|
|
isdn_ioctl_struct ioctl_s;
|
|
act2000_ddef dload;
|
|
act2000_cdef newcard;
|
|
|
|
cmd = strrchr(argv[0], '/');
|
|
cmd = (cmd == NULL) ? argv[0] : cmd + 1;
|
|
if (argc > 1) {
|
|
if (!strcmp(argv[1], "-d")) {
|
|
strcpy(ioctl_s.drvid, argv[2]);
|
|
arg_ofs = 3;
|
|
} else {
|
|
ioctl_s.drvid[0] = '\0';
|
|
arg_ofs = 1;
|
|
}
|
|
} else
|
|
usage();
|
|
ac = argc - (arg_ofs - 1);
|
|
fd = open("/dev/isdnctrl", O_RDWR);
|
|
if (fd < 0) {
|
|
perror("/dev/isdnctrl");
|
|
exit(-1);
|
|
}
|
|
if (!strcmp(argv[arg_ofs], "add")) {
|
|
if (ac < 3)
|
|
usage();
|
|
if (ac >= 3) {
|
|
a = -1;
|
|
if (!strcmp(argv[arg_ofs + 1], "isa"))
|
|
a = ACT2000_BUS_ISA;
|
|
if (!strcmp(argv[arg_ofs + 1], "mca"))
|
|
a = ACT2000_BUS_MCA;
|
|
if (!strcmp(argv[arg_ofs + 1], "pcmcia"))
|
|
a = ACT2000_BUS_PCMCIA;
|
|
if (a == -1) {
|
|
fprintf(stderr, "Bus must be \"isa\", \"mca\" or \"pcmcia\"\n");
|
|
exit(-1);
|
|
}
|
|
if (a != ACT2000_BUS_ISA) {
|
|
fprintf(stderr, "Currently only isa Bus is supported\n");
|
|
exit(-1);
|
|
}
|
|
newcard.bus = a;
|
|
}
|
|
a = -2;
|
|
if (ac >= 4) {
|
|
if (!strcmp(argv[arg_ofs + 2], "auto"))
|
|
a = -1;
|
|
else
|
|
sscanf(argv[arg_ofs + 2], "%i", &a);
|
|
if (a == 0x200 || a == 0x240 || a == 0x280 || a == 0x2c0
|
|
|| a == 0x300 || a == 0x340 || a == 0x380 ||
|
|
a == 0xcfe0 || a == 0xcfa0 || a == 0xcf60 || a == 0xcf20
|
|
|| a == 0xcee0 || a == 0xcea0 || a == 0xce60 || a == -1)
|
|
newcard.port = a;
|
|
else {
|
|
fprintf(stderr, "Invalid port. Possible values are:\n");
|
|
fprintf(stderr, " 0x200, 0x240, 0x280, 0x2c0, 0x300, 0x340\n");
|
|
fprintf(stderr, " 0x380, 0xcfe0, 0xcfa0, 0xcf60, 0xcf20\n");
|
|
fprintf(stderr, " 0xcee0, 0xcea0, 0xce60 or \"auto\"\n");
|
|
exit(-1);
|
|
}
|
|
}
|
|
newcard.irq = -1;
|
|
if (ac >= 5) {
|
|
a = -2;
|
|
if (!strcmp(argv[arg_ofs + 3], "auto"))
|
|
a = -1;
|
|
if (!strcmp(argv[arg_ofs + 3], "none"))
|
|
a = 0;
|
|
if (a == -2)
|
|
sscanf(argv[arg_ofs + 2], "%i", &a);
|
|
if (a == 3 || a == 5 || a == 7 || a == 10 || a == 11 || a == 12
|
|
|| a == 15 || a == -1 || a == 0)
|
|
newcard.irq = a;
|
|
else {
|
|
fprintf(stderr, "Invalid IRQ. Possible values are:\n");
|
|
fprintf(stderr, " 3, 5, 7, 10, 11, 12, 15, \"auto\" or \"none\"\n");
|
|
exit(-1);
|
|
}
|
|
}
|
|
ioctl_s.arg = (unsigned long) &newcard;
|
|
newcard.id[0] = 0;
|
|
if (ac >= 6)
|
|
strncpy(newcard.id, argv[arg_ofs + 4], sizeof(newcard.id) - 1);
|
|
if ((ioctl(fd, ACT2000_IOCTL_ADDCARD + IIOCDRVCTL, &ioctl_s)) < 0) {
|
|
perror("ioctl ADDCARD");
|
|
exit(-1);
|
|
}
|
|
close(fd);
|
|
return 0;
|
|
}
|
|
#if 0
|
|
if (!strcmp(argv[arg_ofs], "io")) {
|
|
if (ac == 4) {
|
|
if (sscanf(argv[arg_ofs + 1], "%i", &mmio) != 1)
|
|
usage();
|
|
if (sscanf(argv[arg_ofs + 2], "%i", &port) != 1)
|
|
usage();
|
|
ioctl_s.arg = mmio;
|
|
if ((mmio = ioctl(fd, ICN_IOCTL_SETMMIO + IIOCDRVCTL, &ioctl_s)) < 0) {
|
|
perror("ioctl SETMMIO");
|
|
exit(-1);
|
|
}
|
|
ioctl_s.arg = port;
|
|
if ((port = ioctl(fd, ICN_IOCTL_SETPORT + IIOCDRVCTL, &ioctl_s)) < 0) {
|
|
perror("ioctl SETPORT");
|
|
exit(-1);
|
|
}
|
|
}
|
|
if ((mmio = ioctl(fd, ICN_IOCTL_GETMMIO + IIOCDRVCTL, &ioctl_s)) < 0) {
|
|
perror("ioctl GETMMIO");
|
|
exit(-1);
|
|
}
|
|
if ((port = ioctl(fd, ICN_IOCTL_GETPORT + IIOCDRVCTL, &ioctl_s)) < 0) {
|
|
perror("ioctl GETPORT");
|
|
exit(-1);
|
|
}
|
|
printf("Memory-mapped io at 0x%08lx, port 0x%03x\n",
|
|
(unsigned long) mmio, (unsigned short) port);
|
|
close(fd);
|
|
return 0;
|
|
}
|
|
#endif
|
|
if (!strcmp(argv[arg_ofs], "load")) {
|
|
if (ac == 3) {
|
|
if (!(code = fopen(argv[arg_ofs + 1], "r"))) {
|
|
perror(argv[arg_ofs + 1]);
|
|
exit(-1);
|
|
}
|
|
dload.buffer = buf;
|
|
if ((dload.length = fread(buf, 1, sizeof(buf), code)) < 1) {
|
|
fprintf(stderr, "Read error on %s\n", argv[arg_ofs + 1]);
|
|
exit(-1);
|
|
}
|
|
dload.length -= 32;
|
|
dload.buffer += 32;
|
|
printf("Loading Firmware %s ... ", argv[arg_ofs + 1]);
|
|
fflush(stdout);
|
|
ioctl_s.arg = (ulong) & dload;
|
|
if (ioctl(fd, ACT2000_IOCTL_LOADBOOT + IIOCDRVCTL, &ioctl_s) < 0) {
|
|
perror("\nioctl LOADBOOT");
|
|
exit(-1);
|
|
}
|
|
fclose(code);
|
|
printf("done\n");
|
|
return 0;
|
|
}
|
|
usage();
|
|
}
|
|
if (!strcmp(argv[arg_ofs], "dproto")) {
|
|
if (ac >= 3) {
|
|
char msnlist[1024];
|
|
|
|
int proto = -1;
|
|
if (strcmp(argv[arg_ofs + 1], "1tr6") == 0)
|
|
proto = 0;
|
|
if (strcmp(argv[arg_ofs + 1], "euro") == 0)
|
|
proto = 1;
|
|
if (proto == -1)
|
|
usage();
|
|
msnlist[0] = '\0';
|
|
if (ac > 3) {
|
|
if (proto == 0)
|
|
usage();
|
|
strcpy(msnlist, argv[arg_ofs + 2]);
|
|
}
|
|
ioctl_s.arg = (ulong)proto;
|
|
if (ioctl(fd, ACT2000_IOCTL_SETPROTO + IIOCDRVCTL, &ioctl_s) < 0) {
|
|
perror("ioctl SETPROTO");
|
|
exit(-1);
|
|
}
|
|
if (strlen(msnlist)) {
|
|
char *p = msnlist;
|
|
char m[17];
|
|
int i = 0;
|
|
char *q;
|
|
|
|
while ((q = strtok(p, ",")) && (i<10)) {
|
|
p = NULL;
|
|
if (strlen(q) > 15) {
|
|
fprintf(stderr, "MSN may not exceed 15 digits\n");
|
|
exit(-1);
|
|
}
|
|
if (q[0] == '-')
|
|
sprintf(m, "%d", i);
|
|
else
|
|
sprintf(m, "%d%s", i, q);
|
|
ioctl_s.arg = (ulong)&m;
|
|
if (ioctl(fd, ACT2000_IOCTL_SETMSN + IIOCDRVCTL, &ioctl_s) < 0) {
|
|
perror("ioctl SETMSN");
|
|
exit(-1);
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
usage();
|
|
}
|
|
if (!strcmp(argv[arg_ofs], "dbg")) {
|
|
if (ac == 3) {
|
|
int res;
|
|
unsigned long parm;
|
|
res = sscanf(argv[arg_ofs + 1], "%li", &parm);
|
|
if (res != 1) {
|
|
fprintf(stderr, "Couldn't read parameter\n");
|
|
exit(-1);
|
|
}
|
|
ioctl_s.arg = parm;
|
|
if (ioctl(fd, ACT2000_IOCTL_TEST + IIOCDRVCTL, &ioctl_s) < 0) {
|
|
perror("ioctl TEST");
|
|
exit(-1);
|
|
}
|
|
return 0;
|
|
}
|
|
usage();
|
|
}
|
|
usage();
|
|
return 0;
|
|
}
|