| plan 9 kernel history: overview | file list | diff list |
1991/0808/pc/devuart.c (diff list | history)
| 1991/0807/sys/src/9/pc/devuart.c:1,4 – 1991/0808/sys/src/9/pc/devuart.c:1,4 (short | long | prev | next) | ||
| 1991/0801 |
| |
| 1991/0808 | #include "u.h" | |
| 1991/0801 | #include "lib.h" #include "mem.h" #include "dat.h" | |
| 1991/0807/sys/src/9/pc/devuart.c:18,26 – 1991/0808/sys/src/9/pc/devuart.c:18,25 | ||
| 1991/0801 | */ Data= 0, /* xmit/rcv buffer */ Iena= 1, /* interrupt enable */ | |
| 1991/0808 | Istat= 2, /* interrupt flag (read) */ Tctl= 2, /* test control (write) */ | |
| 1991/0801 | Format= 3, /* byte format */ Bits8= (3<<0), /* 8 bits/byte */ Stop2= (1<<2), /* 2 stop bits */ | |
| 1991/0807/sys/src/9/pc/devuart.c:42,47 – 1991/0808/sys/src/9/pc/devuart.c:41,49 | ||
| 1991/0801 | Scratch=7, /* scratchpad */ Dlsb= 0, /* divisor lsb */ Dmsb= 1, /* divisor msb */ | |
| 1991/0808 | Serial= 0, Modem= 1, | |
| 1991/0801 | }; typedef struct Uart Uart; | |
| 1991/0807/sys/src/9/pc/devuart.c:62,68 – 1991/0808/sys/src/9/pc/devuart.c:64,69 | ||
| 1991/0801 | Queue *wq; /* write queue */ Rendez r; /* kproc waiting for input */ Alarm *a; /* alarm for waking the kernel process */ | |
| 1991/0807/sys/src/9/pc/devuart.c:248,254 – 1991/0808/sys/src/9/pc/devuart.c:249,256 | ||
| 1991/0801 | void uartintr1(Ureg *ur) { | |
| 1991/0808 | if(uart[1].enabled) uartintr(&uart[1]); | |
| 1991/0801 | } /* | |
| 1991/0807/sys/src/9/pc/devuart.c:262,291 – 1991/0808/sys/src/9/pc/devuart.c:264,297 | ||
| 1991/0801 | /* | |
| 1991/0807 | * turn on power to the port */ | |
| 1991/0808 | if(up == &uart[Serial]){ | |
| 1991/0807 | if(serial(0) < 0) print("can't turn on serial port power\n"); } /* | |
| 1991/0808 | * speed up the clock to poll the uart */ fclockinit(); /* | |
| 1991/0801 | * set up i/o routines */ if(up->oq){ up->oq->puts = uartputs; up->oq->ptr = up; | |
| 1991/0807 | up->enabled = 1; | |
| 1991/0803 |
| |
| 1991/0808 | up->sticky[Iena] = 0xf; | |
| 1991/0801 | /* * turn on interrupts */ uartwrreg(up, Iena, 0); | |
| 1991/0808 | uartwrreg(up, Tctl, 0x0); | |
| 1991/0801 | /* * turn on DTR and RTS | |
| 1991/0807/sys/src/9/pc/devuart.c:292,297 – 1991/0808/sys/src/9/pc/devuart.c:298,305 | ||
| 1991/0801 | */ uartdtr(up, 1); uartrts(up, 1); | |
| 1991/0808 | print("uart enabled: Iena=%lux\n", uartrdreg(up, Iena)); | |
| 1991/0807 | } | |
| 1991/0806 | ||
| 1991/0807 | /* | |
| 1991/0807/sys/src/9/pc/devuart.c:316,325 – 1991/0808/sys/src/9/pc/devuart.c:324,338 | ||
| 1991/0807 | /* * turn off power */ | |
| 1991/0808 | if(up == &uart[Serial]){ | |
| 1991/0807 | if(serial(1) < 0) print("can't turn off serial power\n"); | |
| 1991/0806 | } | |
| 1991/0808 | /* * slow the clock down again */ clockinit(); | |
| 1991/0801 | } /* | |
| 1991/0807/sys/src/9/pc/devuart.c:374,398 – 1991/0808/sys/src/9/pc/devuart.c:387,392 | ||
| 1991/0801 | wakeup(&up->iq->r); } | |
| 1991/0807/sys/src/9/pc/devuart.c:403,408 – 1991/0808/sys/src/9/pc/devuart.c:397,403 | ||
| 1991/0801 | q, s->inuse, s->type, s->dev, s->id); | |
| 1991/0806 | ||
| 1991/0801 | up = &uart[s->id]; | |
| 1991/0808 | up->iq->putc = 0; | |
| 1991/0806 | uartenable(up); | |
| 1991/0801 | qlock(up); | |
| 1991/0807/sys/src/9/pc/devuart.c:409,420 – 1991/0808/sys/src/9/pc/devuart.c:404,413 | ||
| 1991/0801 | up->wq = WR(q); WR(q)->ptr = up; RD(q)->ptr = up; | |
| 1991/0808 | memset(up->delim, 0xff, sizeof(up->delim)); | |
| 1991/0801 | if(up->kstarted == 0){ up->kstarted = 1; | |
| 1991/0807/sys/src/9/pc/devuart.c:468,473 – 1991/0808/sys/src/9/pc/devuart.c:461,478 | ||
| 1991/0801 | case 'd': uartdtr(up, n); break; | |
| 1991/0808 | case 'e': case 'E': /* * the characters in the block are the message * delimiters to use upstream */ memset(up->delim, 0, sizeof(up->delim)); while(++(bp->rptr) < bp->wptr){ m = *bp->rptr; up->delim[m/8] |= 1<<(m&7); } break; | |
| 1991/0801 | case 'K': case 'k': uartbreak(up, n); | |
| 1991/0807/sys/src/9/pc/devuart.c:476,490 – 1991/0808/sys/src/9/pc/devuart.c:481,489 | ||
| 1991/0801 | case 'r': uartrts(up, n); break; | |
| 1991/0807/sys/src/9/pc/devuart.c:507,527 – 1991/0808/sys/src/9/pc/devuart.c:506,528 | ||
| 1991/0801 | Block *bp; int n; | |
| 1991/0808 | if(waserror()) print("uartkproc got an error\n"); for(;;){ | |
| 1991/0801 | sleep(&cq->r, cangetc, cq); | |
| 1991/0808 | qlock(up); if(up->wq == 0){ cq->out = cq->in; }else{ n = cangetc(cq); bp = allocb(n); bp->flags |= S_DELIM; bp->wptr += gets(cq, bp->wptr, n); PUTNEXT(RD(up->wq), bp); } qunlock(up); | |
| 1991/0801 | } | |