|
|
1.1 ! root 1: #include "lex.h" ! 2: #if NLEX > 0 ! 3: ! 4: /* ! 5: * LEXIDATA 3400 DEVICE DRIVER ! 6: */ ! 7: ! 8: #include "../h/param.h" ! 9: #include "../h/dir.h" ! 10: #include "../h/user.h" ! 11: #include "../h/proc.h" ! 12: #include "../h/ioctl.h" ! 13: #include "../h/buf.h" ! 14: #include "../h/systm.h" ! 15: #include "../h/map.h" ! 16: #include "../h/pte.h" ! 17: #include "../h/ubavar.h" ! 18: #include "../h/ubareg.h" ! 19: ! 20: #define ERROR 0160000 ! 21: #define GO 01 ! 22: #define IE 0100 ! 23: #define READY 0200 ! 24: #define ORDY 01000 ! 25: #define RESET 04 ! 26: #define LOAD 02 ! 27: #define TEST 06 ! 28: #define SEND 010000 ! 29: #define LEXPRI PZERO+1 ! 30: #define LXRST 01 ! 31: #define LXULD 02 ! 32: #define LXWAKE 03 ! 33: ! 34: short cursxy[NLEX] = {29}; /*CURSXY command code*/ ! 35: int cursxmax[NLEX] = {640}; /*Max. screen x dimension*/ ! 36: int cursymax[NLEX] = {512}; /*Max. screen x dimension*/ ! 37: ! 38: struct lexdevice{ ! 39: short wc; ! 40: short ba; ! 41: short cs; ! 42: short db; ! 43: }; ! 44: ! 45: struct lexparam{ ! 46: int lex_open; /*open flag*/ ! 47: struct buf lex_buf; /*i/o buffer header*/ ! 48: int lex_uba; /*unibus data path descriptor*/ ! 49: } lexsoft[NLEX]; ! 50: ! 51: int lexprobe(),lexattach(); ! 52: ! 53: struct uba_device *lexinfo[NLEX]; ! 54: u_short lexstd[] = {0164100,0164110,0}; ! 55: ! 56: struct uba_driver lexdriver = ! 57: {lexprobe,0,lexattach,0,lexstd,"lex",lexinfo}; ! 58: ! 59: lexprobe(reg) /*called by autoconfig(4) - fake an interrupt*/ ! 60: caddr_t reg;{ ! 61: register int br,cvec; ! 62: br=0x15; ! 63: switch((int)(reg)&070){ ! 64: case 0: cvec=0370; break; ! 65: case 010: cvec=0364; break; ! 66: } ! 67: return(1); ! 68: } ! 69: ! 70: lexattach(ui) /*driver initialization*/ ! 71: struct uba_dev *ui;{ ! 72: } ! 73: ! 74: lexopen(dev) ! 75: dev_t dev;{ ! 76: register struct lexdevice *lxp; ! 77: register struct uba_device *ui; ! 78: register struct lexparam *lexs; ! 79: if(minor(dev)>=NLEX){ ! 80: u.u_error=ENXIO; /*device does not exist*/ ! 81: return; ! 82: } ! 83: lexs= &lexsoft[minor(dev)]; ! 84: ui=lexinfo[minor(dev)]; ! 85: if((lexs->lex_open)||(ui==0)||(ui->ui_alive==0)){ ! 86: u.u_error=ENXIO; /*device already open or not really present*/ ! 87: return; ! 88: } ! 89: lxp=(struct lexdevice *)(ui->ui_addr); ! 90: lexs->lex_open++; /*flag device as open*/ ! 91: lxp->cs=RESET; ! 92: lxp->db=0; /*send START to 3400*/ ! 93: lxp->cs=0; ! 94: } ! 95: ! 96: lexclose(dev) ! 97: dev_t dev;{ ! 98: register struct lexdevice *lxp; ! 99: register struct uba_device *ui; ! 100: register struct lexparam *lexs; ! 101: register spri; ! 102: ui=lexinfo[minor(dev)]; ! 103: lxp=(struct lexdevice *)(ui->ui_addr); ! 104: lexs= &lexsoft[minor(dev)]; ! 105: spri=spl5(); ! 106: if(lxp->cs&READY==0) tsleep(&lexs->lex_buf,LEXPRI,15); /*wait for DMA to complete*/ ! 107: splx(spri); ! 108: if(lexs->lex_uba) ubarelse(ui->ui_ubanum,&lexs->lex_uba); ! 109: ! 110: lxp->cs=0; /*interrupts off*/ ! 111: lexs->lex_open=lexs->lex_uba=0; /*clear flags*/ ! 112: } ! 113: ! 114: lexstrategy(bp) ! 115: register struct buf *bp;{ ! 116: register struct lexdevice *lxp; ! 117: register struct uba_device *ui; ! 118: register struct lexparam *lexs; ! 119: register eabits; ! 120: lexs= &lexsoft[minor(bp->b_dev)]; ! 121: ui=lexinfo[minor(bp->b_dev)]; ! 122: lxp=(struct lexdevice *)(ui->ui_addr); ! 123: lexs->lex_uba=ubasetup(ui->ui_ubanum,bp,UBA_NEEDBDP); ! 124: lxp->wc=(short)(-(bp->b_bcount)/2); ! 125: lxp->ba=(short)(lexs->lex_uba&0xffff); ! 126: eabits=(lexs->lex_uba>>12)&0x30; ! 127: spl5(); ! 128: lxp->cs=(short)(IE|GO|((bp->b_flags&B_READ)?0:SEND)|eabits); ! 129: } ! 130: ! 131: lexwrite(dev) ! 132: dev_t dev;{ ! 133: physio(lexstrategy,&lexsoft[minor(dev)].lex_buf,dev,B_WRITE,minphys); ! 134: } ! 135: ! 136: lexread(dev) ! 137: dev_t dev;{ ! 138: physio(lexstrategy,&lexsoft[minor(dev)].lex_buf,dev,B_READ,minphys); ! 139: } ! 140: ! 141: lexintr(dev) ! 142: dev_t dev;{ ! 143: register struct lexdevice *lxp; ! 144: register struct lexparam *lexs; ! 145: register struct uba_device *ui; ! 146: register struct buf *bp; ! 147: lexs= &lexsoft[minor(dev)]; ! 148: bp= &lexs->lex_buf; ! 149: ui=lexinfo[minor(dev)]; ! 150: lxp=(struct lexdevice *)(ui->ui_addr); ! 151: bp->b_flags|=B_DONE; ! 152: if(lxp->cs&ERROR) bp->b_flags|=B_ERROR; ! 153: lxp->cs=0; ! 154: if(lexs->lex_uba) ubarelse(ui->ui_ubanum,&lexs->lex_uba); ! 155: wakeup(bp); ! 156: } ! 157: ! 158: lexioctl(dev,cmd,addr,flag) ! 159: dev_t dev; ! 160: caddr_t addr;{ ! 161: register struct lexdevice *lxp; ! 162: register struct uba_device *ui; ! 163: register struct lexparam *lexs; ! 164: int i; ! 165: ui=lexinfo[minor(dev)]; ! 166: lxp=(struct lexdevice *)(ui->ui_addr); ! 167: lexs= &lexsoft[minor(dev)]; ! 168: switch(cmd){ ! 169: case LXRST: /*send reset to display*/ ! 170: lxp->cs=RESET; ! 171: lxp->db=0; ! 172: return; ! 173: case LXULD: /*load microcode*/ ! 174: lxp->cs=SEND|LOAD; ! 175: lxp->db=0; ! 176: return; ! 177: case LXWAKE: /*panic-attempt to wakeup*/ ! 178: printf("waking-up %x\n",&lexs->lex_buf); ! 179: printf("flags= %x\n",lexs->lex_buf.b_flags); ! 180: lexs->lex_buf.b_flags |= B_DONE; ! 181: wakeup(&lexs->lex_buf); ! 182: return; ! 183: default: ! 184: u.u_error=EINVAL; ! 185: } ! 186: } ! 187: ! 188: lexcur(dev,x,y) /*position cursor - called from bpd driver*/ ! 189: dev_t dev;{ ! 190: register struct lexdevice *lxp; ! 191: register struct uba_device *ui; ! 192: register i; ! 193: register struct lexparam *lexs; ! 194: ui=lexinfo[minor(dev)]; ! 195: lxp=(struct lexdevice *)(ui->ui_addr); ! 196: lexs= &lexsoft[minor(dev)]; ! 197: if(lexs->lex_open==0) return; ! 198: if((lxp->cs&READY==0)||(lexs->lex_buf.b_flags&B_BUSY)) return; ! 199: lxp->cs=SEND; ! 200: lxp->db=cursxy[minor(dev)]; ! 201: x=(x*cursxmax[minor(dev)])/1024; ! 202: for(i=1000;((lxp->cs&ORDY)==0)&&i;i--); ! 203: if(i) lxp->db=(short)x; ! 204: y=cursymax[minor(dev)]-1-(y*cursymax[minor(dev)])/1024; ! 205: for(;((lxp->cs&ORDY)==0)&&i;i--); ! 206: if(i) lxp->db=(short)y; ! 207: for(;((lxp->cs&ORDY)==0)&&i;i--); ! 208: if(i==0){ ! 209: printf("plot cursor timeout\n"); ! 210: lxp->cs=RESET; ! 211: lxp->db=0; ! 212: } ! 213: } ! 214: ! 215: #endif NLEX
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.