/* 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<vxWorks.h>
#include <vxLib.h>#include <logLib.h> #include <sysLib.h> #include <sys/time.h> #include <time.h> /* #include <memLib.h> */ #include <intLib.h>
#include<types.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<link.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<dbScan.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]; };
#defineStatusEnable
#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 ); }