## diffname pc/ns16552.h 1994/0902 ## diff -e /dev/null /n/fornaxdump/1994/0902/sys/src/brazil/pc/ns16552.h 0a /* * PC specific code for the ns16552. It includes support for the 2 built * in uarts plus up to 5 MP-008 8 uart ISA cards. */ enum { Maxcard= 5, /* max serial cards */ UartFREQ= 1843200, Serial= 0, Modem= 1, }; #define uartwrreg(u,r,v) outb((u)->port + r, (u)->sticky[r] | (v)) #define uartrdreg(u,r) inb((u)->port + r) void ns16552setup(ulong, ulong); /* * definition of an optional serial card */ typedef struct Scard { ISAConf; /* card configuration */ int first; /* number of first port */ } Scard; static Scard *scard[Maxcard]; /* configs for the serial card */ /* power management currently only makes sense on the AT&T safari */ static void uartpower(int dev, int onoff) { switch(dev){ case Modem: if(modem(onoff) < 0) print("can't turn %s modem speaker\n", onoff?"on":"off"); break; case Serial: if(serial(onoff) < 0) print("can't turn %s serial port power\n", onoff?"on":"off"); break; } } /* * handle an interrupt to a single uart */ static void ns16552intrx(Ureg *ur, void *arg) { USED(ur); ns16552intr((ulong)arg); } /* * interrupts from the multiport card, MP-008. A polling port * tells which of 8 devices interrupted. */ static void mp008intr(Ureg *ur, void *arg) { int i, loops; uchar n; Scard *mp; USED(ur); mp = arg; for(loops = 0;; loops++){ if(loops > 1024) panic("mp008intr"); n = ~inb(mp->mem); if(n == 0) return; for(i = 0; n; i++){ if(n & 1) ns16552intrx(ur, uart[mp->first+i]); n >>= 1; } } } /* * install the uarts (called by reset) */ static void ns16552install(void) { int i, j, port; Scard *sc; /* first two ports are always there and always the normal frequency */ ns16552setup(0x3F8, UartFREQ); setvec(Uart0vec, ns16552intrx, (void*)0); ns16552setup(0x2F8, UartFREQ); setvec(Uart1vec, ns16552intrx, (void*)1); /* the rest come out of plan9.ini */ for(i = 0; i < Maxcard; i++){ sc = scard[i] = xalloc(sizeof(Scard)); if(isaconfig("serial", i, sc) == 0){ xfree(sc); break; } if(strcmp(sc->type, "MP008") == 0 || strcmp(sc->type, "mp008") == 0){ /* * port gives base port address for uarts * irq is interrupt * mem is the polling port * size is the number of serial ports on the same polling port * freq is the baud rate generator frequency */ if(sc->size == 0) sc->size = 8; if(sc->freq == 0) sc->freq = UartFREQ; sc->first = nuart; setvec(Int0vec+sc->irq, mp008intr, sc); port = sc->port; for(j=0; j < sc->size; j++){ ns16552setup(port, sc->freq); port += 8; } } else { /* * port gives base port address for the uart * irq is interrupt * freq is the baud rate generator frequency */ ns16552setup(sc->port, sc->freq); setvec(Int0vec+sc->irq, ns16552intrx, (void*)(nuart-1)); } } } int iprint(char *fmt, ...) { char buf[PRINTSIZE]; int n; n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; screenputs(buf, n); return n; } . ## diffname pc/ns16552.h 1994/1006 ## diff -e /n/fornaxdump/1994/0902/sys/src/brazil/pc/ns16552.h /n/fornaxdump/1994/1006/sys/src/brazil/pc/ns16552.h 77c ns16552intrx(ur, (void*)(mp->first+i)); . 69,71c for(loops = 0; loops < 1024; loops++){ . ## diffname pc/ns16552.h 1994/1007 ## diff -e /n/fornaxdump/1994/1006/sys/src/brazil/pc/ns16552.h /n/fornaxdump/1994/1007/sys/src/brazil/pc/ns16552.h 94a /* set up a serial console */ p = getconf("console"); if(p) ns16552special(atoi(p), 9600, &kbdq, &printq, kbdcr2nl); . 89a if(already) return; already = 1; . 88a static int already; . 87a char *p; . 84c void . ## diffname pc/ns16552.h 1994/1106 ## diff -e /n/fornaxdump/1994/1007/sys/src/brazil/pc/ns16552.h /n/fornaxdump/1994/1106/sys/src/brazil/pc/ns16552.h 139a if(sc->freq == 0) sc->freq = UartFREQ; . 134c } else if(strcmp(sc->type, "com") == 0 || strcmp(sc->type, "COM") == 0){ . ## diffname pc/ns16552.h 1994/1108 ## diff -e /n/fornaxdump/1994/1106/sys/src/brazil/pc/ns16552.h /n/fornaxdump/1994/1108/sys/src/brazil/pc/ns16552.h 142c sprint(name, "eia%d00", i); ns16552setup(sc->port, sc->freq, name); . 131c sprint(name, "eia%d%2.2d", i, j); ns16552setup(port, sc->freq, name); . 99c ns16552setup(0x2F8, UartFREQ, "eia1"); . 97c ns16552setup(0x3F8, UartFREQ, "eia0"); . 89a char name[NAMELEN]; . 17c void ns16552setup(ulong, ulong, char*); . ## diffname pc/ns16552.h 1994/1118 ## diff -e /n/fornaxdump/1994/1108/sys/src/brazil/pc/ns16552.h /n/fornaxdump/1994/1118/sys/src/brazil/pc/ns16552.h 147a nscard++; . 144c sprint(name, "eia%d00", nscard); . 132c sprint(name, "eia%d%2.2d", nscard, j); . 113c scard[nscard] = 0; continue; . 110c sc = scard[nscard] = xalloc(sizeof(Scard)); . 108a nscard = 0; . 87c int i, j, port, nscard; . ## diffname pc/ns16552.h 1995/0222 ## diff -e /n/fornaxdump/1994/1118/sys/src/brazil/pc/ns16552.h /n/fornaxdump/1995/0222/sys/src/brazil/pc/ns16552.h 153,164d 150d 138c } else if(cistrcmp(sc->type, "com") == 0){ . 118c if(cistrcmp(sc->type, "MP008") == 0){ . ## diffname pc/ns16552.h 1997/0327 ## diff -e /n/fornaxdump/1995/0222/sys/src/brazil/pc/ns16552.h /n/emeliedump/1997/0327/sys/src/brazil/pc/ns16552.h 148c intrenable(VectorPIC+sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN); . 131c intrenable(VectorPIC+sc->irq, mp008intr, sc, BUSUNKNOWN); . 104,106c if(p = getconf("console")){ port = strtol(p, &q, 0); if(p != q && (port == 0 || port == 1)) ns16552special(port, 9600, &kbdq, &printq, kbdcr2nl); } . 101c intrenable(VectorUART1, ns16552intrx, (void*)1, BUSUNKNOWN); addclock0link(uartclock); . 99c intrenable(VectorUART0, ns16552intrx, (void*)0, BUSUNKNOWN); . 88c char *p, *q; . 75c ns16552intrx(ureg, (void*)(mp->first+i)); . 67d 61c mp008intr(Ureg* ureg, void* arg) . 51,52d 49c ns16552intrx(Ureg*, void* arg) . 39c if((*arch->serialpower)(onoff) < 0) . 35c if((*arch->modempower)(onoff) < 0) . 18c void ns16552special(int, int, Queue**, Queue**, int (*)(Queue*, int)); void uartclock(void); . ## diffname pc/ns16552.h 1998/0221 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/pc/ns16552.h /n/emeliedump/1998/0221/sys/src/brazil/pc/ns16552.h 139c } else if(cistrcmp(sc->type, "com") == 0 && sc->port != 0x3F8 && sc->port != 0x2F8){ . ## diffname pc/ns16552.h 1998/0910 ## diff -e /n/emeliedump/1998/0221/sys/src/brazil/pc/ns16552.h /n/emeliedump/1998/0910/sys/src/brazil/pc/ns16552.h 99c intrenable(IrqUART1, ns16552intrx, (void*)1, BUSUNKNOWN); . 97c intrenable(IrqUART0, ns16552intrx, (void*)0, BUSUNKNOWN); . ## diffname pc/ns16552.h 1998/0918 ## diff -e /n/emeliedump/1998/0910/sys/src/brazil/pc/ns16552.h /n/emeliedump/1998/0918/sys/src/brazil/pc/ns16552.h 149c intrenable(sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN); . 132c intrenable(sc->irq, mp008intr, sc, BUSUNKNOWN); . ## diffname pc/ns16552.h 1999/0513 ## diff -e /n/emeliedump/1998/0918/sys/src/brazil/pc/ns16552.h /n/emeliedump/1999/0513/sys/src/brazil/pc/ns16552.h 148c ns16552setup(sc->port, sc->freq, name, Ns550); . 138a } else if(cistrcmp(sc->type, "turbo650") == 0){ /* * port gives base port address for the uart * irq is interrupt * freq is the baud rate generator frequency */ if(sc->freq == 0) sc->freq = UartFREQ*4; sprint(name, "eia%d00", nscard); ns16552setup(sc->port, sc->freq, name, Ns650); /* * multiply clock speed by 4 */ if(sc->mem == 0) outb(0x2c8, 0); else outb(sc->mem, 0); intrenable(sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN); . 136c ns16552setup(port, sc->freq, name, Ns550); . 98c ns16552setup(0x2F8, UartFREQ, "eia1", Ns550); . 96c ns16552setup(0x3F8, UartFREQ, "eia0", Ns550); . 17c void ns16552setup(ulong, ulong, char*, int); . ## diffname pc/ns16552.h 1999/0714 ## diff -e /n/emeliedump/1999/0513/sys/src/brazil/pc/ns16552.h /n/emeliedump/1999/0714/sys/src/brazil/pc/ns16552.h 167a if(ioalloc(sc->port, 8, 0, name) < 0){ print("%s: port %lud in use\n", name, sc->port); xfree(sc); scard[nscard] = 0; continue; } . 147a if(ioalloc(sc->port, 8, 0, name) < 0){ print("%s: port %lud in use\n", name, sc->port); xfree(sc); scard[nscard] = 0; continue; } . 131a if(ioalloc(sc->port, 8*sc->size, 0, "mp008") < 0){ print("mp008: port %lud in use\n", sc->port); xfree(sc); scard[nscard] = 0; continue; } . 97a if(ioalloc(0x2F8, 8, 0, "eia1") < 0) print("eia1: port %d in use\n", 0x2F8); . 95a if(ioalloc(0x3f8, 8, 0, "eia0") < 0) print("eia0: port %d in use\n", 0x3f8); . ## diffname pc/ns16552.h 1999/0819 ## diff -e /n/emeliedump/1999/0714/sys/src/brazil/pc/ns16552.h /n/emeliedump/1999/0819/sys/src/brazil/pc/ns16552.h 191c intrenable(sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN, name); . 183d 174c intrenable(sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN, name); . 157d 142c intrenable(sc->irq, mp008intr, sc, BUSUNKNOWN, name); . 136c if(ioalloc(sc->port, 8*sc->size, 0, name) < 0){ . 122a snprint(name, sizeof name, "eia%d00", nscard); . 103c intrenable(IrqUART1, ns16552intrx, (void*)1, BUSUNKNOWN, "eia1"); . 99c intrenable(IrqUART0, ns16552intrx, (void*)0, BUSUNKNOWN, "eia0"); . ## diffname pc/ns16552.h 2000/0613 ## diff -e /n/emeliedump/1999/0819/sys/src/brazil/pc/ns16552.h /n/emeliedump/2000/0613/sys/src/9/pc/ns16552.h 95,103c /* first two ports are usually there and always the normal frequency */ ns16552default("eia0", 0x3F8, IrqUART0); ns16552default("eia1", 0x2F8, IrqUART1); . 79a * install a default serial port on a PC unless * name=disabled is set in plan9.ini */ void ns16552default(char *name, int port, int irq) { char *p; if((p = getconf(name)) && strncmp(p, "disabled", 8) == 0) return; if(ioalloc(port, 8, 0, name) < 0) { print("%s: port %x in use\n", name, port); return; } ns16552setup(port, UartFREQ, name, Ns550); intrenable(irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN, name); } /* . ## diffname pc/ns16552.h 2000/1011 ## diff -e /n/emeliedump/2000/0613/sys/src/9/pc/ns16552.h /n/emeliedump/2000/1011/sys/src/9/pc/ns16552.h 126,127c if(p != q && (port == 0 || port == 1)) { baud = 0; if(p = getconf("baud")) baud = strtoul(p, 0, 0); if(baud == 0) baud = 9600; ns16552special(port, baud, &kbdq, &printq, kbdcr2nl); } . 107c int i, j, port, nscard, baud; . ## diffname pc/ns16552.h 2001/0527 # deleted ## diff -e /n/emeliedump/2000/1011/sys/src/9/pc/ns16552.h /n/emeliedump/2001/0527/sys/src/9/pc/ns16552.h 1,217d