203 lines
4.7 KiB
C
203 lines
4.7 KiB
C
/* base/src/drv $Id$ */
|
|
/*
|
|
* subroutines that are used to interface to the binary output cards
|
|
*
|
|
* Author: Bob Dalesio
|
|
* Date: 5-26-88
|
|
*
|
|
* Experimental Physics and Industrial Control System (EPICS)
|
|
*
|
|
* Copyright 1991, the Regents of the University of California,
|
|
* and the University of Chicago Board of Governors.
|
|
*
|
|
* This software was produced under U.S. Government contracts:
|
|
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
|
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
|
*
|
|
* Initial development by:
|
|
* The Controls and Automation Group (AT-8)
|
|
* Ground Test Accelerator
|
|
* Accelerator Technology Division
|
|
* Los Alamos National Laboratory
|
|
*
|
|
* Co-developed with
|
|
* The Controls and Computing Group
|
|
* Accelerator Systems Division
|
|
* Advanced Photon Source
|
|
* Argonne National Laboratory
|
|
*
|
|
* Modification Log:
|
|
* -----------------
|
|
* .01 10-31-91 bg broke bb902 code out of bo_driver.c
|
|
* .02 02-20-92 bg Added level to io_report. Added ability
|
|
* to read out raw values on card if level
|
|
* > 0.
|
|
* .03 08-10-92 joh made number of cards runtime configurable
|
|
* .04 08-25-92 mrk made masks a macro
|
|
* .05 09-14-93 mrk Let report just display one hex value
|
|
*
|
|
*/
|
|
|
|
static char SccsId[] = "@(#)drvBb902.c 1.6 9/14/92 ";
|
|
|
|
/*
|
|
* Code Portions:
|
|
*
|
|
* bo_drv_init Finds and initializes all binary output cards present
|
|
* bo_driver Interfaces to the binary output cards present
|
|
*/
|
|
|
|
#include <vxWorks.h>
|
|
#include <vme.h>
|
|
#include <module_types.h>
|
|
#include <drvSup.h>
|
|
|
|
static long report();
|
|
static long init();
|
|
|
|
struct {
|
|
long number;
|
|
DRVSUPFUN report;
|
|
DRVSUPFUN init;
|
|
} drvBb902={
|
|
2,
|
|
report,
|
|
init};
|
|
|
|
static long report(level)
|
|
int level;
|
|
{
|
|
int i;
|
|
|
|
bb902_io_report(level);
|
|
return(0);
|
|
}
|
|
|
|
static long init()
|
|
{
|
|
int status;
|
|
|
|
bb902_driver_init();
|
|
return(0);
|
|
}
|
|
|
|
#define MAX_BB_BO_CARDS (bo_num_cards[BB902])
|
|
|
|
/* Burr-Brown 902 binary output memory structure */
|
|
struct bo_bb902{
|
|
short csr; /* control status register */
|
|
unsigned short low_value; /* low order 16 bits value */
|
|
unsigned short high_value; /* high order 16 bits value */
|
|
char end_pad[0x100-6]; /* pad until next card */
|
|
};
|
|
|
|
static char *bb902_shortaddr;
|
|
|
|
/* pointers to the binary output cards */
|
|
struct bo_bb902 **pbo_bb902s; /* Burr-Brown 902s */
|
|
|
|
|
|
/*
|
|
* BO_DRIVER_INIT
|
|
*
|
|
* intialization for the binary output cards
|
|
*/
|
|
int bb902_driver_init(){
|
|
int bomode;
|
|
int status;
|
|
short i;
|
|
struct bo_bb902 *pbo_bb902;
|
|
|
|
pbo_bb902s = (struct bo_bb902 **)calloc(MAX_BB_BO_CARDS,
|
|
sizeof(*pbo_bb902s));
|
|
if(!pbo_bb902s){
|
|
return ERROR;
|
|
}
|
|
|
|
/* intialize the Burr-Brown 902 binary output cards */
|
|
|
|
/* base address of the burr-brown 902 binary output cards */
|
|
|
|
status = sysBusToLocalAdrs(VME_AM_SUP_SHORT_IO,bo_addrs[BB902],&bb902_shortaddr);
|
|
if (status != OK){
|
|
printf("Addressing error in bb902 driver\n");
|
|
return (ERROR);
|
|
}
|
|
pbo_bb902 = (struct bo_bb902 *)bb902_shortaddr;
|
|
/* determine which cards are present */
|
|
for (i = 0; i < bo_num_cards[BB902]; i++,pbo_bb902++){
|
|
if (vxMemProbe(pbo_bb902,READ,sizeof(short),&bomode) == OK)
|
|
pbo_bb902s[i] = pbo_bb902;
|
|
else
|
|
pbo_bb902s[i] = 0;
|
|
}
|
|
return (0);
|
|
|
|
}
|
|
|
|
/*
|
|
* BB902_DRIVER
|
|
*
|
|
* interface to the Burr-Brown binary outputs
|
|
*/
|
|
|
|
int bb902_driver(card,val,mask)
|
|
unsigned short card;
|
|
unsigned long val;
|
|
unsigned long mask;
|
|
{
|
|
unsigned int work;
|
|
|
|
/* verify card exists */
|
|
if (!pbo_bb902s[card])
|
|
return (-1);
|
|
/* use structure to handle high and low short swap */
|
|
/* get current output */
|
|
work = (pbo_bb902s[card]->high_value << 16) /* high */
|
|
+ pbo_bb902s[card]->low_value; /* low */
|
|
/* alter specified bits */
|
|
work = (work & ~mask) | (val & mask);
|
|
|
|
/* write new output */
|
|
pbo_bb902s[card]->high_value = (unsigned short)(work >> 16);
|
|
pbo_bb902s[card]->low_value = (unsigned short)work;
|
|
return (0);
|
|
}
|
|
|
|
/*
|
|
* bb902_read
|
|
*
|
|
* read the binary output
|
|
*/
|
|
int bb902_read(card,mask,pval)
|
|
unsigned short card;
|
|
unsigned int mask;
|
|
unsigned int *pval;
|
|
{
|
|
unsigned int work;
|
|
|
|
/* verify card exists */
|
|
if (!pbo_bb902s[card]) return (-1);
|
|
/* readback */
|
|
*pval = (pbo_bb902s[card]->high_value << 16) /* high */
|
|
+ pbo_bb902s[card]->low_value; /* low */
|
|
*pval &= mask;
|
|
return(0);
|
|
}
|
|
|
|
void bb902_io_report(level)
|
|
short int level;
|
|
{
|
|
unsigned int value;
|
|
int card;
|
|
|
|
for (card = 0; card < MAX_BB_BO_CARDS; card++){
|
|
if (pbo_bb902s[card]){
|
|
value = (pbo_bb902s[card]->high_value << 16)
|
|
+ pbo_bb902s[card]->low_value;
|
|
printf("BO: BB902: card %d value=0x%08.8x\n",card,value);
|
|
}
|
|
}
|
|
|
|
}
|