From 08fd8485040624f128744f4cdf2b2fa6cc75bf3c Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 18 Aug 2016 10:31:10 +0200 Subject: [PATCH] updatereveiger --- slsDetectorSoftware/eigerDetectorServer/Beb.c | 241 +++++++++--------- slsDetectorSoftware/eigerDetectorServer/Beb.h | 8 +- .../eigerDetectorServer/FebRegisterDefs.h | 2 + ....5.14.1 => eigerDetectorServerv2.0.5.14.2} | Bin 277374 -> 277442 bytes .../slsDetectorServer_funcs.c | 9 +- 5 files changed, 128 insertions(+), 132 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv2.0.5.14.1 => eigerDetectorServerv2.0.5.14.2} (59%) diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index 106e72730..1617dace1 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -44,6 +44,7 @@ unsigned int* Beb_recv_data; short Beb_bit_mode; + int BEB_MMAP_SIZE = 0x1000; @@ -149,15 +150,15 @@ void Beb_GetModuleCopnfiguration(int* master, int* top){ *top = 0; *master = 0; //mapping new memory to read master top module configuration - u_int32_t baseaddr; + u_int32_t* csp0base=0; int ret; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0){ cprintf(BG_RED,"Module Configuration FAIL\n"); }else{ //read data - ret = Beb_Read32(baseaddr, MODULE_CONFIGURATION_MASK); + ret = Beb_Read32(csp0base, MODULE_CONFIGURATION_MASK); printf("Module Configuration OK\n"); printf("Beb: value =0x%x\n",ret); if(ret&TOP_BIT_MASK) @@ -165,24 +166,25 @@ void Beb_GetModuleCopnfiguration(int* master, int* top){ if(ret&MASTER_BIT_MASK) *master = 1; //close file pointer - Beb_close(fd); + Beb_close(fd,csp0base); } } /* do not work at the moment */ int Beb_SetMasterViaSoftware(){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = 1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = 1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Set Master FAIL\n"); else{ - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); value|=MASTER_BIT; value|=OVERWRITE_HARDWARE_BIT; - int newval = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,value); + int newval = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,value); if(newval!=value) cprintf(BG_RED,"Could not set Master via Software\n"); else @@ -191,7 +193,7 @@ int Beb_SetMasterViaSoftware(){ //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } @@ -199,17 +201,18 @@ int Beb_SetMasterViaSoftware(){ /* do not work at the moment */ int Beb_SetSlaveViaSoftware(){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = 1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = 1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Set Slave FAIL\n"); else{ - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); value&=~MASTER_BIT; value|=OVERWRITE_HARDWARE_BIT; - int newval = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,value); + int newval = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,value); if(newval!=value) cprintf(BG_RED,"Could not set Slave via Software\n"); else @@ -218,29 +221,30 @@ int Beb_SetSlaveViaSoftware(){ //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } int Beb_Activate(int enable){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = -1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = -1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Deactivate FAIL\n"); else{ if(enable > -1){ - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); printf("Deactivate register value before:%d\n",value); if(enable) value&=~DEACTIVATE_BIT; else value|=DEACTIVATE_BIT; - int newval = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,value); + int newval = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,value); if(newval!=value){ if(enable) cprintf(BG_RED,"Could not activate via Software\n"); @@ -249,7 +253,7 @@ int Beb_Activate(int enable){ } } - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); if(value&DEACTIVATE_BIT) ret = 0; else ret = 1; if(enable == -1){ @@ -262,7 +266,7 @@ int Beb_Activate(int enable){ } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } @@ -270,7 +274,8 @@ int Beb_Activate(int enable){ int Beb_SetNetworkParameter(enum detNetworkParameter mode, int val){ //mapping new memory - u_int32_t baseaddr, valueread = 0; + u_int32_t* csp0base=0; + u_int32_t valueread = 0; u_int32_t offset = TXM_DELAY_LEFT_OFFSET; char modename[100] = ""; @@ -295,25 +300,25 @@ int Beb_SetNetworkParameter(enum detNetworkParameter mode, int val){ default: cprintf(BG_RED,"Unrecognized mode in network parameter: %d\n",mode); return -1; } //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0){ cprintf(BG_RED,"Could not read register to set network parameter. FAIL\n"); return -1; } else{ if(val > -1){ - valueread = Beb_Read32(baseaddr, offset); + valueread = Beb_Read32(csp0base, offset); //cprintf(BLUE, "%s value before:%d\n",modename,valueread); - Beb_Write32(baseaddr, offset,val); + Beb_Write32(csp0base, offset,val); cprintf(BLUE,"%s value:%d\n", modename,valueread); } - valueread = Beb_Read32(baseaddr, offset); + valueread = Beb_Read32(csp0base, offset); //cprintf(BLUE,"%s value:%d\n", modename,valueread); } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return valueread; } @@ -321,14 +326,15 @@ int Beb_SetNetworkParameter(enum detNetworkParameter mode, int val){ int Beb_ResetToHardwareSettings(){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = 1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = 1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Reset to Hardware Settings FAIL\n"); else{ - value = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,0); + value = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,0); if(value) cprintf(BG_RED,"Could not reset to hardware settings\n"); else @@ -337,7 +343,7 @@ int Beb_ResetToHardwareSettings(){ //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } @@ -346,21 +352,22 @@ int Beb_ResetToHardwareSettings(){ u_int32_t Beb_GetFirmwareRevision(){ //mapping new memory - u_int32_t baseaddr, value = 0; + u_int32_t* csp0base=0; + u_int32_t value = 0; //open file pointer - int fd = Beb_open(XPAR_VERSION,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_VERSION); if(fd < 0) cprintf(BG_RED,"Firmware Revision Read FAIL\n"); else{ - value = Beb_Read32(baseaddr, FIRMWARE_VERSION_OFFSET); + value = Beb_Read32(csp0base, FIRMWARE_VERSION_OFFSET); if(!value) cprintf(BG_RED,"Firmware Revision Number does not exist in this version\n"); } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return value; } @@ -368,41 +375,42 @@ u_int32_t Beb_GetFirmwareRevision(){ u_int32_t Beb_GetFirmwareSoftwareAPIVersion(){ //mapping new memory - u_int32_t baseaddr, value = 0; + u_int32_t* csp0base=0; + u_int32_t value = 0; //open file pointer - int fd = Beb_open(XPAR_VERSION,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_VERSION); if(fd < 0) cprintf(BG_RED,"Firmware Software API Version Read FAIL\n"); else{ - value = Beb_Read32(baseaddr, FIRMWARESOFTWARE_API_OFFSET); + value = Beb_Read32(csp0base, FIRMWARESOFTWARE_API_OFFSET); if(!value) cprintf(BG_RED,"Firmware Software API Version does not exist in this version\n"); } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return value; } void Beb_ResetFrameNumber(){ //mapping new memory to read master top module configuration - u_int32_t baseaddr; + u_int32_t* csp0base=0; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0){ cprintf(BG_RED,"Reset Frame Number FAIL\n"); }else{ //write a 1 - Beb_Write32(baseaddr, FRAME_NUM_RESET_OFFSET, 1); + Beb_Write32(csp0base, FRAME_NUM_RESET_OFFSET, 1); usleep(100000); //100ms //write a 0 - Beb_Write32(baseaddr, FRAME_NUM_RESET_OFFSET, 0); + Beb_Write32(csp0base, FRAME_NUM_RESET_OFFSET, 0); printf("Frame Number Reset OK\n"); //close file pointer - Beb_close(fd); + Beb_close(fd,csp0base); } } @@ -583,8 +591,8 @@ int Beb_SetByteOrder(){ int Beb_SetUpUDPHeader(unsigned int beb_number, int ten_gig, unsigned int header_number, char* dst_mac, char* dst_ip, unsigned int dst_port){ u_int32_t bram_phy_addr; - volatile u_int32_t* bram_ptr; - bram_ptr = NULL; + u_int32_t* csp0base=0; + /*u_int32_t* bram_ptr = NULL;*/ if (ten_gig) bram_phy_addr = 0xC6002000; else @@ -592,25 +600,17 @@ int Beb_SetUpUDPHeader(unsigned int beb_number, int ten_gig, unsigned int header if(!Beb_SetHeaderData(beb_number,ten_gig,dst_mac,dst_ip,dst_port)) return 0; - int fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) - cprintf(BG_RED,"\nCan't find /dev/mem!\n"); - else{ -#ifdef VERBOSE - printf("/dev/mem opened\n"); -#endif - bram_ptr = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, bram_phy_addr); - if (bram_ptr == MAP_FAILED) { - cprintf(BG_RED,"\nCan't map memmory area!!\n"); - fd = -1; - } -#ifdef VERBOSE - else printf("CSP0 mapped\n"); -#endif - } - memcpy(bram_ptr+header_number*16, &udp_header, sizeof(udp_header)); - close(fd); + + int fd = Beb_open(&csp0base,bram_phy_addr); + if(fd < 0){ + cprintf(BG_RED,"Set up UDP Header FAIL\n"); + }else{ + //read data + memcpy(csp0base+header_number*16, &udp_header, sizeof(udp_header)); + //close file pointer + Beb_close(fd,csp0base); + } return 1; } @@ -814,27 +814,27 @@ int Beb_SetUpTransferParameters(short the_bit_mode){ int Beb_StopAcquisition() { - u_int32_t baseaddr; + u_int32_t* csp0base=0; volatile u_int32_t valuel,valuer; //open file pointer - int fd = Beb_open(XPAR_CMD_GENERATOR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_CMD_GENERATOR); if(fd < 0){ cprintf(BG_RED,"Beb Stop Acquisition FAIL\n"); return 0; }else{ //find value - valuel = Beb_Read32(baseaddr, (LEFT_OFFSET+STOP_ACQ_OFFSET)); - valuer = Beb_Read32(baseaddr, (RIGHT_OFFSET+STOP_ACQ_OFFSET)); + valuel = Beb_Read32(csp0base, (LEFT_OFFSET+STOP_ACQ_OFFSET)); + valuer = Beb_Read32(csp0base, (RIGHT_OFFSET+STOP_ACQ_OFFSET)); //high - Beb_Write32(baseaddr, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel|STOP_ACQ_BIT)); - Beb_Write32(baseaddr, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer|STOP_ACQ_BIT)); + Beb_Write32(csp0base, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel|STOP_ACQ_BIT)); + Beb_Write32(csp0base, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer|STOP_ACQ_BIT)); //low - Beb_Write32(baseaddr, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel&(~STOP_ACQ_BIT))); - Beb_Write32(baseaddr, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer&(~STOP_ACQ_BIT))); + Beb_Write32(csp0base, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel&(~STOP_ACQ_BIT))); + Beb_Write32(csp0base, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer&(~STOP_ACQ_BIT))); printf("Beb Stop Acquisition OK\n"); //close file pointer - Beb_close(fd); + Beb_close(fd,csp0base); } return 1; } @@ -889,10 +889,10 @@ int Beb_RequestNImages(unsigned int beb_number, int ten_gig, unsigned int dst_nu u_int32_t right_port_value = 0x2000; - u_int32_t baseaddr; + u_int32_t* csp0base=0; volatile u_int32_t value; //open file pointer - int fd = Beb_open(XPAR_CMD_GENERATOR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_CMD_GENERATOR); if(fd < 0){ cprintf(BG_RED,"Beb Request N Images FAIL\n"); return 0; @@ -915,27 +915,27 @@ int Beb_RequestNImages(unsigned int beb_number, int ten_gig, unsigned int dst_nu //"0x20 << 8" is dst_number (0x00 for left, 0x20 for right) //Left - Beb_Write32(baseaddr, (LEFT_OFFSET + FIRST_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (LEFT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command); - Beb_Write32(baseaddr, (LEFT_OFFSET + SECOND_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (LEFT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command); - value = Beb_Read32(baseaddr,(LEFT_OFFSET + TWO_REQUESTS_OFFSET)); - if(in_two_requests) Beb_Write32(baseaddr, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); - else Beb_Write32(baseaddr, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); + Beb_Write32(csp0base, (LEFT_OFFSET + FIRST_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (LEFT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command); + Beb_Write32(csp0base, (LEFT_OFFSET + SECOND_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (LEFT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command); + value = Beb_Read32(csp0base,(LEFT_OFFSET + TWO_REQUESTS_OFFSET)); + if(in_two_requests) Beb_Write32(csp0base, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); + else Beb_Write32(csp0base, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); // Right - Beb_Write32(baseaddr, (RIGHT_OFFSET + FIRST_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (RIGHT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command | right_port_value); - Beb_Write32(baseaddr, (RIGHT_OFFSET + SECOND_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (RIGHT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command | right_port_value); - value = Beb_Read32(baseaddr,(RIGHT_OFFSET + TWO_REQUESTS_OFFSET)); - if(in_two_requests) Beb_Write32(baseaddr, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); - else Beb_Write32(baseaddr, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); + Beb_Write32(csp0base, (RIGHT_OFFSET + FIRST_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (RIGHT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command | right_port_value); + Beb_Write32(csp0base, (RIGHT_OFFSET + SECOND_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (RIGHT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command | right_port_value); + value = Beb_Read32(csp0base,(RIGHT_OFFSET + TWO_REQUESTS_OFFSET)); + if(in_two_requests) Beb_Write32(csp0base, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); + else Beb_Write32(csp0base, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); // Set number of frames - Beb_Write32(baseaddr, (LEFT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); - Beb_Write32(baseaddr, (RIGHT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); + Beb_Write32(csp0base, (LEFT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); + Beb_Write32(csp0base, (RIGHT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); #ifdef MARTIN for (i=0; i < 10; i++) @@ -943,7 +943,7 @@ int Beb_RequestNImages(unsigned int beb_number, int ten_gig, unsigned int dst_nu printf("%d\n",in_two_requests); #endif - Beb_close(fd); + Beb_close(fd,csp0base); #ifdef MARTIN printf("----Beb_RequestNImages----\n"); @@ -991,31 +991,22 @@ int Beb_Test(unsigned int beb_number){ // Temperature value is cropped and not well rounded int Beb_GetBebFPGATemp() { + + u_int32_t* csp0base=0; int temperature=0; - volatile u_int32_t *ptr1; - int fd; - - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) - { - printf("\nCan't find /dev/mem!\n"); - return 0; + int ret; + //open file pointer + int fd = Beb_open(&csp0base,XPAR_SYSMON_0_BASEADDR); + if(fd < 0){ + cprintf(BG_RED,"Module Configuration FAIL\n"); + }else{ + //read data + ret = Beb_Read32(csp0base, FPGA_TEMP_OFFSET); + temperature = ((((float)(ret)/65536.0f)/0.00198421639f ) - 273.15f); // Static conversation, copied from xps sysmon standalone driver + //close file pointer + Beb_close(fd,csp0base); } - u_int32_t CSP0BASE = (u_int32_t)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, XPAR_SYSMON_0_BASEADDR ); - - if (CSP0BASE == (u_int32_t)MAP_FAILED) - { - printf("\nCan't map memmory area!!\n"); - return 0; - } - - ptr1=(u_int32_t*)(CSP0BASE + 0x200); // temperature register in xps sysmon core is at 0x200 - close(fd); - - temperature = ((((float)(*ptr1)/65536.0f)/0.00198421639f ) - 273.15f); // Static conversation, copied from xps sysmon standalone driver - - return temperature; } @@ -1023,7 +1014,8 @@ int Beb_GetBebFPGATemp() -int Beb_open(u_int32_t baseaddr, u_int32_t* csp0base){ + +int Beb_open(u_int32_t** csp0base, u_int32_t offset){ int fd = open("/dev/mem", O_RDWR | O_SYNC, 0); if (fd == -1) @@ -1032,33 +1024,34 @@ int Beb_open(u_int32_t baseaddr, u_int32_t* csp0base){ #ifdef VERBOSE printf("/dev/mem opened\n"); #endif - *csp0base = (u_int32_t)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, baseaddr); - if (*csp0base == (u_int32_t)MAP_FAILED) { + *csp0base = (u_int32_t*)mmap(0, BEB_MMAP_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, offset); + if (*csp0base == MAP_FAILED) { cprintf(BG_RED,"\nCan't map memmory area!!\n"); fd = -1; } #ifdef VERBOSE - else printf("CSP0 mapped\n"); + else printf("CSP0 mapped %p\n",(void*)*csp0base); #endif } return fd; } -u_int32_t Beb_Read32 (u_int32_t baseaddr, u_int32_t offset){ - volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(baseaddr + offset); - return *ptr1; +u_int32_t Beb_Read32 (u_int32_t* baseaddr, u_int32_t offset){ + volatile u_int32_t value; + value=* (u_int32_t*)(baseaddr + offset/(sizeof(u_int32_t))); + return value; } -u_int32_t Beb_Write32 (u_int32_t baseaddr, u_int32_t offset, u_int32_t data){ +u_int32_t Beb_Write32 (u_int32_t* baseaddr, u_int32_t offset, u_int32_t data){ volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(baseaddr + offset); + ptr1=(u_int32_t*)(baseaddr + offset/(sizeof(u_int32_t))); *ptr1 = data; return *ptr1; } -void Beb_close(int fd){ +void Beb_close(int fd,u_int32_t* csp0base){ if(fd >= 0) close(fd); + munmap(csp0base,BEB_MMAP_SIZE); } diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index e5ddedeb0..b11e11815 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -88,10 +88,10 @@ struct BebInfo{ int Beb_GetBebFPGATemp(); - int Beb_open(u_int32_t baseaddr, u_int32_t* csp0base); - u_int32_t Beb_Read32 (u_int32_t baseaddr, u_int32_t offset); - u_int32_t Beb_Write32 (u_int32_t baseaddr, u_int32_t offset, u_int32_t data); - void Beb_close(int fd); + int Beb_open(u_int32_t** csp0base, u_int32_t offset); + u_int32_t Beb_Read32 (u_int32_t* baseaddr, u_int32_t offset); + u_int32_t Beb_Write32 (u_int32_t* baseaddr, u_int32_t offset, u_int32_t data); + void Beb_close(int fd,u_int32_t* csp0base); #endif diff --git a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h index f1cc52140..1dbd97b59 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -122,6 +122,8 @@ #define OVERWRITE_HARDWARE_BIT 0x2 #define DEACTIVATE_BIT 0x4 +#define FPGA_TEMP_OFFSET 0x200 + #define TXM_DELAY_LEFT_OFFSET 0x180 #define TXM_DELAY_RIGHT_OFFSET 0x1A0 #define TXM_DELAY_FRAME_OFFSET 0x1C0 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.1 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.2 similarity index 59% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.1 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.2 index 2c36d689bf2509c5486877f10f5436ed0531b12c..ee237c7121c719961ca8457faad4086984f832ce 100755 GIT binary patch delta 43926 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 U-P%@(7RFduSg7bh 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 SZ<`c`&xvlEcR~2hG5-g5FP_@~ diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index a44da2d18..0a423e50f 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -2526,9 +2526,10 @@ int read_frame(int file_des) { if (differentClients==1 && lockStatus==1) { dataret=FAIL; sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED,"%s",mess); //dataret could be swapped during sendData dataret1 = dataret; - sendData(file_des,&dataret1,sizeof(dataret),INT32); + sendData(file_des,&dataret1,sizeof(dataret1),INT32); sendData(file_des,mess,sizeof(mess),OTHER); printf("dataret %d\n",dataret); return dataret; @@ -2541,11 +2542,11 @@ int read_frame(int file_des) { //dataret could be swapped during sendData dataret1 = dataret; - sendData(file_des,&dataret1,sizeof(dataret),INT32); + sendData(file_des,&dataret1,sizeof(dataret1),INT32); if (dataret==FAIL) sendData(file_des,mess,sizeof(mess),OTHER);//sizeof(mess));//sizeof(mess)); - else - sendData(file_des,dataretval,dataBytes,OTHER); + else if(dataret==OK){printf("shouldnt be sending anything but i am\n"); + sendData(file_des,dataretval,dataBytes,OTHER);} printf("dataret %d\n",dataret); return dataret;