diff --git a/Pcie40Applications/Makefile b/Pcie40Applications/Makefile index 30b88c444352eec2d947ceac392fff66254ced50..e084b3ee108773a6742bc6063c4ee7c0983e704f 100644 --- a/Pcie40Applications/Makefile +++ b/Pcie40Applications/Makefile @@ -5,7 +5,7 @@ include $(TOP)/flags.mk PCIE40_ECS :=pcie40_ecs PCIE40_ECS_OBJS =main_pcie40_ecs.o -PCIE40_ECS_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40DriverLibraries +PCIE40_ECS_CXXFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40DriverLibraries PCIE40_ECS_INSTALL =$(PREFIX)/bin PCIE40_ECS_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs @@ -23,43 +23,43 @@ PCIE40_RELOAD_INSTALL =$(PREFIX)/bin PCIE40_SLC :=pcie40_b2slc PCIE40_SLC_OBJS =main_pcie40_b2slc.o -PCIE40_SLC_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Libraries +PCIE40_SLC_CXXFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Libraries PCIE40_SLC_INSTALL =$(PREFIX)/bin PCIE40_SLC_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs -PCIE40_KLMBYTESTREAM :=pcie40_klmbytestream -PCIE40_KLMBYTESTREAM_OBJS =main_pcie40_klmbytestream.o -PCIE40_KLMBYTESTREAM_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Libraries -PCIE40_KLMBYTESTREAM_INSTALL =$(PREFIX)/bin -PCIE40_KLMBYTESTREAM_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs +# PCIE40_KLMBYTESTREAM :=pcie40_klmbytestream +# PCIE40_KLMBYTESTREAM_OBJS =main_pcie40_klmbytestream.o +# PCIE40_KLMBYTESTREAM_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Libraries +# PCIE40_KLMBYTESTREAM_INSTALL =$(PREFIX)/bin +# PCIE40_KLMBYTESTREAM_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs PCIE40_B2LRESET :=pcie40_b2linkreset PCIE40_B2LRESET_OBJS =main_pcie40_b2linkreset.o -PCIE40_B2LRESET_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Libraries +PCIE40_B2LRESET_CXXFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Libraries PCIE40_B2LRESET_INSTALL =$(PREFIX)/bin PCIE40_B2LRESET_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs PCIE40_DMA :=pcie40_dma PCIE40_DMA_OBJS =main_pcie40_dma.o -PCIE40_DMA_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver +PCIE40_DMA_CXXFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver PCIE40_DMA_INSTALL =$(PREFIX)/bin PCIE40_DMA_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs PCIE40_DAQ :=pcie40_daq PCIE40_DAQ_OBJS =main_pcie40_daq.o -PCIE40_DAQ_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver +PCIE40_DAQ_CXXFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver PCIE40_DAQ_INSTALL =$(PREFIX)/bin PCIE40_DAQ_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs PCIE40_UL :=pcie40_ul PCIE40_UL_OBJS =main_pcie40_ul.o -PCIE40_UL_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver +PCIE40_UL_CXXFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver PCIE40_UL_INSTALL =$(PREFIX)/bin PCIE40_UL_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs PCIE40_READFPGAVERSION :=pcie40_readFPGAversion PCIE40_READFPGAVERSION_OBJS =main_pcie40_readFPGAversion.o -PCIE40_READFPGAVERSION_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver -I$(TOP)/../Pcie40DriverLibraries +PCIE40_READFPGAVERSION_CXXFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40Driver -I$(TOP)/../Pcie40DriverLibraries PCIE40_READFPGAVERSION_INSTALL =$(PREFIX)/bin PCIE40_READFPGAVERSION_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs diff --git a/Pcie40Applications/main_pcie40_b2linkreset.c b/Pcie40Applications/main_pcie40_b2linkreset.c deleted file mode 100644 index b62574c9bd91621a36d63a7801e5f85114764812..0000000000000000000000000000000000000000 --- a/Pcie40Applications/main_pcie40_b2linkreset.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "pcie40_ecs.h" -#include "pcie40_b2ecs.h" -#include <stdio.h> - -int main(int argc, char *argv[]) { - ecs_open( 0 , 2 ) ; - int result = 0; - result = pcie40_resyncb2link( 0 , 0 ) ; - ecs_close( 0 , 2 ) ; - - if ( 0 == result ) - printf( "Resynchronization failed\n" ) ; - else - printf( "Resynchronization succeeded\n" ) ; - - return 0 ; -} diff --git a/Pcie40Applications/main_pcie40_b2slc.c b/Pcie40Applications/main_pcie40_b2slc.c deleted file mode 100644 index 45d4978f611c92dc4694928f5e9d3859bff60410..0000000000000000000000000000000000000000 --- a/Pcie40Applications/main_pcie40_b2slc.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "pcie40_ecs.h" -#include "pcie40_b2slc.h" -#include <stdio.h> - -int main(int argc, char *argv[]) { - ecs_open( 0 , 2 ) ; - - int result = pcie40_readfee32( 0 , 1 , 0x12 ) ; - - ecs_close( 0 , 2 ) ; - - printf( "Value = %X\n" , result ) ; - - return 0 ; -} diff --git a/Pcie40Applications/main_pcie40_daq.c b/Pcie40Applications/main_pcie40_daq.c deleted file mode 100644 index 3130ab23d187633a4bdbb7a9b6e45a188d0714af..0000000000000000000000000000000000000000 --- a/Pcie40Applications/main_pcie40_daq.c +++ /dev/null @@ -1,264 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <time.h> -#include "altera_dma_regs.h" - -//#define USE_UL - -const int CRC16_XMODEM_TABLE[] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, -} ; - - -int decode_data( unsigned int * data , unsigned int * ce , int * crc ) { - int v1 , v2 ; - *crc = 0 ; - v1 = data[ ( *ce ) % DMASIZE ] ; - v2 = data[ ( *ce + 8 ) % DMASIZE ] ; - - if ( ( v1 != data[ ( *ce + 443 * 16 ) % DMASIZE ] ) || - ( v2 != data[ ( *ce + 443 * 16 + 8 ) % DMASIZE ] ) ) return 0 ; - - *crc = 0xffff ; - int byte1, byte2, byte3, byte4 ; - byte1 = v1 & 0xFF; - byte2 = ( v1 & 0xFF00 ) >> 8 ; - byte3 = v2 & 0xFF ; - byte4 = ( v2 & 0xFF00 ) >> 8 ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte2] ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte1] ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte4] ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte3] ; - - int ix ; - int x, y ; - for ( ix = *ce + 16 ; ix < *ce + 443 * 16 ; ix += 16 ) { - x = data[ ix % DMASIZE ] ; - y = data[ ( ix + 8 ) % DMASIZE ] ; - if ( ( v1 == x ) && ( v2 == y ) ) { - *crc = 0 ; - return 0 ; - } - byte1 = x & 0xFF; - byte2 = ( x & 0xFF00 ) >> 8 ; - byte3 = y & 0xFF ; - byte4 = ( y & 0xFF00 ) >> 8 ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte2] ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte1] ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte4] ; - *crc = (((*crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((*crc)>>8)&0xff)^byte3] ; - } - - return 444 ; -} - -int crc_calc( int crc, unsigned int data ){ - int byte1, byte2, byte3, byte4, crc_temp ; - byte1 = data & 0xFF; - byte2 = ( data & 0xFF00 ) >> 8; - byte3 = ( data & 0xFF0000 ) >> 16; - byte4 = ( data & 0xFF000000 ) >> 24; - crc_temp = (((crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc)>>8)&0xff)^byte4] ; - crc_temp = (((crc_temp)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc_temp)>>8)&0xff)^byte3] ; - crc_temp = (((crc_temp)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc_temp)>>8)&0xff)^byte2] ; - crc_temp = (((crc_temp)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc_temp)>>8)&0xff)^byte1] ; - return crc_temp; -} - -int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc ) { - - int magic; - int size, size_link; - int ix ; - - int offset; - unsigned int exp_run, evenum, ctime, utime; - - *crc = 0 ; - size = data[ ( *ce ) % DMASIZE ] ; - magic = data[ ( *ce + 1 ) % DMASIZE ] ; - - - // Check a new event is available in the memory - if( ( magic & 0xffff0000 ) != 0x7f7f0000 ){ - // printf("Invalid magic number %.8x\n", magic ); - return -1; - } - - ix = *ce + 4; - ctime = data[ ix % DMASIZE ]; - ix = *ce + 3; - evenum = data[ ix % DMASIZE ]; - ix = *ce + 5; - utime = data[ ix % DMASIZE ]; - ix = *ce + 2; - exp_run = data[ ix % DMASIZE ]; - - printf("exprun %.8x eve %d\n", exp_run, evenum ); - - offset = 8; // size of ROB header [words] - - /* for ( ix = *ce; ix < *ce + 10; ix++ ) { */ - /* printf("data %.8x\n", data[ ix % DMASIZE ]); */ - /* } */ - - - while( offset + 4 != size ){ // 4 = ROB trailer size - *crc = 0xffff ; - - ix = *ce + offset; - size_link = data[ ix ] & 0x00ffffff ; - - // printf("size link %d\n", size_link ); - - // Calculation of CRC - *crc = crc_calc( *crc, ctime ); - *crc = crc_calc( *crc, evenum ); - *crc = crc_calc( *crc, utime ); - *crc = crc_calc( *crc, exp_run ); - - for ( ix = *ce + offset + 2 ; ix < *ce + offset + size_link -2; ix++ ) { - *crc = crc_calc( *crc, data[ ix % DMASIZE ] ); - // printf("%.8x %.8x\n", data[ ix % DMASIZE ], *crc ); - } - - ix = *ce + 8 + size_link -2; - if( ( *crc & 0xffff ) != ( data[ ix % DMASIZE ] & 0xffff ) ){ - printf( "Error in CRC comparison calc %.8x : data %.8x\n" , *crc , data[ ix % DMASIZE ] ); - - /* for ( ix = *ce; ix < *ce + 24; ix++ ) { */ - /* printf("%.8x ", data[ ix % DMASIZE ]); */ - /* if( ( ix - *ce ) % 8 == 0 ) printf("\n"); */ - /* } */ - /* printf("\n"); */ - usleep(200000); - }else{ - // printf( "O.K. in CRC comparison calc %.8x : data %.8x\n" , *crc , data[ ix % DMASIZE ] ); - } - offset += size_link; - if( offset + 4 > size ){ - printf( "Invalid data size sum of link size %d size = %d\n" , - offset + 4, size ); - exit(1); - } - } - - // return 444 ; - return size ; -} - - -int main (int argc ,char** argv) { - // Stop trigger - system( "ssh vme \"resetft -80\"" ) ; - sleep( 2 ) ; - int res = ecs_open( 0 , 0 ) ; - if ( -1 == res ) printf("ERROR: Could not open device (BAR 0)\n") ; - else printf("SUCCESS: Device opened for DMA\n"); - res = ecs_open( 0 , 2 ) ; - pcie40_b2dmabufferreset( 0 ) ; - // Start trigger - system( "ssh vme \"trigft -80 pulse 10000 -1\"" ) ; - sleep( 2 ) ; - - // Read DMA - unsigned int * data ; - double time_spent ; - int retry ; - retry = 0 ; - - int i ; - int size, size_256, currentEventIndex, crc, nErr, nEvt, nRetry ; - currentEventIndex = 0 ; - nErr = 0 ; - nEvt = 0 ; - nRetry = 0 ; - clock_t begin = clock(); - for ( i = 0 ; i < 1000000 ; ++i ) { - if ( nEvt % 10000 == 1 ) printf( "Event number %d\n", nEvt ) ; - - res = pcie40_b2dmapointerread( 0 , &data ) ; - -#ifdef USE_UL - size = decode_data_wUL( data , ¤tEventIndex , &crc ) ; -#else - size = decode_data( data , ¤tEventIndex , &crc ) ; -#endif - if ( size <= 8 ) continue ; - -#ifdef USE_UL - if( size % 8 != 0 ){ - size_256 = ( size/8 + 1 )*8; - } - /* printf("size %d %d\n", size, i ); */ - /* printf("%.8d ", 0 ); */ - /* for (i= 0 ;i < 16;i++){ */ - /* printf("%08x ",data[ ( currentEventIndex + i ) % DMASIZE ]); */ - /* if( ( i % 8 ) == 7 ) printf("\n%.8d %.8d %.8d ", j, i); */ - /* } */ - /* printf("\n"); */ - - currentEventIndex = ( currentEventIndex + size_256 ) % DMASIZE ; - nEvt++ ; - -#else - if ( ( data[(8+16*size+currentEventIndex)%DMASIZE]&0xFFFF ) != crc ) { - if ( retry == 1 ) { - nErr++ ; - printf( "Error in CRC comparison %x %x\n" , crc , data[(8+16*size+currentEventIndex)%DMASIZE]&0xFFFF ) ; - } else { - nRetry++ ; - retry = 1 ; - } - } else { - retry = 0 ; - currentEventIndex = ( ( size + 1 ) * 16 + currentEventIndex ) % DMASIZE ; - nEvt++ ; - } -#endif - } - clock_t end = clock(); - time_spent += (double)(end - begin) / CLOCKS_PER_SEC; - - res = ecs_close( 0 , 0 ) ; - if ( -1 == res ) printf("ERROR: Could not close device (BAR 0)\n"); - else printf("SUCCESS: Device closed for DMA\n"); - - printf( "Timing = %f s\n" , time_spent ) ; - printf( "Number of events = %d \n", nEvt ) ; - printf( "Number of errors = %d \n", nErr ) ; - printf( "Number of retries = %d \n", nRetry ) ; - return 0 ; -} diff --git a/Pcie40Applications/main_pcie40_dma.c b/Pcie40Applications/main_pcie40_dma.c deleted file mode 100644 index 094c80ff7a02e4fd617751818f84abdd3c8deb61..0000000000000000000000000000000000000000 --- a/Pcie40Applications/main_pcie40_dma.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include "altera_dma_regs.h" - -int main (int argc ,char** argv) { - int res = ecs_open( 0 , 0 ) ; - if ( -1 == res ) printf("ERROR: Could not open device (BAR 0)\n") ; - else printf("SUCCESS: Device opened for DMA\n"); - res = ecs_open( 0 , 2 ) ; - if ( -1 == res ) printf("ERROR: Could not open device (BAR 2)\n") ; - else printf("SUCCESS: Device opened for ECS\n"); - // Read DMA - res = pcie40_b2dmabufferreset( 0 ) ; - unsigned int * data ; - res = pcie40_b2dmapointerread( 0 , &data ) ; - int i = 0 ; - if ( res == 0 ) printf( "DMA Error\n" ) ; - else { - for (i= 0 ;i < DMASIZE;i++) printf("0X%08x\n",data[i]); - } - // - res = ecs_close( 0 , 0 ) ; - if ( -1 == res ) printf("ERROR: Could not close device (BAR 0)\n"); - else printf("SUCCESS: Device closed for DMA\n"); - res = ecs_close( 0 , 2 ) ; - if ( -1 == res ) printf("ERROR: Could not close device (BAR 2)\n"); - else printf("SUCCESS: Device closed for ECS\n"); - return 0 ; -} diff --git a/Pcie40Applications/main_pcie40_ecs.c b/Pcie40Applications/main_pcie40_ecs.c deleted file mode 100644 index 8f9e455ce0fe3ca08947f98c12b50cb9fafae7a4..0000000000000000000000000000000000000000 --- a/Pcie40Applications/main_pcie40_ecs.c +++ /dev/null @@ -1,118 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include "ecs_driverlib.h" - -static int flag_devnum = 0; -static int flag_barnum = -1; -static int flag_address = 0; -static uint32_t flag_addroff; -static int flag_write = 0; -static uint32_t flag_writeval; -static int flag_read = 0; - -//ug`pcie40_ecs.synopsis` -// *pcie40_ecs* [-i _interface_] -b _bar_ -a _address_ -w _value_ _ -// *pcie40_ecs* [-i _interface_] -b _bar_ -a _address_ -r -static void usage() -{ - fprintf(stderr, "usage: pcie40_ecs [options]\n"); - fprintf(stderr, " -h Print this message\n"); - fprintf(stderr, " -i {} Interface number (default: 0)\n"); - fprintf(stderr, " -b {} BAR number\n"); - fprintf(stderr, " -a {} Register address\n"); - fprintf(stderr, " -w {} Write value to register\n"); - fprintf(stderr, " -r Read register\n"); -} - -//ug`pcie40_ecs.description` -// Reads and writes PCIe40 BAR0 and BAR2 registers over PCI Express. - -int main(int argc, char *argv[]) -{ - while (argc > 1 && argv[1][0] == '-') { - switch (argv[1][1]) { - - //ug`pcie40_ecs.options`interface - // *-i* _interface_:: - // Bind to PCIe40 interface number _interface_. This is optional and by default the tool will bind to the first interface available (typically 0). - case 'i': - ++argv; - --argc; - flag_devnum = atoi(argv[1]); - break; - - //ug`pcie40_ecs.options`bar - // *-b* _bar_:: - // Access BAR number _bar_. Two PCI BARs are available: - // * 0 for user code (includes registers for DAQ, TFC, SCA...) - // * 2 for the common low-level interface - case 'b': - ++argv; - --argc; - flag_barnum = atoi(argv[1]); - break; - - //ug`pcie40_ecs.options`address - // *-a* _address_:: - // Address to use for BAR access. Can be in decimal, hexadecimal or any other format supported by *strtol(3)*. - case 'a': - ++argv; - --argc; - flag_address = 1; - flag_addroff = strtol(argv[1], NULL, 0); - break; - - //ug`pcie40_ecs.options`write - // *-w* _value_:: - // Write 32-bit _value_ to register at the given address. Same input format considerations apply as for the *-a* option. - case 'w': - ++argv; - --argc; - flag_write = 1; - flag_writeval = strtoul(argv[1], NULL, 0); - break; - - //ug`pcie40_ecs.options`read - // *-r*:: - // Read value of register at given address. Value is printed to stdout in hexadecimal format. - case 'r': - flag_read = 1; - break; - - //ug`pcie40_ecs.options`help - // *-h*:: - // Output short program synopsis and exit. - default: - case 'h': - usage(); - exit(1); - break; - } - --argc; - ++argv; - } - //ug`pcie40_ecs.exit` - // -1 is returned in case of access error or wrong command line options, 0 otherwise. - if (!flag_address || flag_barnum < 0) { - usage(); - exit(-1); - } - if (!flag_read && !flag_write) { - printf("-r and -w are mutually exclusive\n"); - exit(-1); - } - - uint32_t *regs; - int ecs = p40_ecs_open(flag_devnum, flag_barnum, ®s); - - if (flag_write) { - p40_ecs_w32(regs, flag_addroff, flag_writeval); - } else if (flag_read) { - uint32_t reg = p40_ecs_r32(regs, flag_addroff); - printf("0x%08x\n", reg); - } - p40_ecs_close(ecs, regs, flag_barnum); - - return 0; -} diff --git a/Pcie40Applications/main_pcie40_readFPGAversion.c b/Pcie40Applications/main_pcie40_readFPGAversion.c deleted file mode 100644 index c31f90cf61823dedce9040363874c19a5bcffb2b..0000000000000000000000000000000000000000 --- a/Pcie40Applications/main_pcie40_readFPGAversion.c +++ /dev/null @@ -1,40 +0,0 @@ -/****************************************************************************************//** -* \file readFPGAMemoire.c -* -* lecture de la memore du FPGA -* la taille est de x octets -* l'adresse de depart de lecture vaut 0 -*//********************************************************************************************/ -#include <stdio.h> -#include <stdlib.h> -#include <getopt.h> -#include "ecs_driverlib.h" - -#define SIZE_MEMO_FPGA 1024 /* taille max de la memoire interne FPG */ - -int main(int argc, char *argv[]){ - int board = 0; - int i; - unsigned val; - int reg = 0; - char contenuMemoireFPGA[SIZE_MEMO_FPGA + 1]; - - ecs_openLli(board); - for(i=0; i < SIZE_MEMO_FPGA; i++) - { - if (ecs_iordLli(board, reg, &val)!=0) - { - printf("LLI bar2 Read fails at 0x%08x\n", reg); - exit(0); - } - - contenuMemoireFPGA[i] = val; - reg += 4; - - } - contenuMemoireFPGA[SIZE_MEMO_FPGA+1] = '\0'; - printf("contenu memoire FPGA %s\n",contenuMemoireFPGA); - ecs_closeLli(board); - return 0; -} - diff --git a/Pcie40Applications/main_pcie40_ul.c b/Pcie40Applications/main_pcie40_ul.c deleted file mode 100644 index 9b59e0a5cd69f429a8a66c94808099a3696b4f07..0000000000000000000000000000000000000000 --- a/Pcie40Applications/main_pcie40_ul.c +++ /dev/null @@ -1,401 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <time.h> -#include "altera_dma_regs.h" - -//#define DEBUG - -const int CRC16_XMODEM_TABLE[] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, -} ; - - - -int crc_calc( int * crc, unsigned int * data ){ - int byte1, byte2, byte3, byte4 ; - byte1 = (*data) & 0xFF; - byte2 = ( (*data) & 0xFF00 ) >> 8; - byte3 = ( (*data) & 0xFF0000 ) >> 16; - byte4 = ( (*data) & 0xFF000000 ) >> 24; - *crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte4] ; - *crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte3] ; - *crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte2] ; - *crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte1] ; -} - - -int crc_calc_event( unsigned int* data, int start_pos ){ - int i = 0; - int cur_pos = start_pos; - - int first_crc ; - int crc = 0xffff ; - - - int size = data[ cur_pos % DMASIZE ]; - - if( size > 0xffff || size <= 0 ){ - printf("Invalid total event size %.8x\n", size); - return -1; - } - - /* printf( "TRL %.8x %.8x %.8x\n", */ - /* data[ ( cur_pos + size - 1 + DMASIZE ) % DMASIZE ], */ - /* data[ ( cur_pos + 1 + size ) % DMASIZE ], */ - /* data[ ( cur_pos + 2 + size ) % DMASIZE ] ); */ - - - - - - - cur_pos = start_pos + 4; - unsigned int ctime = data[ cur_pos % DMASIZE ]; - - cur_pos = start_pos + 3; - unsigned int evenum = data[ cur_pos % DMASIZE ]; - cur_pos = start_pos + 5; - unsigned int utime = data[ cur_pos % DMASIZE ]; - cur_pos = start_pos + 2; - unsigned int exp_run = data[ cur_pos % DMASIZE ] ; - - int offset = 8; // size of ROB header [words] - - int link_num = 0; - - - crc_calc( &crc, &ctime ); - crc_calc( &crc, &evenum ); - crc_calc( &crc, &utime ); - crc_calc( &crc, &exp_run ); - first_crc = crc ; - - -#ifdef DEBUG - printf("Start\n"); - for( i = start_pos ; i < start_pos + size ; i++){ - printf("%.8x\n", data[ i % DMASIZE ] ); - } - printf("End\n"); -#endif - int bad = 0; - - while( offset + 4 < size ){ // 4 = ROB trailer size - cur_pos = start_pos + offset; - int size_link = data[ cur_pos % DMASIZE ] & 0x000ffff ; - if ( 0 >= size_link || size_link > 10000000 ){ - printf("[ERROR] Invalid size per link (%.8x words): link num %d\n", size_link, link_num); - return -1 ; // it could be that the memory was read - } - - // - // Calculation of CRC - // - crc = first_crc ; -#ifdef DEBUG - printf("%.8x %.8x crc %.8x\n", data[ ( start_pos + offset ) % DMASIZE ], data[ ( start_pos + offset + 1 ) % DMASIZE ], crc ); -#endif - for ( cur_pos = start_pos + offset + 2 ; cur_pos < start_pos + offset + size_link -2; ++cur_pos ) { - crc_calc( &crc, &data[ cur_pos % DMASIZE ] ); -#ifdef DEBUG - printf("crc %.8x data %.8x\n", crc, data[ cur_pos % DMASIZE ] ); -#endif - } -#ifdef DEBUG - printf("%.8x %.8x\n", data[ ( cur_pos ) % DMASIZE ], data[ ( cur_pos + 1 ) % DMASIZE ]); -#endif - // cur_pos = start_pos + 8 + size_link -2; - cur_pos = start_pos + offset + size_link -2; -#ifdef DEBUG - printf("calcd %.4x data %.4x\n", crc, data[ cur_pos % DMASIZE ] & 0xffff ); -#endif - - // - // Check of CRC - // - if( ( crc & 0xffff ) != ( data[ cur_pos % DMASIZE ] & 0xffff ) ){ - printf("%.2d Bad ! calcd %.4x data %.4x offset %.4x size %.4x szlnk %.4x trl %.8x\n", - link_num, crc, data[ cur_pos % DMASIZE ] & 0xffff, offset, size, size_link, data[ (cur_pos+1) % DMASIZE ] ); - bad = 1; - - }else{ - /* printf("%.2d Good ! calcd %.4x data %.4x offset %.4x size %.4x szlnk %.4x trl %.8x\n", */ - /* link_num, crc, data[ cur_pos % DMASIZE ] & 0xffff, offset, size, size_link, data[ (cur_pos+1) % DMASIZE ] ); */ - - } - link_num++; - offset += size_link; - } - - if( bad ){ - for( i = 0 ; i < size ; i++){ - printf("%.8x ", data[ ( start_pos + i ) % DMASIZE ] ); - if( i % 8 == 7 ) printf("\n"); - } - printf("\n"); - } - - -} - - int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * run , - int * bad , int *evn , int * retry , int * pctime , int * putime , - int * nmissed ) { - - int magic; - int size, size_link; - int ix ; - - int offset; - unsigned int exp_run, evenum, ctime, utime; - int start_pos = *ce; - int cnt = 0; - int cur_pos = *ce + 1; - int ret = 0; - - while( !( ( ( magic = data[ cur_pos % DMASIZE ] ) & 0xffff0000 ) != 0x7f7f0000 ) ){ - usleep(1000); - cnt++; - // - // Scan to find x"7f7f...." - // - if( cnt > 10 ){ - cnt = 0; - int j = 0 ; - for ( j = 0 ; j < DMASIZE ; ++j ) { - if ( ( ( data[ ( cur_pos + j ) % DMASIZE ] & 0xffff0000 ) == 0x7f7f0000 ) ){ - evenum = data[ ( cur_pos + j + 2 ) % DMASIZE ]; - if( evenum > *evn ){ - *evn = evenum; - cur_pos = ( cur_pos + j - 1 + DMASIZE ) % DMASIZE; - size = data[ cur_pos ] ; - *ce = ( cur_pos + size ) % DMASIZE; - printf( "New Event number prev %d new %d pos %d size %d\n" , *evn , evenum, cur_pos, size ); - crc_calc_event( data, cur_pos ); - - }else{ - printf( "Old Event number prev %d new %d pos %d\n" , *evn , evenum, ( cur_pos + j - 1 + DMASIZE ) % DMASIZE ); - break; - } - }else{ - continue; - } - } - } - } - - return size ; - } - - int main (int argc ,char** argv) { - // Stop trigger - /* system( "ssh robbep@vme \"resetft -53\"" ) ; */ - /* sleep( 2 ) ; */ - - int res = ecs_open( 0 , 0 ) ; - if ( -1 == res ) printf("ERROR: Could not open device (BAR 0)\n") ; - else printf("SUCCESS: Device opened for DMA\n"); - res = ecs_open( 0 , 2 ) ; - // ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ; - ecs_write( 0 , 2 , 0x000501A0 , 0x1 ) ; - pcie40_b2dmabufferreset( 0 ) ; - // Start trigger - // fp = popen( "ssh robbep@vme \"trigft -53 pulse 1000 -1\"" , "r" ) ; - // sleep( 2 ) ; - /* while( fgets( buf , sizeof(buf) , fp ) != NULL ) { */ - /* // printf( "A= %d\n" , strncmp( exp , buf , 3 ) ) ; */ - /* // printf( strncmp( &buf[0] , 'exp' , 1 ) ) ; */ - /* tmp = strdup( buf ) ; */ - /* if ( strncmp( exp , buf , 3 ) == 0 ) { */ - /* //printf( '%s\n' , buf ) ; */ - /* // printf( "ICI\n" ) ; */ - /* ptr = strtok( tmp , " " ) ; */ - /* ptr = strtok( NULL , " " ) ; */ - /* ptr = strtok( NULL , " " ) ; */ - /* ptr = strtok( NULL , " " ) ; */ - /* // while ( ptr != NULL ) { */ - /* run = atoi( ptr ) ; */ - /* // ptr = strtok( NULL , " " ) ; */ - /* } */ - /* //} */ - /* } */ - /* pclose( fp ) ; */ - //sleep( 2 ) ; - - int run = 0 ; - FILE* fp; - char * ptr ; - char * tmp ; - char buf[1000] ; - char exp[] = "exp" ; - - unsigned int * data ; - double time_spent ; - int retry ; - int bad ; - int evn ; - evn = 0 ; - bad = 0 ; - retry = 0 ; - int pctime, putime ; - pctime = 0 ; - putime = 0 ; - - int i ; - int size, size_256, currentEventIndex, crc, nErr, nEvt, nRetry, nMissed ; - currentEventIndex = 0 ; - nErr = 0 ; - nEvt = 0 ; - nRetry = 0 ; - nMissed = 0 ; - int read_dma = 1 ; - clock_t begin = clock() ; - int size_zero_cnt = 0; - - int start_flag = 1; - - int magic; - int size_link; - - int offset; - unsigned int exp_run, evenum, ctime, utime; - int start_pos = 0; - int cnt = 0; - int cur_pos = 0; - int ret = 0; - unsigned int cur_eve = 0, next_eve = 0; - int mod_pos = 0; - - // if ( ( nEvt % 1000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ; - - // - // Read the 1st data - // - if ( read_dma == 1 ) { - // set busy - //res = ecs_write( 0 , 2 , 0x000501A0 , 0x1 ) ; - //sleep(5); - res = pcie40_b2dmapointerread( 0 , &data ) ; - if ( start_flag == 1 ){ - ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ; - start_flag = 0; - } - //usleep( 5 ) ; - // release busy - //res = ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ; - read_dma = 1 ; - } - - // - // Main loop - // - while( 1 ){ - - while( ( ( ( magic = data[ ( cur_pos + 1 ) % DMASIZE ] ) & 0xffff0000 ) != 0x7f7f0000 ) - || data[ ( cur_pos + data[ cur_pos % DMASIZE ] - 1 + DMASIZE ) % DMASIZE ] != 0x7fff0006 ){ - // printf("MAGIC %.8x\n", magic); - usleep(1000); - - // - // Refresh DMA memory - // - res = pcie40_b2dmapointerread( 0 , &data ) ; - int wait_flag = 0; - // - // Scan to find x"7f7f...." - // - if( cnt > 100 ){ - cnt = 0; - int j = 0 ; - for ( j = 0 ; j < DMASIZE ; ++j ) { -#ifdef DEBUG - printf("%.8x %d\n", data[ ( cur_pos + j + 1 ) % DMASIZE ], cur_pos + j ); -#endif - if ( ( ( data[ ( cur_pos + j + 1 ) % DMASIZE ] & 0xffff0000 ) == 0x7f7f0000 ) ){ - next_eve = data[ ( cur_pos + j + 3 ) % DMASIZE ]; - - // printf( "TRAILER %.8x %.8x %.8x\n",data[ ( cur_pos + j + data[ ( cur_pos + j + DMASIZE ) % DMASIZE ] - 1 + DMASIZE ) % DMASIZE ] ); - - if( next_eve > cur_eve ){ - /* if( data[ ( ( data[ ( cur_pos + j + DMASIZE ) % DMASIZE ] ) - 1 + DMASIZE ) % DMASIZE ] != 0x7fff0006 ){ */ - /* usleep(1000); */ - /* break; */ - /* } */ - cur_pos = ( cur_pos + j + DMASIZE ) % DMASIZE; - size = data[ cur_pos ]; - printf( "Detect new Event number prev %.8x new %.8x pos %.8x size %.8x\n" , cur_eve , next_eve, cur_pos, size ); - break; - }else{ - printf( "Detect Old Event number prev %.8x new %.8x pos %d\n" , cur_eve , next_eve, ( cur_pos + j + DMASIZE ) % DMASIZE ); - break; - } - }else{ - continue; - } - } - } - cnt++; - } - size = data[ cur_pos ] ; - - next_eve = data[ ( cur_pos + 3 ) % DMASIZE ]; - printf( "Event number prev %.8x new %.8x pos %.8x size %.8x\n" , cur_eve , next_eve, cur_pos, size ); - crc_calc_event( data, cur_pos ); - cur_eve = next_eve; - - mod_pos = ( cur_pos + size ) % 8; - if( mod_pos != 0 ){ - cur_pos = ( cur_pos + size + DMASIZE + ( 8 - mod_pos) ) % DMASIZE ; - }else{ - cur_pos = ( cur_pos + size + DMASIZE ) % DMASIZE ; - } - - } - - - clock_t end = clock(); - time_spent += (double)(end - begin) / CLOCKS_PER_SEC; - - res = ecs_close( 0 , 0 ) ; - if ( -1 == res ) printf("ERROR: Could not close device (BAR 0)\n"); - else printf("SUCCESS: Device closed for DMA\n"); - - printf( "Timing = %f s\n" , time_spent ) ; - printf( "Number of events = %d \n", nEvt ) ; - printf( "Number of errors = %d \n", nErr ) ; - printf( "Number of retries = %d \n", nRetry ) ; - printf( "Number of missed = %d \n", nMissed ) ; - return 0 ; - } diff --git a/Pcie40Libraries/pcie40_b2slc.c b/Pcie40Libraries/pcie40_b2slc.c deleted file mode 100644 index 079f15db1e0d1a1050ac75de14f5387f30551481..0000000000000000000000000000000000000000 --- a/Pcie40Libraries/pcie40_b2slc.c +++ /dev/null @@ -1,402 +0,0 @@ -// File for Belle2 slow control access with PCIe40 -#include "pcie40_b2slc.h" -#include <unistd.h> -#include <stdio.h> -#include <vector> -#include "pcie40_ecs.h" - -/////////////////////////////////////////////////////////////////////////// -// Internal functions for slow control,, do not use outside of this library -/////////////////////////////////////////////////////////////////////////// - -int pcie40_resetWriteFifo( int dev , int ch ) { - unsigned ret = 0 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_RESET_ADD , - 1 << SLC_WFIFO_RESET_BIT ) ; - if ( ret != 0 ) return -1 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_RESET_ADD , 0 ) ; - if ( ret != 0 ) return -1 ; - return ret ; -} - -int pcie40_resetReadFifo( int dev , int ch ) { - unsigned ret = 0 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_RESET_ADD , - 1 << SLC_WFIFO_RESET_BIT ) ; - if ( ret != 0 ) return -1 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_RESET_ADD , 0 ) ; - if ( ret != 0 ) return -1 ; - return ret ; -} - -int pcie40_writeToFifo( int dev , int ch , std::vector< int > & data ) { - std::vector< int >::iterator it ; - unsigned ret = 0 ; - for ( it = data.begin() ; it != data.end() ; ++it ) { - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_ADD + ch * 0x20 , - (int) ( (*it) & 0xFFFFFFFF ) ) ; - if ( ret != 0 ) return -1 ; - } - return ret ; -} - -int pcie40_startEmit( int dev , int ch ) { - unsigned ret = 0 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_START_ADD , 0 ) ; - if ( ret != 0 ) return -1 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_START_ADD , - 1 << ( SLC_WFIFO_EMIT_BIT + ch ) ) ; - if ( ret != 0 ) return -1 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_START_ADD , 0 ) ; - if ( ret != 0 ) return -1 ; - return ret ; -} - -int pcie40_waitRead( int dev , int ch , int length ) { - unsigned ret = 0 ; - int i ; - for ( i=0 ; i<10 ; i++ ) { - usleep( 10 ) ; //10 ms - ret = ecs_read( dev , SLC_BAR , SLC_RFIFO_STATUS + ch * 0x20 ) ; - ret = ( ret & 0xFF00 ) >> 8 ; - if ( ret == length ) break; - } - - if (i == 10) { - printf( "Timeout\n" ) ; - return -1 ; - } - return ret ; -} - -int pcie40_readData( int dev , int ch , std::vector< int > & result , int length ) { - unsigned ret = 0 ; - int i = 0 ; - for ( i = 0 ; i < length ; ++i ) { - ret = ecs_read( dev , SLC_BAR , SLC_RFIFO_ADD + fd * 0x20 ); - result.push_back( ret ) ; - } - return 0 ; -} -/* ---------------------------------------------------------------------- *\ - readfee8 - returns -1 in case of error -\* ---------------------------------------------------------------------- */ -int pcie40_readfee8( int dev , int ch , int adr) { - // PCIe40 - if ( ( adr <=0 ) || ( adr > 0x7F ) ) return -1 ; - // Reset the FIFO (Emit and reception) - unsigned ret = 0 ; - ret = pcie40_resetReadFifo( dev , ch ) ; - if ( ret != 0 ) return ret ; - - // Fill the FIFO with the requested information: write MSB first - std::vector< int > data ; - data.push_back( - 0xFFFE , - 0x0001 , - 0x8000 | ( adr & 0x7F ) , - 0x000c , - 0xEEEE - ) - ret = pcie40_writeToFifo( dev , ch , data ) ; - if ( ret != 0 ) return ret ; - - // start emit - ret = pcie40_startEmit( dev , ch ) - if ( ret != 0 ) return -1 ; - - // Wait for the result to come back (40 words in the fifo) - ret = pcie40_waitRead( dev , fd , 40 ) ; - if ( ret != 0 ) return -1 ; - - // Read the value - std::vector< int > result ; - ret = pcie40_readData( dev , fd , result , 5 ) ; - - int ret2 = result.at( 1 ) ; - int ret3 = result.at( 2 ) ; - // check address consistency - if ( ( ( ret2 & 0x7F ) ) != adr ) return -1 ; - - return ( ret3 & 0xFF ) ; -} - -//============================================================================== -// Write 8b -//============================================================================== -int pcie40_writefee8( int dev , int ch , int adr , int val ) { - // PCIe40 - if ( ( adr <=0 ) || ( adr > 0x7F ) ) return -1 ; - // Reset the FIFO - unsigned ret = 0 ; - ret = pcie40_resetReadFifo( dev , ch ) ; - if ( ret != 0 ) return ret ; - - // Fill the FIFO with the requested information: write MSB first - std::vector< int > data ; - data.push_back( - 0xFFFF , - 0x0001 , - 0x8000 | ( adr & 0x7F ) , - 0x0000 | ( val & 0xFF ) , - 0xEEEE - ) - ret = pcie40_writeToFifo( dev , ch , data ) ; - if ( ret != 0 ) return ret ; - - // start emit - ret = pcie40_startEmit( dev , ch ) - if ( ret != 0 ) return -1 ; - - return 0 ; -} - -//============================================================================== -// Read 32b -//============================================================================== -unsigned long pcie40_readfee32( int dev , int ch , int adr ) { - // PCIe40 - if ( ( adr <0 ) || ( adr > 0xFFFF ) ) return -1 ; - // Reset the FIFO - unsigned ret = 0 ; - ret = pcie40_resetReadFifo( dev , ch ) ; - if ( ret != 0 ) return ret ; - - // Fill the FIFO with the requested information: write MSB first - std::vector< int > data ; - data.push_back( - 0xFFFB , - 0x7000 | ( ( adr & 0xFF00 ) >> 8 ) , - 0x7000 | ( adr & 0xFF ) , - 0xEEEE - ) - ret = pcie40_writeToFifo( dev , ch , data ) ; - if ( ret != 0 ) return ret ; - - // start emit - ret = pcie40_startEmit( dev , ch ) - if ( ret != 0 ) return -1 ; - - // Wait for the result to come back - ret = pcie40_waitRead( dev , ch , 4 ) ; - if ( ret != 0 ) return -1 ; - - // Read the value - std::result< int > result ; - ret = pcie40_readData( dev , ch , result , 56 ) ; - - int t_ret1 = result.at(0); - int t_ret2 = result.at(1); - int t_ret3 = result.at(2); - int t_ret4 = result.at(3); - int t_ret5 = result.at(4); - int t_ret6 = result.at(5); - - if ( ( t_ret1 & 0x0000FFFF ) != 0xFFFF ) { - printf( "Bad header\n" ) ; - return -1 ; - } - if ( ( t_ret6 & 0x0000FFFF ) != 0xEEEE ) { - printf( "Bad trailer\n" ) ; - return -1 ; - } - - int add1 = ( t_ret2 & 0xFF00 ) >> 8 ; - int add2 = ( t_ret3 & 0xFF00 ) >> 8 ; - int add3 = ( t_ret4 & 0xFF00 ) >> 8 ; - int add4 = ( t_ret5 & 0xFF00 ) >> 8 ; - - if ( ( add1 & 0xF8 ) != 0x10 ) { - printf( "Bad address1 %X\n" , add1 ) ; - return -1 ; - } - if ( ( add2 & 0xF8 ) != 0x10 ) { - printf( "Bad address2 %X\n" , add2 ) ; - return -1 ; - } - if ( ( add3 & 0xF8 ) != 0x10 ) { - printf( "Bad address3 %X\n" , add3 ) ; - return -1 ; - } - if ( ( add4 & 0xF8 ) != 0x10 ) { - printf( "Bad address4 %X\n" , add4 ) ; - return -1 ; - } - - add1 += 0x58 ; - add2 += 0x58 ; - add3 += 0x58 ; - add4 += 0x58 ; - - if ( ( add2 != 0x6C ) || ( add1 != 0x6D ) || ( add4 != 0x6A ) || ( add3 != 0x6B ) ) - { - printf( "Unexpected address %X %X %X %X\n" , add1 , add2 , add3 , add4 ) ; - return -1 ; - } - - int res1 = ( t_ret2 & 0xFF ) ; - int res2 = ( t_ret3 & 0xFF ) ; - int res3 = ( t_ret4 & 0xFF ) ; - int res4 = ( t_ret5 & 0xFF ) ; - - return 0xFFFFFFFF & ( ( res1 << 24 ) | ( res2 << 16 ) | ( res3 << 8 ) | ( res4 ) ) ; -} - -//============================================================================== -// Write 32b -//============================================================================== -int pcie40_writefee32( int dev , int ch , int adr , int val ) { - // PCIe40 - if ( ( adr <0 ) || ( adr > 0xFFFF ) ) return -1 ; - // Reset the FIFO - unsigned ret = 0 ; - ret = pcie40_resetReadFifo( dev , ch ) ; - if ( ret != 0 ) return ret ; - - int val1 = ( val & 0xFF ) ; - int val2 = ( val & 0xFF00 ) >> 8 ; - int val3 = ( val & 0xFF0000 ) >> 16 ; - int val4 = ( val & 0xFF000000 ) >> 24 ; - - // Fill the FIFO with the requested information: write MSB first - std::vector< int > data ; - data.push_back( - 0xFFFC , - 0x7000 | ( ( adr & 0xFF00 ) >> 8 ) , - 0x7000 | ( adr & 0xFF ) , - 0x7000 | val4 , - 0x7000 | val3 , - 0x7000 | val2 , - 0x7000 | val1 , - 0xEEEE - ) - ret = pcie40_writeToFifo( dev , ch , data ) ; - if ( ret != 0 ) return ret ; - - // start emit - ret = pcie40_startEmit( dev , ch ) - if ( ret != 0 ) return -1 ; - - return ret; -} - -int pcie40_writestream( int dev , int ch , char * filename ) { - // PCIe40 - // Check if the file exists - const char * mode = "r" ; - FILE * fp = fopen( filename , mode ) ; - if ( 0 == fp ) { - printf( "The file does not exist\n" ) ; - return -1 ; - } - // Reset the FIFO - unsigned ret = 0 ; - ret = pcie40_resetReadFifo( dev , ch ) ; - - if ( ret != 0 ) { - fclose( fp ) ; - return -1 ; - } - - // Fill the FIFO with the requested information: write MSB first - // This is a stream write -> FFFD - int data_word_1 = 0xFFFD ; - - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_ADD + ch * 0x20 , - (int) ( data_word_1 & 0xFFFFFFFF ) ) ; - if ( ret != 0 ) { - fclose( fp ) ; - return -1 ; - } - - // Read the file - int c = 0 ; - int count = 0 ; - std::vector< int > data ; - while ((c = getc(fp)) != EOF) { - if ( count == 0 ) - data.push_back( 0xFFFD ) ; - count++ ; - data.push_back( (int) ( ( ( 0x70 << 8 ) | ( c & 0xFF ) ) & - 0xFFFFFFFF ) ) ; - - if ( 14 == count ) { - data.push_back( 0xEEEE ) ; - ret = pcie40_writeToFifo( dev , ch , data ) ; - if ( ret != 0 ) { - fclose( fp ) ; - return -1 ; - } - ret = pcie40_startEmit( dev , ch ) ; - if ( ret != 0 ) { - fclose( fp ) ; - return -1 ; - } - count = 0 ; - data.clear() ; - } - } - fclose( fp ) ; - - // End of the file -> 0xEEEE - data.push_back( 0xEEEE ) ; - ret = pcie40_writeToFifo( dev , ch , data ) ; - if ( ret != 0 ) return -1 ; - - // start emit - ret = pcie40_startEmit( dev , ch ) ; - if ( ret != 0 ) return -1 ; - - return ret ; -} - -int pcie40_writebytestream( int dev, int ch, int len, const char *bytes ) -{ - - printf( "Desactivated for the moment \n") ; - return -1 ; - - // Reset the FIFO - unsigned ret = 0 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_RESET_ADD , - 1 << ( SLC_WFIFO_RESET_BIT ) ) ; - if ( ret != 0 ) return -1 ; - - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_RESET_ADD , 0 ) ; - if ( ret != 0 ) return -1 ; - - // Fill the FIFO with the requested information: write MSB first - // This is a stream write -> FFFD - int data_word_1 = 0xFFFD ; - - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_ADD + ch * 0x20 , - (int) ( data_word_1 & 0xFFFFFFFF ) ) ; - if ( ret != 0 ) return -1 ; - - // Read the file - int i ; - for ( i = 0 ; i < len ; ++i ) { - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_ADD + ch * 0x20 , - (int) ( ( ( 0x70 << 8 ) | ( bytes[i] & 0xFF ) ) & - 0xFFFFFFFF ) ) ; - if ( ret != 0 ) return -1 ; - } - - // End of the stream -> 0xEEEE - int data_word_3 = 0xEEEE ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_ADD + ch * 0x20 , - (int) ( data_word_3 & 0xFFFFFFFF ) ) ; - if ( ret != 0 ) return -1 ; - - // start emit - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_START_ADD , 0 ) ; - if ( ret != 0 ) return -1 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_START_ADD , - 1 << ( SLC_WFIFO_EMIT_BIT + ch ) ) ; - if ( ret != 0 ) return -1 ; - ret = ecs_write( dev , SLC_BAR , SLC_WFIFO_START_ADD , 0 ) ; - if ( ret != 0 ) return -1 ; - - return ret ; -} diff --git a/Pcie40Libraries/pcie40_b2slc.cpp b/Pcie40Libraries/pcie40_b2slc.cpp index f4549acc5a192e98feb81efe6655360151d98301..9bd12a711b571f8a08f35795aa40f469ee8065de 100644 --- a/Pcie40Libraries/pcie40_b2slc.cpp +++ b/Pcie40Libraries/pcie40_b2slc.cpp @@ -3,7 +3,13 @@ #include <unistd.h> #include <stdio.h> #include <vector> -#include "pcie40_ecs.h" + +// ===== +// CALL C functions +// ===== + +extern "C" int ecs_write(int dev, int bar, unsigned add, int val); +extern "C" unsigned ecs_read(int dev, int bar, unsigned add); /////////////////////////////////////////////////////////////////////////// // Internal functions for slow control,, do not use outside of this library