| plan 9 kernel history: overview | file list | diff list |
1997/0327/pc/ns16552.h (diff list | history)
| pc/ns16552.h on 1994/0902 | ||
| 1994/0902 | /* * 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) | |
| 1994/1108 | void ns16552setup(ulong, ulong, char*); | |
| 1997/0327 | void ns16552special(int, int, Queue**, Queue**, int (*)(Queue*, int)); void uartclock(void); | |
| 1994/0902 | /* * 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: | |
| 1997/0327 | if((*arch->modempower)(onoff) < 0) | |
| 1994/0902 | print("can't turn %s modem speaker\n", onoff?"on":"off"); break; case Serial: | |
| 1997/0327 | if((*arch->serialpower)(onoff) < 0) | |
| 1994/0902 | print("can't turn %s serial port power\n", onoff?"on":"off"); break; } } /* * handle an interrupt to a single uart */ static void | |
| 1997/0327 | ns16552intrx(Ureg*, void* arg) | |
| 1994/0902 | { ns16552intr((ulong)arg); } /* * interrupts from the multiport card, MP-008. A polling port * tells which of 8 devices interrupted. */ static void | |
| 1997/0327 | mp008intr(Ureg* ureg, void* arg) | |
| 1994/0902 | { int i, loops; uchar n; Scard *mp; mp = arg; | |
| 1994/1006 | for(loops = 0; loops < 1024; loops++){ | |
| 1994/0902 | n = ~inb(mp->mem); if(n == 0) return; for(i = 0; n; i++){ if(n & 1) | |
| 1997/0327 | ns16552intrx(ureg, (void*)(mp->first+i)); | |
| 1994/0902 | n >>= 1; } } } /* * install the uarts (called by reset) */ | |
| 1994/1007 | void | |
| 1994/0902 | ns16552install(void) { | |
| 1994/1118 | int i, j, port, nscard; | |
| 1997/0327 | char *p, *q; | |
| 1994/0902 | Scard *sc; | |
| 1994/1108 | char name[NAMELEN]; | |
| 1994/1007 | static int already; | |
| 1994/0902 | ||
| 1994/1007 | if(already) return; already = 1; | |
| 1994/0902 | /* first two ports are always there and always the normal frequency */ | |
| 1994/1108 | ns16552setup(0x3F8, UartFREQ, "eia0"); | |
| 1997/0327 | intrenable(VectorUART0, ns16552intrx, (void*)0, BUSUNKNOWN); | |
| 1994/1108 | ns16552setup(0x2F8, UartFREQ, "eia1"); | |
| 1997/0327 | intrenable(VectorUART1, ns16552intrx, (void*)1, BUSUNKNOWN); addclock0link(uartclock); | |
| 1994/1007 | /* set up a serial console */ | |
| 1997/0327 | if(p = getconf("console")){ port = strtol(p, &q, 0); if(p != q && (port == 0 || port == 1)) ns16552special(port, 9600, &kbdq, &printq, kbdcr2nl); } | |
| 1994/0902 | /* the rest come out of plan9.ini */ | |
| 1994/1118 | nscard = 0; | |
| 1994/0902 | for(i = 0; i < Maxcard; i++){ | |
| 1994/1118 | sc = scard[nscard] = xalloc(sizeof(Scard)); | |
| 1994/0902 | if(isaconfig("serial", i, sc) == 0){ xfree(sc); | |
| 1994/1118 | scard[nscard] = 0; continue; | |
| 1994/0902 | } | |
| 1995/0222 | if(cistrcmp(sc->type, "MP008") == 0){ | |
| 1994/0902 | /* * 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; | |
| 1997/0327 | intrenable(VectorPIC+sc->irq, mp008intr, sc, BUSUNKNOWN); | |
| 1994/0902 | port = sc->port; for(j=0; j < sc->size; j++){ | |
| 1994/1118 | sprint(name, "eia%d%2.2d", nscard, j); | |
| 1994/1108 | ns16552setup(port, sc->freq, name); | |
| 1994/0902 | port += 8; } | |
| 1995/0222 | } else if(cistrcmp(sc->type, "com") == 0){ | |
| 1994/0902 | /* * port gives base port address for the uart * irq is interrupt * freq is the baud rate generator frequency */ | |
| 1994/1106 | if(sc->freq == 0) sc->freq = UartFREQ; | |
| 1994/1118 | sprint(name, "eia%d00", nscard); | |
| 1994/1108 | ns16552setup(sc->port, sc->freq, name); | |
| 1997/0327 | intrenable(VectorPIC+sc->irq, ns16552intrx, (void*)(nuart-1), BUSUNKNOWN); | |
| 1994/0902 | } | |
| 1994/1118 | nscard++; | |
| 1994/0902 | } } | |