Annotation of researchv10no/sys/io/camac.c, revision 1.1.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 = 0;
                     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:        regs->csr = 0;          /* initialize csr */
                    105: 
                    106:        if(camdebug){
                    107:                printf(" csr initialized: %o at addr %o\n", regs->csr,&regs->csr);
                    108:                printf(" exit camopen \n");
                    109:        }
                    110: }
                    111: 
                    112: camclose()
                    113: {
                    114:        /* not used */
                    115: }
                    116: 
                    117: camread()
                    118: {
                    119:        /* not used */
                    120: }
                    121: 
                    122: camwrite()
                    123: {
                    124:        /* not used */
                    125: }
                    126: 
                    127: camioctl(dev, cmd, usr_buf)
                    128: caddr_t                usr_buf;
                    129: {
                    130:        extern int              copyin(), copyout();    
                    131:        struct module_info      buffer1;
                    132:        struct reg_info         buffer2;
                    133: 
                    134:        unsigned                *Dev_addr(), datalo, datahi;
                    135:        unsigned short          *device;
                    136:        char                    *cdevice;
                    137: 
                    138:        if(camdebug) {
                    139:                printf(" starting camioctl \n");
                    140:                printf(" dev= %o cmd= %d usr_buf= %o at addr %o \n",
                    141:                        dev,cmd,usr_buf,&usr_buf);
                    142:        }
                    143: 
                    144: 
                    145:        switch(cmd) {
                    146: 
                    147:        case CAMREAD:
                    148:        case CAMWRITE:
                    149:        case CAMSET:
                    150: 
                    151:                if(camdebug) {
                    152:                        printf(" 1st copyin in driver \n");
                    153:                        printf(" usr_buf %o \n",usr_buf);
                    154:                }
                    155: 
                    156:                if(copyin(usr_buf, (caddr_t)&buffer1, sizeof(buffer1)))
                    157:                        u.u_error = EFAULT;
                    158: 
                    159:                device = &regs->na[buffer1.N][buffer1.A];
                    160: 
                    161:                if(camdebug) {
                    162:                        printf(" address of device: %o \n",device);
                    163:                }
                    164:                
                    165:                if(camdebug) { 
                    166:                printf(" camioctldriver: %d %d", buffer1.N,buffer1.A);}
                    167: 
                    168:                switch(cmd) {
                    169: 
                    170:                case CAMREAD:
                    171:                /* Turn off no read bit, set f-bits, lv others unchanged */
                    172:                if(camdebug){
                    173:                        printf("started CAMREAD \n");
                    174:                }
                    175:                        regs->csr = (regs->csr & ~04007) | (buffer1.F & 07);
                    176:                if(camdebug){
                    177:                        printf("set regs->csr = %o \n",regs->csr);
                    178:                }
                    179: 
                    180:                        datalo = regs->na[buffer1.N][buffer1.A];
                    181: 
                    182:                if(camdebug){
                    183:                        printf("in camread(driver) datalo=%o \n",datalo);
                    184:                }
                    185:                        datahi = regs->datahi;
                    186:                        buffer1.data = (long)datahi << 16;/*left shift 16 bits*/
                    187:                        buffer1.data += (long) datalo;
                    188:                        break;
                    189: 
                    190:                case CAMWRITE:
                    191:                        if(camdebug){
                    192:                                printf(" camwrite(driver) start \n");
                    193:                                printf(" contents of buffer1:\n");
                    194:                                printf("buffer1.F %o\n",buffer1.F);
                    195:                                printf("buffer1.N %d\n",buffer1.N);
                    196:                                printf("buffer1.A %d\n",buffer1.A);
                    197:                                printf("buffer1.data %o\n",buffer1.data);
                    198:                                printf("buffer1.Q %o\n",buffer1.Q);
                    199:                        }
                    200:                /* Turn off no read bit, set f-bits, lv others unchanged */
                    201:                        regs->csr = (regs->csr & ~04007) | (buffer1.F & 07);
                    202: 
                    203:                if(camdebug){
                    204:                        printf("camwrite set regs->csr = %o \n",regs->csr);
                    205:                        printf("put the buffer into the registers \n");
                    206:                        printf("buffer1.data %o at %o", 
                    207:                                buffer1.data,&buffer1.data);
                    208:                }
                    209:                        regs->datahi = (buffer1.data >> 16);
                    210:                                        /*rightshift 16 bits*/
                    211: 
                    212:                if(camdebug){
                    213:                        printf(" datahi= %o \n", regs->datahi);
                    214:                        printf(" writing to address %o \n", device);
                    215:                }
                    216:                        
                    217:                        regs->na[buffer1.N][buffer1.A] = buffer1.data & 0177777;
                    218: 
                    219:                if(camdebug){
                    220:                        printf(" written to address %o\n",device);
                    221:                }
                    222:                        break;
                    223:                
                    224:                case CAMSET:
                    225:                        regs->csr &= ~04000;    /* turn on "no-read" bit */
                    226:                        cdevice = (char*)device; /* Cntrl ops need "MOVB"*/
                    227:                        *cdevice = buffer1.F;
                    228:                        if(camdebug){
                    229:                        printf(" cdevice= %o at address= %o \n",cdevice,&cdevice);
                    230:                        }
                    231:                        regs->csr &= ~04000;    /* turn off no read bit */
                    232:                        buffer1.Q = (regs->csr & 0200) >> 7;
                    233:                        break;
                    234:                }
                    235:                
                    236:                buffer1.Q = (regs->csr & 0200) >> 7;
                    237:                if(copyout((caddr_t)&buffer1, usr_buf, sizeof(buffer1)))
                    238:                        u.u_error = EFAULT;
                    239:                        
                    240:                break;
                    241: 
                    242:        case CSRREAD:
                    243:        case LAMLOREAD:
                    244:        case LAMHIREAD:
                    245:        case VCTREAD:
                    246: 
                    247:                switch(cmd) {
                    248: 
                    249:                case CSRREAD:   buffer2.reg = regs->csr;
                    250:                                break;
                    251: 
                    252:                case LAMLOREAD: buffer2.reg = regs->lamlo;
                    253:                                break;
                    254: 
                    255:                case LAMHIREAD: buffer2.reg = regs->lamhi;
                    256:                                break;
                    257: 
                    258:                case VCTREAD:   buffer2.reg = regs->int0;
                    259:                                break;
                    260:                }
                    261: 
                    262:                if(copyout((caddr_t)&buffer2, usr_buf, sizeof(buffer2)))
                    263:                        u.u_error = EFAULT;
                    264:                break;
                    265: 
                    266:        case CSRWRITE:
                    267:                if(copyin(usr_buf, (caddr_t)&buffer2, sizeof(buffer2)))
                    268:                        u.u_error = EFAULT;
                    269: 
                    270:                regs->csr = buffer2.reg;
                    271:                break;
                    272:        }
                    273: }
                    274: 
                    275: cam0int()
                    276: {
                    277:        /* not used */
                    278: }

unix.superglobalmegacorp.com

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