static Chan* uartopen(Chan *c, int omode) { Uart *p; c = devopen(c, omode, uartdir, uartndir, devgen); switch(UARTTYPE(c->qid.path)){ case Qctl: case Qdata: p = uart[UARTID(c->qid.path)]; qlock(&p->ql); if(p->opens == 0 && uartenable(p) == nil){ qunlock(&p->ql); c->flag &= ~COPEN; error(Enodev); } p->opens++; qunlock(&p->ql); break; } c->iounit = qiomaxatomic; return c; }
/* must call this from a process's context */ int i8250console(void) { Uart *uart = &i8250uart[CONSOLE]; if (up == nil) return -1; /* too early */ if(uartenable(uart) != nil /* && uart->console */){ // iprint("i8250console: enabling console uart\n"); serialoq = uart->oq; uart->opens++; consuart = uart; } uartctl(uart, "b115200 l8 pn r1 s1 i1"); return 0; }
/* * called by main() to configure a duart port as a console or a mouse */ void uartspecial(int port, int bps, char parity, Queue **in, Queue **out, int (*putc)(Queue*, int)) { Uart *p; uartinstall(); if(port >= nuart) return; p = uart[port]; if(bps) p->bps = bps; if(parity) p->parity = parity; uartenable(p); p->putc = putc; if(in) *in = p->iq; if(out) *out = p->oq; p->opens++; }
static Chan* uartopen(Chan *c, int omode) { Uart *p; c = devopen(c, omode, uartdir, ndir, devgen); switch(NETTYPE(c->qid.path)){ case Nctlqid: case Ndataqid: p = uart[NETID(c->qid.path)]; qlock(p); if(p->opens++ == 0){ uartenable(p); qreopen(p->iq); qreopen(p->oq); } qunlock(p); break; } return c; }
static Chan* uartopen(Chan *c, int omode) { Uart *p; c = devopen(c, omode, uartdir, uartndir, devgen); switch(NETTYPE(c->qid.path)){ case Nctlqid: case Ndataqid: p = uart[NETID(c->qid.path)]; qlock(p); if(p->opens++ == 0 && uartenable(p) == nil){ qunlock(p); c->flag &= ~COPEN; error(Enodev); } qunlock(p); break; } c->iounit = qiomaxatomic; return c; }
/* * set up the '#t' directory */ static void uartreset(void) { int i; Dirtab *dp; Uart *p, *tail; tail = nil; for(i = 0; physuart[i] != nil; i++){ if(physuart[i]->pnp == nil) continue; if((p = physuart[i]->pnp()) == nil) continue; if(uartlist != nil) tail->next = p; else uartlist = p; for(tail = p; tail->next != nil; tail = tail->next) uartnuart++; uartnuart++; } if(uartnuart) uart = xalloc(uartnuart*sizeof(Uart*)); uartndir = 1 + 3*uartnuart; uartdir = xalloc(uartndir * sizeof(Dirtab)); if (uart == nil || uartdir == nil) panic("uartreset: no memory"); dp = uartdir; strcpy(dp->name, "."); mkqid(&dp->qid, 0, 0, QTDIR); dp->length = 0; dp->perm = DMDIR|0555; dp++; p = uartlist; for(i = 0; i < uartnuart; i++){ /* 3 directory entries per port */ snprint(dp->name, sizeof dp->name, "eia%d", i); dp->qid.path = NETQID(i, Ndataqid); dp->perm = 0660; dp++; snprint(dp->name, sizeof dp->name, "eia%dctl", i); dp->qid.path = NETQID(i, Nctlqid); dp->perm = 0660; dp++; snprint(dp->name, sizeof dp->name, "eia%dstatus", i); dp->qid.path = NETQID(i, Nstatqid); dp->perm = 0444; dp++; uart[i] = p; p->dev = i; if(p->console || p->special){ if(uartenable(p) != nil){ if(p->console && up) serialoq = p->oq; p->opens++; } } p = p->next; } if(uartnuart){ /* * at 115200 baud, the 1024 char buffer takes 56 ms to process, * processing it every 22 ms should be fine. */ uarttimer = addclock0link(uartclock, 22); } }