/*---------------------------------------------------------*/ int v288Wait(UINT32 addr, int delay) { volatile UINT16 *v288adr = (volatile UINT16 *) addr; volatile UINT16 *statreg = (volatile UINT16 *) (addr+2); int i=0; UINT16 q=0; UINT16 vmedat; /*printf("v288Wait reached, delay=%d\n",delay);*/ while(i<=TIMEOUT && q!=QQ) { /*v288ActiveLoop(delay);*/ vmedat = vmeRead16(v288adr); /*v288ActiveLoop(delay);*/ if((q=vmeRead16(statreg)) == QQ) { /*printf("v288Wait: info: q=0x%08x, i=%d\n",q,i);*/ return(vmedat); } #ifndef VXWORKS usleep(1); #endif i++; } printf("v288Wait: error: q=0x%08x, i=%d\n",q,i); return(WAIT_ERROR); }
/*---------------------------------------------------------*/ int v288Reset(UINT32 addr) { volatile UINT16 *statreg = (volatile UINT16 *) (addr+2); volatile UINT16 *resetreg = (volatile UINT16 *) (addr+6); int i=0; UINT16 q=0; #ifdef VXWORKS int delay=10000000; #else int delay=1000000000; #endif /*printf("v288Reset reached\n");*/ while(q!=QQ && i<=11) { v288ActiveLoop(delay); vmeWrite16(resetreg, MEK); v288ActiveLoop(delay); q = vmeRead16(statreg); /*printf("q=0x%08x\n",q);*/ i++; } if(i>11) printf("v288Reset: error: q=0x%08x, i=%d\n",q,i); /*else printf("v288Reset: info: q=0x%08x, i=%d\n",q,i);*/ return((i==11) ? 11 : OK); }
/* return(0) if not complete */ unsigned int adc1182ready(int id) { short ret; ret = vmeRead16((unsigned short *)vmeaddress[id]) & 0x0001; return(ret); }
int v851Init(unsigned long addr, int id) { int res; UINT32 boardID=0; if (addr == 0) { /* Use default */ v851p[id] = (struct v851_struct *)V851_BASE_ADDR; } else if ((addr>0)&&(addr<0xffff)) { /* A16 Local address - find translation */ #ifdef VXWORKS res = sysBusToLocalAdrs(0x29,(char *)addr,(char **)&v851p[id]); if (res != 0) { printf("v851Init: ERROR in sysBusToLocalAdrs(0x29,0x%x,&laddr) \n",(int)addr); return(ERROR); } #else res = vmeBusToLocalAdrs(0x29,(char *)addr,(char **)&v851p[id]); if (res != 0) { printf("v851Init: ERROR in vmeBusToLocalAdrs(0x29,0x%x,&laddr) \n",(int)addr); return(ERROR); } #endif } else { /* NO TRANSLATION */ v851p[id] = (struct v851_struct *)addr; } boardID = vmeRead16(&v851p[id]->id); #ifdef SP_DEBUG printf(" ModuleID = (0x%x) , address = 0x%x\n",boardID,(int)v851p[id]); #endif if(boardID != V851_MODULE_ID) { printf("v851Init: ERROR: Invalid Module ID (0x%x) at address 0x%x\n", boardID,(int)v851p[id]); v851p[id]=0; return(ERROR); } /* Initialize Control Register and readback variable */ v851ControlReg = V851_CONTROL_DISARM; vmeWrite16(&v851p[id]->control,v851ControlReg); return(OK); }
/* get data */ int v288Get(UINT32 addr, int nw, UINT16 *buffer) { volatile UINT16 *v288adr = (volatile UINT16 *) addr; volatile UINT16 *statreg = (volatile UINT16 *) (addr+2); int i, k=0; UINT16 q=0; UINT16 vmedat; #ifdef VXWORKS int delay = 10000; #else /// int delay = 100000; ///my: #endif i = 0; for(;;) { /*v288ActiveLoop(delay);*/ vmedat = vmeRead16(v288adr); /*v288ActiveLoop(delay);*/ if( (q=vmeRead16(statreg)) != QQ ) { /*printf("v288Get: q=0x%08x, i=%d - break\n",q,i);*/ break; } i++; if(k<nw) { buffer[k++] = vmedat; } else { printf("v288Get: ERROR: buffer size %d is not enough !\n",nw); } } return(k); }
/*---------------------------------------------------------*/ int v288Reset(UINT32 addr) { volatile UINT16 *statreg = (volatile UINT16 *) (addr+2); volatile UINT16 *resetreg = (volatile UINT16 *) (addr+6); int i=0; UINT16 q=0; #ifdef VXWORKS int delay=10000000; #else int delay=1000000000; #endif /*printf("v288Reset reached\n");*/ // NAB: Is this 11 iterations optimized / appropriate? // Why is there no delay in this loop? while(q!=QQ && i<=11) { v288ActiveLoop(delay); vmeWrite16(resetreg, MEK); v288ActiveLoop(delay); q = vmeRead16(statreg); /*printf("q=0x%08x\n",q);*/ i++; } //if(i>11) printf("v288Reset: error: q=0x%08x, i=%d\n",q,i); /*else printf("v288Reset: info: q=0x%08x, i=%d\n",q,i);*/ //return((i==11) ? 11 : OK); // NAB: //return((i>11) ? i : OK); //return i; if(i>11) { printf("v288Reset: ERROR: q=0x%08x, i=%d\n",q,i); return i; } else { printf("v288Reset: INFO: q=0x%08x, i=%d\n",q,i); return OK; } }
/* read data from module at base address addr from channel chan */ unsigned int adc1182read(int id, int chan) { int adrtmp; short buf; short *address; unsigned int ret; adrtmp = vmeaddress[id] + 0x0100 + chan*2; buf = vmeRead16((unsigned short *)adrtmp); ret = (buf & 0x0fff) + (chan<<17); return(ret); }
/* addr - base address of v288 board offset - register offset (in bytes) we want to access: 0 - base reg 2 - stat reg 4 - trans reg 6 - reset reg vmedat - data to write into the register spas - parameter for delay active loop */ int v288Transmit(UINT32 addr, UINT32 offset, UINT16 vmedat, int spas) { volatile UINT16 *vmeaddress = (volatile UINT16 *) (addr+offset); volatile UINT16 *statreg = (volatile UINT16 *) (addr+2); int i=0; UINT16 q=0; /*printf("v288Transmit reached\n");*/ while(q!=QQ && i<=TIMEOUT) { /*v288ActiveLoop(spas);*/ vmeWrite16(vmeaddress, vmedat); /*v288ActiveLoop(spas);*/ q = vmeRead16(statreg); i++; } if(i>=TIMEOUT) printf("v288Transmit: error: q=0x%08x, i=%d\n",q,i); /*else printf("v288Transmit: info: q=0x%08x, i=%d\n",q,i);*/ return((i==TIMEOUT) ? TIMEOUT : OK); }