Annotation of researchv10no/sys/io/camac.oldc, revision 1.1

1.1     ! root        1: /*#include     "../h/param.h"*/
        !             2: /*#include     "../h/dir.h"*/
        !             3: /*#include     "../h/user.h"*/
        !             4: /*#include     "../h/conf.h"*/
        !             5: /*#include     "../h/seg.h"*/
        !             6: 
        !             7: #include       <sys/param.h>
        !             8: #include       <sys/dir.h>
        !             9: #include       <sys/user.h>
        !            10: #include       <sys/ubaddr.h>
        !            11: #include       <sys/buf.h>
        !            12: #include       <sys/conf.h>
        !            13: #include       <sys/pte.h>
        !            14: #include       <sys/proc.h>
        !            15: /*#include     <sys/seg.h>*/
        !            16: 
        !            17: #include       <sys/camac.h> 
        !            18: 
        !            19: int camopen(), camclose(), camread(), camwrite(), camioctl();
        !            20: 
        !            21: extern struct ubaddr camaddr[];                /* defined in conf..*/
        !            22: extern int camcnt;
        !            23: extern caddr_t camcaddr[];
        !            24: 
        !            25: struct cdevsw camcdev = cdinit(camopen, camclose, camread, camwrite, camioctl);
        !            26: 
        !            27: /*#define      BASE    0766000 */              /* start addr of Camac registers for VAX*/
        !            28: /*#define      BASE    0166000          old LSI start addr */
        !            29: /*
        !            30:  * camac registers
        !            31:  */
        !            32: 
        !            33: int camdebug = 1;
        !            34: 
        !            35: /*     the following is to make shure that the driver occupies
        !            36:        a contiguous space in memory for all valid camac addresses
        !            37:        01400 equals 768 addresses or 384 word addresses
        !            38:        the base address is then the one chosen for the camac controller
        !            39:        usually 0766000 (the csr is at N(24)A(0), which is BASE+01400)
        !            40: */
        !            41: 
        !            42: struct camregs {
        !            43:        unsigned short  na[24][16];
        !            44:        unsigned short  csr;
        !            45:        unsigned short  datahi;
        !            46:        unsigned short  lamlo;
        !            47:        unsigned short  lamhi;
        !            48:        unsigned short  reg4;
        !            49:        unsigned short  reg5;
        !            50:        unsigned short  reg6;
        !            51:        unsigned short  int0;
        !            52: };
        !            53: struct camregs *regs;
        !            54: 
        !            55: unsigned long  *intvector;
        !            56: unsigned short *BASE;
        !            57: 
        !            58: camopen(d,f)
        !            59: {
        !            60:        register int dev;
        !            61: 
        !            62:        if(camdebug){ printf(" started camopen \n");}
        !            63: 
        !            64:        if((dev = minor(d)) >= camcnt) {
        !            65:                u.u_error = ENODEV;
        !            66:                return;
        !            67:        }
        !            68: 
        !            69:        /* get the addresses for regs...*/
        !            70: /*     if((regs = (struct camregs *)ubaddr(&camaddr[dev])) == 0
        !            71:           || ubbadaddr(camaddr[dev].ubno, (caddr_t)regs, sizeof(u_short))) {
        !            72:                printf("cam%d absent\n", dev); 
        !            73:                u.u_error = ENODEV;
        !            74:                return;
        !            75:        }*/
        !            76: 
        !            77:        /* get the address from the configuration */
        !            78:        /* the following will assign the range of contiguous addresses
        !            79:           for the physical I/O bus addresses */
        !            80: 
        !            81:        regs = (struct camregs *) ubaddr(&camaddr[dev]);
        !            82: 
        !            83:        if(camdebug){
        !            84:                printf("address: value(csr):%o %o %o %o \n",
        !            85:                &regs->csr,&regs->datahi,&regs->lamlo,&regs->lamhi);
        !            86:        }
        !            87: /*     
        !            88:        the PDP/11 does it absolut, BASE=0766000
        !            89: */
        !            90: /*     regs = (struct camregs *) (BASE + 01400);*/
        !            91: 
        !            92:        BASE = (&regs->na[0][0]);/* calculate the BASE relative to CSR */
        !            93: 
        !            94:        if(camdebug){
        !            95:                printf(" BASE: %o \n",BASE);
        !            96:        }
        !            97: 
        !            98:        if(camdebug){
        !            99:        printf("BASE as calculated:%o \n",BASE);
        !           100:        printf("should be         :20016750000\n");
        !           101:        }
        !           102: 
        !           103: /*
        !           104:        BASE = 020016750000;
        !           105: */
        !           106: 
        !           107: /*     intvector = (unsigned *) (BASE + 01416);*/
        !           108: 
        !           109: 
        !           110:        regs->csr = 0;          /* initialize csr */
        !           111: 
        !           112:        if(camdebug){
        !           113:                printf(" csr initialized: %o at addr %o\n", regs->csr,&regs->csr);
        !           114:                printf(" exit camopen \n");
        !           115:        }
        !           116: }
        !           117: 
        !           118: camclose()
        !           119: {
        !           120:        /* not used */
        !           121: }
        !           122: 
        !           123: camread()
        !           124: {
        !           125:        /* not used */
        !           126: }
        !           127: 
        !           128: camwrite()
        !           129: {
        !           130:        /* not used */
        !           131: }
        !           132: 
        !           133: camioctl(dev, cmd, usr_buf)
        !           134: caddr_t                usr_buf;
        !           135: {
        !           136:        extern int              copyin(), copyout();    
        !           137:        struct module_info      buffer1;
        !           138:        struct reg_info         buffer2;
        !           139: 
        !           140:        unsigned                *Dev_addr(), datalo, datahi;
        !           141:        unsigned short          *device;
        !           142:        char                    *cdevice;
        !           143: 
        !           144:        if(camdebug) {
        !           145:                printf(" starting camioctl \n");
        !           146:                printf(" dev= %o cmd= %d usr_buf= %o at addr %o \n",
        !           147:                        dev,cmd,usr_buf,&usr_buf);
        !           148:        }
        !           149: 
        !           150: 
        !           151:        switch(cmd) {
        !           152: 
        !           153:        case CAMREAD:
        !           154:        case CAMWRITE:
        !           155:        case CAMSET:
        !           156: 
        !           157:                if(camdebug) {
        !           158:                        printf(" 1st copyin in driver \n");
        !           159:                        printf(" usr_buf %o \n",usr_buf);
        !           160:                }
        !           161: 
        !           162:                if(copyin(usr_buf, (caddr_t)&buffer1, sizeof(buffer1)))
        !           163:                        u.u_error = EFAULT;
        !           164: 
        !           165:                device = &regs->na[buffer1.N][buffer1.A];
        !           166: 
        !           167:                if(camdebug) {
        !           168:                        printf(" address of device: %o \n",device);
        !           169:                }
        !           170:                
        !           171:                if(camdebug) { 
        !           172:                printf(" camioctldriver: %d %d", buffer1.N,buffer1.A);}
        !           173: 
        !           174:                switch(cmd) {
        !           175: 
        !           176:                case CAMREAD:
        !           177:                /* Turn off no read bit, set f-bits, lv others unchanged */
        !           178:                if(camdebug){
        !           179:                        printf("started CAMREAD \n");
        !           180:                }
        !           181:                        regs->csr = (regs->csr & ~04007) | (buffer1.F & 07);
        !           182:                if(camdebug){
        !           183:                        printf("set regs->csr = %o \n",regs->csr);
        !           184:                }
        !           185: 
        !           186:                        datalo = regs->na[buffer1.N][buffer1.A];
        !           187:        /*              datalo = *device; */
        !           188: 
        !           189:                if(camdebug){
        !           190:                        printf("in camread(driver) datalo=%o \n",datalo);
        !           191:                }
        !           192:                        datahi = regs->datahi;
        !           193:                        buffer1.data = (long)datahi << 16;/*left shift 16 bits*/
        !           194:                        buffer1.data += (long) datalo;
        !           195:                        break;
        !           196: 
        !           197:                case CAMWRITE:
        !           198:                        if(camdebug){
        !           199:                                printf(" camwrite(driver) start \n");
        !           200:                                printf(" contents of buffer1:\n");
        !           201:                                printf("buffer1.F %o\n",buffer1.F);
        !           202:                                printf("buffer1.N %d\n",buffer1.N);
        !           203:                                printf("buffer1.A %d\n",buffer1.A);
        !           204:                                printf("buffer1.data %o\n",buffer1.data);
        !           205:                                printf("buffer1.Q %o\n",buffer1.Q);
        !           206:                        }
        !           207:                /* Turn off no read bit, set f-bits, lv others unchanged */
        !           208:                        regs->csr = (regs->csr & ~04007) | (buffer1.F & 07);
        !           209: 
        !           210:                if(camdebug){
        !           211:                        printf("camwrite set regs->csr = %o \n",regs->csr);
        !           212:                        printf("put the buffer into the registers \n");
        !           213:                        printf("buffer1.data %o at %o", 
        !           214:                                buffer1.data,&buffer1.data);
        !           215:                }
        !           216:                        regs->datahi = (buffer1.data >> 16);
        !           217:                                        /*rightshift 16 bits*/
        !           218: 
        !           219:                if(camdebug){
        !           220:                        printf(" datahi= %o \n", regs->datahi);
        !           221:                        printf(" writing to address %o \n", device);
        !           222:                }
        !           223: 
        !           224: /*                     indirect write to the address computed for *device */
        !           225:                        
        !           226: /*                     *device = buffer1.data & 0177777;*//*mask for 16 bits*/
        !           227:                        regs->na[buffer1.N][buffer1.A] = buffer1.data & 0177777;
        !           228: 
        !           229:                if(camdebug){
        !           230:                        printf(" written to address %o\n",device);
        !           231:                }
        !           232:                        break;
        !           233:                
        !           234:                case CAMSET:
        !           235:                        regs->csr &= ~04000;    /* turn on "no-read" bit */
        !           236:                        cdevice = (char*)device; /* Cntrl ops need "MOVB"*/
        !           237:                        *cdevice = buffer1.F;
        !           238:                        if(camdebug){
        !           239:                        printf(" cdevice= %o at address= %o \n",cdevice,&cdevice);
        !           240:                        }
        !           241:                        regs->csr &= ~04000;    /* turn off no read bit */
        !           242:                        buffer1.Q = (regs->csr & 0200) >> 7;
        !           243:                        break;
        !           244:                }
        !           245:                
        !           246:                buffer1.Q = (regs->csr & 0200) >> 7;
        !           247:                if(copyout((caddr_t)&buffer1, usr_buf, sizeof(buffer1)))
        !           248:                        u.u_error = EFAULT;
        !           249:                        
        !           250:                break;
        !           251: 
        !           252:        case CSRREAD:
        !           253:        case LAMLOREAD:
        !           254:        case LAMHIREAD:
        !           255:        case VCTREAD:
        !           256: 
        !           257:                switch(cmd) {
        !           258: 
        !           259:                case CSRREAD:   buffer2.reg = regs->csr;
        !           260:                                break;
        !           261: 
        !           262:                case LAMLOREAD: buffer2.reg = regs->lamlo;
        !           263:                                break;
        !           264: 
        !           265:                case LAMHIREAD: buffer2.reg = regs->lamhi;
        !           266:                                break;
        !           267: 
        !           268:                case VCTREAD:   buffer2.reg = regs->int0;
        !           269:                                break;
        !           270:                }
        !           271: 
        !           272:                if(copyout((caddr_t)&buffer2, usr_buf, sizeof(buffer2)))
        !           273:                        u.u_error = EFAULT;
        !           274:                break;
        !           275: 
        !           276:        case CSRWRITE:
        !           277:                if(copyin(usr_buf, (caddr_t)&buffer2, sizeof(buffer2)))
        !           278:                        u.u_error = EFAULT;
        !           279: 
        !           280:                regs->csr = buffer2.reg;
        !           281:                break;
        !           282:        }
        !           283: }
        !           284: 
        !           285: cam0int()
        !           286: {
        !           287:        /* not used */
        !           288: }
        !           289: 
        !           290: unsigned *
        !           291: Dev_addr(N,A)
        !           292: int    N,A;
        !           293: {
        !           294:        unsigned long   addr;
        !           295: 
        !           296:        addr = (unsigned)(BASE + N * 040 + A * 02);
        !           297:        if(camdebug){
        !           298:                printf("\nBASE:%o, N=%d, A=%d",BASE,N,A);
        !           299:                printf("\nDev_addr(%d,%d)=%o \n",N,A,addr);
        !           300:        }
        !           301: 
        !           302:        return((unsigned *)addr);
        !           303: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.