Beispiel #1
0
/*---------------------------------------------------------*/
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);
}
Beispiel #2
0
/*---------------------------------------------------------*/
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);
}
Beispiel #3
0
/*       return(0) if not complete                         */
unsigned int
adc1182ready(int id)
{
  short ret;

  ret = vmeRead16((unsigned short *)vmeaddress[id]) & 0x0001;

  return(ret);
}
Beispiel #4
0
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);
}
Beispiel #5
0
/* 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);
}
Beispiel #6
0
/*---------------------------------------------------------*/
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;
  }

}
Beispiel #7
0
/* 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);
}
Beispiel #8
0
/*
     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);
}