Skip to content
Snippets Groups Projects
main_pcie40_dma.cpp 2.75 KiB
Newer Older
Patrick Robbe's avatar
Patrick Robbe committed
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "pcie40_b2dma.h"
qzhou's avatar
qzhou committed
#include "pcie40_ecs.h"
#include <iostream>

void printData( unsigned int * data ) {
  printf(   "Header  : %8X%8X%8X%8X%8X%8X%8X%8X\n" , data[7], data[6] ,data[5] ,data[4],
	    data[3], data[2], data[1], data[0] ) ;
  
  int eventSize = ( ( data[ 0 ] & 0xFF ) ) - 1 ; // minus header

  for ( int i = 1 ; i < eventSize ; ++i ) {
    printf( "data %3d: %8X%8X%8X%8X%8X%8X%8X%8X\n" , i-1 , data[ 8*i+7 ] , data[ 8*i+6 ] , data[ 8*i+5 ] ,
	    data[ 8*i+4 ], data[ 8*i+3 ], data[ 8*i+2 ], data[ 8*i+1 ], data[ 8*i ] ) ;
  }
  printf(   "Trailer : %8X%8X%8X%8X%8X%8X%8X%8X\n" , data[8*eventSize+7], data[8*eventSize+6] ,data[8*eventSize+5] ,data[8*eventSize+4],
	    data[8*eventSize+3], data[8*eventSize+2], data[8*eventSize+1], data[8*eventSize] ) ;
}
Patrick Robbe's avatar
Patrick Robbe committed

int main (int argc ,char** argv) {
  printf( "Program to printout the first event read by DMA\n" ) ;

Patrick Robbe's avatar
Patrick Robbe committed
  int res = ecs_open( 0 , 0 ) ;
  if ( -1 == res ) printf("ERROR: Could not open device (BAR 0)\n") ;
  else printf("SUCCESS: Device opened for ECS 0\n");

Patrick Robbe's avatar
Patrick Robbe committed
  res = ecs_open( 0 , 2 ) ; 
  if ( -1 == res ) printf("ERROR: Could not open device (BAR 2)\n") ;
  else printf("SUCCESS: Device opened for ECS 2\n");

  // DMA part
  res = dma_open( 0 ) ;
  if ( -1 == res ) printf("ERROR: Could not open device (DMA)\n") ;
  else printf("SUCCESS: Device opened for DMA\n");

  //
  unsigned int initial_value = pcie40_getNbWordInEvent( 0 ) ;
  if ( initial_value == 0 ) pcie40_setNbWordInEvent( 0 , 0xFF ) ;
  
  pcie40_dmaReset( 0 ) ; 
  pcie40_dmaStop( 0 ) ;

  //pcie40_enableGenerator( 0 ) ; 
  //pcie40_useDataFromGenerator( 0 ) ; 
  pcie40_disableGenerator( 0 ) ;
  pcie40_useDataFromFibers( 0 ) ;
  
  // pcie40_setGeneratorTriggerFrequency( 0 , 30 ) ;
  //pcie40_setNbEvents( 0 , 1 ) ;

  // start DAQ
  pcie40_resetSPages( 0 ) ; 
  pcie40_dmaSetReadout( 0 ) ;
  pcie40_setSizeFromHeader( 0 ) ; 
  //pcie40_setNbWordInEvent( 0 , 5 ) ;
  pcie40_setBusyLevel( 0 , 0x502 ) ;
  dma_initialize( 0 ) ;

  std::cin.ignore() ; 



  // start DMA and wait for data
  int rv = 0 ;
  while ( rv == 0 ) {
    rv = pcie40_dmaStart( 0 ) ;
Patrick Robbe's avatar
Patrick Robbe committed
  }
  printf( "Number of super page received: %d\n" , rv ) ;
  unsigned int * data = pcie40_getSuperPagePointer( 0 , 0 , 0 ) ; 
  printData( data ) ; 
  data = pcie40_getSuperPagePointer( 0 , 0 , 1 ) ; 
  printData( data ) ; 
  //data = pcie40_getSuperPagePointer( 0 , 1 , 0 ) ; 
  //printData( data ) ; 
  //data = pcie40_getSuperPagePointer( 0 , 1 , 1 ) ; 
  //printData( data ) ; 
Patrick Robbe's avatar
Patrick Robbe committed
  // 
  //   rv = pcie40_dmaStart( 0 ) ;
  // printf( "Number of super page received: %d\n" , rv ) ;
  // data = pcie40_getSuperPagePointer( 0 , 1 , 1 ) ; 
  // printData( data ) ; 

  //
Patrick Robbe's avatar
Patrick Robbe committed
  ecs_close( 0 , 0 ) ;
  ecs_close( 0 , 2 ) ;
  dma_close( 0 ) ;
Patrick Robbe's avatar
Patrick Robbe committed
  return 0 ;
}