Skip to content
Snippets Groups Projects
Commit 7398c1fd authored by Patrick Robbe's avatar Patrick Robbe
Browse files

Add test software for user logic

parent 47324d15
No related branches found
No related tags found
No related merge requests found
......@@ -30,6 +30,7 @@ Pcie40Applications/pcie40_b2slc
Pcie40Applications/pcie40_dma
Pcie40Applications/pcie40_b2linkreset
Pcie40Applications/pcie40_daq
Pcie40Applications/pcie40_ul
*.d
**/pcie40_reload.out
......@@ -45,6 +45,12 @@ PCIE40_DAQ_CFLAGS =$(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_INSTALL =$(PREFIX)/bin
PCIE40_UL_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs
VPATH :=$(TOP)
include $(TOP)/rules.mk
......@@ -55,6 +61,7 @@ $(eval $(call ODIR_template,PCIE40_SLC))
$(eval $(call ODIR_template,PCIE40_B2LRESET))
$(eval $(call ODIR_template,PCIE40_DMA))
$(eval $(call ODIR_template,PCIE40_DAQ))
$(eval $(call ODIR_template,PCIE40_UL))
$(eval $(call COPY_template,SCRIPTS,755))
$(eval $(call LINK_template,PCIE40_RELOAD))
$(eval $(call ODIR_template,PCIE40_RELOAD_SUID))
......
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include "altera_dma_regs.h"
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, 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 * run ) {
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 0;
}
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 ] >> 8 ;
printf("exprun %.8x eve %d\n", exp_run, evenum );
if ( exp_run != *run ) { // it may be that the old data is still in memory
printf( "RUN = %d\n", *run ) ;
return 0 ;
}
offset = 8; // size of ROB header [words]
while( offset + 4 != size ){ // 4 = ROB trailer size
*crc = 0xffff ;
ix = *ce + offset;
size_link = data[ ix ] & 0x00ffffff ;
// 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 ] );
}
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 ] );
return -1;
}else{
}
offset += size_link;
if( offset + 4 > size ){
printf( "Invalid data size sum of link size %d size = %d\n" ,
offset + 4, size );
return -1 ;
}
}
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
int run = 0 ;
FILE* fp;
char * ptr ;
char * tmp ;
fp = popen( "ssh vme \"trigft -80 pulse 1 10\"" , "r" ) ;
char buf[1000] ;
char exp[] = "exp" ;
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 ) ;
// 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 < 100 ; ++i ) {
if ( nEvt % 10000 == 1 ) printf( "Event number %d\n", nEvt ) ;
res = pcie40_b2dmapointerread( 0 , &data ) ;
size = decode_data_wUL( data , &currentEventIndex , &crc , &run ) ;
if ( 0 == size ) continue ;
if ( size == -1 ) {
nErr++ ;
continue ;
}
if( size % 8 != 0 ){
size_256 = ( size/8 + 1 )*8;
}
currentEventIndex = ( currentEventIndex + size_256 ) % DMASIZE ;
nEvt++ ;
}
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 ;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment