| plan 9 kernel history: overview | file list | diff list |
1991/0823/pc/devuart.c (diff list | history)
| 1991/0822/sys/src/9/pc/devuart.c:1,4 – 1991/0823/sys/src/9/pc/devuart.c:1,4 (short | long | prev | next) | ||
| 1991/0808 |
| |
| 1991/0823 | #include "u.h" | |
| 1991/0801 | #include "lib.h" #include "mem.h" #include "dat.h" | |
| 1991/0822/sys/src/9/pc/devuart.c:18,23 – 1991/0823/sys/src/9/pc/devuart.c:18,27 | ||
| 1991/0801 | */ Data= 0, /* xmit/rcv buffer */ Iena= 1, /* interrupt enable */ | |
| 1991/0823 | Ircv= (1<<0), /* for char rcv'd */ Ixmt= (1<<1), /* for xmit buffer empty */ Irstat=(1<<2), /* for change in rcv'er status */ Imstat=(1<<3), /* for change in modem status */ | |
| 1991/0808 | Istat= 2, /* interrupt flag (read) */ Tctl= 2, /* test control (write) */ | |
| 1991/0801 | Format= 3, /* byte format */ | |
| 1991/0822/sys/src/9/pc/devuart.c:36,42 – 1991/0823/sys/src/9/pc/devuart.c:40,48 | ||
| 1991/0801 | Loop= (1<<4), /* loop bask */ Lstat= 5, /* line status */ Inready=(1<<0), /* receive buffer full */ | |
| 1991/0822 |
| |
| 1991/0823 | Oerror=(1<<1), /* receiver overrun */ Perror=(1<<2), /* receiver parity error */ Ferror=(1<<3), /* rcv framing error */ | |
| 1991/0803 | Outready=(1<<5), /* output buffer full */ | |
| 1991/0801 | Mstat= 6, /* modem status */ Scratch=7, /* scratchpad */ | |
| 1991/0822/sys/src/9/pc/devuart.c:67,72 – 1991/0823/sys/src/9/pc/devuart.c:73,82 | ||
| 1991/0801 | Alarm *a; /* alarm for waking the kernel process */ int kstarted; /* kproc started */ uchar delim[256/8]; /* characters that act as delimiters */ | |
| 1991/0823 | /* error statistics */ ulong frame; ulong overrun; | |
| 1991/0801 | }; Uart uart[2]; | |
| 1991/0822/sys/src/9/pc/devuart.c:213,226 – 1991/0823/sys/src/9/pc/devuart.c:223,237 | ||
| 1991/0801 | IOQ *cq; | |
| 1991/0806 | int s, l; | |
| 1991/0801 | ||
| 1991/0822 |
| |
| 1991/0810 | for(;;){ s = uartrdreg(up, Istat); switch(s){ case 6: /* receiver line status */ l = uartrdreg(up, Lstat); | |
| 1991/0823 | if(l & Ferror) up->frame++; if(l & Oerror) up->overrun++; | |
| 1991/0810 | break; case 4: /* received data available */ | |
| 1991/0822/sys/src/9/pc/devuart.c:233,241 – 1991/0823/sys/src/9/pc/devuart.c:244,249 | ||
| 1991/0810 | if(up->delim[ch/8] & (1<<(ch&7)) ) wakeup(&cq->r); } | |
| 1991/0822 |
| |
| 1991/0810 | break; case 2: /* transmitter empty */ | |
| 1991/0822/sys/src/9/pc/devuart.c:257,263 – 1991/0823/sys/src/9/pc/devuart.c:265,271 | ||
| 1991/0810 | default: if(s&1) return; | |
| 1991/0823 | /* print("weird modem interrupt\n");/**/ | |
| 1991/0810 | break; | |
| 1991/0801 | } } | |
| 1991/0822/sys/src/9/pc/devuart.c:290,295 – 1991/0823/sys/src/9/pc/devuart.c:298,308 | ||
| 1991/0807 | } | |
| 1991/0808 | /* | |
| 1991/0823 | * speed up the clock to poll the uart fclockinit(); */ /* | |
| 1991/0801 | * set up i/o routines */ if(up->oq){ | |
| 1991/0822/sys/src/9/pc/devuart.c:304,310 – 1991/0823/sys/src/9/pc/devuart.c:317,323 | ||
| 1991/0801 | /* * turn on interrupts */ | |
| 1991/0810 |
| |
| 1991/0823 | up->sticky[Iena] = Ircv | Ixmt | Irstat; | |
| 1991/0801 | uartwrreg(up, Iena, 0); /* | |
| 1991/0822/sys/src/9/pc/devuart.c:514,519 – 1991/0823/sys/src/9/pc/devuart.c:527,533 | ||
| 1991/0801 | IOQ *cq = up->iq; Block *bp; int n; | |
| 1991/0823 | ulong frame, overrun; | |
| 1991/0801 | ||
| 1991/0808 | if(waserror()) print("uartkproc got an error\n"); | |
| 1991/0822/sys/src/9/pc/devuart.c:531,536 – 1991/0823/sys/src/9/pc/devuart.c:545,558 | ||
| 1991/0808 | PUTNEXT(RD(up->wq), bp); } qunlock(up); | |
| 1991/0823 | if(up->frame != frame){ kprint("uart%d: %d framing\n", up-uart, up->frame); frame = up->frame; } if(up->overrun != overrun){ kprint("uart%d: %d overruns\n", up-uart, up->overrun); overrun = up->overrun; } | |
| 1991/0801 | } } | |