Newer
Older
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include "altera_dma_regs.h"
//#define USE_UL
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 ) ) {
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 ;
}
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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, utime );
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
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 ) ;
#ifdef USE_UL
size = decode_data_wUL( data , ¤tEventIndex , &crc ) ;
#else
#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++ ;
}
}
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 ;
}