Files
epics-base/src/drv/drvExampleVxi.c
1994-06-22 15:35:59 +00:00

238 lines
5.9 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* base/src/drv $Id$ */
/*
* Author: John Winans
* Date: 09-09-92
*
* Skeleton VXI driver module.
*
* 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 09-09-92 jrw written
* .02 08-24-93 joh updated for EPICS format return codes
* .03 08-24-93 joh converted to ANSI C
* .04 08-24-93 joh ran through -Wall
*
*/
#include <vxWorks.h>
#include <stdioLib.h>
#include <rebootLib.h>
#include <drvEpvxi.h>
#include <drvSup.h>
#include <devLib.h>
typedef long exVxiStat;
exVxiStat vti(int make, int model);
LOCAL exVxiStat example_init(void);
LOCAL void example_stat(unsigned card, int level);
LOCAL void example_init_card(unsigned addr);
LOCAL int example_shutdown(void);
LOCAL void example_shutdown_card(unsigned la);
struct drvet drvExample={
2,
NULL, /* VXI I/O report takes care of this */
example_init
};
static unsigned long exampleDriverID; /* ID used to identify this driver */
struct examplePrivate {
int j;
/*
* Define all per-card private variables here.
*/
};
#define PRIVATE_SIZE sizeof(struct examplePrivate)
int vxi_make_example = 0x100; /* Set to proper make of the card */
int vxi_model_example = 0x100; /* Set to proper model of the card */
/*
* This is a test entry point that allows a user to do a pseudo-init of
* a make and model of VXI cards.
*/
exVxiStat vti(int make, int model)
{
vxi_make_example = make;
vxi_model_example = model;
example_init();
printf("Driver ID is 0x%08X\n", exampleDriverID);
return(VXI_SUCCESS);
}
/******************************************************************************
*
* Initialize all cards controlled by the example driver.
*
******************************************************************************/
LOCAL exVxiStat example_init(void)
{
exVxiStat s;
epvxiDeviceSearchPattern dsp;
/*
* do nothing on crates without VXI
*/
if(!epvxiResourceMangerOK)
return VXI_SUCCESS;
if (rebootHookAdd(example_shutdown) < 0){
s = S_dev_internal;
errMessage(s, "rebootHookAdd failed");
return(s);
}
exampleDriverID = epvxiUniqueDriverID();
dsp.flags = VXI_DSP_make;
dsp.make = vxi_make_example;
s = epvxiLookupLA(&dsp, example_init_card, (void *)NULL);
return s;
}
/******************************************************************************
*
* initialize single example card
*
******************************************************************************/
LOCAL void example_init_card(unsigned addr)
{
exVxiStat s;
struct examplePrivate *ep; /* Per-card private variable area */
struct exampleCard *ec; /* Physical address of the card */
/* Tell the VXI sub-system that this driver is in charge of this card */
s = epvxiOpen(addr, exampleDriverID, PRIVATE_SIZE, example_stat);
if (s)
{
errPrintf(s, __FILE__, __LINE__, "LA=0X%X", addr);
return;
}
printf("example_init_card entered for card at LA 0x%02X, make 0x%02X, model 0x%02X\n", addr, vxi_make_example, vxi_model_example);
/* Allocate a private variable area for the card */
s = epvxiFetchPConfig(addr, exampleDriverID, ep);
if(s){
errMessage(s, NULL);
epvxiClose(addr, exampleDriverID);
return;
}
/* Get physical base address of the card */
ec = (struct exampleCard *) VXIBASE(addr);
/***********************************************
*
* Perform card-specific initialization in here.
*
***********************************************/
/* Register the card's model and make names for reporting purposes */
s = epvxiRegisterModelName(
vxi_make_example,
vxi_model_example,
"Example Model Name");
if(s){
errMessage(s, NULL);
}
s = epvxiRegisterMakeName(
vxi_make_example,
"Example Make Name");
if(s){
errMessage(s, NULL);
}
return;
}
/******************************************************************************
*
* Shut the cards down beacuse a soft-boot will be taking place soon.
*
******************************************************************************/
LOCAL int example_shutdown(void)
{
exVxiStat s;
epvxiDeviceSearchPattern dsp;
dsp.flags = VXI_DSP_make;
dsp.make = vxi_make_example;
s = epvxiLookupLA(&dsp, example_shutdown_card, (void *)NULL);
if(s){
errMessage(s, NULL);
}
return OK;
}
LOCAL void example_shutdown_card(unsigned la)
{
/*
* Perform proper operations here to disable the VXI card from
* generating interrupts and/or other backplane bus activity that
* could cause the CPUs and controllers problems during a soft-boot.
*/
return;
}
/******************************************************************************
*
* Print status for a single card.
*
******************************************************************************/
LOCAL void example_stat(
unsigned card,
int level
)
{
/*
* Perform proper operations to evaluate the current operating mode
* of the card and print a summary.
*/
return;
}
/******************************************************************************
*
* Place any user-required functions here.
*
******************************************************************************/