/* * $Id: avmcapictrl.c,v 1.2 1997/03/20 00:18:57 luethje Exp $ * * AVM-B1-ISDN driver for Linux. (Control-Utility) * * Copyright 1996 by Carsten Paeth (calle@calle.in-berlin.de) * * $Log: avmcapictrl.c,v $ * Revision 1.2 1997/03/20 00:18:57 luethje * inserted the line #include in avmb1/avmcapictrl.c and imon/imon.c, * some bugfixes, new structure in isdnlog/isdnrep/isdnrep.c. * * Revision 1.1 1997/03/04 22:46:32 calle * Added program to add and download firmware to AVM-B1 card * * Revision 2.2 1997/02/12 09:31:39 calle * more verbose error messages * * Revision 1.1 1997/01/31 10:32:20 calle * Initial revision * * */ #include #include #include #include #include #include #include #include #include #include #include #include #include char *cmd; char *ctrldev; int arg_ofs; void usage(void) { fprintf(stderr, "usage: %s add (Add a new card)\n", cmd); fprintf(stderr, " or: %s load [contrnr] (load firmware)\n", cmd); fprintf(stderr, " or: %s reset [contrnr] (reset controller)\n", cmd); exit(1); } int validports[] = {0x150, 0x250, 0x300, 0x340, 0}; int validirqs[] = { 3, 4, 5, 6, 7, 9, 10, 11, 12, 15, 0}; int main(int argc, char **argv) { int fd; int ac; capi_manufacturer_cmd ioctl_s; avmb1_carddef newcard; avmb1_loaddef ldef; avmb1_resetdef rdef; int port, irq; cmd = strrchr(argv[0], '/'); cmd = (cmd == NULL) ? argv[0] : ++cmd; if (argc > 1) { arg_ofs = 1; } else usage(); ac = argc - (arg_ofs - 1); fd = open("/dev/capi20", O_RDWR); if (fd < 0) { switch (errno) { case ENOENT: perror("Device file /dev/capi20 missing, use instdev"); exit(2); case ENODEV: perror("device capi20 not registered"); fprintf(stderr, "look in /proc/devices.\n"); fprintf(stderr, "maybe the devicefiles are installed with a wrong majornumber,\n"); fprintf(stderr, "or you linux kernel version only supports 64 char device (check /usr/include/linux/major.h)\n"); exit(2); } perror("/dev/capi20"); exit(-1); } if (!strcmp(argv[arg_ofs], "add")) { if (ac >= 4) { int i; sscanf(argv[arg_ofs + 1], "%i", &port); sscanf(argv[arg_ofs + 2], "%i", &irq); for (i = 0; validports[i] && port != validports[i]; i++); if (!validports[i]) { fprintf(stderr, "%s: illegal io-addr 0x%x\n", cmd, port); fprintf(stderr, "%s: try one of 0x%x", cmd, validports[0]); for (i = 1; validports[i]; i++) fprintf(stderr, ", 0x%x", validports[i]); fprintf(stderr, "\n"); exit(-1); } for (i = 0; validirqs[i] && irq != validirqs[i]; i++); if (!validirqs[i]) { fprintf(stderr, "%s: illegal irq %d\n", cmd, irq); fprintf(stderr, "%s: try one of %d", cmd, validirqs[0]); for (i = 1; validirqs[i]; i++) fprintf(stderr, ", %d", validirqs[i]); fprintf(stderr, "\n"); exit(-1); } newcard.port = port; newcard.irq = irq; ioctl_s.cmd = AVMB1_ADDCARD; ioctl_s.data = &newcard; if ((ioctl(fd, CAPI_MANUFACTURER_CMD, &ioctl_s)) < 0) { perror("ioctl ADDCARD"); exit(-1); } close(fd); return 0; } } if (!strcmp(argv[arg_ofs], "load")) { struct stat st; int codefd; int contr = 1; if (ac > 3) contr = atoi(argv[arg_ofs + 2]); if (stat(argv[arg_ofs + 1], &st)) { perror(argv[arg_ofs + 1]); exit(2); } if (!(codefd = open(argv[arg_ofs + 1], O_RDONLY))) { perror(argv[arg_ofs + 1]); exit(-1); } ldef.contr = contr; ldef.t4file.len = st.st_size; ldef.t4file.data = mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, codefd, 0); if (ldef.t4file.data == (unsigned char *) -1) { perror("mmap"); exit(2); } printf("Loading Bootcode %s ... ", argv[arg_ofs + 1]); fflush(stdout); ioctl_s.cmd = AVMB1_LOAD; ioctl_s.data = &ldef; if ((ioctl(fd, CAPI_MANUFACTURER_CMD, &ioctl_s)) < 0) { perror("\nioctl LOAD"); exit(2); } munmap(ldef.t4file.data, ldef.t4file.len); close(codefd); close(fd); printf("done\n"); return 0; } if (!strcmp(argv[arg_ofs], "reset")) { int contr = 1; if (ac > 2) contr = atoi(argv[arg_ofs + 1]); rdef.contr = contr; ioctl_s.cmd = AVMB1_RESETCARD; ioctl_s.data = &rdef; if ((ioctl(fd, CAPI_MANUFACTURER_CMD, &ioctl_s)) < 0) { perror("\nioctl RESET"); exit(2); } close(fd); return 0; } usage(); return 0; }