| plan 9 kernel history: overview | file list | diff list |
1991/0601/port/devscc.c (diff list | history)
| 1991/0601/sys/src/9/port/devscc.c:197,208 – 1991/0604/sys/src/9/port/devscc.c:197,209 (short | long) | ||
| 1991/0601 | } /* | |
| 1991/0604 | * default is 9600 baud, 1 stop bit, 8 bit chars, no interrupts, | |
| 1991/0601 | * transmit and receive enabled, interrupts disabled. */ void | |
| 1991/0604 | sccsetup(void *addr) | |
| 1991/0601 | { | |
| 1991/0604 | SCCdev *dev; | |
| 1991/0601 | SCC *sp; static int already; | |
| 1991/0601/sys/src/9/port/devscc.c:209,222 – 1991/0604/sys/src/9/port/devscc.c:210,224 | ||
| 1991/0601 | if(already) return; already = 1; | |
| 1991/0604 | dev = addr; | |
| 1991/0601 | /* * get port addresses */ | |
| 1991/0604 | scc[0].ptr = &dev->ptra; scc[0].data = &dev->dataa; scc[1].ptr = &dev->ptrb; scc[1].data = &dev->datab; | |
| 1991/0601 | for(sp = scc; sp < &scc[2]; sp++){ memset(sp->sticky, 0, sizeof(sp->sticky)); | |
| 1991/0601/sys/src/9/port/devscc.c:331,341 – 1991/0604/sys/src/9/port/devscc.c:333,338 | ||
| 1991/0601 | void sccdevice(SCC *sp) { | |
| 1991/0604/sys/src/9/port/devscc.c:101,107 – 1991/0606/sys/src/9/port/devscc.c:101,107 (short | long) | ||
| 1991/0601 | Alarm *a; /* alarm for waking the kernel process */ int delay; /* between character input and waking kproc */ int kstarted; /* kproc started */ | |
| 1991/0606 | uchar delim[256/8]; /* characters that act as delimiters */ | |
| 1991/0601 | }; SCC scc[2]; | |
| 1991/0604/sys/src/9/port/devscc.c:296,302 – 1991/0606/sys/src/9/port/devscc.c:296,302 | ||
| 1991/0601 | (*cq->putc)(cq, ch); else { putc(cq, ch); | |
| 1991/0606 | if(sp->delim[ch/8] & (1<<(ch&7)) ) | |
| 1991/0601 | wakeup(&cq->r); } } | |
| 1991/0604/sys/src/9/port/devscc.c:331,337 – 1991/0606/sys/src/9/port/devscc.c:331,337 | ||
| 1991/0601 | * turn on a port's interrupts. set DTR and RTS */ void | |
| 1991/0606 | sccenable(SCC *sp) | |
| 1991/0601 | { /* * set up i/o routines | |
| 1991/0604/sys/src/9/port/devscc.c:371,377 – 1991/0606/sys/src/9/port/devscc.c:371,377 | ||
| 1991/0601 | sp->nostream = 1; sp->oq = oq; sp->iq = iq; | |
| 1991/0606 | sccenable(sp); | |
| 1991/0601 | sccsetbaud(sp, baud); } | |
| 1991/0604/sys/src/9/port/devscc.c:580,586 – 1991/0606/sys/src/9/port/devscc.c:580,586 | ||
| 1991/0601 | initq(sp->iq); sp->oq = ialloc(sizeof(IOQ), 0); initq(sp->oq); | |
| 1991/0606 | sccenable(sp); | |
| 1991/0601 | } } | |
| 1991/0606/sys/src/9/port/devscc.c:284,290 – 1991/0607/sys/src/9/port/devscc.c:284,289 (short | long) | ||
| 1991/0601 | IOQ *cq; if(x & ExtPendB){ | |
| 1991/0606/sys/src/9/port/devscc.c:305,314 – 1991/0607/sys/src/9/port/devscc.c:304,311 | ||
| 1991/0601 | cq = sp->oq; lock(cq); ch = getc(cq); | |
| 1991/0607/sys/src/9/port/devscc.c:370,375 – 1991/0727/sys/src/9/port/devscc.c:370,383 (short | long) | ||
| 1991/0601 | sp->iq = iq; | |
| 1991/0606 | sccenable(sp); | |
| 1991/0601 | sccsetbaud(sp, baud); | |
| 1991/0727 | if(iq){ /* * Stupid HACK to undo a stupid hack */ if(iq == &kbdq) kbdq.putc = kbdcr2nl; } | |
| 1991/0601 | } static void scctimer(Alarm*); | |
| 1991/0727/sys/src/9/port/devscc.c:99,107 – 1991/1003/sys/src/9/port/devscc.c:99,105 (short | long) | ||
| 1991/0601 | Queue *wq; /* write queue */ Rendez r; /* kproc waiting for input */ Alarm *a; /* alarm for waking the kernel process */ | |
| 1991/0606 |
| |
| 1991/0601 | }; SCC scc[2]; | |
| 1991/0727/sys/src/9/port/devscc.c:293,303 – 1991/1003/sys/src/9/port/devscc.c:291,298 | ||
| 1991/0601 | ch = *sp->data; if(cq->putc) (*cq->putc)(cq, ch); | |
| 1991/1003 | else | |
| 1991/0601 | putc(cq, ch); | |
| 1991/0606 |
| |
| 1991/0601 |
| |
| 1991/0727/sys/src/9/port/devscc.c:324,329 – 1991/1003/sys/src/9/port/devscc.c:319,337 | ||
| 1991/0601 | sccintr0(&scc[0], x>>3); } | |
| 1991/1003 | void sccclock(void) { SCC *sp; IOQ *cq; for(sp = scc; sp < &scc[2]; sp++){ cq = sp->iq; if(sp->wq && cangetc(cq)) wakeup(&cq->r); } } | |
| 1991/0601 | /* * turn on a port's interrupts. set DTR and RTS */ | |
| 1991/0727/sys/src/9/port/devscc.c:380,386 – 1991/1003/sys/src/9/port/devscc.c:388,393 | ||
| 1991/0727 | } | |
| 1991/0601 | } | |
| 1991/0727/sys/src/9/port/devscc.c:395,433 – 1991/1003/sys/src/9/port/devscc.c:402,408 | ||
| 1991/0601 | "scc" }; | |
| 1991/0727/sys/src/9/port/devscc.c:440,452 – 1991/1003/sys/src/9/port/devscc.c:415,422 | ||
| 1991/0601 | sp->wq = WR(q); WR(q)->ptr = sp; RD(q)->ptr = sp; | |
| 1991/0727/sys/src/9/port/devscc.c:507,514 – 1991/1003/sys/src/9/port/devscc.c:477,483 | ||
| 1991/0601 | break; case 'W': case 'w': | |
| 1991/1003 | /* obsolete */ | |
| 1991/0601 | break; } }else while((m = BLEN(bp)) > 0){ | |
| 1991/1003/sys/src/9/port/devscc.c:524,540 – 1991/1115/sys/src/9/port/devscc.c:524,540 (short | long) | ||
| 1991/0601 | enum{ Qdir= 0, | |
| 1991/1115 | Qeia0= STREAMQID(0, Sdataqid), Qeia0ctl= STREAMQID(0, Sctlqid), Qeia1= STREAMQID(1, Sdataqid), Qeia1ctl= STREAMQID(1, Sctlqid), | |
| 1991/0601 | }; Dirtab sccdir[]={ | |
| 1991/1115 | "eia0", {Qeia0}, 0, 0666, "eia0ctl", {Qeia0ctl}, 0, 0666, "eia1", {Qeia1}, 0, 0666, "eia1ctl", {Qeia1ctl}, 0, 0666, | |
| 1991/0601 | }; #define NSCC (sizeof sccdir/sizeof(Dirtab)) | |
| 1991/1003/sys/src/9/port/devscc.c:585,595 – 1991/1115/sys/src/9/port/devscc.c:585,595 | ||
| 1991/0601 | sccstat(Chan *c, char *dp) { switch(c->qid.path){ | |
| 1991/1115 | case Qeia0: streamstat(c, dp, "eia0"); | |
| 1991/0601 | break; | |
| 1991/1115 | case Qeia1: streamstat(c, dp, "eia1"); | |
| 1991/0601 | break; default: devstat(c, dp, sccdir, NSCC, devgen); | |
| 1991/1003/sys/src/9/port/devscc.c:603,614 – 1991/1115/sys/src/9/port/devscc.c:603,614 | ||
| 1991/0601 | SCC *sp; switch(c->qid.path){ | |
| 1991/1115 | case Qeia0: case Qeia0ctl: | |
| 1991/0601 | sp = &scc[0]; break; | |
| 1991/1115 | case Qeia1: case Qeia1ctl: | |
| 1991/0601 | sp = &scc[1]; break; default: | |
| 1991/1003/sys/src/9/port/devscc.c:627,632 – 1991/1115/sys/src/9/port/devscc.c:627,633 | ||
| 1991/0601 | void scccreate(Chan *c, char *name, int omode, ulong perm) { | |
| 1991/1115 | USED(c, name, omode, perm); | |
| 1991/0601 | error(Eperm); } | |
| 1991/1003/sys/src/9/port/devscc.c:645,654 – 1991/1115/sys/src/9/port/devscc.c:646,655 | ||
| 1991/0601 | switch(c->qid.path&~CHDIR){ case Qdir: return devdirread(c, buf, n, sccdir, NSCC, devgen); | |
| 1991/1115 | case Qeia1ctl: | |
| 1991/0601 | ++sp; /* fall through */ | |
| 1991/1115 | case Qeia0ctl: | |
| 1991/0601 | if(offset) return 0; s = splhi(); | |
| 1991/1003/sys/src/9/port/devscc.c:668,673 – 1991/1115/sys/src/9/port/devscc.c:669,675 | ||
| 1991/0601 | void sccremove(Chan *c) { | |
| 1991/1115 | USED(c); | |
| 1991/0601 | error(Eperm); } | |
| 1991/1003/sys/src/9/port/devscc.c:674,678 – 1991/1115/sys/src/9/port/devscc.c:676,681 | ||
| 1991/0601 | void sccwstat(Chan *c, char *dp) { | |
| 1991/1115 | USED(c, dp); | |
| 1991/0601 | error(Eperm); } | |
| 1991/1115/sys/src/9/port/devscc.c:89,94 – 1991/1225/sys/src/9/port/devscc.c:89,95 (short | long) | ||
| 1991/0601 | uchar *ptr; /* command/pointer register in Z8530 */ uchar *data; /* data register in Z8530 */ int printing; /* true if printing */ | |
| 1991/1225 | ulong freq; /* clock frequency */ | |
| 1991/0601 | /* console interface */ int nostream; /* can't use the stream interface */ | |
| 1991/1115/sys/src/9/port/devscc.c:101,108 – 1991/1225/sys/src/9/port/devscc.c:102,111 | ||
| 1991/0601 | Alarm *a; /* alarm for waking the kernel process */ int kstarted; /* kproc started */ }; | |
| 1991/1225 | int nscc; SCC *scc[8]; /* up to 4 8530's */ | |
| 1991/0601 | void onepointseven(void) { | |
| 1991/1115/sys/src/9/port/devscc.c:145,152 – 1991/1225/sys/src/9/port/devscc.c:148,158 | ||
| 1991/0601 | { int brconst; | |
| 1991/1225 | if(rate == 0) errors("bad baud rate"); | |
| 1991/0601 | ||
| 1991/1225 | brconst = (sp->freq+16*rate-1)/(2*16*rate) - 2; | |
| 1991/0601 | sccwrreg(sp, 12, brconst & 0xff); sccwrreg(sp, 13, (brconst>>8) & 0xff); } | |
| 1991/1115/sys/src/9/port/devscc.c:183,188 – 1991/1225/sys/src/9/port/devscc.c:189,196 | ||
| 1991/0601 | void sccbreak(SCC *sp, int ms) { | |
| 1991/1225 | if(ms == 0) ms = 100; | |
| 1991/0601 | sp->sticky[1] &=~TxIntEna; sccwrreg(sp, 1, 0); sccwrreg(sp, 5, TxBreak|TxEna); | |
| 1991/1115/sys/src/9/port/devscc.c:198,248 – 1991/1225/sys/src/9/port/devscc.c:206,262 | ||
| 1991/0604 | * default is 9600 baud, 1 stop bit, 8 bit chars, no interrupts, | |
| 1991/0601 | * transmit and receive enabled, interrupts disabled. */ | |
| 1991/1225 | static void sccsetup0(SCC *sp) { memset(sp->sticky, 0, sizeof(sp->sticky)); /* * turn on baud rate generator and set rate to 9600 baud. * use 1 stop bit. */ sp->sticky[14] = BRSource; sccwrreg(sp, 14, 0); sccsetbaud(sp, 9600); sp->sticky[4] = Rx1stop | X16; sccwrreg(sp, 4, 0); sp->sticky[11] = TxClockBR | RxClockBR | TRxCOutBR | TRxCOI; sccwrreg(sp, 11, 0); sp->sticky[14] = BREna | BRSource; sccwrreg(sp, 14, 0); /* * enable I/O, 8 bits/character */ sp->sticky[3] = RxEna | Rx8bits; sccwrreg(sp, 3, 0); sp->sticky[5] = TxEna | Tx8bits; sccwrreg(sp, 5, 0); } | |
| 1991/0601 | void | |
| 1991/0604 |
| |
| 1991/1225 | sccsetup(void *addr, ulong freq) | |
| 1991/0601 | { | |
| 1991/0604 | SCCdev *dev; | |
| 1991/0601 | SCC *sp; | |
| 1991/0604 | dev = addr; | |
| 1991/0601 | /* | |
| 1991/1225 | * allocate a structure, set port addresses, and setup the line | |
| 1991/0601 | */ | |
| 1991/0604 |
| |
| 1991/0601 |
| |
| 1991/1225 | sp = ialloc(sizeof(SCC), 0); scc[nscc] = sp; sp->ptr = &dev->ptra; sp->data = &dev->dataa; sp->freq = freq; sccsetup0(sp); sp = ialloc(sizeof(SCC), 0); scc[nscc+1] = sp; sp->ptr = &dev->ptrb; sp->data = &dev->datab; sp->freq = freq; sccsetup0(sp); nscc += 2; | |
| 1991/0601 | } /* | |
| 1991/1115/sys/src/9/port/devscc.c:313,322 – 1991/1225/sys/src/9/port/devscc.c:327,342 | ||
| 1991/0601 | sccintr(void) { uchar x; | |
| 1991/1225 | int i; | |
| 1991/0601 |
| |
| 1991/1225 | for(i = 0; i < nscc; i += 2){ x = sccrdreg(scc[i], 3); if(x & (ExtPendB|RxPendB|TxPendB)) sccintr0(scc[i+1], x); x = x >> 3; if(x & (ExtPendB|RxPendB|TxPendB)) sccintr0(scc[i], x); } | |
| 1991/0601 | } | |
| 1991/1003 | void | |
| 1991/1115/sys/src/9/port/devscc.c:324,331 – 1991/1225/sys/src/9/port/devscc.c:344,353 | ||
| 1991/1003 | { SCC *sp; IOQ *cq; | |
| 1991/1225 | int i; | |
| 1991/1003 |
| |
| 1991/1225 | for(i = 0; i < nscc; i++){ sp = scc[i]; | |
| 1991/1003 | cq = sp->iq; if(sp->wq && cangetc(cq)) wakeup(&cq->r); | |
| 1991/1115/sys/src/9/port/devscc.c:371,377 – 1991/1225/sys/src/9/port/devscc.c:393,399 | ||
| 1991/0601 | void sccspecial(int port, IOQ *oq, IOQ *iq, int baud) { | |
| 1991/1225 | SCC *sp = scc[port]; | |
| 1991/0601 | sp->nostream = 1; sp->oq = oq; | |
| 1991/1115/sys/src/9/port/devscc.c:410,416 – 1991/1225/sys/src/9/port/devscc.c:432,438 | ||
| 1991/0601 | kprint("sccstopen: q=0x%ux, inuse=%d, type=%d, dev=%d, id=%d\n", q, s->inuse, s->type, s->dev, s->id); | |
| 1991/1225 | sp = scc[s->id]; | |
| 1991/0601 | qlock(sp); sp->wq = WR(q); WR(q)->ptr = sp; | |
| 1991/1115/sys/src/9/port/devscc.c:430,436 – 1991/1225/sys/src/9/port/devscc.c:452,457 | ||
| 1991/0601 | SCC *sp = q->ptr; qlock(sp); | |
| 1991/1115/sys/src/9/port/devscc.c:461,467 – 1991/1225/sys/src/9/port/devscc.c:482,491 | ||
| 1991/0601 | switch(*bp->rptr){ case 'B': case 'b': | |
| 1991/1225 | if(BLEN(bp)>4 && strncmp((char*)(bp->rptr+1), "reak", 4) == 0) sccbreak(sp, 0); else sccsetbaud(sp, n); | |
| 1991/0601 | break; case 'D': case 'd': | |
| 1991/1115/sys/src/9/port/devscc.c:522,553 – 1991/1225/sys/src/9/port/devscc.c:546,579 | ||
| 1991/0601 | goto loop; } | |
| 1991/1115 |
| |
| 1991/0601 |
| |
| 1991/1225 | Dirtab *sccdir; | |
| 1991/0601 |
| |
| 1991/1115 |
| |
| 1991/0601 |
| |
| 1991/1225 | * create 2 directory entries for each 'sccsetup' ports. * allocate the queues if no one else has. | |
| 1991/0601 | */ void sccreset(void) { SCC *sp; | |
| 1991/1225 | int i; Dirtab *dp; | |
| 1991/0601 |
| |
| 1991/1225 | sccdir = ialloc(2 * nscc * sizeof(Dirtab), 0); dp = sccdir; for(i = 0; i < nscc; i++){ /* 2 directory entries per port */ sprint(dp->name, "eia%d", i); dp->qid.path = STREAMQID(i, Sdataqid); dp->perm = 0666; dp++; sprint(dp->name, "eia%dctl", i); dp->qid.path = STREAMQID(i, Sctlqid); dp->perm = 0666; dp++; /* set up queues if a stream port */ sp = scc[i]; | |
| 1991/0601 | if(sp->nostream) continue; sp->iq = ialloc(sizeof(IOQ), 0); | |
| 1991/1115/sys/src/9/port/devscc.c:578,598 – 1991/1225/sys/src/9/port/devscc.c:604,624 | ||
| 1991/0601 | int sccwalk(Chan *c, char *name) { | |
| 1991/1225 | return devwalk(c, name, sccdir, 2*nscc, devgen); | |
| 1991/0601 | } void sccstat(Chan *c, char *dp) { | |
| 1991/1115 |
| |
| 1991/1225 | int i; i = STREAMID(c->qid.path); switch(STREAMTYPE(c->qid.path)){ case Sdataqid: streamstat(c, dp, sccdir[2*i].name); | |
| 1991/0601 | break; | |
| 1991/1115 |
| |
| 1991/0601 |
| |
| 1991/1225 | devstat(c, dp, sccdir, 2*nscc, devgen); | |
| 1991/0601 | break; } } | |
| 1991/1115/sys/src/9/port/devscc.c:602,627 – 1991/1225/sys/src/9/port/devscc.c:628,640 | ||
| 1991/0601 | { SCC *sp; | |
| 1991/1115 |
| |
| 1991/0601 |
| |
| 1991/1115 |
| |
| 1991/0601 |
| |
| 1991/1225 | if(c->qid.path != CHDIR){ sp = scc[STREAMID(c->qid.path)]; if(sp->nostream) errors("in use"); | |
| 1991/0601 | streamopen(c, &sccinfo); | |
| 1991/1225 | } return devopen(c, omode, sccdir, 2*nscc, devgen); | |
| 1991/0601 | } void | |
| 1991/1115/sys/src/9/port/devscc.c:641,663 – 1991/1225/sys/src/9/port/devscc.c:654,673 | ||
| 1991/0601 | long sccread(Chan *c, void *buf, long n, ulong offset) { | |
| 1991/1225 | SCC *sp; char b[8]; | |
| 1991/0601 |
| |
| 1991/1115 |
| |
| 1991/0601 |
| |
| 1991/1115 |
| |
| 1991/0601 |
| |
| 1991/1225 | if(c->qid.path == CHDIR) return devdirread(c, buf, n, sccdir, 2*nscc, devgen); switch(STREAMTYPE(c->qid.path)){ case Sdataqid: return streamread(c, buf, n); case Sctlqid: sprint(b, "%d", STREAMID(c->qid.path)); return stringread(buf, n, b, offset); | |
| 1991/0601 | } | |
| 1991/1225 | errors("bad qid"); | |
| 1991/0601 | } long | |
| 1991/1225/sys/src/9/port/devscc.c:4,10 – 1992/0111/sys/src/9/port/devscc.c:4,10 (short | long) | ||
|
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1991/0601 | #include "dat.h" #include "fns.h" #include "io.h" | |
| 1992/0111 | #include "../port/error.h" | |
| 1991/0601 | #include "devtab.h" | |
| 1992/0111/sys/src/9/port/devscc.c:149,155 – 1992/0114/sys/src/9/port/devscc.c:149,155 (short | long) | ||
| 1991/0601 | int brconst; | |
| 1991/1225 | if(rate == 0) | |
| 1992/0114 | error(Ebadctl); | |
| 1991/0601 | ||
| 1991/1225 | brconst = (sp->freq+16*rate-1)/(2*16*rate) - 2; | |
| 1992/0111/sys/src/9/port/devscc.c:631,637 – 1992/0114/sys/src/9/port/devscc.c:631,637 | ||
| 1991/1225 | if(c->qid.path != CHDIR){ sp = scc[STREAMID(c->qid.path)]; if(sp->nostream) | |
| 1992/0114 | error(Einuse); | |
| 1991/0601 | streamopen(c, &sccinfo); | |
| 1991/1225 | } return devopen(c, omode, sccdir, 2*nscc, devgen); | |
| 1992/0111/sys/src/9/port/devscc.c:667,673 – 1992/0114/sys/src/9/port/devscc.c:667,673 | ||
| 1991/1225 | sprint(b, "%d", STREAMID(c->qid.path)); return stringread(buf, n, b, offset); | |
| 1991/0601 | } | |
| 1991/1225 |
| |
| 1992/0114 | error(Egreg); | |
| 1991/0601 | } long | |
| 1992/0114/sys/src/9/port/devscc.c:101,110 – 1992/0129/sys/src/9/port/devscc.c:101,116 (short | long) | ||
| 1991/0601 | Rendez r; /* kproc waiting for input */ Alarm *a; /* alarm for waking the kernel process */ int kstarted; /* kproc started */ | |
| 1992/0129 | /* idiot flow control */ int xonoff; /* true if we obey this tradition */ int blocked; /* abstinence */ | |
| 1991/0601 | }; | |
| 1991/1225 | int nscc; SCC *scc[8]; /* up to 4 8530's */ | |
| 1992/0129 | #define CTLS 023 #define CTLQ 021 | |
| 1991/1225 | ||
| 1991/0601 | void onepointseven(void) | |
| 1992/0114/sys/src/9/port/devscc.c:272,278 – 1992/0129/sys/src/9/port/devscc.c:278,284 | ||
| 1991/0601 | x = splhi(); lock(cq); puts(cq, s, n); | |
| 1992/0129 | if(sp->printing == 0 && sp->blocked==0){ | |
| 1991/0601 | ch = getc(cq); /*kprint("<start %2.2ux>", ch);*/ if(ch >= 0){ | |
| 1992/0114/sys/src/9/port/devscc.c:303,308 – 1992/0129/sys/src/9/port/devscc.c:309,320 | ||
| 1991/0601 | while(*sp->ptr&RxReady){ onepointseven(); ch = *sp->data; | |
| 1992/0129 | if (ch == CTLS && sp->xonoff) sp->blocked = 1; else if (ch == CTLQ && sp->xonoff) { sp->blocked = 0; sccputs(sp->oq, "", 0); } | |
| 1991/0601 | if(cq->putc) (*cq->putc)(cq, ch); | |
| 1991/1003 | else | |
| 1992/0114/sys/src/9/port/devscc.c:310,315 – 1992/0129/sys/src/9/port/devscc.c:322,332 | ||
| 1991/0601 | } } if(x & TxPendB){ | |
| 1992/0129 | if (sp->blocked) { sccwrreg(sp, 0, ResTxPend); sp->printing = 0; return; } | |
| 1991/0601 | cq = sp->oq; lock(cq); ch = getc(cq); | |
| 1992/0114/sys/src/9/port/devscc.c:502,507 – 1992/0129/sys/src/9/port/devscc.c:519,528 | ||
| 1991/0601 | case 'W': case 'w': | |
| 1991/1003 | /* obsolete */ | |
| 1992/0129 | break; case 'X': case 'x': sp->xonoff = n; | |
| 1991/0601 | break; } }else while((m = BLEN(bp)) > 0){ | |
| 1992/0129/sys/src/9/port/devscc.c:1,5 – 1992/0321/sys/src/9/port/devscc.c:1,5 (short | long) | ||
|
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1991/0601 | #include "u.h" | |
| 1992/0321 | #include "../port/lib.h" | |
| 1991/0601 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0321/sys/src/9/port/devscc.c:33,38 – 1992/0326/sys/src/9/port/devscc.c:33,42 (short | long) | ||
| 1991/0601 | Rx8bits= 3<<6, /* wr 4 */ | |
| 1992/0326 | ParEven= 3<<0, ParOdd= 1<<0, ParOff= 0<<0, ParMask= 3<<0, | |
| 1991/0601 | SyncMode= 0<<2, Rx1stop= 1<<2, Rx1hstop= 2<<2, | |
| 1992/0321/sys/src/9/port/devscc.c:163,168 – 1992/0326/sys/src/9/port/devscc.c:167,192 | ||
| 1991/0601 | sccwrreg(sp, 13, (brconst>>8) & 0xff); } | |
| 1992/0326 | void sccparity(SCC *sp, char type) { int val; switch(type){ case 'e': val = ParEven; break; case 'o': val = ParOdd; break; default: val = ParOff; break; } sp->sticky[4] = (sp->sticky[4] & ~ParMask) | val; sccwrreg(sp, 4, 0); } | |
| 1991/0601 | /* * toggle DTR */ | |
| 1992/0321/sys/src/9/port/devscc.c:507,512 – 1992/0326/sys/src/9/port/devscc.c:531,540 | ||
| 1991/0601 | case 'D': case 'd': sccdtr(sp, n); | |
| 1992/0326 | break; case 'P': case 'p': sccparity(sp, *(bp->rptr+1)); | |
| 1991/0601 | break; case 'K': case 'k': | |
| 1992/0326/sys/src/9/port/devscc.c:451,457 – 1992/0519/sys/src/9/port/devscc.c:451,456 (short | long) | ||
| 1991/0727 | } | |
| 1991/0601 | } | |
| 1992/0519/sys/src/9/port/devscc.c:716,721 – 1992/0522/sys/src/9/port/devscc.c:716,722 (short | long) | ||
| 1991/1225 | return stringread(buf, n, b, offset); | |
| 1991/0601 | } | |
| 1992/0114 | error(Egreg); | |
| 1992/0522 | return 0; /* not reached */ | |
| 1991/0601 | } long | |
| 1992/0522/sys/src/9/port/devscc.c:103,109 – 1992/0602/sys/src/9/port/devscc.c:103,108 (short | long) | ||
| 1991/0601 | /* stream interface */ Queue *wq; /* write queue */ Rendez r; /* kproc waiting for input */ | |
| 1992/0129 | /* idiot flow control */ | |
| 1992/0602/sys/src/9/port/devscc.c:31,36 – 1992/0617/sys/src/9/port/devscc.c:31,37 (short | long) | ||
| 1991/0601 | Rx7bits= 1<<6, Rx6bits= 2<<6, Rx8bits= 3<<6, | |
| 1992/0617 | Rxbitmask= 3<<6, | |
| 1991/0601 | /* wr 4 */ | |
| 1992/0326 | ParEven= 3<<0, | |
| 1992/0602/sys/src/9/port/devscc.c:52,57 – 1992/0617/sys/src/9/port/devscc.c:53,59 | ||
| 1991/0601 | Tx7bits= 1<<5, Tx6bits= 2<<5, Tx8bits= 3<<5, | |
| 1992/0617 | Txbitmask= 3<<5, | |
| 1991/0601 | /* wr 9 */ IntEna= 1<<3, | |
| 1992/0602/sys/src/9/port/devscc.c:187,192 – 1992/0617/sys/src/9/port/devscc.c:189,228 | ||
| 1992/0326 | } | |
| 1991/0601 | /* | |
| 1992/0617 | * set bits/character, default 8 */ void sccbits(SCC *sp, int n) { int val; int rbits, tbits; switch(n){ case 5: rbits = Rx5bits; tbits = Tx5bits; break; case 6: rbits = Rx6bits; tbits = Tx6bits; break; case 7: rbits = Rx7bits; tbits = Tx7bits; break; case 8: default: rbits = Rx8bits; tbits = Tx8bits; break; } sp->sticky[3] = (sp->sticky[3]&~Rxbitmask) | rbits; sccwrreg(sp, 3, 0); sp->sticky[5] = (sp->sticky[5]&~Txbitmask) | tbits; sccwrreg(sp, 5, 0); } /* | |
| 1991/0601 | * toggle DTR */ void | |
| 1992/0602/sys/src/9/port/devscc.c:530,535 – 1992/0617/sys/src/9/port/devscc.c:566,576 | ||
| 1991/0601 | case 'd': sccdtr(sp, n); | |
| 1992/0326 | break; | |
| 1992/0617 | case 'L': case 'l': sccbits(sp, n); break; | |
| 1992/0326 | case 'P': case 'p': sccparity(sp, *(bp->rptr+1)); | |
| 1992/0617/sys/src/9/port/devscc.c:298,303 – 1992/0620/sys/src/9/port/devscc.c:298,304 (short | long) | ||
| 1991/1225 | sp->sticky[5] = TxEna | Tx8bits; sccwrreg(sp, 5, 0); } | |
| 1992/0620 | ||
| 1991/0601 | void | |
| 1991/1225 | sccsetup(void *addr, ulong freq) | |
| 1991/0601 | { | |
| 1992/0617/sys/src/9/port/devscc.c:309,321 – 1992/0620/sys/src/9/port/devscc.c:310,322 | ||
| 1991/0601 | /* | |
| 1991/1225 | * allocate a structure, set port addresses, and setup the line | |
| 1991/0601 | */ | |
| 1991/1225 |
| |
| 1992/0620 | sp = xalloc(sizeof(SCC)); | |
| 1991/1225 | scc[nscc] = sp; sp->ptr = &dev->ptra; sp->data = &dev->dataa; sp->freq = freq; sccsetup0(sp); | |
| 1992/0620 | sp = xalloc(sizeof(SCC)); | |
| 1991/1225 | scc[nscc+1] = sp; sp->ptr = &dev->ptrb; sp->data = &dev->datab; | |
| 1992/0617/sys/src/9/port/devscc.c:647,653 – 1992/0620/sys/src/9/port/devscc.c:648,654 | ||
| 1991/1225 | int i; Dirtab *dp; | |
| 1991/0601 | ||
| 1991/1225 |
| |
| 1992/0620 | sccdir = xalloc(2 * nscc * sizeof(Dirtab)); | |
| 1991/1225 | dp = sccdir; for(i = 0; i < nscc; i++){ /* 2 directory entries per port */ | |
| 1992/0620/sys/src/9/port/devscc.c:665,673 – 1992/0622/sys/src/9/port/devscc.c:665,673 (short | long) | ||
| 1991/1225 | sp = scc[i]; | |
| 1991/0601 | if(sp->nostream) continue; | |
| 1992/0622 | sp->iq = xalloc(sizeof(IOQ)); | |
| 1991/0601 | initq(sp->iq); | |
| 1992/0622 | sp->oq = xalloc(sizeof(IOQ)); | |
| 1991/0601 | initq(sp->oq); | |
| 1991/0606 | sccenable(sp); | |
| 1991/0601 | } | |
| 1992/0622/sys/src/9/port/devscc.c:754,760 – 1992/0623/sys/src/9/port/devscc.c:754,760 (short | long) | ||
| 1991/1225 | return streamread(c, buf, n); case Sctlqid: sprint(b, "%d", STREAMID(c->qid.path)); | |
| 1992/0623 | return readstr(offset, buf, n, b); | |
| 1991/0601 | } | |
| 1992/0114 | error(Egreg); | |
| 1992/0522 | return 0; /* not reached */ | |
| 1992/0623/sys/src/9/port/devscc.c:194,200 – 1992/0711/sys/src/9/port/devscc.c:194,199 (short | long) | ||
| 1992/0617 | void sccbits(SCC *sp, int n) { | |
| 1992/0623/sys/src/9/port/devscc.c:743,749 – 1992/0711/sys/src/9/port/devscc.c:742,747 | ||
| 1991/0601 | long sccread(Chan *c, void *buf, long n, ulong offset) { | |
| 1991/1225 |
| |
| 1991/0601 | ||
| 1991/1225 | if(c->qid.path == CHDIR) | |
| 1992/0623/sys/src/9/port/devscc.c:763,768 – 1992/0711/sys/src/9/port/devscc.c:761,767 | ||
| 1991/0601 | long sccwrite(Chan *c, void *va, long n, ulong offset) { | |
| 1992/0711 | USED(offset); | |
| 1991/0601 | return streamwrite(c, va, n, 0); } | |
| 1992/0711/sys/src/9/port/devscc.c:486,491 – 1992/0722/sys/src/9/port/devscc.c:486,506 (short | long) | ||
| 1991/0727 | } | |
| 1991/0601 | } | |
| 1992/0722 | void sccrawput(int port, int c) { SCC *sp = scc[port]; if(c == '\n') { sccrawput(port, '\r'); delay(100); } while((*sp->ptr&TxReady)==0) ; *sp->data = c; } | |
| 1991/0601 | static void sccstopen(Queue*, Stream*); static void sccstclose(Queue*); static void sccoput(Queue*, Block*); | |
| 1992/0722/sys/src/9/port/devscc.c:718,724 – 1992/0826/sys/src/9/port/devscc.c:718,724 (short | long) | ||
| 1991/1225 | i = STREAMID(c->qid.path); switch(STREAMTYPE(c->qid.path)){ case Sdataqid: | |
| 1992/0826 | streamstat(c, dp, sccdir[2*i].name, sccdir[2*i].perm); | |
| 1991/0601 | break; default: | |
| 1991/1225 | devstat(c, dp, sccdir, 2*nscc, devgen); | |
| 1992/0826/sys/src/9/port/devscc.c:271,277 – 1992/0922/sys/src/9/port/devscc.c:271,277 (short | long) | ||
| 1991/0601 | * transmit and receive enabled, interrupts disabled. */ | |
| 1991/1225 | static void | |
| 1992/0922 | sccsetup0(SCC *sp, int brsource) | |
| 1991/1225 | { memset(sp->sticky, 0, sizeof(sp->sticky)); | |
| 1992/0826/sys/src/9/port/devscc.c:284,292 – 1992/0922/sys/src/9/port/devscc.c:284,294 | ||
| 1991/1225 | sccsetbaud(sp, 9600); sp->sticky[4] = Rx1stop | X16; sccwrreg(sp, 4, 0); | |
| 1992/0922 | sp->sticky[11] = TxClockBR | RxClockBR | TRxCOutBR /*| TRxCOI*/; | |
| 1991/1225 | sccwrreg(sp, 11, 0); | |
| 1992/0922 | sp->sticky[14] = BREna; if(brsource) sp->sticky[14] |= BRSource; | |
| 1991/1225 | sccwrreg(sp, 14, 0); /* | |
| 1992/0826/sys/src/9/port/devscc.c:299,305 – 1992/0922/sys/src/9/port/devscc.c:301,307 | ||
| 1991/1225 | } | |
| 1992/0620 | ||
| 1991/0601 | void | |
| 1991/1225 |
| |
| 1992/0922 | sccsetup(void *addr, ulong freq, int brsource) | |
| 1991/0601 | { | |
| 1991/0604 | SCCdev *dev; | |
| 1991/0601 | SCC *sp; | |
| 1992/0826/sys/src/9/port/devscc.c:314,326 – 1992/0922/sys/src/9/port/devscc.c:316,328 | ||
| 1991/1225 | sp->ptr = &dev->ptra; sp->data = &dev->dataa; sp->freq = freq; | |
| 1992/0922 | sccsetup0(sp, brsource); | |
| 1992/0620 | sp = xalloc(sizeof(SCC)); | |
| 1991/1225 | scc[nscc+1] = sp; sp->ptr = &dev->ptrb; sp->data = &dev->datab; sp->freq = freq; | |
| 1992/0922 | sccsetup0(sp, brsource); | |
| 1991/1225 | nscc += 2; | |
| 1991/0601 | } | |
| 1992/0922/sys/src/9/port/devscc.c:98,104 – 1992/1020/sys/src/9/port/devscc.c:98,104 (short | long) | ||
| 1991/1225 | ulong freq; /* clock frequency */ | |
| 1991/0601 | /* console interface */ | |
| 1992/1020 | int special; /* can't use the stream interface */ | |
| 1991/0601 | IOQ *iq; /* input character queue */ IOQ *oq; /* output character queue */ | |
| 1992/0922/sys/src/9/port/devscc.c:473,479 – 1992/1020/sys/src/9/port/devscc.c:473,479 | ||
| 1991/0601 | { | |
| 1991/1225 | SCC *sp = scc[port]; | |
| 1991/0601 |
| |
| 1992/1020 | sp->special = 1; | |
| 1991/0601 | sp->oq = oq; sp->iq = iq; | |
| 1991/0606 | sccenable(sp); | |
| 1992/0922/sys/src/9/port/devscc.c:543,548 – 1992/1020/sys/src/9/port/devscc.c:543,551 | ||
| 1991/0601 | { SCC *sp = q->ptr; | |
| 1992/1020 | if(sp->special) return; | |
| 1991/0601 | qlock(sp); sp->wq = 0; sp->iq->putc = 0; | |
| 1992/0922/sys/src/9/port/devscc.c:679,685 – 1992/1020/sys/src/9/port/devscc.c:682,688 | ||
| 1991/1225 | /* set up queues if a stream port */ sp = scc[i]; | |
| 1991/0601 |
| |
| 1992/1020 | if(sp->special) | |
| 1991/0601 | continue; | |
| 1992/0622 | sp->iq = xalloc(sizeof(IOQ)); | |
| 1991/0601 | initq(sp->iq); | |
| 1992/0922/sys/src/9/port/devscc.c:735,741 – 1992/1020/sys/src/9/port/devscc.c:738,744 | ||
| 1991/0601 | ||
| 1991/1225 | if(c->qid.path != CHDIR){ sp = scc[STREAMID(c->qid.path)]; | |
| 1992/1020 | if(sp->special) | |
| 1992/0114 | error(Einuse); | |
| 1991/0601 | streamopen(c, &sccinfo); | |
| 1991/1225 | } | |
| 1992/1020/sys/src/9/port/devscc.c:96,101 – 1992/1021/sys/src/9/port/devscc.c:96,102 (short | long) | ||
| 1991/0601 | uchar *data; /* data register in Z8530 */ int printing; /* true if printing */ | |
| 1991/1225 | ulong freq; /* clock frequency */ | |
| 1992/1021 | uchar mask; /* bits/char */ | |
| 1991/0601 | /* console interface */ | |
| 1992/1020 | int special; /* can't use the stream interface */ | |
| 1992/1020/sys/src/9/port/devscc.c:198,216 – 1992/1021/sys/src/9/port/devscc.c:199,221 | ||
| 1992/0617 | switch(n){ case 5: | |
| 1992/1021 | sp->mask = 0x1f; | |
| 1992/0617 | rbits = Rx5bits; tbits = Tx5bits; break; case 6: | |
| 1992/1021 | sp->mask = 0x3f; | |
| 1992/0617 | rbits = Rx6bits; tbits = Tx6bits; break; case 7: | |
| 1992/1021 | sp->mask = 0x7f; | |
| 1992/0617 | rbits = Rx7bits; tbits = Tx7bits; break; case 8: default: | |
| 1992/1021 | sp->mask = 0xff; | |
| 1992/0617 | rbits = Rx8bits; tbits = Tx8bits; break; | |
| 1992/1020/sys/src/9/port/devscc.c:298,303 – 1992/1021/sys/src/9/port/devscc.c:303,309 | ||
| 1991/1225 | sccwrreg(sp, 3, 0); sp->sticky[5] = TxEna | Tx8bits; sccwrreg(sp, 5, 0); | |
| 1992/1021 | sp->mask = 0xff; | |
| 1991/1225 | } | |
| 1992/0620 | ||
| 1991/0601 | void | |
| 1992/1020/sys/src/9/port/devscc.c:369,375 – 1992/1021/sys/src/9/port/devscc.c:375,381 | ||
| 1991/0601 | cq = sp->iq; while(*sp->ptr&RxReady){ onepointseven(); | |
| 1992/1021 | ch = *sp->data & sp->mask; | |
| 1992/0129 | if (ch == CTLS && sp->xonoff) sp->blocked = 1; else if (ch == CTLQ && sp->xonoff) { | |
| 1992/1020/sys/src/9/port/devscc.c:477,483 – 1992/1021/sys/src/9/port/devscc.c:483,490 | ||
| 1991/0601 | sp->oq = oq; sp->iq = iq; | |
| 1991/0606 | sccenable(sp); | |
| 1991/0601 |
| |
| 1992/1021 | if(baud) sccsetbaud(sp, baud); | |
| 1991/0727 | if(iq){ /* | |
| Too many diffs (26 > 25). Stopping. | ||