/* devVme18k10KM.c */
/* devVme18k10KM.c - Device Support Routines for VME adc board */
/*
*
* Original Author: Makoto Tobiyama
* Current Author:
* Date: 30/Jul/2012
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1997, KEKB.
*
*
* Modification Log:
* -----------------
*/
#include <vxLib.h>#include <logLib.h>
#include <sysLib.h>
#include <sys/time.h>
#include <time.h>
/* #include <memLib.h> */
#include <intLib.h>
#include <stdio.h>
| #include | <stdioLib.h> |
| #include | <string.h> |
/* #include <sys/time.h> */
| #include | <vme.h> |
| #include | <dbDefs.h> |
| #include | <dbAccess.h> |
| #include | <recSup.h> |
| #include | <devSup.h> |
#include <iv.h>
| #include | <module_types.h> |
| #include | <longinRecord.h> |
| #include | <longoutRecord.h> |
| #include | <boRecord.h> |
| #include | <biRecord.h> |
| #include | <mbbiDirectRecord.h> |
| #include | <mbboDirectRecord.h> |
| #include | <waveformRecord.h> |
#include <stringinRecord.h>#include <stringoutRecord.h>
#include <epicsMutex.h>#include <epicsExport.h>
#include <nfsDrv.h>
#include <usrLib.h>
#if 1
#include </cont/VxWorks/vw68/vxworks-6.8/target/config/mv5500/sysDma.h>
#include </cont/VxWorks/vw68/vxworks-6.8/target/config/mv5500/universe.h>
#include <vxLib.h>
#endif
static void dmaCallBackCh0( void );
static void dmaCallBackCh1( void );
struct D18k10KM {
unsigned long board_reset;
unsigned long trig_enb;
unsigned long mem_trig;
unsigned long mem_size;
unsigned long irq_enb;
unsigned long adclk_dly;
unsigned long adc_rst;
unsigned long adrdpt_rst;
unsigned long mem_cl;
unsigned long fpga_out;
unsigned long dum1[2];
unsigned long board_sts;
unsigned long ad_sts;
unsigned long rec_mode;
unsigned long harmonic;
unsigned long irq_no;
unsigned long irq_id;
unsigned long fpga_in;
unsigned long dum2;
unsigned long debug[2];
unsigned long dum3[10];
unsigned long dum4[32];
unsigned long ad_data[64];
};
#define NUM_20M (5120*4096)
#define NUM_40M (5120*8192)
#define NUM_80M (5120*16384)
#define SAVE_SIZE NUM_20M
static long init_all();
static long init_mi_record();
static long get_mbbi_int_info();
static long init_bo_record();
static long write_bo();
static long init_bi_record();
static long read_bi();
static long read_mbbiDirect();
static long init_wf_record();
static long read_wf_record();
static long init_lo_record();
static long write_longout();
static long init_li_record();
static long read_longin();
static long init_so_record();
static long write_so();
static long init_si_record();
static long read_si();
static void vme18k10KM_isr();
static int checkLink();
/* Create the dset for devBo18k10KM */
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN write_bo;
}devBo18k10KM={
5,
NULL,
NULL,
init_bo_record,
NULL,
write_bo
};
epicsExportAddress(dset,devBo18k10KM);
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_bi_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_bi;
}devBi18k10KM={
5,
NULL,
NULL,
init_bi_record,
NULL,
read_bi
};
epicsExportAddress(dset,devBi18k10KM);
/* For devMbbi18k10KM */
struct{
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_mi_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_mbbiDirect;
}devMbbi18k10KM={
5,
NULL,
NULL,
init_mi_record,
get_mbbi_int_info,
read_mbbiDirect
};
epicsExportAddress(dset,devMbbi18k10KM);
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_write;
DEVSUPFUN conv;
}devWf18k10KM ={
6,
NULL,
NULL,
init_wf_record,
NULL,
read_wf_record,
NULL
};
epicsExportAddress(dset,devWf18k10KM);
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN write_longout;
DEVSUPFUN special_linconv;
}devLo18k10KM={
6,
NULL,
NULL,
init_lo_record,
NULL,
write_longout,
NULL
};
epicsExportAddress(dset,devLo18k10KM);
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_longin;
DEVSUPFUN special_linconv;
}devLi18k10KM={
6,
NULL,
NULL,
init_li_record,
NULL,
read_longin,
NULL
};
epicsExportAddress(dset,devLi18k10KM);
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN write_so;
DEVSUPFUN special_linconv;
}devSo18k10KM={
6,
NULL,
NULL,
init_so_record,
NULL,
write_so,
NULL};
epicsExportAddress(dset,devSo18k10KM);
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_si;
DEVSUPFUN special_linconv;
}devSi18k10KM={
6,
NULL,
NULL,
init_si_record,
NULL,
read_si,
NULL};
epicsExportAddress(dset,devSi18k10KM);
struct ioCard {
volatile struct D18k10KM *card; /* address of this card */
epicsMutexId lock; /* semaphore */
IOSCANPVT ioscanpvt;
};
static char file_name[10][255];
static char head[10][255];
static int saveflag[10];
FILE *FHAND;
#define CONST_NUM_LINKS 10
/* #define STATIC */
#define DEBUG_ON
static int debug_flag = 0;
static unsigned long Base_IO;
static int D18k10KM_num_links;
static struct ioCard cards[CONST_NUM_LINKS];
static int init_flag = 0;
static unsigned short INT_VEC_BASE;
static unsigned char int_level;
#if 1
static unsigned long *gplTmpDataB; /* 256K Word * 4ch(256*1024*2*4/4) */
#endif
int dev18k10KMConfig(ncards,a32base,irq,intvecbase)
int ncards;
long a32base;
int irq;
int intvecbase;
{
D18k10KM_num_links = ncards;
Base_IO = a32base;
int_level= irq;
INT_VEC_BASE=intvecbase;
logMsg("dev18k10KM NumLink= %d BaseIO= %x IRQ = %d INTVECBASE =%x\n
",D18k10KM_num_links,Base_IO,int_level,INT_VEC_BASE,0,0);
init_all(0);
return 0;
}
static long init_all(after)
int after;
{
int cardNum, chanNum;
unsigned char probeVal[4];
volatile struct D18k10KM *p;
unsigned short mem_pat;
int rtn ;
if (init_flag != 0 )
return(OK);
init_flag = 1;
#if 1
if ( sysVmeDmaInit() != OK ) {
logMsg("sysVmeDmaInit() Error!!\n",0,0,0,0,0,0);
return(ERROR);
}
logMsg("sysVmeDmaInit() OK!!\n",0,0,0,0,0,0);
#endif
if (sysBusToLocalAdrs(VME_AM_EXT_SUP_DATA,(char *)Base_IO,(char **)&p) == ERROR)
{
logMsg("18k10KM: cannot find extended address space\n",0,0,0,0,0,0);
return(ERROR);
}
/* if (debug_flag >0) logMsg("18k10KM address %x\n",(int)p,0,0,0,0,0); */
for (cardNum=0; cardNum< D18k10KM_num_links; cardNum++)
{
if (vxMemProbe((char*) &(p->board_reset), READ, 4, (char *)&probeVal[0])!= OK)
{
logMsg("No 18k10KM with cardNum= %d\n probe= %x\n",cardNum,(int)p,0,0,0,0);
cards[cardNum].card = NULL;
} else
{
if (debug_flag >0)
logMsg("Found 18k10KM with cardNum= %d\n address= %x\n",cardNum,(int)p,0,0,0,0);
cards[cardNum].card = p; /* Remember address of the board */
scanIoInit(&(cards[cardNum].ioscanpvt));
logMsg("scan IO init %x\n",(int)cards[cardNum].ioscanpvt,0,0,0,0,0);
} if (debug_flag >0)
logMsg("IntSet for 18K10KM with address %x\n",(int)p->irq_enb,0,0,0,0,0);
p->irq_enb = 0x00;
cards[cardNum].lock = epicsMutexMustCreate();
epicsMutexUnlock((cards[cardNum].lock)); /* Init the board lock */
p++;
}
gplTmpDataB = memalign( 256, 64*4 );
/* 256 x 4ch */
if (sysVmeDmaCnfgSet(DCTL_VDW_32 | DCTL_VCT_BLK,
DCTL_VAS_A32,
DCTL_PGM_DATA,
DCTL_SUPER_SUP) != OK){
logMsg("devVme18k10KM error DMA setting\n",0,0,0,0,0,0);}
return(OK);
}
/******************************************************************
*
* Interrupt service routine
*
*******************************************************************/
static void vme18k10KM_isr(pmbbi)
| struct mbbiDirectRecord | *pmbbi; |
{ unsigned char mode;
short cardN;
unsigned long ad;
cardN = pmbbi->inp.value.vmeio.card;
ad = (cards[cardN].card->ad_sts) & 0xff;
scanIoRequest(cards[cardN].ioscanpvt);
/* logMsg("18k10KM int called \n");*/
return;
}
/**************************************************************************
*
* BO Initialization (Called one time for each BO PowerUT card record)
*
**************************************************************************/
static long init_bo_record(pbo)
struct boRecord *pbo;
{
pbo->mask = 1;
return(0);
}
/**************************************************************************
*
* Perform a write operation from a BO record
*
**************************************************************************/
static long write_bo(pbo)
struct boRecord *pbo;
{
short cardN;
cardN = pbo->out.value.vmeio.card;
if (checkLink(cardN) == ERROR)
{
logMsg("Error--- No 18k10KM for card %d\n",cardN,0,0,0,0,0);
return(ERROR);
}
if (debug_flag>5) logMsg("BO\n",0,0,0,0,0,0);
epicsMutexMustLock((cards[cardN].lock));
switch(pbo->out.value.vmeio.signal){
case 0 : /* board reset */
cards[cardN].card->board_reset = 0x1 & (pbo->val);
break;
case 1 : /* trg enable */
cards[cardN].card->trig_enb = 0x1 & (pbo->val);
break;
case 2 : /* adc reset */
cards[cardN].card->adc_rst = 0x1 & (pbo->val);
break;
case 3 : /* adrdpt_rst */
cards[cardN].card->adrdpt_rst = 0x1 & (pbo->val);
break;
case 4 : /* mem clear */
cards[cardN].card->mem_cl = 0x1 & (pbo->val);
break;
case 5 : /* soft : record data y/n */
saveflag[cardN] = 0x1 &(pbo->val);
break;
default:
logMsg("write_bo called with card %d\n",cardN,0,0,0,0,0);
break;
}
epicsMutexUnlock((cards[cardN].lock));
return(0);
}
static long init_bi_record(pbi)
struct biRecord *pbi;
{
pbi->mask = 1;
return(0);
}
static long read_bi(pbi)
struct biRecord *pbi;
{
short cardN;
cardN = pbi ->inp.value.vmeio.card;
if (checkLink(cardN) == ERROR)
return(ERROR);
switch(pbi->inp.value.vmeio.signal){
case 0 :
pbi->rval = cards[cardN].card->board_reset & pbi->mask;
break;
case 1 :
pbi->rval = cards[cardN].card->trig_enb & pbi->mask;
break;
case 2 :
pbi->rval = cards[cardN].card->adc_rst & pbi->mask;
break;
case 3 :
pbi->rval = cards[cardN].card->adrdpt_rst & pbi->mask;
break;
case 4 :
pbi->rval = cards[cardN].card->rec_mode & pbi->mask;
break;
default :
break;
}
return(0);
}
static long init_lo_record(plongout)
struct longoutRecord *plongout;
{
return(0);
}
static long write_longout(plongout)
struct longoutRecord *plongout;
{
short cardN;
cardN = plongout->out.value.vmeio.card;
if (debug_flag >10)
logMsg("write_lo called with card %d\n",cardN,0,0,0,0,0);
if (checkLink(cardN) == ERROR)
return(ERROR);
epicsMutexMustLock((cards[cardN].lock));
switch(plongout->out.value.vmeio.signal){
case 0 : /* mem_trig */
cards[cardN].card->mem_trig = 0x3 & (plongout->val);
break;
case 1 : /* mem_size */ cards[cardN].card->mem_size = 0x3 & (plongout ->val);
break;
case 2 : /* interrupt enable */
cards[cardN].card->irq_enb = 0x3 & (plongout -> val);
break;
case 3 : /* adclk_dly */ cards[cardN].card->adclk_dly = 0x3f & (plongout->val);
break;
default: break;
}
epicsMutexUnlock((cards[cardN].lock));
return(OK);
}
static long init_li_record(plongin)
struct longinRecord *plongin;
{
return(0);
}
static long read_longin(plongin)
struct longinRecord *plongin;
{
short cardN;
if (debug_flag >10)
logMsg("read_longin called...\n",0,0,0,0,0,0);
cardN = plongin->inp.value.vmeio.card;
if (checkLink(cardN) == ERROR)
return(ERROR);
switch(plongin->inp.value.vmeio.signal){
case 0: /* mem_trig */
plongin->val = (cards[cardN].card->mem_trig) & 0x3;
break;
case 1: /* mem_size */
plongin->val = (cards[cardN].card->mem_size) & 0x3;
break;
case 2: /* IRQ_ENB */
plongin->val = (cards[cardN].card->irq_enb) & 0x3;
break;
case 3 : /* ADCLK_DLY */
plongin->val = (cards[cardN].card->adclk_dly) & 0x3f;
break;
case 4: /* harmonic */
plongin->val = (cards[cardN].card->harmonic) & 0x3;
break;
case 5: /* IRQ_NO */ plongin->val = (cards[cardN].card->irq_no) &0xff;
break;
case 6: /* irq_id */
plongin->val = (cards[cardN].card->irq_id) & 0xff;
break;
default: break;
}
return(OK);
}
static long init_mi_record(pmbbi)
| struct mbbiDirectRecord | *pmbbi; |
{ short cardNum;
short signal;
cardNum = pmbbi->inp.value.vmeio.card;
signal = pmbbi->inp.value.vmeio.signal;
if (signal == 1) {
if (intConnect(INUM_TO_IVEC(INT_VEC_BASE + cardNum),
(VOIDFUNCPTR)vme18k10KM_isr,
(int)pmbbi) != OK)
logMsg("devVme18k10KM: Interrupt connect failed for card %d %x\n",pmbbi->inp.value.vmeio.card,(int)INUM_TO_IVEC(INT_VEC_BASE + cardNum),0,0,0,0); logMsg("intConnect 0x%x\n",(int)pmbbi,0,0,0,0,0);
sysIntEnable(int_level); logMsg("devVme18k10KM int set for int 0x%x\n",int_level,0,0,0,0,0);
}
return(0);
}
static long read_mbbiDirect(pmbbi)
struct mbbiDirectRecord *pmbbi;
{
short cardN;
cardN = pmbbi->inp.value.vmeio.card;
if (debug_flag >5)
logMsg("read_mbbiDirect called with card %d\n",cardN,0,0,0,0,0);
if (checkLink(cardN) == ERROR)
return(ERROR);
switch(pmbbi->inp.value.vmeio.signal){
case 0: /* board_sts */
pmbbi->rval = (cards[cardN].card->board_sts) & 0x7f;
break;
case 1: /* AD_STS */
pmbbi->rval = (cards[cardN].card->ad_sts) & 0xff;
break;
default: break;
}
if (debug_flag >5)
logMsg("mbbi read complete \n",0,0,0,0,0,0);
return(OK);
}
static long get_mbbi_int_info(cmd,pmbbi,ppvt)
int cmd;
struct mbbiDirectRecord *pmbbi;
IOSCANPVT *ppvt;
{
short cardN;
unsigned char stat;
cardN = pmbbi->inp.value.vmeio.card;
*ppvt = cards[cardN].ioscanpvt;
if (debug_flag >5) logMsg("mbbi_INT CALLED\n",0,0,0,0,0,0);
return(0);
}
static long init_wf_record(pwf)
| struct waveformRecord | *pwf; |
{ /*
short cardNum;
cardNum = pwf->inp.value.vmeio.card;
if (intConnect(INUM_TO_IVEC(INT_VEC_BASE + cardNum),
(VOIDFUNCPTR)vme18k10KM_isr,
(int)pwf) != OK)
logMsg("devVme18k10KM: Interrupt connect failed for card %d\n",pwf->inp.value.vmeio.card); logMsg("intConnect 0x%x\n",pwf);
sysIntEnable(int_level); logMsg("devVme18k10KM int set for int 0x%x\n",int_level);
*/
return(0);
}
static long read_wf_record(pwf)
| struct waveformRecord | *pwf; |
{ short cardN;
unsigned long a1,a2;
long ii,start,is;
unsigned long temp_tpos;
unsigned long uuu;
unsigned char* us_thing = (unsigned char*)pwf->bptr;
struct timespec time_val;
int memory_size,m1,m2;
char ttt[255],eee[255];
int buflen=255;
FILE *pwFile;
int wsize;
char fname[255];
#if 1
STATUS iDmaStartRc;
unsigned int p1=0,p2=0,p3=0,p4=0,pSta=0;
#endif
#if 1
struct timespec oTimeSpec1;
struct timespec oTimeSpec2;
struct timespec oTimeSpec3;
struct timespec oTimeSpec4;
struct timespec oTimeSpec5;
/*
clock_gettime( CLOCK_REALTIME, &oTimeSpec1 );
*/
#endif
cardN = pwf->inp.value.vmeio.card;
memory_size = cards[cardN].card->mem_size;
strcpy(file_name[cardN],NULL);
strcat(file_name[cardN],head[cardN]);
clock_gettime(CLOCK_REALTIME, &time_val);
strftime(ttt,buflen,"%d_%b_%Y_%H_%M_%S",localtime(&time_val));
strcat(file_name[cardN],ttt);
strcpy(eee,".ADC");
strcat(file_name[cardN],eee);
if (debug_flag >5)
logMsg("file_name =%s\n",file_name[cardN],0,0,0,0,0);
if (debug_flag >5)
logMsg("read_wf_record called with card number of %d\n",cardN,0,0,0,0,0);
if (checkLink(cardN) == ERROR)
return(ERROR);
cards[cardN].card->irq_enb = 0x0;
switch(pwf->inp.value.vmeio.signal){
case 0: { /* KEKB 20M full */
cards[cardN].card->adrdpt_rst = 0x1;
sysUnivVERRClr();
if(sysVmeDmaStatusGet(&pSta) != OK )
{
logMsg("sysVmeDmaStatusGet() Error!!\n", 0, 0, 0, 0, 0,0);
}
if(sysVmeDmaCnfgGet(&p1,&p2,&p3,&p4) != OK )
{
logMsg("sysVmeDmaCnfgGet() Error!!\n", 0, 0, 0, 0, 0,0);
}
for (is=0;is<81920;is++){
iDmaStartRc = sysVmeDmaV2LCopy( &cards[cardN].card->ad_data[0], gplTmpDataB+0, 64*4 );
if(iDmaStartRc != 0)
{
logMsg("-->sysVmeDmaV2LCopy() error!! Rc[%d] card[%d]\n", iDmaStartRc, cardN, 0, 0 ,0, 0 );
}
for ( ii = 0; ii < 64 ; ii++ )
{
us_thing[is*256+ii*4+0] = (unsigned char)( (gplTmpDataB[ii] >>24)&0xff);
us_thing[is*256+ii*4+1] = (unsigned char)( (gplTmpDataB[ii] >>16)& 0xff);
us_thing[is*256+ii*4+2] = (unsigned char)((gplTmpDataB[ii] >>8) &0xff);
us_thing[is*256+ii*4+3] = (unsigned char)((gplTmpDataB[ii]) & 0xff);
}
}
/* logMsg("--us_thing[0,1] %x %x\n",us_thing[0],us_thing[1],0,0,0,0); */
/* clock_gettime( CLOCK_REALTIME, &oTimeSpec5 ); */
/* cards[cardN].card->adrdpt_rst = 0x1; */
pwf->nord = 20971520;
if (saveflag[cardN])
{
if (hostAdd( "wrs", "172.19.57.***" ) != OK) {
logMsg("hostAdd Error!!\n",0,0,0,0,0,0);
return(-1); }
taskDelay( sysClkRateGet() /10);
if( nfsMount( "wrs", "/raid0/data/_NAS_NFS_Exports_/BOR","/bor/" ) != OK) {
logMsg("nfsMount Error!!\n",0,0,0,0,0,0);
return(-1);
}
cd( "/bor/current/");
if( ( pwFile = fopen( file_name[cardN], "w" )) == NULL ) {
logMsg("File Open[Write mode] Error!!\n",0,0,0,0,0,0);
return(-1); }
if( ( wsize = fwrite(&us_thing[0], 1, SAVE_SIZE, pwFile )) != SAVE_SIZE) {
logMsg("Unmatch File Write Length!!\n",0,0,0,0,0,0);
}
fclose(pwFile);
nfsUnmount("/bor/");
hostDelete( "wrs", "172.19.57.***");
}
cards[cardN].card->irq_enb = 0x1;
cards[cardN].card->trig_enb = 0x1;
#if 0
logMsg("ad_start[%d]\n",cardN,0,0,0,0,0);
#endif
break;
}
case 1: { /* KEKB BCM 64 turn*/
cards[cardN].card->adrdpt_rst = 0x1;
sysUnivVERRClr();
if(sysVmeDmaStatusGet(&pSta) != OK )
{
logMsg("sysVmeDmaStatusGet() Error!!\n", 0, 0, 0, 0, 0,0);
}
if(sysVmeDmaCnfgGet(&p1,&p2,&p3,&p4) != OK )
{
logMsg("sysVmeDmaCnfgGet() Error!!\n", 0, 0, 0, 0, 0,0);
}
for (is=0;is<1280;is++){
iDmaStartRc = sysVmeDmaV2LCopy( &cards[cardN].card->ad_data[0], gplTmpDataB+0, 64*4 );
if(iDmaStartRc != 0)
{
logMsg("-->sysVmeDmaV2LCopy() error!! Rc[%d] card[%d]\n", iDmaStartRc, cardN, 0, 0 ,0, 0 );
}
for ( ii = 0; ii < 64 ; ii++ )
{
us_thing[is*256+ii*4+0] = (unsigned char)( (gplTmpDataB[ii] >>24)&0xff);
us_thing[is*256+ii*4+1] = (unsigned char)( (gplTmpDataB[ii] >>16)& 0xff);
us_thing[is*256+ii*4+2] = (unsigned char)((gplTmpDataB[ii] >>8) &0xff);
us_thing[is*256+ii*4+3] = (unsigned char)((gplTmpDataB[ii]) & 0xff);
}
}
/* logMsg("--us_thing[0,1] %x %x\n",us_thing[0],us_thing[1],0,0,0,0); */
/* clock_gettime( CLOCK_REALTIME, &oTimeSpec5 ); */
/* cards[cardN].card->adrdpt_rst = 0x1; */
pwf->nord = 327680;
cards[cardN].card->irq_enb = 0x1;
cards[cardN].card->trig_enb = 0x1;
#if 0
logMsg("ad_start[%d]\n",cardN,0,0,0,0,0);
#endif
break;
}
case 2: {
for (is=0;is<81920;is++){
for ( ii = 0; ii < 64 ; ii++ )
{
uuu = cards[cardN].card->ad_data[0];
us_thing[is*256+ii*4+0] = (unsigned char)(( uuu >>24) & 0xff);
us_thing[is*256+ii*4+1] = (unsigned char)(( uuu >>16) & 0xff);
us_thing[is*256+ii*4+2] = (unsigned char)(( uuu >>8 ) & 0xff);
us_thing[is*256+ii*4+3] = (unsigned char)(( uuu ) & 0xff);
}
}
/* } */
/* logMsg("--us_thing[0,1] %x %x\n",us_thing[0],us_thing[1],0,0,0,0); */
/* clock_gettime( CLOCK_REALTIME, &oTimeSpec5 ); */
/* cards[cardN].card->adrdpt_rst = 0x1; */
pwf->nord = 20971520;
/* cards[cardN].card ->irq_enb = 0x1; */
cards[cardN].card->irq_enb = 0x1;
cards[cardN].card->trig_enb = 0x1;
break;
}
case 3: { /* much larger memory */
cards[cardN].card->adrdpt_rst = 0x1;
if (memory_size == 1)
{
m1 = 81920 * 2;
m2 = NUM_40M;
} else if (memory_size == 2)
{
m1 = 81920 * 4;
m2 = NUM_80M;
}
else
{
m1 = 81920;
m2 = NUM_20M; }
sysUnivVERRClr();
if(sysVmeDmaStatusGet(&pSta) != OK )
{
logMsg("sysVmeDmaStatusGet() Error!!\n", 0, 0, 0, 0, 0,0);
}
if(sysVmeDmaCnfgGet(&p1,&p2,&p3,&p4) != OK )
{
logMsg("sysVmeDmaCnfgGet() Error!!\n", 0, 0, 0, 0, 0,0);
}
for (is=0;is<m1;is++){
iDmaStartRc = sysVmeDmaV2LCopy( &cards[cardN].card->ad_data[0], gplTmpDataB+0, 64*4 );
if(iDmaStartRc != 0)
{
logMsg("-->sysVmeDmaV2LCopy() error!! Rc[%d] card[%d]\n", iDmaStartRc, cardN, 0, 0 ,0, 0 );
}
for ( ii = 0; ii < 64 ; ii++ )
{
us_thing[is*256+ii*4+0] = (unsigned char)( (gplTmpDataB[ii] >>24)&0xff);
us_thing[is*256+ii*4+1] = (unsigned char)( (gplTmpDataB[ii] >>16)& 0xff);
us_thing[is*256+ii*4+2] = (unsigned char)((gplTmpDataB[ii] >>8) &0xff);
us_thing[is*256+ii*4+3] = (unsigned char)((gplTmpDataB[ii]) & 0xff);
}
}
/* logMsg("--us_thing[0,1] %x %x\n",us_thing[0],us_thing[1],0,0,0,0); */
/* clock_gettime( CLOCK_REALTIME, &oTimeSpec5 ); */
/* cards[cardN].card->adrdpt_rst = 0x1; */
pwf->nord = m2;
if (saveflag[cardN])
{
if (hostAdd( "wrs", "172.19.57.***" ) != OK) {
logMsg("hostAdd Error!!\n",0,0,0,0,0,0);
return(-1); }
taskDelay( sysClkRateGet() /10);
if( nfsMount( "wrs", "/raid0/data/_NAS_NFS_Exports_/BOR","/bor/" ) != OK) {
logMsg("nfsMount Error!!\n",0,0,0,0,0,0);
return(-1);
}
cd( "/bor/current/");
if( ( pwFile = fopen( file_name[cardN], "w" )) == NULL ) {
logMsg("File Open[Write mode] Error!!\n",0,0,0,0,0,0);
return(-1); }
if( ( wsize = fwrite(&us_thing[0], 1, m2, pwFile )) != m2) {
logMsg("Unmatch File Write Length!!\n",0,0,0,0,0,0);
}
fclose(pwFile);
nfsUnmount("/bor/");
hostDelete( "wrs", "172.19.57.***");
}
cards[cardN].card->irq_enb = 0x1;
cards[cardN].card->trig_enb = 0x1;
#if 0
logMsg("ad_start[%d]\n",cardN,0,0,0,0,0);
#endif
break;
}
default : logMsg("Invalid Signal\n",0,0,0,0,0,0);
}
/* cards[cardN].card->status = 0x1; */
/* temp_tpos = cards[cardN].card->trg_pos;
logMsg("TPOS After %x\n",temp_tpos,0,0,0,0,0); */
if (debug_flag >5) logMsg("18k10KM card %d end of read\n",cardN,0,0,0,0,0);
#if 0
/*
logMsg( "card[%d] ch1ch3 DMA Info. vmeaddr[0x%x]->memaddr[0x%x] readlen[0x%x]", &cards[cardN].card->call[0], gplTmpData+0, mems*4,0,0,0 );
*/
logMsg( "card[%d] ch1ch3 DMA stime[%ld.%09ld] etime[%ld.%09ld]\n",
cardN, oTimeSpec1.tv_sec, oTimeSpec1.tv_nsec, oTimeSpec2.tv_sec, oTimeSpec2.tv_nsec, 0 );
/*
logMsg( "card[%d] ch2ch4 DMA Info. vmeaddr[0x%x]->memaddr[0x%x] readlen[0x%x]", &cards[cardN].card->call[262144], gplTmpData+262144, mems*4,0,0,0 );
*/
logMsg( "card[%d] ch2ch4 DMA stime[%ld.%09ld] etime[%ld.%09ld]\n",
cardN, oTimeSpec3.tv_sec, oTimeSpec3.tv_nsec, oTimeSpec4.tv_sec, oTimeSpec4.tv_nsec, 0 );
logMsg( "card[%d] Move&Shift eTime[%ld.%09ld] \n",cardN,oTimeSpec5.tv_sec,oTimeSpec5.tv_nsec,0,0,0 );
#endif
return(0);
}
static long init_so_record(pstringout)
struct stringoutRecord *pstringout;
{
return 0;
}
static long write_so(pstringout)
struct stringoutRecord *pstringout;
{
long status = 0;
short cardN;
char tempchar[255];
cardN = pstringout->out.value.vmeio.card;
if (checkLink(cardN) == ERROR)
{
logMsg("Error- No 18k10KM for card %d\n",cardN,0,0,0,0,0);
return(ERROR);
}
switch(pstringout->out.value.vmeio.signal){
case 0 :
strcpy(head[cardN],pstringout->val);
strcpy(file_name[cardN],head[cardN]);
break;
}
return(status);
}
static long init_si_record(pstringin)
struct stringinRecord *pstringin;
{
return 0;
}
static long read_si(pstringin)
struct stringinRecord *pstringin;
{
long status = 0;
short cardN;
char tempchar[255];
cardN = pstringin->inp.value.vmeio.card;
if (checkLink(cardN) == ERROR)
{
logMsg("Error- No 18k10KM for card %d\n",cardN,0,0,0,0,0);
return(ERROR);
}
switch(pstringin->inp.value.vmeio.signal){
case 0 :
strcpy(pstringin->val,file_name[cardN]);
break;
}
return(status);
}
/*
static long get_wf_int_info(cmd,pwf,ppvt)
int cmd;
struct waveformRecord *pwf;
IOSCANPVT *ppvt;
{
short cardN;
unsigned char stat;
cardN = pwf->inp.value.vmeio.card;
*ppvt = cards[cardN].ioscanpvt;
if (debug_flag >5) logMsg("wf_INT CALLED\n");
return(0);
}
*/
/**************************************************************************
*
* Make sure card number is valid
*
**************************************************************************/
static int checkLink(cardN)
short cardN;
{
if (cardN >= D18k10KM_num_links)
return(ERROR);
if (cards[cardN].card == NULL)
{
logMsg("No 18K10KM with this number = %d\n",cardN,0,0,0,0,0);
return(ERROR);
}
if (debug_flag >10)
logMsg("Yes you have 18k10KM with card No= %d\n",cardN,0,0,0,0,0);
return(OK);
}
static void dmaCallBackCh0( void )
{
logMsg( "call dmaCallBackCh0\n",0,0,0,0,0,0 );
}
static void dmaCallBackCh1( void )
{
logMsg( "call dmaCallBackCh1\n", 0,0,0,0,0,0 );
}