From d41abc2b1c68e95ce02a2efd238477e368d5874a Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 12 Jun 2017 18:50:18 +0200 Subject: [PATCH] added new jungfraustructure, wiht common detector tcp interface --- .../jungfrauDetectorServer/.gitignore | 1 - .../jungfrauDetectorServer/.target-makefrag | 1 - .../jungfrauDetectorServer/Makefile | 71 +- .../jungfrauDetectorServer/Makefile.virtual | 41 +- .../jungfrauDetectorServer/README.txt | 11 - .../RegisterDefs.h | 0 .../jungfrauDetectorServer/ansi.h | 2 +- .../bin/jungfrauDetectorServerv3.0.0.1.1 | Bin 0 -> 105576 bytes .../jungfrauDetectorServer/firmware_funcs.c | 1292 ------- .../jungfrauDetectorServer/firmware_funcs.h | 127 - .../jungfrauDetectorServerv3.0.0.1 | Bin 127056 -> 0 bytes .../jungfrauDetectorServer/mcb_funcs.c | 323 -- .../jungfrauDetectorServer/mcb_funcs.h | 17 - .../jungfrauDetectorServer/registers_m.h | 360 -- .../jungfrauDetectorServer/server.c | 121 - .../jungfrauDetectorServer/server_defs.h | 158 - .../jungfrauDetectorServer/server_funcs.c | 2955 ----------------- .../jungfrauDetectorServer/server_funcs.h | 92 - .../slsDetectorFunctionList.c | 0 .../slsDetectorFunctionList.h | 0 .../slsDetectorServer.c | 0 .../slsDetectorServer_defs.h | 0 .../slsDetectorServer_funcs.c | 0 .../slsDetectorServer_funcs.h | 0 .../jungfrauDetectorServer/stop_server.c | 46 - .../Makefile | 26 - .../Makefile.virtual | 25 - .../jungfrauDetectorServerNewStructure/ansi.h | 1 - .../communication_funcs.c | 1 - .../communication_funcs.h | 1 - .../gitInfo.txt | 9 - .../gitInfoJungfrau.h | 11 - .../gitInfoJungfrauTmp.h | 11 - .../sls_detector_defs.h | 1 - .../sls_detector_funcs.h | 1 - .../sls_receiver_defs.h | 1 - .../sls_receiver_funcs.h | 1 - 37 files changed, 39 insertions(+), 5668 deletions(-) delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/.gitignore delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/.target-makefrag mode change 100755 => 100644 slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/README.txt rename slsDetectorSoftware/{jungfrauDetectorServerNewStructure => jungfrauDetectorServer}/RegisterDefs.h (100%) create mode 100755 slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.0.1.1 delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.h delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/jungfrauDetectorServerv3.0.0.1 delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.h delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/registers_m.h delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/server.c delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/server_defs.h delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h rename slsDetectorSoftware/{jungfrauDetectorServerNewStructure => jungfrauDetectorServer}/slsDetectorFunctionList.c (100%) rename slsDetectorSoftware/{jungfrauDetectorServerNewStructure => jungfrauDetectorServer}/slsDetectorFunctionList.h (100%) rename slsDetectorSoftware/{jungfrauDetectorServerNewStructure => jungfrauDetectorServer}/slsDetectorServer.c (100%) rename slsDetectorSoftware/{jungfrauDetectorServerNewStructure => jungfrauDetectorServer}/slsDetectorServer_defs.h (100%) rename slsDetectorSoftware/{jungfrauDetectorServerNewStructure => jungfrauDetectorServer}/slsDetectorServer_funcs.c (100%) rename slsDetectorSoftware/{jungfrauDetectorServerNewStructure => jungfrauDetectorServer}/slsDetectorServer_funcs.h (100%) delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/stop_server.c delete mode 100755 slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile delete mode 100644 slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile.virtual delete mode 120000 slsDetectorSoftware/jungfrauDetectorServerNewStructure/ansi.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.c delete mode 120000 slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.h delete mode 100644 slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfo.txt delete mode 100644 slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrau.h delete mode 100644 slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrauTmp.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_funcs.h diff --git a/slsDetectorSoftware/jungfrauDetectorServer/.gitignore b/slsDetectorSoftware/jungfrauDetectorServer/.gitignore deleted file mode 100644 index 0173208ed..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.gdb diff --git a/slsDetectorSoftware/jungfrauDetectorServer/.target-makefrag b/slsDetectorSoftware/jungfrauDetectorServer/.target-makefrag deleted file mode 100755 index ce093ecac..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/.target-makefrag +++ /dev/null @@ -1 +0,0 @@ -AXIS_BUILDTYPE ?= cris-axis-linux-gnu diff --git a/slsDetectorSoftware/jungfrauDetectorServer/Makefile b/slsDetectorSoftware/jungfrauDetectorServer/Makefile index 436b54b8d..8ff6779c8 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/Makefile +++ b/slsDetectorSoftware/jungfrauDetectorServer/Makefile @@ -1,57 +1,26 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu +CROSS = bfin-uclinux- +CC = $(CROSS)gcc +CFLAGS += -Wall -DJUNGFRAUD -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DSTOP_SERVER #-DVERBOSEI #-DVERBOSE +LDLIBS += -lm -lstdc++ +PROGS = jungfrauDetectorServer +DESTDIR ?= bin +INSTMODE = 0777 -CROSS = bfin-uclinux- -CC = $(CROSS)gcc +SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c +OBJS = $(SRC_CLNT:.c=.o) + +all: clean $(PROGS) -CFLAGS += -Wall -DJUNGFRAUD -DMCB_FUNCS -DDACS_INT #-DVERBOSE #-DVERYVERBOSE #-DVIRTUAL +boot: $(OBJS) - -PROGS= jungfrauDetectorServer -INSTDIR= /tftpboot -INSTMODE= 0777 - - - -BINS = testlib_sharedlibc -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c -OBJS = $(SRCS:%.c=%.o) - - - -all: clean $(PROGS) - -test: clean jungfrauADCTEst - -boot: $(OBJS) - -jungfrauDetectorServer: $(OBJS) - echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - - -jungfrauADCTEst: $(OBJS) - echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) -DTESTADC - - - - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - - -romfs: - $(ROMFSINST) /bin/$(PROGS) +$(PROGS): $(OBJS) + echo $(OBJS) + mkdir -p $(DESTDIR) + $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) + mv $(PROGS) $(DESTDIR) + rm *.gdb clean: - rm -rf $(PROGS) *.o *.gdb - - - - - - + rm -rf $(DESTDIR)/$(PROGS) *.o + diff --git a/slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual b/slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual old mode 100755 new mode 100644 index 38dd2537c..8ee348341 --- a/slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual +++ b/slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual @@ -1,30 +1,25 @@ +CC = gcc +CFLAGS += -Wall -DJUNGFRAUD -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DSTOP_SERVER #-DVERBOSEI #-DVERBOSE +LDLIBS += -lm -lstdc++ -DESTDIR ?= ./ +PROGS = jungfrauDetectorServer +DESTDIR ?= bin +INSTMODE = 0777 -CC = gcc -CFLAGS += -Wall -DMOENCHD -DMCB_FUNCS -DDACS_INT -DDEBUG -DVIRTUAL - - -PROGS= $(DESTDIR)/moenchVirtualServer - - -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c -OBJS = $(SRCS:%.c=%.o) - -moenchVirtualServer = $(PROGS) - -all: clean $(PROGS) +SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c +OBJS = $(SRC_CLNT:.c=.o) + +all: clean $(PROGS) +boot: $(OBJS) $(PROGS): $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - + echo $(OBJS) + mkdir -p $(DESTDIR) + $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) + mv $(PROGS) $(DESTDIR) + rm *.gdb clean: - rm -rf $(PROGS) *.o *.gdb - - - - - - + rm -rf $(DESTDIR)/$(PROGS) *.o + diff --git a/slsDetectorSoftware/jungfrauDetectorServer/README.txt b/slsDetectorSoftware/jungfrauDetectorServer/README.txt deleted file mode 100644 index 7785cee12..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/README.txt +++ /dev/null @@ -1,11 +0,0 @@ -add the following to /etc/rc before using programfpga command before cat motd - - -#registering 7th and 9th pin to linux kernel -echo 7 > /sys/class/gpio/export -echo 9 > /sys/class/gpio/export -#define direction for the linux kernel -echo in > /sys/class/gpio/gpio7/direction -echo out > /sys/class/gpio/gpio9/direction -#needed, else all write errors when server starts up, because linux tries to take control fof gpio -echo 1 > /sys/class/gpio/gpio9/value diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/RegisterDefs.h b/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h similarity index 100% rename from slsDetectorSoftware/jungfrauDetectorServerNewStructure/RegisterDefs.h rename to slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h diff --git a/slsDetectorSoftware/jungfrauDetectorServer/ansi.h b/slsDetectorSoftware/jungfrauDetectorServer/ansi.h index c8131b6ec..a122db0ad 120000 --- a/slsDetectorSoftware/jungfrauDetectorServer/ansi.h +++ b/slsDetectorSoftware/jungfrauDetectorServer/ansi.h @@ -1 +1 @@ -/afs/psi.ch/project/sls_det_software/dhanya_softwareDevelopment/mySoft/slsDetectorsPackage/slsReceiverSoftware/include/ansi.h \ No newline at end of file +../../slsReceiverSoftware/include/ansi.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.0.1.1 b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.0.1.1 new file mode 100755 index 0000000000000000000000000000000000000000..d6ccbca7bd0dc59650799cc913452bb0b182371c GIT binary patch literal 105576 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 XnMu?=dKWpJmQvD!D6eEBnfbo}^$+0+ literal 0 HcmV?d00001 diff --git a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c deleted file mode 100755 index fb1e6868f..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c +++ /dev/null @@ -1,1292 +0,0 @@ -//#define TESTADC - - -#include "server_defs.h" -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "registers_m.h" -#include "gitInfoJungfrau.h" - - -#include -#include /* exit() */ -#include -#include /* memset(), memcpy() */ -#include -#include -#include -#include -#include -#include /* uname() */ -#include -#include /* socket(), bind(), listen(), accept() */ -#include /* fork(), write(), close() */ -#include -#include -#include -#include -#include -#include -#include - - - - -typedef struct ip_header_struct { - u_int16_t ip_len; - u_int8_t ip_tos; - u_int8_t ip_ihl:4 ,ip_ver:4; - u_int16_t ip_offset:13,ip_flag:3; - u_int16_t ip_ident; - u_int16_t ip_chksum; - u_int8_t ip_protocol; - u_int8_t ip_ttl; - u_int32_t ip_sourceip; - u_int32_t ip_destip; -} ip_header; - - -u_int32_t CSP0BASE = 0; -int highvoltage = 0; -int dacValues[NDAC]; -int32_t clkPhase[2] = {0, 0}; -char mtdvalue[10]; -int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING; -enum externalSignalFlag signals[4]={EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF}; - - - - - - -int mapCSP0(void) { - printf("Mapping memory\n"); -#ifndef VIRTUAL - int fd; - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) { - printf("\nCan't find /dev/mem!\n"); - return FAIL; - } -#ifdef VERBOSE - printf("/dev/mem opened\n"); -#endif - CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); - if (CSP0BASE == (u_int32_t)MAP_FAILED) { - printf("\nCan't map memmory area!!\n"); - return FAIL; - } - printf("CSPOBASE mapped from %08x to %08x\n",CSP0BASE,CSP0BASE+MEM_SIZE); -#else - CSP0BASE = malloc(MEM_SIZE); - printf("memory allocated\n"); -#endif - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - return OK; -} - - -u_int16_t bus_w16(u_int32_t offset, u_int16_t data) { - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - *ptr1=data; - return OK; -} - -u_int16_t bus_r16(u_int32_t offset){ - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - return *ptr1; -} - -// ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG -u_int16_t ram_w16(u_int32_t ramType, int adc, int adcCh, int Ch, u_int16_t data) { - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - return bus_w16(adr,data); -} - -// ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG -u_int16_t ram_r16(u_int32_t ramType, int adc, int adcCh, int Ch){ - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - return bus_r16(adr); -} - -u_int32_t bus_w(u_int32_t offset, u_int32_t data) { - volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - *ptr1=data; - return OK; -} - -u_int32_t bus_r(u_int32_t offset) { - volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - return *ptr1; -} - - - - -void initializeDetector(){ - printf("Initializing Detector\n"); - - //initial test - if ( (checkType() == FAIL) || (testFpga() == FAIL) || (testBus() == FAIL) ) { - cprintf(BG_RED, "Dangerous to continue. Goodbye!\n"); - exit(-1); - } - - printf("Resetting PLL\n"); - resetPLL(); - resetCore(); - resetPeripheral(); - cleanFifos(); - - //allocating module structure for the detector in the server -#ifdef MCB_FUNCS - initDetector(); -#endif - - prepareADC(); - - // initialize dac series - initDac(0); /* todo might work without */ - initDac(8); //only for old board compatibility - - //set dacs - printf("Setting Default Dac values\n") - { - int i = 0; - int retval = -1; - const int defaultvals[NDAC] = DEFAULT_DAC_VALS; - for(i = 0; i < NDAC; ++i) { - retval = setDac(i, defaultvals[i]); - if (retval != defaultvals[i]) - cprintf(RED, "Error: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval); - } - } - - bus_w(DAQ_REG, 0x0); /* Only once at server startup */ - - setClockDivider(HALF_SPEED); - cleanFifos(); /* todo might work without */ - resetCore(); /* todo might work without */ - - - //Initialization of acquistion parameters - setSettings(DEFAULT_SETTINGS,-1); - setFrames(DEFAULT_NUM_FRAMES); - setTrains(DEFAULT_NUM_CYCLES); - setExposureTime(DEFAULT_EXPTIME); - setPeriod(DEFAULT_PERIOD); - setDelay(DEFAULT_DELAY); - setHighVoltage(DEFAULT_HIGH_VOLTAGE); - -} - -int checkType() { - volatile u_int32_t type = ((bus_r(FPGA_VERSION_REG) & DETECTOR_TYPE_MSK) >> DETECTOR_TYPE_OFST); - if (type != JUNGFRAU){ - cprintf(BG_RED,"This is not a Jungfrau Server (read %d, expected %d)\n",type, JUNGFRAU); - return FAIL; - } - - - printVersions(); - - return OK; -} - -void printVersions() { - cprintf(BLUE,"\n\n" - "********************************************************\n" - "*********************Jungfrau Server********************\n" - "********************************************************\n\n" - "Firmware Version:\t 0x%llx\n" - "Software Version:\t 0x%llx\n" - //"F/w-S/w API Version:\t\t %lld\n" - //"Required Firmware Version:\t %d\n" - "********************************************************\n", - (long long unsigned int)getId(DETECTOR_FIRMWARE_VERSION), - (long long unsigned int)getId(DETECTOR_SOFTWARE_VERSION) - //,(long long unsigned int)getId(SOFTWARE_FIRMWARE_API_VERSION) - //REQUIRED_FIRMWARE_VERSION); - ); -} - - - - - - -int testFifos(void) { - printf("Fifo test not implemented!\n"); - return OK; -} - -u_int32_t testFpga(void) { - printf("\nTesting FPGA...\n"); - - //fixed pattern - int ret = OK; - volatile u_int32_t val = bus_r(FIX_PATT_REG); - if (val == FIX_PATT_VAL) { - printf("Fixed pattern: successful match 0x%08x\n",val); - } else { - cprintf(RED,"Fixed pattern does not match! Read 0x%08x, expected 0x%08x\n", val, FIX_PATT_VAL); - ret = FAIL; - } - printf("\n"); - return ret; -} - -u_int32_t testRAM(void) { - int result=OK; - printf("RAM Test not implemented!\n"); - return result; -} - -int testBus() { - printf("\nTesting Bus...\n"); - - int ret = OK; - u_int32_t addr = SET_DELAY_LSB_REG; - int times = 1000 * 1000; - int i = 0; - - for (i = 0; i < times; ++i) { - bus_w(addr, i * 100); - if (i * 100 != bus_r(SET_DELAY_LSB_REG)) { - cprintf(RED,"ERROR: Mismatch! Wrote 0x%x, read 0x%x\n", i * 100, bus_r(SET_DELAY_LSB_REG)); - ret = FAIL; - } - } - - if (ret == OK) - printf("Successfully tested bus %d times\n", times); - - printf("\n"); - return ret; -} - - - - - -u_int64_t getDetectorNumber() { - char output[255],mac[255]=""; - u_int64_t res=0; - FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - //getting rid of ":" - char * pch; - pch = strtok (output,":"); - while (pch != NULL){ - strcat(mac,pch); - pch = strtok (NULL, ":"); - } - sscanf(mac,"%llx",&res); - return res; -} - -u_int64_t getFirmwareVersion() { - return ((bus_r(FPGA_VERSION_REG) & BOARD_REVISION_MSK) >> BOARD_REVISION_OFST); -} - -int64_t getId(enum idMode arg) { - int64_t retval = -1; - - switch(arg){ - case DETECTOR_SERIAL_NUMBER: - retval = getDetectorNumber(); - break; - case DETECTOR_FIRMWARE_VERSION: - retval=getFirmwareSVNVersion(); - retval=(retval <<32) | getFirmwareVersion(); - break; - case DETECTOR_SOFTWARE_VERSION: - retval= SVNREV; - retval= (retval <<32) | SVNDATE; - break; - default: - printf("Required unknown id %d \n", arg); - break; - } - return retval; -} - - - - - -void defineGPIOpins(){ - //define the gpio pins - system("echo 7 > /sys/class/gpio/export"); - system("echo 9 > /sys/class/gpio/export"); - //define their direction - system("echo in > /sys/class/gpio/gpio7/direction"); - system("echo out > /sys/class/gpio/gpio9/direction"); -} - -void resetFPGA(){ - cprintf(BLUE,"\n*** Reseting FPGA ***\n"); - FPGAdontTouchFlash(); - FPGATouchFlash(); - usleep(250*1000); -} - -void FPGAdontTouchFlash(){ - //tell FPGA to not touch flash - system("echo 0 > /sys/class/gpio/gpio9/value"); - //usleep(100*1000); -} - -void FPGATouchFlash(){ - //tell FPGA to touch flash to program itself - system("echo 1 > /sys/class/gpio/gpio9/value"); -} - - -void eraseFlash(){ -#ifdef VERY_VERBOSE - printf("\n at eraseFlash \n"); -#endif - - char command[255]; - sprintf(command,"flash_eraseall %s",mtdvalue); - system(command); - printf("flash erased\n"); -} - - -int startWritingFPGAprogram(FILE** filefp){ -#ifdef VERY_VERBOSE - printf("\n at startWritingFPGAprogram \n"); -#endif - - //getting the drive - char output[255]; - FILE* fp = popen("awk \'$4== \"\\\"bitfile(spi)\\\"\" {print $1}\' /proc/mtd", "r"); - fgets(output, sizeof(output), fp); - pclose(fp); - strcpy(mtdvalue,"/dev/"); - char* pch = strtok(output,":"); - if(pch == NULL){ - cprintf(RED,"Could not get mtd value\n"); - return FAIL; - } - strcat(mtdvalue,pch); - printf ("\nFlash drive found: %s\n",mtdvalue); - - - FPGAdontTouchFlash(); - - //writing the program to flash - *filefp = fopen(mtdvalue, "w"); - if(*filefp == NULL){ - cprintf(RED,"Unable to open %s in write mode\n",mtdvalue); - return FAIL; - } - printf("flash ready for writing\n"); - - return OK; -} - -int stopWritingFPGAprogram(FILE* filefp){ -#ifdef VERY_VERBOSE - printf("\n at stopWritingFPGAprogram \n"); -#endif - - int wait = 0; - if(filefp!= NULL){ - fclose(filefp); - wait = 1; - } - - //touch and program - FPGATouchFlash(); - - if(wait){ -#ifdef VERY_VERBOSE - printf("Waiting for FPGA to program from flash\n"); -#endif - //waiting for success or done - char output[255]; - int res=0; - while(res == 0){ - FILE* sysFile = popen("cat /sys/class/gpio/gpio7/value", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - sscanf(output,"%d",&res); -#ifdef VERY_VERBOSE - printf("gpi07 returned %d\n",res); -#endif - } - } - printf("FPGA has picked up the program from flash\n\n"); - - - return OK; -} - -int writeFPGAProgram(char* fpgasrc, size_t fsize, FILE* filefp){ -#ifdef VERY_VERBOSE - printf("\n at writeFPGAProgram \n"); - cprintf(BLUE,"address of fpgasrc:%p\n",(void *)fpgasrc); - cprintf(BLUE,"fsize:%d\n",fsize); - cprintf(BLUE,"pointer:%p\n",(void*)filefp); -#endif - - if(fwrite((void*)fpgasrc , sizeof(char) , fsize , filefp )!= fsize){ - cprintf(RED,"Could not write FPGA source to flash\n"); - return FAIL; - } -#ifdef VERY_VERBOSE - cprintf(BLUE,"program written to flash\n"); -#endif - return OK; -} - - - - - - - - -long int calcChecksum(int sourceip, int destip) { - - ip_header ip; - int count; - unsigned short *addr; - long int sum = 0; - long int checksum; - ip.ip_ver = 0x4; - ip.ip_ihl = 0x5; - ip.ip_tos = 0x0; - ip.ip_len = IP_PACKETSIZE; - ip.ip_ident = 0x0000; - ip.ip_flag = 0x2; //not nibble aligned (flag& offset - ip.ip_offset = 0x000; - ip.ip_ttl = 0x40; - ip.ip_protocol = 0x11; - ip.ip_chksum = 0x0000 ; // pseudo - ip.ip_sourceip = sourceip; - ip.ip_destip = destip; - - count = sizeof(ip); - addr =& (ip); /* warning: assignment from incompatible pointer type */ - while( count > 1 ) { - sum += *addr++; - count -= 2; - } - if (count > 0) sum += *addr; // Add left-over byte, if any - while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits - checksum = (~sum) & 0xffff; - - printf("IP checksum is 0x%lx\n",checksum); - - return checksum; -} - - - -void configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, int sourceip, uint32_t destport) { - uint32_t sourceport = DEFAULT_TX_UDP_PORT; - long int checksum=calcChecksum(sourceip, destip); - - bus_w(TX_IP_REG, sourceip); - bus_w(RX_IP_REG, destip); - bus_w(RX_MAC_LSB_REG, (destmac << RX_MAC_LSB_OFST) & RX_MAC_LSB_MSK); - bus_w(RX_MAC_MSB_REG, (destmac << RX_MAC_MSB_OFST) & RX_MAC_MSB_MSK); - bus_w(TX_MAC_LSB_REG, (sourcemac << TX_MAC_LSB_OFST) & TX_MAC_LSB_MSK); - bus_w(TX_MAC_MSB_REG, (sourcemac << TX_MAC_MSB_OFST) & TX_MAC_MSB_MSK); - bus_w(UDP_PORT_REG, - ((sourceport << UDP_PORT_TX_OFST) & UDP_PORT_TX_MSK) | - ((destport << UDP_PORT_RX_OFST) & UDP_PORT_RX_MSK)); - bus_w(TX_IP_CHECKSUM_REG,(checksum << TX_IP_CHECKSUM_OFST) & TX_IP_CHECKSUM_MSK); - - cleanFifos(); - resetCore(); - - usleep(500 * 1000); /* todo maybe without */ -} - - - - - - - - -// program dacq settings - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - if (value!=-1) { - vLSB=value&(0xffffffff); - bus_w(aLSB,vLSB); - v64=value>> 32; - vMSB=v64&(0xffffffff); - bus_w(aMSB,vMSB); - } - return get64BitReg(aLSB, aMSB); - -} - -int64_t get64BitReg(int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - vLSB=bus_r(aLSB); - vMSB=bus_r(aMSB); - v64=vMSB; - v64=(v64<<32) | vLSB; - - printf("reg64(%x,%x) %x %x %llx\n", aLSB, aMSB, vLSB, vMSB, v64); - - return v64; -} - -int64_t setFrames(int64_t value){ - if(value!=-1) - printf("\nSetting number of frames to %lld\n",(long long int)value); - - int64_t retval = set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); - printf("Getting number of frames: %lld\n",(long long int)retval); - return retval; -} - -int64_t getFrames(){ - return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); -} - -int64_t setExposureTime(int64_t value){ - if (value!=-1){ - printf("\nSetting exptime to %lldns\n",(long long int)value); - value*=(1E-3*CLK_RUN); - } - int64_t retval = set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG)/(1E-3*CLK_RUN); - printf("Getting exptime: %lldns\n",(long long int)retval); - return retval; -} - -int64_t getExposureTime(){ - return 0; -} - -int64_t setGates(int64_t value){ - return 0; -} - -int64_t getGates(){ - return 0; -} - -int64_t setDelay(int64_t value){ - if (value!=-1){ - printf("\nSetting delay to %lldns\n",(long long int)value); - value*=(1E-3*CLK_SYNC); - } - - int64_t retval = set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG)/(1E-3*CLK_SYNC); - printf("Getting delay: %lldns\n",(long long int)retval); - return retval; -} - -int64_t getDelay(){ - return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG)/(1E-3*CLK_SYNC); -} - -int64_t setPeriod(int64_t value){ - if (value!=-1){ - printf("\nSetting period to %lldns\n",(long long int)value); - value*=(1E-3*CLK_SYNC); - } - - int64_t retval = set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/(1E-3*CLK_SYNC); - printf("Getting period: %lldns\n",(long long int)retval); - return retval; -} - -int64_t getPeriod(){ - return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG)/(1E-3*CLK_SYNC); -} - -int64_t setTrains(int64_t value){ - if(value!=-1) - printf("\nSetting number of cycles to %lld\n",(long long int)value); - - int64_t retval = set64BitReg(value, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); - printf("Getting number of cycles: %lld\n",(long long int)retval); - return retval; -} - -int64_t getTrains(){ - return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); -} - -int64_t setProbes(int64_t value){ - return 0; -} - -int64_t getProbes(){ - return 0; -} - - - -int64_t getActualTime(){ - return get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG)/(1E-9*CLK_SYNC); -} - -int64_t getMeasurementTime(){ - return get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG)/(1E-9*CLK_SYNC); - -} - -int64_t getFramesFromStart(){ - int64_t v1=get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); - printf("Frames from start run control %lld\n",v1); - return v1; -} - - - - - - -u_int32_t runBusy(void) { - u_int32_t s = ((bus_r(STATUS_REG) & RUN_BUSY_MSK) >> RUN_BUSY_OFST); -#ifdef VERBOSE - printf("Status Register: %08x\n", s); -#endif - return s; -} - - - - -// State Machine - -int startStateMachine(){ - printf("*******Starting State Machine*******\n"); - - cleanFifos(); - - //start state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_START_ACQ_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_START_ACQ_MSK); - - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - return OK; -} - - - - -int stopStateMachine(){ - cprintf(BG_RED,"*******Stopping State Machine*******\n"); - - //stop state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STOP_ACQ_MSK); - usleep(100); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STOP_ACQ_MSK); - - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - return OK; -} - - - -enum runStatus getStatus() { -#ifdef VERBOSE - printf("Getting status\n"); -#endif - - enum runStatus s; - u_int32_t retval = bus_r(STATUS_REG); - printf("Status Register: %08x\n",retval); - - //running - if(((retval & RUN_BUSY_MSK) >> RUN_BUSY_OFST)) { - if ((retval & WAITING_FOR_TRIGGER_MSK) >> WAITING_FOR_TRIGGER_OFST) { - printf("-----------------------------------WAITING-----------------------------------\n"); - s=WAITING; - } - else{ - printf("-----------------------------------RUNNING-----------------------------------\n"); - s=RUNNING; - } - } - - //not running - else { - if ((retval & STOPPED_MSK) >> STOPPED_OFST) { - printf("-----------------------------------STOPPED--------------------------\n"); - s=STOPPED; - } else if ((retval & RUNMACHINE_BUSY_MSK) >> RUNMACHINE_BUSY_OFST) { - printf("-----------------------------------READ MACHINE BUSY--------------------------\n"); - s=TRANSMITTING; - } else if (!retval) { - printf("-----------------------------------IDLE--------------------------------------\n"); - s=IDLE; - } else { - printf("-----------------------------------Unknown status %08x--------------------------------------\n", retval); - s=ERROR; - } - } - - return s; -} - - -void waitForAcquisitionEnd(){ - while(runBusy()){ - usleep(500); - } -} - - - - - - - - - - -void serializeToSPI(u_int32_t addr, u_int32_t val, u_int16_t csmask, int numbitstosend, u_int16_t clkmask, u_int16_t digoutmask, int digofset) { -#ifdef VERBOSE - if (numbitstosend == 16) - printf("Writing to ADC SPI Register: 0x%04x\n",val); - else - printf("Writing to SPI Register: 0x%08x\n", val); -#endif - - u_int16_t valw; - - // start point - valw = 0xffff; /**todo testwith old board 0xff for adc_spi */ // old board compatibility (not using specific bits) - bus_w16 (addr, valw); - - // chip sel bar down - valw &= ~csmask; /* todo with test: done a bit different, not with previous value */ - bus_w16 (addr, valw); - - { - int i = 0; - for (i = 0; i < numbitstosend; ++i) { - - // clk down - valw &= ~clkmask; - bus_w16 (addr, valw); - - // write data (i) - valw = ((valw & ~digoutmask) + // unset bit - (((val >> (numbitstosend - 1 - i)) & 0x1) << digofset)); // each bit from val starting from msb - bus_w16 (addr, valw); - - // clk up - valw |= clkmask ; - bus_w16 (addr, valw); - } - } - - // chip sel bar up - valw |= csmask; /* todo with test: not done for spi */ - bus_w16 (addr, valw); - - //clk down - valw &= ~clkmask; - bus_w16 (addr, valw); - - // stop point = start point of course - valw = 0xffff; /**todo testwith old board 0xff for adc_spi */ // old board compatibility (not using specific bits) - bus_w16 (addr, valw); - - printf("\n"); -} - - - -void initDac(int dacnum) { - printf("\n Initializing dac for %d to \n",dacnum); - - u_int32_t codata; - int csdx = dacnum / NDAC + DAC_SERIAL_CS_OUT_OFST; // old board (16 dacs),so can be DAC_SERIAL_CS_OUT_OFST or +1 - int dacchannel = 0xf; // all channels - int dacvalue = 0x6; // can be any random value (just writing to power up) - printf("Write to Input Register\n" - "Chip select bit:%d\n" - "Dac Channel:0x%x\n3" - "Dac Value:0x%x", - csdx, dacchannel, dacvalue); - - codata = LTC2620_DAC_CMD_WRITE + // command to write to input register - ((dacchannel << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) + // all channels - ((dacvalue << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK); // any random value - serializeToSPI(SPI_REG, codata, (0x1 << csdx), LTC2620_DAC_NUMBITS, - DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); -} - - -int setDac(int dacnum, int dacvalue){ - - u_int32_t codata; - int csdx = dacnum / NDAC + DAC_SERIAL_CS_OUT_OFST; // old board (16 dacs),so can be DAC_SERIAL_CS_OUT_OFST or +1 - int dacchannel = dacnum % NDAC; // 0-8, dac channel number (also for dacnum 9-15 in old board) - - if ( (dacvalue >= 0) || (dacvalue == -100)) { - printf("\n Setting of DAC %d with value %d\n",dacnum, dacvalue); - // command - if (dacvalue >= 0) { - printf("Write to Input Register and Update\n"); - codata = LTC2620_DAC_CMD_SET; - - } else if (dacvalue == -100) { - printf("POWER DOWN\n"); - codata = LTC2620_DAC_CMD_POWER_DOWN; - } - // address - printf("Chip select bit:%d\n" - "Dac Channel:0x%x\n3" - "Dac Value:0x%x", - csdx, dacchannel, dacvalue); - codata += ((dacchannel << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) + - ((dacvalue << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK); - // to spi - serializeToSPI(SPI_REG, codata, (0x1 << csdx), LTC2620_DAC_NUMBITS, - DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); - - dacValues[dacnum] = dacvalue; - } else - printf("\nGetting DAC %d\n",dacnum); - return dacValues[dacnum]; -} - - - -int setHighVoltage(int val, int imod){ - - u_int32_t dacvalue; - float alpha = 0.55; - // setting hv - if (val >= 0) { - // limit values - if (val < 60) { - dacvalue = 0; - val = 60; - } else if (val >= 200) { - dacvalue = 0x1; - val = 200; - } else { - dacvalue = 1. + (200.-val) / alpha; - val=200.-(dacvalue-1)*alpha; - } - printf ("\n Setting High voltage to %d (dacval %d)\n",val, dacvalue); - dacvalue &= MAX1932_HV_DATA_MSK; - serializeToSPI(SPI_REG, dacvalue, HV_SERIAL_CS_OUT_MSK, MAX1932_HV_NUMBITS, - HV_SERIAL_CLK_OUT_MSK, HV_SERIAL_DIGITAL_OUT_MSK, HV_SERIAL_DIGITAL_OUT_OFST); - highvoltage = val; - } - return highvoltage; -} - - - -void setAdc(int addr, int val) { - - u_int32_t codata; - codata = val + (addr << 8); - printf("\n Setting Adc spi register. Addr: 0x%04x Value: 0x%04x\n", addr, val); - serializeToSPI(ADC_SPI_REG, codata, ADC_SERIAL_CS_OUT_MSK, AD9257_ADC_NUMBITS, - ADC_SERIAL_CLK_OUT_MSK, ADC_SERIAL_DATA_OUT_MSK, ADC_SERIAL_DATA_OUT_OFST); -} - - - - -void prepareADC(){ - printf("Preparing ADC\n"); - - //power mode reset - setAdc(AD9257_POWER_MODE_REG, - (AD9257_INT_RESET_VAL << AD9257_POWER_INTERNAL_OFST) & AD9257_POWER_INTERNAL_MSK); - //power mode chip run - setAdc(AD9257_POWER_MODE_REG, - (AD9257_INT_CHIP_RUN_VAL << AD9257_POWER_INTERNAL_OFST) & AD9257_POWER_INTERNAL_MSK); - - //output clock phase - setAdc(AD9257_OUT_PHASE_REG, - (AD9257_OUT_CLK_60_VAL << AD9257_OUT_CLK_OFST) & AD9257_OUT_CLK_MSK); - - // lvds-iee reduced , binary offset - setAdc(AD9257_OUT_MODE_REG, - (AD9257_OUT_LVDS_IEEE_VAL << AD9257_OUT_LVDS_OPT_OFST) & AD9257_OUT_LVDS_OPT_MSK); - - // all devices on chip to receive next command - setAdc(AD9257_DEV_IND_2_REG, - AD9257_CHAN_H_MSK | AD9257_CHAN_G_MSK | AD9257_CHAN_F_MSK | AD9257_CHAN_E_MSK); - setAdc(AD9257_DEV_IND_1_REG, - AD9257_CHAN_D_MSK | AD9257_CHAN_C_MSK | AD9257_CHAN_B_MSK | AD9257_CHAN_A_MSK | - AD9257_CLK_CH_DCO_MSK | AD9257_CLK_CH_IFCO_MSK); - - // vref 1.33 - setAdc(AD9257_VREF_REG, - (AD9257_VREF_1_33_VAL << AD9257_VREF_OFST) & AD9257_VREF_MSK); - - // no test mode - setAdc(AD9257_TEST_MODE_REG, - (AD9257_NONE_VAL << AD9257_OUT_TEST_OFST) & AD9257_OUT_TEST_MSK); - -#ifdef TESTADC - printf("***************************************** *******\n"); - printf("******* PUTTING ADC IN TEST MODE!!!!!!!!! *******\n"); - printf("***************************************** *******\n"); - // mixed bit frequency test mode - setAdc(AD9257_TEST_MODE_REG, - (AD9257_MIXED_BIT_FREQ_VAL << AD9257_OUT_TEST_OFST) & AD9257_OUT_TEST_MSK); -#endif -} - - - - - - - - - -int setDynamicRange(int dr) { - return DYNAMIC_RANGE; -} - -int getDynamicRange() { - return DYNAMIC_RANGE; -} - -int getNModBoard() { - return NMOD; -} - -int setNMod(int n) { - return NMOD; -} - -int getNMod() { - return NMOD; -} - - - - - -int powerChip (int on){ - if(on != -1){ - if(on){ - printf("\nPowering on the chip\n"); - bus_w(CHIP_POWER_REG, bus_r(CHIP_POWER_REG) | CHIP_POWER_ENABLE_MSK); - } - else{ - printf("\nPowering off the chip\n"); - bus_w(CHIP_POWER_REG, bus_r(CHIP_POWER_REG) & ~CHIP_POWER_ENABLE_MSK); - } - } - return bus_r(CHIP_POWER_REG); -} - - - -void cleanFifos() { - printf("Clearing Acquisition Fifos\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_ACQ_FIFO_CLR_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_ACQ_FIFO_CLR_MSK); -} - -void resetCore() { - printf("Resetting Core\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CORE_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_CORE_RST_MSK); -} - -void resetPeripheral() { - printf("Resetting Peripheral\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PERIPHERAL_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PERIPHERAL_RST_MSK); -} - - - - -int adcPhase(int st){ /**carlos needed clkphase 1 and 2? cehck with Aldo */ - printf("\nSetting ADC Phase to %d\n",st); - if (st > 65535 || st < -65535) - return clkPhase[0]; - clkPhase[1] = st - clkPhase[0]; - - printf("phase %d\n", clkPhase[1] ); - configurePll(); - clkPhase[0] = st; - return clkPhase[0]; -} - - -int getPhase() { - return clkPhase[0]; -} - - - - - - -u_int32_t setClockDivider(int d) { - if(d!=-1){ - switch(d){ - //stop state machine if running - if(runBusy()) - stopStateMachine(); - - case FULL_SPEED://40 - printf("Setting Half Speed (20 MHz):\n"); - /**to be done*/ - - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED); bus_w(SAMPLE_REG, SAMPLE_ADC_HALF_SPEED); - printf("Setting Config Reg to 0x%x\n", CONFIG_HALF_SPEED); bus_w(CONFIG_REG, CONFIG_HALF_SPEED); - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL); bus_w(ADC_OFST_REG, ADC_OFST_HALF_SPEED_VAL); - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED); adcPhase(ADC_PHASE_HALF_SPEED); - break; - case HALF_SPEED: - printf("Setting Half Speed (20 MHz):\n"); - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED); bus_w(SAMPLE_REG, SAMPLE_ADC_HALF_SPEED); - printf("Setting Config Reg to 0x%x\n", CONFIG_HALF_SPEED); bus_w(CONFIG_REG, CONFIG_HALF_SPEED); - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL); bus_w(ADC_OFST_REG, ADC_OFST_HALF_SPEED_VAL); - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED); adcPhase(ADC_PHASE_HALF_SPEED); - break; - case QUARTER_SPEED: - printf("Setting Half Speed (10 MHz):\n"); - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_QUARTER_SPEED); bus_w(SAMPLE_REG, SAMPLE_ADC_QUARTER_SPEED); - printf("Setting Config Reg to 0x%x\n", CONFIG_QUARTER_SPEED); bus_w(CONFIG_REG, CONFIG_QUARTER_SPEED); - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_QUARTER_SPEED_VAL); bus_w(ADC_OFST_REG, ADC_OFST_QUARTER_SPEED_VAL); - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_QUARTER_SPEED); adcPhase(ADC_PHASE_QUARTER_SPEED); - break; - } - printf("\n"); - } - return getClockDivider(); -} - - - - - - -u_int32_t getClockDivider(int ic) { - - u_int32_t val = bus_r(CONFIG_REG); - int speed = val & CONFIG_READOUT_SPEED_MSK; - switch(speed){ - case CONFIG_FULL_SPEED_40MHZ_VAL: - return FULL_SPEED; - case CONFIG_HALF_SPEED_20MHZ_VAL: - return HALF_SPEED; - case CONFIG_QUARTER_SPEED_10MHZ_VAL: - return QUARTER_SPEED; - default: - return -1; - } -} - - - - - - - - - - - - -/**carlos shouldnt exist what sort of temperatre?s tempr in reg is 1b<11 and temp pit is 1c<11 ..firmware (only 0x1c 32 bit ) Aldo.. is it connected??*/ -int getTemperature(int tempSensor, int imod){ - int val; - imod=0;//ignoring more than 1 mod for now - int i,j,repeats=6; - u_int32_t tempVal=0; -#ifdef VERBOSE - char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; - printf("Getting Temperature of module:%d for the %s for tempsensor:%d\n",imod,cTempSensor[tempSensor],tempSensor); -#endif - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs - - for(i=0;i<20;i++) { - //repeats is number of register writes for delay - for(j=0;j>1);//fpga - } - } - - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - val=((int)tempVal)/4.0; - -#ifdef VERBOSE - printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val); -#endif - return val; -} - - - - - - - - - - - -void resetPLL() { - // reset PLL Reconfiguration and PLL - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) | PLL_CTRL_RECONFIG_RST_MSK | PLL_CTRL_RST_MSK); - usleep(100); - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) & ~PLL_CTRL_RECONFIG_RST_MSK & ~PLL_CTRL_RST_MSK); -} - - -u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val) { - - // set parameter - bus_w(PLL_PARAM_REG, val); - - // set address - bus_w(PLL_CONTROL_REG, (reg << PLL_CTRL_ADDR_OFST) & PLL_CTRL_ADDR_MSK); - usleep(10*1000); - - //write parameter - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) | PLL_CTRL_WR_PARAMETER_MSK); - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) & ~PLL_CTRL_WR_PARAMETER_MSK); - usleep(10*1000); - - return val; -} - - - - - - -void configurePll() { - u_int32_t val; - int32_t phase=0, inv=0; - - printf("phase in %d\n", clkPhase[1]); - if (clkPhase[1]>0) { - inv=0; - phase=clkPhase[1]; - } else { - inv=1; - phase=-1*clkPhase[1]; - } - printf("phase out %d %08x\n", phase, phase); - - if (inv) { - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) | PLL_SHIFT_CNT_SLCT_C1_VAL | PLL_SHIFT_UP_DOWN_NEG_VAL; - printf("**************** phase word %08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - } else { - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) | PLL_SHIFT_CNT_SLCT_C0_VAL | PLL_SHIFT_UP_DOWN_NEG_VAL; - printf("**************** phase word %08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - - printf("**************** phase word %08x\n", val); - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) | PLL_SHIFT_CNT_SLCT_C2_VAL; - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - } - usleep(10000); -} - - - - - - - - - -int loadImage(int index, short int ImageVals[]){ - printf("loadImage Not implemented yet\n"); - return OK; -} - - -int readCounterBlock(int startACQ, short int CounterVals[]){ - -//not implemented - return FAIL; -} - - - - -int resetCounterBlock(int startACQ){ - - //not implemented - return FAIL; - -} - - - -int calibratePedestal(int frames){ - //not implemented - return FAIL; -} - - - - - - - -int setTiming(int ti) { - - if(ti != GET_EXTERNAL_COMMUNICATION_MODE){ - switch((int)ti){ - case AUTO_TIMING: bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); break; - case TRIGGER_EXPOSURE: bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); break; - default: - cprintf(RED,"Unknown timing mode %d\n", ti); - return GET_EXTERNAL_COMMUNICATION_MODE; - } - } - if (bus_r(EXT_SIGNAL_REG) == EXT_SIGNAL_MSK) - return TRIGGER_EXPOSURE; - return AUTO_TIMING; -} - - - -int setMaster(int f) { - return NO_MASTER; -} - - - -int setSynchronization(int s) { - return NO_SYNCHRONIZATION; - -} - - diff --git a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.h deleted file mode 100755 index 4508391a3..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.h +++ /dev/null @@ -1,127 +0,0 @@ -#ifndef FIRMWARE_FUNCS_H -#define FIRMWARE_FUNCS_H -#include "sls_detector_defs.h" - -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - -int mapCSP0(void); -u_int16_t bus_w16(u_int32_t offset, u_int16_t data); -u_int16_t bus_r16(u_int32_t offset); -u_int16_t ram_w16(u_int32_t ramType, int adc, int adcCh, int Ch, u_int16_t data); -u_int16_t ram_r16(u_int32_t ramType, int adc, int adcCh, int Ch); -u_int32_t bus_w(u_int32_t offset, u_int32_t data); -u_int32_t bus_r(u_int32_t offset); - -void initializeDetector(); -int checkType(); -void printVersions(); - -int testFifos(void); -u_int32_t testFpga(void); -u_int32_t testRAM(void); -int testBus(void); - -u_int64_t getDetectorNumber(); -u_int64_t getFirmwareVersion(); -int64_t getId(enum idMode arg); - -void defineGPIOpins(); -void resetFPGA(); -void FPGAdontTouchFlash(); -void FPGATouchFlash(); -void eraseFlash(); -int startWritingFPGAprogram(FILE** filefp); -int stopWritingFPGAprogram(FILE* filefp); -int writeFPGAProgram(char* fpgasrc, size_t fsize, FILE* filefp); - -long int calcChecksum(int sourceip, int destip); -void configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, int sourceip, uint32_t destport); - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB); -int64_t get64BitReg(int aLSB, int aMSB); - -int64_t setFrames(int64_t value); -int64_t getFrames(); - -int64_t setExposureTime(int64_t value); -int64_t getExposureTime(); - -int64_t setGates(int64_t value); -int64_t getGates(); - -int64_t setDelay(int64_t value); -int64_t getDelay(); - -int64_t setPeriod(int64_t value); -int64_t getPeriod(); - -int64_t setTrains(int64_t value); -int64_t getTrains(); - -int64_t setProbes(int64_t value); -int64_t getProbes(); - -int64_t getActualTime(); -int64_t getMeasurementTime(); -int64_t getFramesFromStart(); - -u_int32_t runBusy(void); -int startStateMachine(); -int stopStateMachine(); -enum runStatus getStatus(); -void waitForAcquisitionEnd(); - -void serializeToSPI(u_int32_t addr, u_int32_t val, u_int16_t csmask, int numbitstosend, u_int16_t clkmask, u_int16_t digoutmask, int digofset); -void initDac(int dacnum); -int setDac(int dacnum, int dacvalue); -int setHighVoltage(int val, int imod); -void setAdc(int addr, int val); -void prepareADC(); - -int setDynamicRange(int dr); -int getDynamicRange(); -int getNModBoard(); -int setNMod(int n); -int getNMod(); - -int powerChip (int on); -void cleanFifos(); -void resetCore(); -void resetPeripheral(); -int adcPhase(int st); -int getPhase(); - -u_int32_t setClockDivider(int d); -u_int32_t getClockDivider(); - -int getTemperature(int tempSensor,int imod); -int initConfGain(int isettings,int val,int imod); -int initSpeedConfGain(int val); - -void resetPLL(); -u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val); -void configurePll(); - -int loadImage(int index, short int ImageVals[]); -int readCounterBlock(int startACQ, short int CounterVals[]); -int resetCounterBlock(int startACQ); -int calibratePedestal(int frames); - -int setTiming(int t); -int setMaster(int f); -int setSynchronization(int s); - -#endif diff --git a/slsDetectorSoftware/jungfrauDetectorServer/jungfrauDetectorServerv3.0.0.1 b/slsDetectorSoftware/jungfrauDetectorServer/jungfrauDetectorServerv3.0.0.1 deleted file mode 100755 index ba692a1baea73bae2229810c5145377d5c174e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127056 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 diff --git a/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c deleted file mode 100755 index 158ca2cba..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c +++ /dev/null @@ -1,323 +0,0 @@ -#ifdef MCB_FUNCS - -#include "registers_m.h" -#include "server_defs.h" -#include "firmware_funcs.h" -#include "mcb_funcs.h" - -#include -#include -#include -#include -#include - -/* global variables */ - - - -enum detectorSettings thisSettings; - -int sChan, sChip, sMod, sDac, sAdc; -const int allSelected=-2; -const int noneSelected=-1; - -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -int *detectorDacs=NULL; -int *detectorAdcs=NULL; - - - -int initDetector() { - int imod; - int n=getNModBoard(); -#ifdef VERBOSE - printf("Board is for %d modules\n",n); -#endif - detectorModules=malloc(n*sizeof(sls_detector_module)); - detectorDacs=malloc(n*NDAC*sizeof(int)); - detectorAdcs=malloc(n*NADC*sizeof(int)); - detectorChips=NULL; - detectorChans=NULL; - detectorAdcs=NULL; -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",(unsigned int)(detectorModules), (unsigned int)(detectorModules+n)); - printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs+n*NDAC)); - printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs+n*NADC)); -#endif - - - for (imod=0; imoddacs=detectorDacs+imod*NDAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; - (detectorModules+imod)->ndac=NDAC; - (detectorModules+imod)->nadc=NADC; - (detectorModules+imod)->nchip=NCHIP; - (detectorModules+imod)->nchan=NCHIP*NCHAN; - (detectorModules+imod)->module=imod; - (detectorModules+imod)->gain=0; - (detectorModules+imod)->offset=0; - (detectorModules+imod)->reg=0; - } - thisSettings=UNINITIALIZED; - sChan=noneSelected; - sChip=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - - return OK; -} - - - - - -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { - - int idac, iadc; - - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",(unsigned int)(srcMod),(unsigned int)(destMod)); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ -/* #ifdef VERBOSE */ -/* printf("Copying module serial number %x to module serial number %x\n",srcMod->serialnumber,destMod->serialnumber); */ -/* #endif */ - destMod->serialnumber=srcMod->serialnumber; - } - - /* - if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - */ - - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - //printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - //printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - - - - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - // destMod->nchip=srcMod->nchip; - //destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); - - - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - - return ret; -} - - - - - - - -int setSettings(int i, int imod) { -//#ifdef VERBOSE - if(i!=-1) - printf("\nSetting settings wit value %d\n",i); -//#endif - int isett=-1,val=-1,retval=-1; - enum conf_gain { - dynamic = 0x0f00, //dynamic - dynamichighgain0 = v, //dynamichighgain0 - fixgain1 = 0x0f02, //fixgain1 - fixgain2 = 0x0f06, //fixgain2 - forceswitchgain1 = 0x1f00, //forceswitchgain1 - forceswitchgain2 = 0x3f00 //forceswitchgain2 - }; - - //determine conf value to write - if(i!=GET_SETTINGS){ - switch(i){ - case DYNAMICGAIN: val = dynamic; break; - case DYNAMICHG0: val = dynamichighgain0; break; - case FIXGAIN1: val = fixgain1; break; - case FIXGAIN2: val = fixgain2; break; - case FORCESWITCHG1: val = forceswitchgain1; break; - case FORCESWITCHG2: val = forceswitchgain2; break; - default: - printf("Error: This settings is not defined for this detector %d\n",i); - return GET_SETTINGS; - } - } - - retval = initConfGain(i,val,imod); - - switch(retval){ - case dynamic: isett=DYNAMICGAIN; break; - case dynamichighgain0: isett=DYNAMICHG0; break; - case fixgain1: isett=FIXGAIN1; break; - case fixgain2: isett=FIXGAIN2; break; - case forceswitchgain1: isett=FORCESWITCHG1; break; - case forceswitchgain2: isett=FORCESWITCHG2; break; - default: - isett=UNDEFINED; - printf("Error:Wrong settings read out from Gain Reg 0x%x\n",retval); - break; - } - - thisSettings=isett; -//#ifdef VERBOSE - printf("detector settings are %d\n",thisSettings); -//#endif - return thisSettings; -} - - - - - - - -/* Initialization*/ - - - -int initModulebyNumber(sls_detector_module myMod) { - printf("\nInitializing Module\n"); - int nchip,nchan;//int ichip, nchip, ichan, nchan; - int im, modmi,modma; - // int ft, cae, ae, coe, ocoe, counts, chanreg; - int imod; - // int obe; - // int ow; - /* int v[NDAC];*/ - int retval =-1, idac; - - - nchip=myMod.nchip; - nchan=(myMod.nchan)/nchip; - imod=myMod.module; - sMod=imod; - if (sMod==ALLMOD) - sMod=allSelected; - if (sMod==allSelected) { - modmi=0; - modma=NMODX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>NMODX || sMod<0) {// (sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - //printf("ndac:%d\n",NDAC); - - for (idac=0; idacmodule; -#ifdef VERBOSE - printf("Getting module %d\n",imod); -#endif - if (detectorModules) { - copyModule(myMod,detectorModules+imod); - ; - } else - return FAIL; - - return OK; -} - - - - - - - -// Fifo continuous read - - -int getModuleNumber(int modnum) { - int val = 0xfff; - // val=readin(modnum); - return val; -} - - - - - - - - - - -#endif - - diff --git a/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.h deleted file mode 100755 index b4eca93c5..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifdef MCB_FUNCS - -#ifndef MCB_FUNCS_H -#define MCB_FUNCS_H - -#include "sls_detector_defs.h" - -int initDetector(); -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod); -int setSettings(int i,int imod); -int initModulebyNumber(sls_detector_module); -int getModulebyNumber(sls_detector_module*); -int getModuleNumber(int modnum); - -#endif - -#endif diff --git a/slsDetectorSoftware/jungfrauDetectorServer/registers_m.h b/slsDetectorSoftware/jungfrauDetectorServer/registers_m.h deleted file mode 100755 index 5bec80984..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/registers_m.h +++ /dev/null @@ -1,360 +0,0 @@ -#ifndef REGISTERS_G_H -#define REGISTERS_G_H - - -#include "sls_detector_defs.h" - - -/* Definitions for FPGA*/ -#define CSP0 0x20200000 -#define MEM_SIZE 0x100000 - -/* FPGA Version register */ -#define FPGA_VERSION_REG (0x00 << 11) - -#define BOARD_REVISION_OFST (0) -#define BOARD_REVISION_MSK (0x00FFFFFF << BOARD_REVISION_OFST) -#define DETECTOR_TYPE_OFST (24) -#define DETECTOR_TYPE_MSK (0x000000FF << DETECTOR_TYPE_OFST) - - - -/* Fix pattern register */ -#define FIX_PATT_REG (0x01 << 11) - -/* Status register */ -#define STATUS_REG (0x02 << 11) - -#define RUN_BUSY_OFST (0) -#define RUN_BUSY_MSK (0x00000001 << RUN_BUSY_OFST) -#define WAITING_FOR_TRIGGER_OFST (3) -#define WAITING_FOR_TRIGGER_MSK (0x00000001 << WAITING_FOR_TRIGGER_OFST) -#define DELAYBEFORE_OFST (4) //Not used in software -#define DELAYBEFORE_MSK (0x00000001 << DELAYBEFORE_OFST) //Not used in software -#define DELAYAFTER_OFST (5) //Not used in software -#define DELAYAFTER_MSK (0x00000001 << DELAYAFTER_OFST) //Not used in software -#define STOPPED_OFST (15) -#define STOPPED_MSK (0x00000001 << STOPPED_OFST) -#define RUNMACHINE_BUSY_OFST (17) -#define RUNMACHINE_BUSY_MSK (0x00000001 << RUNMACHINE_BUSY_OFST) - - -/* Look at me register */ -#define LOOK_AT_ME_REG (0x03 << 11) //Not used in firmware or software - -/* System Status register */ -#define SYSTEM_STATUS_REG (0x04 << 11) //Not used in software - -#define DDR3_CAL_DONE_OFST (0) //Not used in software -#define DDR3_CAL_DONE_MSK (0x00000001 << DDR3_CAL_DONE_OFST) //Not used in software -#define DDR3_CAL_FAIL_OFST (1) //Not used in software -#define DDR3_CAL_FAIL_MSK (0x00000001 << DDR3_CAL_FAIL_OFST) //Not used in software -#define DDR3_INIT_DONE_OFST (2) //Not used in software -#define DDR3_INIT_DONE_MSK (0x00000001 << DDR3_INIT_DONE_OFST) //Not used in software -#define RECONFIG_PLL_LCK_OFST (3) //Not used in software -#define RECONFIG_PLL_LCK_MSK (0x00000001 << RECONFIG_PLL_LCK_OFST) //Not used in software -#define PLL_A_LCK_OFST (4) //Not used in software -#define PLL_A_LCK_MSK (0x00000001 << PLL_A_LCK_OFST) //Not used in software -#define DD3_PLL_LCK_OFST (5) //Not used in software -#define DD3_PLL_LCK_MSK (0x00000001 << DD3_PLL_LCK_OFST) //Not used in software - - -/* Module Control Board Serial Number Register */ -#define MOD_SERIAL_NUM_REG (0x0A << 11) //Not used in software - -#define HARDWARE_SERIAL_NUM_OFST (0) //Not used in software -#define HARDWARE_SERIAL_NUM_MSK (0x000000FF << HARDWARE_SERIAL_NUM_OFST) //Not used in software -#define HARDWARE_VERSION_NUM_OFST (16) //Not used in software -#define HARDWARE_VERSION_NUM_MSK (0x0000003F << HARDWARE_VERSION_NUM_OFST) //Not used in software - - -/* Time from Start 64 bit register */ -#define TIME_FROM_START_LSB_REG (0x10 << 11) -#define TIME_FROM_START_MSB_REG (0x11 << 11) - -/* Get Delay 64 bit register */ -#define GET_DELAY_LSB_REG (0x12 << 11) -#define GET_DELAY_MSB_REG (0x13 << 11) - -/* Get Cycles 64 bit register */ -#define GET_CYCLES_LSB_REG (0x14 << 11) -#define GET_CYCLES_MSB_REG (0x15 << 11) - -/* Get Frames 64 bit register */ -#define GET_FRAMES_LSB_REG (0x16 << 11) -#define GET_FRAMES_MSB_REG (0x17 << 11) - -/* Get Period 64 bit register */ -#define GET_PERIOD_LSB_REG (0x18 << 11) -#define GET_PERIOD_MSB_REG (0x19 << 11) - -/* Get Period 64 bit register */ -#define GET_EXPTIME_LSB_REG (0x1A << 11) -#define GET_EXPTIME_MSB_REG (0x1B << 11) - -/* Get Period 64 bit register */ -#define GET_GATES_LSB_REG (0x1C << 11) -#define GET_GATES_MSB_REG (0x1D << 11) - -/* Get Frames from Start 64 bit register (frames from start Run Control) */ -#define FRAMES_FROM_START_PG_LSB_REG (0x24 << 11) -#define FRAMES_FROM_START_PG_MSB_REG (0x25 << 11) - -/* Measurement Time 64 bit register (timestamp at a frame start until reset)*/ -#define START_FRAME_TIME_LSB_REG (0x26 << 11) -#define START_FRAME_TIME_MSB_REG (0x27 << 11) - -/* SPI (Serial Peripheral Interface) Register */ -#define SPI_REG (0x40 << 11) - -#define DAC_SERIAL_DIGITAL_OUT_OFST (0) -#define DAC_SERIAL_DIGITAL_OUT_MSK (0x00000001 << DAC_SERIAL_DIGITAL_OUT_OFST) -#define DAC_SERIAL_CLK_OUT_OFST (1) -#define DAC_SERIAL_CLK_OUT_MSK (0x00000001 << DAC_SERIAL_CLK_OUT_OFST) -#define DAC_SERIAL_CS_OUT_OFST (2) -#define DAC_SERIAL_CS_OUT_MSK (0x00000001 << DAC_SERIAL_CS_OUT_OFST) -#define HV_SERIAL_DIGITAL_OUT_OFST (8) -#define HV_SERIAL_DIGITAL_OUT_MSK (0x00000001 << HV_SERIAL_DIGITAL_OUT_OFST) -#define HV_SERIAL_CLK_OUT_OFST (9) -#define HV_SERIAL_CLK_OUT_MSK (0x00000001 << HV_SERIAL_CLK_OUT_OFST) -#define HV_SERIAL_CS_OUT_OFST (10) -#define HV_SERIAL_CS_OUT_MSK (0x00000001 << HV_SERIAL_CS_OUT_OFST) - - -/* ADC SPI (Serial Peripheral Interface) Register */ -#define ADC_SPI_REG (0x41 << 11) - -#define ADC_SERIAL_CLK_OUT_OFST (0) -#define ADC_SERIAL_CLK_OUT_MSK (0x00000001 << ADC_SERIAL_CLK_OUT_OFST) -#define ADC_SERIAL_DATA_OUT_OFST (1) -#define ADC_SERIAL_DATA_OUT_MSK (0x00000001 << ADC_SERIAL_DATA_OUT_OFST) -#define ADC_SERIAL_CS_OUT_OFST (2) -#define ADC_SERIAL_CS_OUT_MSK (0x0000000F << ADC_SERIAL_CS_OUT_OFST) - -/* ADC offset Register */ -#define ADC_OFST_REG (0x42 << 11) - -/* ADC Port Invert Register */ -#define ADC_PORT_INVERT_REG (0x43 << 11) - -/* Receiver IP Address Register */ -#define RX_IP_REG (0x45 << 11) - -/* UDP Port */ -#define UDP_PORT_REG (0x46 << 11) - -#define UDP_PORT_RX_OFST (0) -#define UDP_PORT_RX_MSK (0x0000FFFF << UDP_PORT_RX_OFST) -#define UDP_PORT_TX_OFST (16) -#define UDP_PORT_TX_MSK (0x0000FFFF << UDP_PORT_TX_OFST) - -/* Receiver Mac Address 64 bit Register */ -#define RX_MAC_LSB_REG (0x47 << 11) -#define RX_MAC_MSB_REG (0x48 << 11) - -#define RX_MAC_LSB_OFST (0) -#define RX_MAC_LSB_MSK (0x0000FFFF << RX_MAC_LSB_OFST) -#define RX_MAC_MSB_OFST (0) -#define RX_MAC_MSB_MSK (0x000000FF << RX_MAC_MSB_OFST) - -/* Detector/ Transmitter Mac Address 64 bit Register */ -#define TX_MAC_LSB_REG (0x49 << 11) -#define TX_MAC_MSB_REG (0x4A << 11) - -#define TX_MAC_LSB_OFST (0) -#define TX_MAC_LSB_MSK (0x0000FFFF << TX_MAC_LSB_OFST) -#define TX_MAC_MSB_OFST (0) -#define TX_MAC_MSB_MSK (0x000000FF << TX_MAC_MSB_OFST) - -/* Detector/ Transmitter IP Address Register */ -#define TX_IP_REG (0x4B << 11) - -/* Detector/ Transmitter IP Checksum Register */ -#define TX_IP_CHECKSUM_REG (0x4C << 11) - -#define TX_IP_CHECKSUM_OFST (0) -#define TX_IP_CHECKSUM_MSK (0x000000FF << TX_IP_CHECKSUM_OFST) - -/* Configuration Register */ -#define CONFIG_REG (0x4D << 11) - -#define CONFIG_OPERATION_MODE_OFST (16) -#define CONFIG_OPERATION_MODE_MSK (0x00000001 << CONFIG_OPERATION_MODE_OFST) -#define CONFIG_MODE_1_X_10GBE_VAL ((0x0 << CONFIG_OPERATION_MODE_OFST) & CONFIG_OPERATION_MODE_MSK) -#define CONFIG_MODE_2_X_10GBE_VAL ((0x1 << CONFIG_OPERATION_MODE_OFST) & CONFIG_OPERATION_MODE_MSK) -#define CONFIG_READOUT_SPEED_OFST (20) -#define CONFIG_READOUT_SPEED_MSK (0x00000003 << CONFIG_READOUT_SPEED_OFST) -#define CONFIG_QUARTER_SPEED_10MHZ_VAL ((0x0 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK) -#define CONFIG_HALF_SPEED_20MHZ_VAL ((0x1 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK) -#define CONFIG_FULL_SPEED_VAL ((0x2 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK) -#define CONFIG_TDMA_OFST (24) -#define CONFIG_TDMA_MSK (0x00000001 << CONFIG_TDMA_OFST) -#define CONFIG_TDMA_DISABLE_VAL ((0x0 << CONFIG_TDMA_OFST) & CONFIG_TDMA_MSK) -#define CONFIG_TDMA_ENABLE_VAL ((0x1 << CONFIG_TDMA_OFST) & CONFIG_TDMA_MSK) -#define CONFIG_TDMA_TIMESLOT_OFST (25) -#define CONFIG_TDMA_TIMESLOT_MSK (0x0000001F << CONFIG_TDMA_TIMESLOT_OFST) -#define CONFIG_TDMA_TIMESLOT_0_VAL ((0x0 << CONFIG_TDMA_TIMESLOT_OFST) & CONFIG_TDMA_TIMESLOT_MSK) - -/* External Signal Register */ -#define EXT_SIGNAL_REG (0x4E << 11) - -#define EXT_SIGNAL_OFST (0) -#define EXT_SIGNAL_MSK (0x00000003 << EXT_SIGNAL_OFST) //enabled when both bits high - -/* Control Register */ -#define CONTROL_REG (0x4F << 11) - -#define CONTROL_START_ACQ_OFST (0) -#define CONTROL_START_ACQ_MSK (0x00000001 << CONTROL_START_ACQ_OFST) -#define CONTROL_STOP_ACQ_OFST (1) -#define CONTROL_STOP_ACQ_MSK (0x00000001 << CONTROL_STOP_ACQ_OFST) -#define CONTROL_CORE_RST_OFST (10) -#define CONTROL_CORE_RST_MSK (0x00000001 << CONTROL_CORE_RST_OFST) -#define CONTROL_PERIPHERAL_RST_OFST (11) //DDR3 HMem Ctrlr, GBE, Temp -#define CONTROL_PERIPHERAL_RST_MSK (0x00000001 << CONTROL_PERIPHERAL_RST_OFST) //DDR3 HMem Ctrlr, GBE, Temp -#define CONTROL_DDR3_MEM_RST_OFST (12) //only PHY, not DDR3 PLL ,Not used in software -#define CONTROL_DDR3_MEM_RST_MSK (0x00000001 << CONTROL_DDR3_MEM_RST_OFST) //only PHY, not DDR3 PLL ,Not used in software -#define CONTROL_ACQ_FIFO_CLR_OFST (14) -#define CONTROL_ACQ_FIFO_CLR_MSK (0x00000001 << CONTROL_ACQ_FIFO_CLR_OFST) - -/* Reconfiguratble PLL Paramater Register */ -#define PLL_PARAM_REG (0x50 << 11) - -/* Reconfiguratble PLL Control Regiser */ -#define PLL_CONTROL_REG (0x51 << 11) - -#define PLL_CTRL_RECONFIG_RST_OFST (0) //parameter reset -#define PLL_CTRL_RECONFIG_RST_MSK (0x00000001 << PLL_CTRL_RECONFIG_RST_OFST) //parameter reset -#define PLL_CTRL_WR_PARAMETER_OFST (2) -#define PLL_CTRL_WR_PARAMETER_MSK (0x00000001 << PLL_CTRL_WR_PARAMETER_OFST) -#define PLL_CTRL_RST_OFST (3) -#define PLL_CTRL_RST_MSK (0x00000001 << PLL_CTRL_RST_OFST) -#define PLL_CTRL_ADDR_OFST (16) -#define PLL_CTRL_ADDR_MSK (0x0000003F << PLL_CTRL_ADDR_OFST) - -/* Sample Register (Obsolete) */ -#define SAMPLE_REG (0x59 << 11) /** carlos set speed differently*/ - -#define SAMPLE_ADC_SAMPLE_SEL_OFST (0) /** carlos cant use the bits*/ -#define SAMPLE_ADC_SAMPLE_SEL_MSK (0x00000007 << SAMPLE_ADC_SAMPLE_SEL_OFST) -#define SAMPLE_ADC_SAMPLE_0_VAL ((0x0 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_1_VAL ((0x1 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_2_VAL ((0x2 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_3_VAL ((0x3 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_4_VAL ((0x4 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_5_VAL ((0x5 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_6_VAL ((0x6 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_7_VAL ((0x7 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) - -#define SAMPLE_ADC_DECMT_FACTOR_OFST (4) -#define SAMPLE_ADC_DECMT_FACTOR_MSK (0x00000007 << SAMPLE_ADC_DECMT_FACTOR_OFST) -#define SAMPLE_ADC_DECMT_FACTOR_0_VAL ((0x0 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_1_VAL ((0x1 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_2_VAL ((0x2 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_3_VAL ((0x3 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_4_VAL ((0x4 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_5_VAL ((0x5 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_6_VAL ((0x6 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_7_VAL ((0x7 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) - -#define SAMPLE_DGTL_SAMPLE_SEL_OFST (8) -#define SAMPLE_DGTL_SAMPLE_SEL_MSK (0x0000000F << SAMPLE_DGTL_SAMPLE_SEL_OFST) -#define SAMPLE_DGTL_SAMPLE_0_VAL ((0x0 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_1_VAL ((0x1 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_2_VAL ((0x2 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_3_VAL ((0x3 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_4_VAL ((0x4 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_5_VAL ((0x5 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_6_VAL ((0x6 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_7_VAL ((0x7 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_8_VAL ((0x8 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_9_VAL ((0x9 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_10_VAL ((0xa << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_11_VAL ((0xb << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_12_VAL ((0xc << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_13_VAL ((0xd << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_14_VAL ((0xe << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_15_VAL ((0xf << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) - -#define SAMPLE_DGTL_DECMT_FACTOR_OFST (12) -#define SAMPLE_DGTL_DECMT_FACTOR_MSK (0x00000003 << SAMPLE_DGTL_DECMT_FACTOR_OFST) -#define SAMPLE_DECMT_FACTOR_1_VAL ((0x0 << SAMPLE_DGTL_DECMT_FACTOR_OFST) & SAMPLE_DGTL_DECMT_FACTOR_MSK) -#define SAMPLE_DECMT_FACTOR_2_VAL ((0x1 << SAMPLE_DGTL_DECMT_FACTOR_OFST) & SAMPLE_DGTL_DECMT_FACTOR_MSK) -#define SAMPLE_DECMT_FACTOR_4_VAL ((0x2 << SAMPLE_DGTL_DECMT_FACTOR_OFST) & SAMPLE_DGTL_DECMT_FACTOR_MSK) - -/** Vref Comp Mod Register */ -#define VREF_COMP_MOD_REG (0x5C << 11) //Not used in software, TBD in firmware - -/** DAQ Register */ -#define DAQ_REG (0x5D << 11) //TBD in firmware - -/** carlos ?? */ -/* settings/conf gain register */ -#define GAIN_MASK 0x0000ffff -#define GAIN_OFFSET 0 -#define SPEED_GAIN_MASK 0xf0000000 -#define SPEED_GAIN_OFFSET 28 -/***************/ - -/** Chip Power Register */ -#define CHIP_POWER_REG (0x5E << 11) - -#define CHIP_POWER_ENABLE_OFST (0) -#define CHIP_POWER_ENABLE_MSK (0x00000001 << CHIP_POWER_ENABLE_OFST) - -/* Set Delay 64 bit register */ -#define SET_DELAY_LSB_REG (0x60 << 11) -#define SET_DELAY_MSB_REG (0x61 << 11) - -/* Set Cycles 64 bit register */ -#define SET_CYCLES_LSB_REG (0x62 << 11) -#define SET_CYCLES_MSB_REG (0x63 << 11) - -/* Set Frames 64 bit register */ -#define SET_FRAMES_LSB_REG (0x64 << 11) -#define SET_FRAMES_MSB_REG (0x65 << 11) - -/* Set Period 64 bit register */ -#define SET_PERIOD_LSB_REG (0x66 << 11) -#define SET_PERIOD_MSB_REG (0x67 << 11) - -/* Set Period 64 bit register */ -#define SET_EXPTIME_LSB_REG (0x68 << 11) -#define SET_EXPTIME_MSB_REG (0x69 << 11) - -/* Module Coordinates Register 0 */ -#define COORD_0 (0x7C << 11) - -#define COORD_0_Y_OFST (0) -#define COORD_0_Y_MSK (0x0000FFFF << COORD_0_Y_OFST) -#define COORD_0_X_OFST (16) -#define COORD_0_X_MSK (0x0000FFFF << COORD_0_X_OFST) - -/* Module Coordinates Register 1 */ -#define COORD_1 (0x7D << 11) - -#define COORD_0_Z_OFST (0) -#define COORD_0_Z_MSK (0x0000FFFF << COORD_0_Z_OFST) - - - - - - - - - - -/**carlos */ -#define SET_GATES_LSB_REG 106<<11//0x7c<<11 -#define SET_GATES_MSB_REG 107<<11//0x7d<<11 - - -/**ADC SYNC CLEAN FIFO*/ -#define ADCSYNC_CLEAN_FIFO_BITS 0x300000 -#define CLEAN_FIFO_MASK 0x0fffff - - - -#endif - diff --git a/slsDetectorSoftware/jungfrauDetectorServer/server.c b/slsDetectorSoftware/jungfrauDetectorServer/server.c deleted file mode 100755 index eb422c06c..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/server.c +++ /dev/null @@ -1,121 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ - -#include "sls_detector_defs.h" - -#include -#include "communication_funcs.h" -#include "server_funcs.h" -#include - - - -extern int sockfd; -extern int phase_shift; - - - -void error(char *msg) -{ - perror(msg); -} - -int main(int argc, char *argv[]) -{ - int portno, b; - char cmd[500]; - int retval=OK; - int sd, fd; - int iarg; - - - for(iarg=1; iarg 2) && (!strcasecmp(argv[2],"stopserver"))){ - portno = DEFAULT_PORTNO+1; - if ( sscanf(argv[1],"%d",&portno) ==0) { - printf("could not open stop server: unknown port\n"); - return 1; - } - b=0; - printf("\n\nStop Server\nOpening stop server on port %d\n",portno); - } - - //control server - else { - portno = DEFAULT_PORTNO; - sprintf(cmd,"%s %d stopserver &",argv[0],DEFAULT_PORTNO+1); - printf("\n\nControl Server\nOpening control server on port %d\n",portno ); - //printf("\n\ncmd:%s\n",cmd); - system(cmd); - b=1; - } - - - - init_detector(b); - - - sd=bindSocket(portno); - sockfd=sd; - if (getServerError(sd)) { - printf("server error!\n"); - return -1; - } - - /* assign function table */ - function_table(); -#ifdef VERBOSE - printf("function table assigned \n"); -#endif - - - /* waits for connection */ - while(retval!=GOODBYE) { -#ifdef VERBOSE - printf("\n"); -#endif -#ifdef VERY_VERBOSE - printf("Waiting for client call\n"); -#endif - fd=acceptConnection(sockfd); -#ifdef VERY_VERBOSE - printf("Conenction accepted\n"); -#endif - retval=decode_function(fd); -#ifdef VERY_VERBOSE - printf("function executed\n"); -#endif - closeConnection(fd); -#ifdef VERY_VERBOSE - printf("connection closed\n"); -#endif - } - - exitServer(sockfd); - printf("Goodbye!\n"); - - return 0; -} - diff --git a/slsDetectorSoftware/jungfrauDetectorServer/server_defs.h b/slsDetectorSoftware/jungfrauDetectorServer/server_defs.h deleted file mode 100755 index 16800080f..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/server_defs.h +++ /dev/null @@ -1,158 +0,0 @@ -#ifndef SERVER_DEFS_H -#define SERVER_DEFS_H -#include "sls_detector_defs.h" -#include - -#define GOODBYE (-200) - -/* Hardware Definitions */ -#define NMAXMODY (1) -#define NMAXMODX (1) -#define NMAXMOD (NMAXMODX * NMAXMODY) -#define NMODY (1) -#define NMODX (1) -#define NMOD (NMODX * NMODY) -#define NCHAN (256 * 256) -#define NCHIP (8) -#define NADC (0) -#define NDAC (8) -#define NCHANS (NCHAN * NCHIP * NMAXMOD) -#define NDACS (NDAC * NMAXMOD) -#define DYNAMIC_RANGE (16) -#define DATA_BYTES (NMAXMOD * NCHIP * NCHAN * 2) -#define IP_PACKETSIZE (0x0522) /**carlos?? calcChecksum*/ -#define UDP_PACKETSIZE (0x050E) /**carlos?? calcChecksum*/ -#define CLK_EXPTIME (40) /** 0x28 better name? */ -#define CLK_FC (20) /** 0x14 better name? */ - -#define CLK_FREQ 156.25E+6 /**carlos used in firmware_funcs.. but needed ?*/ - -/** Default Acqusition Parameters */ -#define DEFAULT_NUM_FRAMES (1*1000*1000) -#define DEFAULT_NUM_CYCLES (0) -#define DEFAULT_EXPTIME (10*1000) -#define DEFAULT_PERIOD (2*1000*1000) -#define DEFAULT_DELAY (0) -#define DEFAULT_NUM_GATES (0) -#define DEFAULT_HIGH_VOLTAGE (0) - -/* Other Default Values */ -//enum DACNAMES { VB_COMP, VDD_PROT, VIN_COM, VREF_PRECH, VB_PIXBUF, VB_DS, VREF_DS, VREF_COMP }; -#define DEFAULT_DAC_VALS { 1220, 3000, 1053, 1450, 750, 1000, 480, 420 }; -enum adcVals {TEMP_FPGA, TEMP_ADC}; -#define DEFAULT_SETTINGS (DYNAMICGAIN) -#define DEFAULT_TX_UDP_PORT (0x7e9a) - -/* Defines in the Firmware */ -#define FIX_PATT_VAL (0xACDC2014) -#define ADC_PORT_INVERT_VAL (0x453b2a9c) -#define ADC_OFST_HALF_SPEED_VAL (0x20) -#define ADC_OFST_QUARTER_SPEED_VAL (0x10) - -#define SAMPLE_ADC_HALF_SPEED (0x7f7c) -#define SAMPLE_ADC_QUARTER_SPEED (0x8981) -#define DAQ_HALF_SPEED (0x0) -#define DAQ_QUARTER_SPEED (0xf) -#define ADC_PHASE_HALF_SPEED (0x41) -#define ADC_PHASE_QUARTER_SPEED (0x19) - -/* Maybe not required for jungfrau */ -#define NTRIMBITS (6) -#define NCOUNTBITS (24) -#define NCHIPS_PER_ADC (2) -#define TRIM_DR (((int)pow(2,NTRIMBITS))-1) -#define COUNT_DR (((int)pow(2,NCOUNTBITS))-1) -#define ALLMOD (0xffff) -#define ALLFIFO (0xffff) - -/* LTC2620 DAC DEFINES */ -#define LTC2620_DAC_CMD_OFST (20) -#define LTC2620_DAC_CMD_MSK (0x0000000F << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_ADDR_OFST (16) -#define LTC2620_DAC_ADDR_MSK (0x0000000F << LTC2620_DAC_ADDR_OFST) -#define LTC2620_DAC_DATA_OFST (4) -#define LTC2620_DAC_DATA_MSK (0x00000FFF << LTC2620_DAC_DATA_OFST) - -#define LTC2620_DAC_CMD_WRITE (0x00000000 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_CMD_SET (0x00000003 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_CMD_POWER_DOWN (0x00000004 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_NUMBITS (24) - - -/* MAX1932 HV DEFINES */ -#define MAX1932_HV_NUMBITS (8) -#define MAX1932_HV_DATA_OFST (0) -#define MAX1932_HV_DATA_MSK (0x000000FF << MAX1932_HV_DATA_OFST) - -/* AD9257 ADC DEFINES */ -#define AD9257_ADC_NUMBITS (24) - -#define AD9257_DEV_IND_2_REG (0x04) -#define AD9257_CHAN_H_OFST (0) -#define AD9257_CHAN_H_MSK (0x00000001 << AD9257_CHAN_H_OFST) -#define AD9257_CHAN_G_OFST (1) -#define AD9257_CHAN_G_MSK (0x00000001 << AD9257_CHAN_G_OFST) -#define AD9257_CHAN_F_OFST (2) -#define AD9257_CHAN_F_MSK (0x00000001 << AD9257_CHAN_F_OFST) -#define AD9257_CHAN_E_OFST (3) -#define AD9257_CHAN_E_MSK (0x00000001 << AD9257_CHAN_E_OFST) - -#define AD9257_DEV_IND_1_REG (0x05) -#define AD9257_CHAN_D_OFST (0) -#define AD9257_CHAN_D_MSK (0x00000001 << AD9257_CHAN_D_OFST) -#define AD9257_CHAN_C_OFST (1) -#define AD9257_CHAN_C_MSK (0x00000001 << AD9257_CHAN_C_OFST) -#define AD9257_CHAN_B_OFST (2) -#define AD9257_CHAN_B_MSK (0x00000001 << AD9257_CHAN_B_OFST) -#define AD9257_CHAN_A_OFST (3) -#define AD9257_CHAN_A_MSK (0x00000001 << AD9257_CHAN_A_OFST) -#define AD9257_CLK_CH_DCO_OFST (4) -#define AD9257_CLK_CH_DCO_MSK (0x00000001 << AD9257_CLK_CH_DCO_OFST) -#define AD9257_CLK_CH_IFCO_OFST (5) -#define AD9257_CLK_CH_IFCO_MSK (0x00000001 << AD9257_CLK_CH_IFCO_OFST) - -#define AD9257_POWER_MODE_REG (0x08) -#define AD9257_POWER_INTERNAL_OFST (0) -#define AD9257_POWER_INTERNAL_MSK (0x00000003 << AD9257_POWER_INTERNAL_OFST) -#define AD9257_INT_RESET_VAL (0x3) -#define AD9257_INT_CHIP_RUN_VAL (0x0) -#define AD9257_POWER_EXTERNAL_OFST (5) -#define AD9257_POWER_EXTERNAL_MSK (0x00000001 << AD9257_POWER_EXTERNAL_OFST) -#define AD9257_EXT_FULL_POWER_VAL (0x0) -#define AD9257_EXT_STANDBY_VAL (0x1) - -#define AD9257_OUT_MODE_REG (0x14) -#define AD9257_OUT_FORMAT_OFST (0) -#define AD9257_OUT_FORMAT_MSK (0x00000001 << AD9257_OUT_FORMAT_OFST) -#define AD9257_OUT_BINARY_OFST_VAL (0) -#define AD9257_OUT_TWOS_COMPL_VAL (1) -#define AD9257_OUT_LVDS_OPT_OFST (6) -#define AD9257_OUT_LVDS_OPT_MSK (0x00000001 << AD9257_OUT_LVDS_OPT_OFST) -#define AD9257_OUT_LVDS_ANSI_VAL (0) -#define AD9257_OUT_LVDS_IEEE_VAL (1) - -#define AD9257_OUT_PHASE_REG (0x16) -#define AD9257_OUT_CLK_OFST (0) -#define AD9257_OUT_CLK_MSK (0x0000000F << AD9257_OUT_CLK_OFST) -#define AD9257_OUT_CLK_60_VAL (0x1) -#define AD9257_IN_CLK_OFST (4) -#define AD9257_IN_CLK_MSK (0x00000007 << AD9257_IN_CLK_OFST) -#define AD9257_IN_CLK_0_VAL (0x0) - -#define AD9257_VREF_REG (0x18) -#define AD9257_VREF_OFST (0) -#define AD9257_VREF_MSK (0x00000003 << AD9257_VREF_OFST) -#define AD9257_VREF_1_33_VAL (0x2) - -#define AD9257_TEST_MODE_REG (0x0D) -#define AD9257_OUT_TEST_OFST (0) -#define AD9257_OUT_TEST_MSK (0x0000000F << AD9257_OUT_TEST_OFST) -#define AD9257_NONE_VAL (0x0) -#define AD9257_MIXED_BIT_FREQ_VAL (0xC) -#define AD9257_TEST_RESET_SHORT_GEN (4) -#define AD9257_TEST_RESET_LONG_GEN (5) -#define AD9257_USER_IN_MODE_OFST (6) -#define AD9257_USER_IN_MODE_MSK (0x00000003 << AD9257_USER_IN_MODE_OFST) - - -#endif diff --git a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c deleted file mode 100755 index eabe39b2c..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c +++ /dev/null @@ -1,2955 +0,0 @@ -#include "sls_detector_defs.h" -#include "sls_receiver_defs.h" -#include "server_funcs.h" -#include "server_defs.h" -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "registers_m.h" -#include "gitInfoJungfrau.h" - - - -extern int lockStatus; -extern char lastClientIP[INET_ADDRSTRLEN]; -extern char thisClientIP[INET_ADDRSTRLEN]; -extern int differentClients; - -//defined in the detector specific make file -#ifdef MYTHEND -const enum detectorType myDetectorType=MYTHEN; -#elif PROPIXD -const enum detectorType myDetectorType=PROPIX; -#elif GOTTHARDD -const enum detectorType myDetectorType=GOTTHARD; -#elif EIGERD -const enum detectorType myDetectorType=EIGER; -#elif PICASSOD -const enum detectorType myDetectorType=PICASSO; -#elif MOENCHD -const enum detectorType myDetectorType=MOENCH; -#elif JUNGFRAUD -const enum detectorType myDetectorType=JUNGFRAU; -#else -const enum detectorType myDetectorType=GENERIC; -#endif - - - -// Global variables -int (*flist[256])(int); -char mess[MAX_STR_LENGTH]; - -int adcvpp = 0x4; /** Carlos will we use this somewhere */ -//set adc val?? - - - - -int init_detector(int controlserver) { - if(controlserver){ - defineGPIOpins(); - resetFPGA(); - }else - usleep(300*1000); - - if (mapCSP0()==FAIL) { - printf("Could not map memory\n"); - exit(1); - } - if (controlserver) - initializeDetector(); - - //common for both control and stop server - strcpy(mess,"dummy message"); - strcpy(lastClientIP,"none"); - strcpy(thisClientIP,"none1"); - lockStatus=0; - return OK; -} - - -int decode_function(int file_des) { - int fnum,n; - int retval=FAIL; -#ifdef VERBOSE - printf( "receive data\n"); -#endif - n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); - if (n <= 0) { -#ifdef VERBOSE - printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); -#endif - return FAIL; - } -#ifdef VERBOSE - else - printf("size of data received %d\n",n); -#endif - -#ifdef VERBOSE - printf( "calling function fnum = %d %x %x %x\n",fnum,(unsigned int)(flist[fnum]), (unsigned int)(flist[F_READ_REGISTER]),(unsigned int)(&read_register)); -#endif - if (fnum<0 || fnum>255) - fnum=255; - retval=(*flist[fnum])(file_des); - if (retval==FAIL) - printf( "Error executing the function = %d \n",fnum); - return retval; -} - - -int function_table() { - int i; - for (i=0;i<256;i++){ - flist[i]=&M_nofunc; - } - flist[F_EXIT_SERVER]=&exit_server; - flist[F_EXEC_COMMAND]=&exec_command; - flist[F_GET_DETECTOR_TYPE]=&get_detector_type; - flist[F_SET_NUMBER_OF_MODULES]=&set_number_of_modules; - flist[F_GET_MAX_NUMBER_OF_MODULES]=&get_max_number_of_modules; - flist[F_SET_EXTERNAL_SIGNAL_FLAG]=&set_external_signal_flag; - flist[F_SET_EXTERNAL_COMMUNICATION_MODE]=&set_external_communication_mode; - flist[F_GET_ID]=&get_id; - flist[F_DIGITAL_TEST]=&digital_test; - flist[F_WRITE_REGISTER]=&write_register; - flist[F_READ_REGISTER]=&read_register; - flist[F_SET_DAC]=&set_dac; - flist[F_GET_ADC]=&get_adc; - flist[F_SET_CHANNEL]=&set_channel; - flist[F_SET_CHIP]=&set_chip; - flist[F_SET_MODULE]=&set_module; - flist[F_GET_CHANNEL]=&get_channel; - flist[F_GET_CHIP]=&get_chip; - flist[F_GET_MODULE]=&get_module; - flist[F_GET_THRESHOLD_ENERGY]=&get_threshold_energy; - flist[F_SET_THRESHOLD_ENERGY]=&set_threshold_energy; - flist[F_SET_SETTINGS]=&set_settings; - flist[F_START_ACQUISITION]=&start_acquisition; - flist[F_STOP_ACQUISITION]=&stop_acquisition; - flist[F_START_READOUT]=&start_readout; - flist[F_GET_RUN_STATUS]=&get_run_status; - flist[F_READ_FRAME]=&read_frame; - flist[F_READ_ALL]=&read_all; - flist[F_START_AND_READ_ALL]=&start_and_read_all; - flist[F_SET_TIMER]=&set_timer; - flist[F_GET_TIME_LEFT]=&get_time_left; - flist[F_SET_DYNAMIC_RANGE]=&set_dynamic_range; - flist[F_SET_ROI]=&set_roi; - flist[F_SET_SPEED]=&set_speed; - flist[F_SET_READOUT_FLAGS]=&set_readout_flags; - flist[F_EXECUTE_TRIMMING]=&execute_trimming; - flist[F_LOCK_SERVER]=&lock_server; - flist[F_SET_PORT]=&set_port; - flist[F_GET_LAST_CLIENT_IP]=&get_last_client_ip; - flist[F_UPDATE_CLIENT]=&update_client; - flist[F_CONFIGURE_MAC]=&configure_mac; - flist[F_LOAD_IMAGE]=&load_image; - flist[F_SET_MASTER]=&set_master; - flist[F_SET_SYNCHRONIZATION_MODE]=&set_synchronization; - flist[F_READ_COUNTER_BLOCK]=&read_counter_block; - flist[F_RESET_COUNTER_BLOCK]=&reset_counter_block; - flist[F_START_RECEIVER]=&start_receiver; - flist[F_STOP_RECEIVER]=&stop_receiver; - flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; - flist[F_WRITE_ADC_REG]=&write_adc_register; - flist[F_PROGRAM_FPGA]=&program_fpga; - flist[F_RESET_FPGA]=&reset_fpga; - flist[F_POWER_CHIP]=&power_chip; - - return OK; -} - - -int M_nofunc(int file_des){ - - int ret=FAIL; - sprintf(mess,"Unrecognized Function\n"); - printf(mess); - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} - - -int exit_server(int file_des) { - int retval=FAIL; - sendDataOnly(file_des,&retval,sizeof(retval)); - printf("closing server."); - sprintf(mess,"closing server"); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} - -int exec_command(int file_des) { - char cmd[MAX_STR_LENGTH]; - char answer[MAX_STR_LENGTH]; - int retval=OK; - int sysret=0; - int n=0; - - /* receive arguments */ - n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - - /* execute action if the arguments correctly arrived*/ - if (retval==OK) { -#ifdef VERBOSE - printf("executing command %s\n", cmd); -#endif - if (lockStatus==0 || differentClients==0) - sysret=system(cmd); - - //should be replaced by popen - if (sysret==0) { - sprintf(answer,"Succeeded\n"); - if (lockStatus==1 && differentClients==1) - sprintf(answer,"Detector locked by %s\n", lastClientIP); - } else { - sprintf(answer,"Failed\n"); - retval=FAIL; - } - } else { - sprintf(answer,"Could not receive the command\n"); - } - - /* send answer */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error writing to socket"); - retval=FAIL; - } - - - /*return ok/fail*/ - return retval; - -} - - - - - -int get_detector_type(int file_des) { - int n=0; - enum detectorType ret; - int retval=OK; - - sprintf(mess,"Can't return detector type\n"); - - - /* receive arguments */ - /* execute action */ - ret=myDetectorType; - -#ifdef VERBOSE - printf("Returning detector type %d\n",ret); -#endif - - /* send answer */ - /* send OK/failed */ - if (differentClients==1) - retval=FORCE_UPDATE; - - n += sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - - -} - - -int set_number_of_modules(int file_des) { - int n; - int arg[2], ret=0; - int retval=OK; - int dim, nm; - - sprintf(mess,"Can't set number of modules\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket %d", n); - retval=GOODBYE; - } - if (retval==OK) { - dim=arg[0]; - nm=arg[1]; - - /* execute action */ -#ifdef VERBOSE - printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); -#endif - - //if (nm!=GET_FLAG) { - if (dim!=X && nm!=GET_FLAG) { - retval=FAIL; - sprintf(mess,"Can't change module number in dimension %d\n",dim); - } else { - if (lockStatus==1 && differentClients==1 && nm!=GET_FLAG) { - sprintf(mess,"Detector locked by %s\n", lastClientIP); - retval=FAIL; - } else { - ret=setNMod(nm); - if (NMODX==nm || nm==GET_FLAG) { - retval=OK; - if (differentClients==1) - retval=FORCE_UPDATE; - } else - retval=FAIL; - } - } - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - -} - - -int get_max_number_of_modules(int file_des) { - int n; - int ret; - int retval=OK; - enum dimension arg; - - sprintf(mess,"Can't get max number of modules\n"); - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* execute action */ -#ifdef VERBOSE - printf("Getting the max number of modules in dimension %d \n",arg); -#endif - - - switch (arg) { - case X: - ret=getNModBoard(); - break; - case Y: - ret=NMAXMODY; - break; - default: - ret=FAIL; - retval=FAIL; - break; - } -#ifdef VERBOSE - printf("Max number of module in dimension %d is %d\n",arg,ret ); -#endif - - - - if (differentClients==1 && retval==OK) { - retval=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - - /*return ok/fail*/ - return retval; -} - - -//index 0 is in gate -//index 1 is in trigger -//index 2 is out gate -//index 3 is out trigger - -int set_external_signal_flag(int file_des) { - int n; - int arg[2]; - int ret=OK; - int signalindex; - enum externalSignalFlag flag, retval; - - sprintf(mess,"Can't set external signal flag\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - retval=SIGNAL_OFF; - if (ret==OK) { - signalindex=arg[0]; - flag=arg[1]; - /* execute action */ - switch (flag) { - case GET_EXTERNAL_SIGNAL_FLAG: - retval=getExtSignal(signalindex); - break; - - default: - if (differentClients==0 || lockStatus==0) { - retval=setExtSignal(signalindex,flag); - } else { - if (lockStatus!=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n", lastClientIP); - } - } - } -#ifdef VERBOSE - printf("Setting external signal %d to flag %d\n",signalindex,flag ); - printf("Set to flag %d\n",retval); -#endif - } else - ret=FAIL; - - - if (ret==OK && differentClients!=0) - ret=FORCE_UPDATE; - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - -int set_external_communication_mode(int file_des) { - int n; - enum externalCommunicationMode arg, ret=GET_EXTERNAL_COMMUNICATION_MODE; - int retval=OK; - - sprintf(mess,"Can't set external communication mode\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* - enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE - }; - */ - if (retval==OK) { - /* execute action */ - ret=setTiming(arg); -#ifdef VERBOSE - printf("Setting external communication mode to %d\n", arg); -#endif - } else - ret=FAIL; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return retval; -} - - - -int get_id(int file_des) { - // sends back 64 bits! - int64_t retval=-1; - int ret=OK; - int n=0; - enum idMode arg; - - sprintf(mess,"Can't return id\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Getting id %d\n", arg); -#endif - - switch (arg) { - case DETECTOR_SERIAL_NUMBER: - case DETECTOR_FIRMWARE_VERSION: - case DETECTOR_SOFTWARE_VERSION: - retval = getId(arg); - break; - default: - printf("Required unknown id %d \n", arg); - ret=FAIL; - retval=FAIL; - break; - } - -#ifdef VERBOSE - printf("Id is %llx\n", retval); -#endif - - if (differentClients==1) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int digital_test(int file_des) { - - int retval; - int ret=OK; - int imod=-1; - int n=0; - int ival; - enum digitalTestMode arg; - - sprintf(mess,"Can't send digital test\n"); - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Digital test mode %d\n",arg ); -#endif - - switch (arg) { - case CHIP_TEST: - n = receiveDataOnly(file_des,&imod,sizeof(imod)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - ret = FAIL; - strcpy(mess, "Not implemented for this detector\n"); - break; - case MODULE_FIRMWARE_TEST: - retval=0x2; - break; - case DETECTOR_FIRMWARE_TEST: - retval=testFpga(); - break; - case DETECTOR_MEMORY_TEST: - ret=testRAM(); - break; - case DETECTOR_BUS_TEST: - retval=testBus(); - break; - case DETECTOR_SOFTWARE_TEST: - retval=testFpga(); - break; - case DIGITAL_BIT_TEST:// only for gotthard - n = receiveDataOnly(file_des,&ival,sizeof(ival)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } -#ifdef VERBOSE - printf("with value %d\n", ival); -#endif - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - break; - } - break; - default: - printf("Unknown digital test required %d\n",arg); - ret=FAIL; - retval=FAIL; - break; - } - -#ifdef VERBOSE - printf("digital test result is 0x%x\n", retval); -#endif - //Always returns force update such that the dynamic range is always updated on the client - - // if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int write_register(int file_des) { - - int retval; - int ret=OK; - int arg[2]; - int addr, val; - int n; - u_int32_t address; - - sprintf(mess,"Can't write to register\n"); - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - addr=arg[0]; - val=arg[1]; - -#ifdef VERBOSE - printf("writing to register 0x%x data 0x%x\n", addr, val); -#endif - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } - - - if(ret!=FAIL){ - address=(addr<<11); - ret=bus_w(address,val); - if(ret==OK){ - retval=bus_r(address); - } - } - - -#ifdef VERBOSE - printf("Data set to 0x%x\n", retval); -#endif - if (retval==val) { - ret=OK; - if (differentClients) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int read_register(int file_des) { - - int retval; - int ret=OK; - int arg; - int addr; - int n; - u_int32_t address; - - sprintf(mess,"Can't read register\n"); - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - addr=arg; - - - - //#ifdef VERBOSE - printf("reading register 0x%x\n", addr); - //#endif - - if(ret!=FAIL){ - address=(addr<<11); - retval=bus_r(address); - } - - - -#ifdef VERBOSE - printf("Returned value 0x%x\n", retval); -#endif - if (ret==FAIL) { - ret=FAIL; - printf("Reading register 0x%x failed\n", addr); - } else if (differentClients) - ret=FORCE_UPDATE; - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int set_dac(int file_des) { - //default:all mods - int retval, retval1; - int ret=OK; - int arg[3]; - enum dacIndex ind; - int imod; - int n; - int val; - int mV=0; - sprintf(mess,"Can't set DAC\n"); - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ind=arg[0]; - imod=arg[1]; - mV=arg[3]; - n = receiveDataOnly(file_des,&val,sizeof(val)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - //#ifdef VERBOSE - printf("Setting DAC %d of module %d to %d , mode %d\n", ind, imod, val, mV); - //#endif - - if (imod>=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - - - - -#ifdef MCB_FUNCS - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - if (ind<16) { - - if (mV) { - if (val>2500) - val=-1; - printf("%d mV is ",val); - if (val>0) - val=4095*val/2500; - printf("%d DACu\n", val); - } else if (val>4095) - val=-1; - - - retval=setDac(ind,val); - } - else if (ind==ADC_VPP) { - printf("Setting ADC VPP to %d\n",val); - if (val>4 || val<0) - printf("Cannot set ADC VPP to %d\n",val); - else { - setAdc(0x18,val); - adcvpp=val; - } - retval=adcvpp;; - - } else if (ind==HV_NEW ) - retval=setHighVoltage(val,0); - else - printf("**********No dac with index %d\n",ind); - } - } - if(ret==OK){ - if (ind<16) { - if (mV) { - - printf("%d DACu is ",retval); - retval1=2500*retval/16535; - printf("%d mV \n",retval1); - } else - retval1=retval; - } else - retval1=retval; - } -#endif - -#ifdef VERBOSE - printf("DAC set to %d V\n", retval); -#endif - - if(ret==FAIL) - printf("Setting dac %d of module %d: wrote %d but read %d\n", ind, imod, val, retval); - else{ - if (differentClients) - ret=FORCE_UPDATE; - } - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - n += sendDataOnly(file_des,&retval1,sizeof(retval1)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - - -int get_adc(int file_des) { - //default: mod 0 - int retval; - int ret=OK; - int arg[2]; - enum dacIndex ind; - int imod; - int n; - int idac=0; - - sprintf(mess,"Can't read ADC\n"); - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ind=arg[0]; - imod=arg[1]; - -#ifdef VERBOSE - printf("Getting ADC %d of module %d\n", ind, imod); -#endif - - if (imod>=getNModBoard() || imod<0) - ret=FAIL; - -#ifdef MCB_FUNCS - switch (ind) { - case TEMPERATURE_FPGA: - idac=TEMP_FPGA; - break; - case TEMPERATURE_ADC: - idac=TEMP_ADC; - break; - default: - printf("Unknown DAC index %d\n",ind); - sprintf(mess,"Unknown DAC index %d\n",ind); - ret=FAIL; - break; - } - - if (ret==OK) - retval=getTemperature(idac,imod); -#endif - -#ifdef VERBOSE - printf("ADC is %d V\n", retval); -#endif - if (ret==FAIL) { - printf("Getting adc %d of module %d failed\n", ind, imod); - } - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int set_channel(int file_des) { - int ret=OK; - sls_detector_channel myChan; - int retval; - int n; - - - sprintf(mess,"Can't set channel\n"); - -#ifdef VERBOSE - printf("Setting channel\n"); -#endif - ret=receiveChannel(file_des, &myChan); - if (ret>=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); -#endif - - if (ret==OK) { - if (myChan.module>=getNModBoard()) - ret=FAIL; - if (myChan.chip>=NCHIP) - ret=FAIL; - if (myChan.chan>=NCHAN) - ret=FAIL; - if (myChan.module<0) - myChan.module=ALLMOD; - } - - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChannelbyNumber(myChan); -#endif - } - } - /* Maybe this is done inside the initialization funcs */ - //copyChannel(detectorChans[myChan.module][myChan.chip]+(myChan.chan), &myChan); - - - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - - - -int get_channel(int file_des) { - - int ret=OK; - sls_detector_channel retval; - - int arg[3]; - int ichan, ichip, imod; - int n; - - sprintf(mess,"Can't get channel\n"); - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichan=arg[0]; - ichip=arg[1]; - imod=arg[2]; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0 && ichan=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); -#endif - - if (ret==OK) { - if (myChip.module>=getNModBoard()) - ret=FAIL; - if (myChip.module<0) - myChip.module=ALLMOD; - if (myChip.chip>=NCHIP) - ret=FAIL; - } - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChipbyNumber(myChip); -#endif - } - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - return ret; -} - - -int get_chip(int file_des) { - - - int ret=OK; - sls_detector_chip retval; - int arg[2]; - int ichip, imod; - int n; - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichip=arg[0]; - imod=arg[1]; - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0) - ret=OK; - else - ret=FAIL; - - - //#ifdef VERBOSE - printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); - //#endif - - if (ret==OK) { - if (myModule.module>=getNModBoard()) { - ret=FAIL; - printf("Module number is too large %d\n",myModule.module); - } - if (myModule.module<0) - myModule.module=ALLMOD; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initModulebyNumber(myModule); - if(retval != myModule.reg) - ret = FAIL; -#endif - } - } - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - free(myDac); - if(myAdc != NULL) free(myAdc); - if(myChip != NULL) free(myChip); - if(myChan != NULL) free(myChan); - - - //setDynamicRange(dr); always 16 commented out - - return ret; -} - - - - -int get_module(int file_des) { - - int ret=OK; - int arg; - int imod; - int n; - sls_detector_module myModule; - int *myDac=malloc(NDAC*sizeof(int)); - int *myChip=NULL; - int *myChan=NULL; - int *myAdc=NULL; - //not allocating mychip,mychan for jungfrau to sace memory - - if (myDac) - myModule.dacs=myDac; - else { - sprintf(mess,"could not allocate dacs\n"); - ret=FAIL; - } - - - myModule.adcs=NULL; - myModule.chipregs=NULL; - myModule.chanregs=NULL; - myModule.ndac=NDAC; - myModule.nchip=NCHIP; - myModule.nchan=NCHAN*NCHIP; - myModule.nadc=NADC; - - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - imod=arg; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod0) { - dataret=FAIL; - sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames()+1)); - cprintf(RED,"%s\n",mess); - } else { - dataret=FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s",mess); - if (differentClients) - dataret=FORCE_UPDATE; - } -#endif - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; -} - - - - -int read_all(int file_des) { - while(read_frame(file_des)==OK) { -#ifdef VERBOSE - printf("frame read\n"); -#endif - ; - } -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - return OK; -} - - - -int start_and_read_all(int file_des) { -#ifdef VERBOSE - printf("Starting and reading all frames\n"); -#endif - if (differentClients==1 && lockStatus==1) { - int dataret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; - - } - startStateMachine(); - read_all(file_des); -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - return OK; -} - -int set_timer(int file_des) { - enum timerIndex ind; - int64_t tns; - int n; - int64_t retval; - int ret=OK; - - sprintf(mess,"can't set timer\n"); - - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&tns,sizeof(tns)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret!=OK) { - printf(mess); - } - - -#ifdef VERBOSE - printf("setting timer %d to %lld ns\n",ind,tns); -#endif - - if (ret==OK) { - - if (differentClients==1 && lockStatus==1 && tns!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch(ind) { - case FRAME_NUMBER: - retval=setFrames(tns); - break; - case ACQUISITION_TIME: - retval=setExposureTime(tns); - break; - case FRAME_PERIOD: - retval=setPeriod(tns); - break; - case DELAY_AFTER_TRIGGER: - retval=setDelay(tns); - break; - case GATES_NUMBER: - retval=setGates(tns); - break; - case PROBES_NUMBER: - sprintf(mess,"can't set timer for this detector\n"); - ret=FAIL; - break; - case CYCLES_NUMBER: - retval=setTrains(tns); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - } - - if(ret == OK && (retval!=tns) && (tns != -1)){ - ret = FAIL; - sprintf(mess,"Setting timer %d of failed: wrote %lld but read %lld\n", ind, (long long int)tns, (long long int)retval); - cprintf(RED,"%s",mess); - }else if (ret!=OK) { - cprintf(RED,"%s",mess); - cprintf(RED,"set timer failed\n"); - } - - if (ret==OK && differentClients) - ret=FORCE_UPDATE; - - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { -#ifdef VERBOSE - printf("returning ok %d\n",(int)(sizeof(retval))); -#endif - - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - - return ret; - -} - - - - - - - - -int get_time_left(int file_des) { - - enum timerIndex ind; - int n; - int64_t retval; - int ret=OK; - - sprintf(mess,"can't get timer\n"); - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - //#ifdef VERBOSE - - printf("getting time left on timer %d \n",ind); - //#endif - - if (ret==OK) { - switch(ind) { - case FRAME_NUMBER: - printf("getting frames \n"); - retval=getFrames(); - break; - case ACQUISITION_TIME: - retval=getExposureTime();/** not implemented */ - break; - case FRAME_PERIOD: - retval=getPeriod(); - break; - case DELAY_AFTER_TRIGGER: - retval=getDelay(); - break; - case GATES_NUMBER: - retval=getGates();/** not implemented */ - break; - case PROBES_NUMBER: - retval=getProbes(); - break; - case CYCLES_NUMBER: - retval=getTrains(); - break; - case ACTUAL_TIME: - retval=getActualTime(); - break; - case MEASUREMENT_TIME: - retval=getMeasurementTime(); - break; - case FRAMES_FROM_START: - case FRAMES_FROM_START_PG: - retval=getFramesFromStart(); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - - - if (ret!=OK) { - printf("get time left failed\n"); - } else if (differentClients) - ret=FORCE_UPDATE; - - //#ifdef VERBOSE - - printf("time left on timer %d is %lld\n",ind, retval); - //#endif - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&retval,sizeof(retval)); - -#ifdef VERBOSE - - printf("data sent\n"); -#endif - - return ret; - - -} - -int set_dynamic_range(int file_des) { - - - - int dr; - int n; - int retval; - int ret=OK; - - sprintf(mess,"can't set dynamic range\n"); - - - n = receiveDataOnly(file_des,&dr,sizeof(dr)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (differentClients==1 && lockStatus==1 && dr>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setDynamicRange(dr); - } - - //if (dr>=0 && retval!=dr) ret=FAIL; - if (ret!=OK) { - sprintf(mess,"set dynamic range failed\n"); - } else { - if (differentClients) - ret=FORCE_UPDATE; - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - -int set_roi(int file_des) { - - int ret=OK; - int nroi=-1; - int n=0; - strcpy(mess,"Could not set/get roi\n"); - - n = receiveDataOnly(file_des,&nroi,sizeof(nroi)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - ret = FAIL; - strcpy(mess,"Not applicable/implemented for this detector\n"); - printf("Error:Set ROI-%s",mess); - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - -int get_roi(int file_des) { - return FAIL; -} - -int set_speed(int file_des) { - - enum speedVariable arg; - int val,n; - int ret=OK; - int retval=-1; - - n=receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - n=receiveDataOnly(file_des,&val,sizeof(val)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - - - if (val!=-1) { - if (differentClients==1 && lockStatus==1 && val>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch (arg) { - case CLOCK_DIVIDER: - switch(val){ - case 0: - ret=FAIL; - sprintf(mess,"Full speed not implemented yet. Available options: 1 for half speed and 2 for quarter speed"); - break; - case 1: - case 2: - break; - default: - ret=FAIL; - sprintf(mess,"Unknown clock options %d. Available options: 1 for half speed and 2 for quarter speed",arg); - break; - } - setClockDivider(val); - break; - - case ADC_PHASE: - adcPhase(val); - break; - - default: - ret=FAIL; - sprintf(mess,"Unknown speed parameter %d",arg); - } - } - } - } - - - - if (ret==OK) { - switch (arg) { - case CLOCK_DIVIDER: - retval=getClockDivider(); - break; - - case ADC_PHASE: - retval=getPhase(); - break; - - default: - ret=FAIL; - sprintf(mess,"Unknown speed parameter %d",arg); - } - } - - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - -int set_readout_flags(int file_des) { - - enum readOutFlags arg; - int ret=FAIL; - - - receiveDataOnly(file_des,&arg,sizeof(arg)); - - sprintf(mess,"can't set readout flags for this detector\n"); - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - return ret; -} - - - - - -int execute_trimming(int file_des) { - - int arg[3]; - int ret=FAIL; - enum trimMode mode; - - sprintf(mess,"can't set execute trimming for this detector\n"); - - receiveDataOnly(file_des,&mode,sizeof(mode)); - receiveDataOnly(file_des,arg,sizeof(arg)); - - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - return ret; -} - - -int lock_server(int file_des) { - - - int n; - int ret=OK; - - int lock; - n = receiveDataOnly(file_des,&lock,sizeof(lock)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (lock)\n"); - ret=FAIL; - } - if (lock>=0) { - if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) - lockStatus=lock; - else { - ret=FAIL; - sprintf(mess,"Server already locked by %s\n", lastClientIP); - } - } - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); - - return ret; - -} - -int set_port(int file_des) { - int n; - int ret=OK; - int sd=-1; - - enum portType p_type; /** data? control? stop? Unused! */ - int p_number; /** new port number */ - - n = receiveDataOnly(file_des,&p_type,sizeof(p_type)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (ptype)\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&p_number,sizeof(p_number)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (pnum)\n"); - ret=FAIL; - } - if (differentClients==1 && lockStatus==1 ) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - if (p_number<1024) { - sprintf(mess,"Too low port number %d\n", p_number); - printf("\n"); - ret=FAIL; - } - - printf("set port %d to %d\n",p_type, p_number); - - sd=bindSocket(p_number); - } - if (sd>=0) { - ret=OK; - if (differentClients ) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Could not bind port %d\n", p_number); - printf("Could not bind port %d\n", p_number); - if (sd==-10) { - sprintf(mess,"Port %d already set\n", p_number); - printf("Port %d already set\n", p_number); - - } - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&p_number,sizeof(p_number)); - closeConnection(file_des); - exitServer(sockfd); - sockfd=sd; - - } - - return ret; - -} - -int get_last_client_ip(int file_des) { - int ret=OK; - int n; - if (differentClients ) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - - return ret; - -} - - -int send_update(int file_des) { - - int ret=OK; - enum detectorSettings t; - int n; - int val; - size_t s; - int64_t retval, tns=-1; - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - val = NMODX; - n = sendDataOnly(file_des,&val,sizeof(val)); - val = NMODY; - n = sendDataOnly(file_des,&val,sizeof(val)); - val = DYNAMIC_RANGE; - n = sendDataOnly(file_des,&val,sizeof(val)); - s = DATA_BYTES; - n = sendDataOnly(file_des,&s,sizeof(s)); - t=setSettings(GET_SETTINGS,-1); - n = sendDataOnly(file_des,&t,sizeof(t)); - /* thr=getThresholdEnergy(); - n = sendDataOnly(file_des,&thr,sizeof(thr));*/ - retval=setFrames(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setExposureTime(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setPeriod(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setDelay(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setGates(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - /* retval=setProbes(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t));*/ - retval=setTrains(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - - if (lockStatus==0) { - strcpy(lastClientIP,thisClientIP); - } - - return ret; - - -} -int update_client(int file_des) { - - int ret=OK; - - sendDataOnly(file_des,&ret,sizeof(ret)); - return send_update(file_des); - - - -} - - -int configure_mac(int file_des) { - - int ret=OK; - char arg[5][50]; - int n; - - int imod=0;//should be in future sent from client as -1, arg[2] - int ipad; - long long int imacadd; - long long int idetectormacadd; - int udpport; - int detipad; - int retval=-100; - - sprintf(mess,"Can't configure MAC\n"); - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - sscanf(arg[0], "%x", &ipad); - sscanf(arg[1], "%llx", &imacadd); - sscanf(arg[2], "%x", &udpport); - sscanf(arg[3], "%llx", &idetectormacadd); - sscanf(arg[4], "%x", &detipad); - - //#ifdef VERBOSE - int i; - printf("\nipadd %x\t",ipad); - printf("destination ip is %d.%d.%d.%d = 0x%x \n",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff,ipad); - printf("macad:%llx\n",imacadd); - for (i=0;i<6;i++) - printf("mac adress %d is 0x%x \n",6-i,(unsigned int)(((imacadd>>(8*i))&0xFF))); - printf("udp port:0x%x\n",udpport); - printf("detector macad:%llx\n",idetectormacadd); - for (i=0;i<6;i++) - printf("detector mac adress %d is 0x%x \n",6-i,(unsigned int)(((idetectormacadd>>(8*i))&0xFF))); - printf("detipad %x\n",detipad); - printf("\n"); - //#endif - - - - if (imod>=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - - //#ifdef VERBOSE - printf("Configuring MAC of module %d at port %x\n", imod, udpport); - //#endif -#ifdef MCB_FUNCS - if (ret==OK){ - if(runBusy()){ - ret=stopStateMachine(); - if(ret==FAIL) - strcpy(mess,"could not stop detector acquisition to configure mac"); - } - - if(ret==OK) - configureMAC(ipad,imacadd,idetectormacadd,detipad,udpport); - } -#endif - if (ret==FAIL) - printf("configuring MAC of mod %d failed\n", imod); - else - printf("Configuremac successful of mod %d\n",imod); - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - /*return ok/fail*/ - return ret; - -} - - - -int load_image(int file_des) { - int retval; - int ret=OK; - int n; - enum imageType index; - short int ImageVals[NCHAN*NCHIP]; - - sprintf(mess,"Loading image failed\n"); - - n = receiveDataOnly(file_des,&index,sizeof(index)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,ImageVals,DATA_BYTES); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - switch (index) { - case DARK_IMAGE : -#ifdef VERBOSE - printf("Loading Dark image\n"); -#endif - break; - case GAIN_IMAGE : -#ifdef VERBOSE - printf("Loading Gain image\n"); -#endif - break; - default: - printf("Unknown index %d\n",index); - sprintf(mess,"Unknown index %d\n",index); - ret=FAIL; - break; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - retval=loadImage(index,ImageVals); - if (retval==-1) - ret = FAIL; - } - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - -int set_master(int file_des) { - - enum masterFlags retval=GET_MASTER; - enum masterFlags arg; - int n; - int ret=OK; - // int regret=OK; - - - sprintf(mess,"can't set master flags\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setMaster(arg); - - } - if (retval==GET_MASTER) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int set_synchronization(int file_des) { - - enum synchronizationMode retval=GET_MASTER; - enum synchronizationMode arg; - int n; - int ret=OK; - //int regret=OK; - - - sprintf(mess,"can't set synchronization mode\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - //ret=setStoreInRAM(0); - // initChipWithProbes(0,0,0, ALLMOD); - retval=setSynchronization(arg); - } - if (retval==GET_SYNCHRONIZATION_MODE) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int read_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - //char *retval=NULL; - short int CounterVals[NCHAN*NCHIP]; - - sprintf(mess,"Read counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - ret=readCounterBlock(startACQ,CounterVals); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,CounterVals[i]); -#endif - } - } - - if(ret!=FAIL){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,CounterVals,DATA_BYTES); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - - - -int reset_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - - sprintf(mess,"Reset counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=resetCounterBlock(startACQ); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - - /*return ok/fail*/ - return ret; -} - - - - - - -int start_receiver(int file_des) { - int ret=FAIL; - int n; - strcpy(mess,"Not implemented for this detector\n"); - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - - -int stop_receiver(int file_des) { - int ret = FAIL; - int n; - strcpy(mess,"Not implemented for this detector\n"); - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - -int calibrate_pedestal(int file_des){ - - int ret=OK; - int retval=-1; - int n; - int frames; - - sprintf(mess,"Could not calibrate pedestal\n"); - - n = receiveDataOnly(file_des,&frames,sizeof(frames)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=calibratePedestal(frames); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - /*return ok/fail*/ - return ret; -} - - -int write_adc_register(int file_des) { - - int retval; - int ret=OK; - int arg[2]; - int addr, val; - int n; - - sprintf(mess,"Can't write to register\n"); - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - addr=arg[0]; - val=arg[1]; - -#ifdef VERBOSE - printf("writing to register 0x%x data 0x%x\n", addr, val); -#endif - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } - - - if(ret!=FAIL){ - ret=setAdc(addr,val); - if (ret==OK) - retval=val; - } - - -#ifdef VERBOSE - printf("Data set to 0x%x\n", retval); -#endif - if (retval==val) { - ret=OK; - if (differentClients) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - - - - - -int program_fpga(int file_des) { - int ret=OK; - int n; - sprintf(mess,"Program FPGA unsuccessful\n"); - char* fpgasrc = NULL; - FILE* fp = NULL; - size_t filesize = 0; - size_t unitprogramsize = 0; - size_t totalsize = 0; - - - //filesize - n = receiveDataOnly(file_des,&filesize,sizeof(filesize)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - totalsize = filesize; -#ifdef VERY_VERBOSE - printf("\n\n Total size is:%d\n",totalsize); -#endif - - //lock - if (ret==OK && differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - filesize = 0; - } - - //opening file pointer to flash and telling FPGA to not touch flash - if(ret == OK && startWritingFPGAprogram(&fp) != OK){ - sprintf(mess,"Could not write to flash. Error at startup.\n"); - cprintf(RED,"%s",mess); - ret=FAIL; - filesize = 0; - } - - //---------------- first ret ---------------- - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - //---------------- first ret ---------------- - - - //erasing flash - if(ret != FAIL){ - eraseFlash(); - fpgasrc = (char*)malloc(MAX_FPGAPROGRAMSIZE); - } - - - - //writing to flash part by part - while(ret != FAIL && filesize){ - - unitprogramsize = MAX_FPGAPROGRAMSIZE; //2mb - if(unitprogramsize > filesize) //less than 2mb - unitprogramsize = filesize; -#ifdef VERY_VERBOSE - printf("unit size to receive is:%d\n",unitprogramsize); - printf("filesize:%d currentpointer:%d\n",filesize,currentPointer); -#endif - - - //receive - n = receiveDataOnly(file_des,fpgasrc,unitprogramsize); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (ret==OK) { - if(!(unitprogramsize - filesize)){ - fpgasrc[unitprogramsize]='\0'; - filesize-=unitprogramsize; - unitprogramsize++; - }else - filesize-=unitprogramsize; - - ret = writeFPGAProgram(fpgasrc,unitprogramsize,fp); - } - - - //---------------- middle rets ---------------- - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - cprintf(RED,"Failure: Breaking out of program receiving\n"); - } - //---------------- middle rets ---------------- - - - if(ret != FAIL){ - //print progress - printf("Writing to Flash:%d%%\r",(int) (((double)(totalsize-filesize)/totalsize)*100) ); - fflush(stdout); - } - - } - - - - printf("\n"); - - //closing file pointer to flash and informing FPGA - if(stopWritingFPGAprogram(fp) == FAIL){ - sprintf(mess,"Could not write to flash. Error at end.\n"); - cprintf(RED,"%s",mess); - ret=FAIL; - } - - if(ret!=FAIL){ - ret=FORCE_UPDATE; - } - - - //---------------- last ret ---------------- - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - //---------------- last ret ---------------- - - - //free resources - if(fpgasrc != NULL) - free(fpgasrc); - if(fp!=NULL) - fclose(fp); -#ifdef VERY_VERBOSE - printf("Done with program receiving command\n"); -#endif - /*return ok/fail*/ - return ret; -} - - - -int reset_fpga(int file_des) { - int ret=OK; - int n; - sprintf(mess,"Reset FPGA unsuccessful\n"); - - resetFPGA(); - initializeDetector(); - - ret = FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - - /*return ok/fail*/ - return ret; -} - - - -int power_chip(int file_des) { - - int retval=-1; - int ret=OK; - int arg=-1; - int n; - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - printf("Power chip to %d\n", arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=powerChip(arg); -#ifdef VERBOSE - printf("Chip powered: %d\n",retval); -#endif - - if (retval==arg || arg<0) { - ret=OK; - } else { - ret=FAIL; - printf("Powering chip failed, wrote %d but read %d\n", arg, retval); - } - - } - if (ret==OK && differentClients==1) - ret=FORCE_UPDATE; - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - return ret; -} diff --git a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h deleted file mode 100755 index 479e78a7e..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef SERVER_FUNCS_H -#define SERVER_FUNCS_H - - -#include "sls_detector_defs.h" -#include "communication_funcs.h" - -#include - -#define GOODBYE (-200) - - -int sockfd; - - -int function_table(); -int decode_function(int); -int init_detector(int); -int M_nofunc(int); -int exit_server(int); -int exec_command(int); - - - -// General purpose functions -int get_detector_type(int); -int set_number_of_modules(int); -int get_max_number_of_modules(int); - - -int set_external_signal_flag(int); -int set_external_communication_mode(int); -int get_id(int); -int digital_test(int); -int write_register(int); -int read_register(int); -int set_dac(int); -int get_adc(int); -int set_channel(int); -int get_channel(int); -int set_chip(int); -int get_chip(int); -int set_module(int); -int get_module(int); - -int get_threshold_energy(int); -int set_threshold_energy(int); -int set_settings(int); -int start_acquisition(int); -int stop_acquisition(int); -int start_readout(int); -int get_run_status(int); -int read_frame(int); -int read_all(int); -int start_and_read_all(int); -int set_timer(int); -int get_time_left(int); -int set_dynamic_range(int); -int set_roi(int); -int get_roi(int); -int set_speed(int); -int set_readout_flags(int); -int execute_trimming(int); -int lock_server(int); -int set_port(int); -int get_last_client_ip(int); -int send_update(int); -int update_client(int); - -int configure_mac(int); -int load_image(int); - -int set_master(int); -int set_synchronization(int); - -int read_counter_block(int); -int reset_counter_block(int); - -int start_receiver(int); -int stop_receiver(int); - - -int calibrate_pedestal(int); - -int set_roi(int); - -int write_adc_register(int);; - -int program_fpga(int); -int reset_fpga(int); -int power_chip(int); -#endif diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorFunctionList.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c similarity index 100% rename from slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorFunctionList.c rename to slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorFunctionList.h b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.h similarity index 100% rename from slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorFunctionList.h rename to slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.h diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer.c similarity index 100% rename from slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer.c rename to slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer.c diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer_defs.h b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h similarity index 100% rename from slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer_defs.h rename to slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.c similarity index 100% rename from slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer_funcs.c rename to slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.c diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.h similarity index 100% rename from slsDetectorSoftware/jungfrauDetectorServerNewStructure/slsDetectorServer_funcs.h rename to slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.h diff --git a/slsDetectorSoftware/jungfrauDetectorServer/stop_server.c b/slsDetectorSoftware/jungfrauDetectorServer/stop_server.c deleted file mode 100755 index e3c8ff7e1..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/stop_server.c +++ /dev/null @@ -1,46 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ - - -#include "sls_detector_defs.h" - - -#include "communication_funcs.h" -#include "firmware_funcs.h" - - -int sockfd; - -int main(int argc, char *argv[]) -{ - int portno; - int retval=0; - - portno = DEFAULT_PORTNO; - - - bindSocket(portno); - if (getServerError()) - return -1; - - - - /* waits for connection */ - while(retval!=GOODBYE) { -#ifdef VERBOSE - printf("\n"); -#endif -#ifdef VERY_VERBOSE - printf("Stop server: waiting for client call\n"); -#endif - acceptConnection(); - retval=stopStateMachine(); - closeConnection(); - } - - exitServer(); - printf("Goodbye!\n"); - - return 0; -} - diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile deleted file mode 100755 index 8ff6779c8..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -CROSS = bfin-uclinux- -CC = $(CROSS)gcc -CFLAGS += -Wall -DJUNGFRAUD -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DSTOP_SERVER #-DVERBOSEI #-DVERBOSE -LDLIBS += -lm -lstdc++ - -PROGS = jungfrauDetectorServer -DESTDIR ?= bin -INSTMODE = 0777 - -SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c -OBJS = $(SRC_CLNT:.c=.o) - -all: clean $(PROGS) - -boot: $(OBJS) - -$(PROGS): $(OBJS) - echo $(OBJS) - mkdir -p $(DESTDIR) - $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) - mv $(PROGS) $(DESTDIR) - rm *.gdb - -clean: - rm -rf $(DESTDIR)/$(PROGS) *.o - diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile.virtual b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile.virtual deleted file mode 100644 index 8ee348341..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/Makefile.virtual +++ /dev/null @@ -1,25 +0,0 @@ -CC = gcc -CFLAGS += -Wall -DJUNGFRAUD -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DSTOP_SERVER #-DVERBOSEI #-DVERBOSE -LDLIBS += -lm -lstdc++ - -PROGS = jungfrauDetectorServer -DESTDIR ?= bin -INSTMODE = 0777 - -SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c -OBJS = $(SRC_CLNT:.c=.o) - -all: clean $(PROGS) - -boot: $(OBJS) - -$(PROGS): $(OBJS) - echo $(OBJS) - mkdir -p $(DESTDIR) - $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) - mv $(PROGS) $(DESTDIR) - rm *.gdb - -clean: - rm -rf $(DESTDIR)/$(PROGS) *.o - diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/ansi.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/ansi.h deleted file mode 120000 index a122db0ad..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/ansi.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/ansi.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.c b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfo.txt b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfo.txt deleted file mode 100644 index c64e4f71a..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/jungfrauDetectorServer -URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git/jungfrauDetectorServer -Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 230d6b36e9852214f4ba5ae7c92647f35000b24d -Revision: 56 -Branch: developer -Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1313 -Last Changed Date: 2016-11-30 10:36:34 +0100 diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrau.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrau.h deleted file mode 100644 index 633eb8933..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrau.h +++ /dev/null @@ -1,11 +0,0 @@ -//#define SVNPATH "" -#define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_software.git/jungfrauDetectorServer" -//#define SVNREPPATH "" -#define SVNREPUUID "230d6b36e9852214f4ba5ae7c92647f35000b24d" -//#define SVNREV 0x1313 -//#define SVNKIND "" -//#define SVNSCHED "" -#define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x1313 -#define SVNDATE 0x20161130 -// diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrauTmp.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrauTmp.h deleted file mode 100644 index 58e48f497..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/gitInfoJungfrauTmp.h +++ /dev/null @@ -1,11 +0,0 @@ -//#define SVNPATH "" -#define SVNURL "" -//#define SVNREPPATH "" -#define SVNREPUUID "" -//#define SVNREV "" -//#define SVNKIND "" -//#define SVNSCHED "" -#define SVNAUTH "" -#define SVNREV "" -#define SVNDATE "" -// diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_defs.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_defs.h deleted file mode 120000 index c5062e03f..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_defs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_funcs.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_funcs.h deleted file mode 120000 index 844b67129..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_detector_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_defs.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_defs.h deleted file mode 120000 index 1de31caf5..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_defs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_funcs.h b/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_funcs.h deleted file mode 120000 index c2ea4ded9..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServerNewStructure/sls_receiver_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_funcs.h \ No newline at end of file