LCOV - code coverage report
Current view: top level - uhallibs/test/apps - toy-tohost-dma-test.cxx (source / functions) Coverage Total Hit
Test: code.result Lines: 0.0 % 94 0
Test Date: 2026-10-11 15:05:20 Functions: 0.0 % 3 0

            Line data    Source code
       1              : /*******************************************************************/
       2              : /*                                                                 */
       3              : /* This is the C++ source code of the flx-dma-test application     */
       4              : /*                                                                 */
       5              : /* Author: Markus Joos, CERN                                       */
       6              : /*                                                                 */
       7              : /**C 2015 Ecosoft - Made from at least 80% recycled source code*****/
       8              : 
       9              : #include <iostream>
      10              : #include <stdio.h>
      11              : #include <stdlib.h>
      12              : #include <unistd.h>
      13              : 
      14              : #include "cmem_rcc/cmem_rcc.h"
      15              : #include "flxcard/FlxCard.h"
      16              : #include "flxcard/FlxException.h"
      17              : 
      18              : #define APPLICATION_NAME "flx-dma-test"
      19              : #define BUFSIZE (1024)
      20              : #define DMA_ID (0)
      21              : 
      22              : #ifndef BF_GBT_EMU_ENA_TOHOST
      23              : #define BF_GBT_EMU_ENA_TOHOST BF_FE_EMU_ENA_EMU_TOHOST
      24              : #endif
      25              : #ifndef BF_GBT_EMU_ENA_TOFRONTEND
      26              : #define BF_GBT_EMU_ENA_TOFRONTEND BF_FE_EMU_ENA_EMU_TOFRONTEND
      27              : #endif
      28              : 
      29              : // Globals
      30              : FlxCard flxCard;
      31              : 
      32              : /*****************/
      33              : void
      34            0 : display_help()
      35              : /*****************/
      36              : {
      37            0 :   printf("Usage: %s [OPTIONS]\n", APPLICATION_NAME);
      38            0 :   printf("Initializes DMA transfers and the DMA memory on the screen in 1s intervals.\n\n");
      39            0 :   printf("Options:\n");
      40            0 :   printf("  -d NUMBER      Use card indicated by NUMBER. Default: 0.\n");
      41            0 :   printf("  -h             Display help.\n");
      42            0 : }
      43              : 
      44              : /********************************/
      45              : void
      46            0 : dump_buffer(u_long virt_addr)
      47              : /********************************/
      48              : {
      49            0 :   u_char* buf = (u_char*)virt_addr;
      50            0 :   int i;
      51              : 
      52            0 :   for (i = 0; i < BUFSIZE; i++) {
      53            0 :     if (i % 32 == 0)
      54            0 :       printf("\n0x  ");
      55            0 :     printf("%02x ", *buf++);
      56              :   }
      57            0 :   printf("\n");
      58            0 : }
      59              : 
      60              : /*****************************/
      61              : int
      62            0 : main(int argc, char** argv)
      63              : /*****************************/
      64              : {
      65            0 :   int i, loop, ret, device_number = 0, opt, handle;
      66            0 :   u_long baraddr0, vaddr, paddr, board_id, bsize, opt_emu_ena_to_host, opt_emu_ena_to_frontend;
      67            0 :   flxcard_bar0_regs_t* bar0;
      68              : 
      69            0 :   while ((opt = getopt(argc, argv, "hd:D:V")) != -1) {
      70            0 :     switch (opt) {
      71            0 :       case 'd':
      72            0 :         device_number = atoi(optarg);
      73            0 :         break;
      74              : 
      75            0 :       case 'h':
      76            0 :         display_help();
      77            0 :         exit(0);
      78            0 :         break;
      79              : 
      80            0 :       default:
      81            0 :         fprintf(
      82              :           stderr, "Usage: %s COMMAND [OPTIONS]\nTry %s -h for more information.\n", APPLICATION_NAME, APPLICATION_NAME);
      83            0 :         exit(-1);
      84              :     }
      85              :   }
      86              : 
      87            0 :   try {
      88            0 :     flxCard.card_open(device_number, 0);
      89              : 
      90              :     // save current state
      91            0 :     opt_emu_ena_to_host = flxCard.cfg_get_option(BF_GBT_EMU_ENA_TOHOST);
      92            0 :     opt_emu_ena_to_frontend = flxCard.cfg_get_option(BF_GBT_EMU_ENA_TOFRONTEND);
      93              : 
      94            0 :     for (loop = 0; loop < 8; loop++)
      95            0 :       flxCard.dma_stop(loop);
      96              : 
      97            0 :     flxCard.dma_reset();
      98            0 :     flxCard.soft_reset();
      99              :     // flxCard.dma_fifo_flush(); MJ: Method disabled (requsted by Frans)
     100            0 :     flxCard.cfg_set_option(BF_GBT_EMU_ENA_TOFRONTEND, 0);
     101            0 :     flxCard.cfg_set_option(BF_GBT_EMU_ENA_TOHOST, 1);
     102              : 
     103            0 :     board_id = flxCard.cfg_get_option(REG_GIT_TAG);
     104              : 
     105              :     u_long loop;
     106              :     char git_tag[8];
     107            0 :     for (loop = 0; loop < 8; loop++)
     108            0 :       git_tag[loop] = (board_id >> (8 * loop)) & 0xff;
     109            0 :     printf("Board ID (GIT): %s\n", git_tag);
     110              : 
     111            0 :     ret = CMEM_Open();
     112            0 :     bsize = BUFSIZE;
     113            0 :     if (!ret)
     114            0 :       ret = CMEM_SegmentAllocate(bsize, (char*)"FlxThroughput", &handle);
     115              : 
     116            0 :     if (!ret)
     117            0 :       ret = CMEM_SegmentPhysicalAddress(handle, &paddr);
     118              : 
     119            0 :     if (!ret)
     120            0 :       ret = CMEM_SegmentVirtualAddress(handle, &vaddr);
     121              : 
     122            0 :     if (ret) {
     123            0 :       rcc_error_print(stdout, ret);
     124            0 :       exit(-1);
     125              :     }
     126              : 
     127            0 :     printf("Allocated Memory Segment\n  Phys. Addr: 0x%016lx\n  Virt. Addr: 0x%016lx\n", paddr, vaddr);
     128              : 
     129            0 :     printf("\nBuffer before DMA write:\n");
     130            0 :     dump_buffer(vaddr);
     131              : 
     132            0 :     flxCard.dma_to_host(DMA_ID, paddr, BUFSIZE, FLX_DMA_WRAPAROUND);
     133              :     // flxCard.dma_wait(DMA_ID);
     134              : 
     135            0 :     baraddr0 = flxCard.openBackDoor(0);
     136            0 :     bar0 = (flxcard_bar0_regs_t*)baraddr0;
     137              : 
     138            0 :     printf("Start Ptr:   0x%016lx\n", bar0->DMA_DESC[0].start_address);
     139            0 :     printf("End Ptr:     0x%016lx\n", bar0->DMA_DESC[0].end_address);
     140            0 :     printf("Enable:      0x%0x\n", bar0->DMA_DESC_ENABLE);
     141            0 :     printf("Read Ptr:    0x%016lx\n", bar0->DMA_DESC[0].read_ptr);
     142            0 :     printf("Write Ptr:   0x%016lx\n", bar0->DMA_DESC_STATUS[0].current_address);
     143            0 :     printf("Descriptor done DMA0: 0x%lx\n", bar0->DMA_DESC_STATUS[0].descriptor_done);
     144            0 :     printf("Even Addr. DMA  DMA0: 0x%lx\n", bar0->DMA_DESC_STATUS[0].even_addr_dma);
     145            0 :     printf("Even Addr. PC   DMA0: 0x%lx\n", bar0->DMA_DESC_STATUS[0].even_addr_pc);
     146            0 :     printf("Descriptor done DMA1: 0x%lx\n", bar0->DMA_DESC_STATUS[1].descriptor_done);
     147            0 :     printf("Even Addr. DMA  DMA1: 0x%lx\n", bar0->DMA_DESC_STATUS[1].even_addr_dma);
     148            0 :     printf("Even Addr. PC   DMA1: 0x%lx\n", bar0->DMA_DESC_STATUS[1].even_addr_pc);
     149              : 
     150            0 :     printf("Start Addr: %016lx\nEnd Addr:  %016lx\nRead Ptr: %016lx\n",
     151            0 :            bar0->DMA_DESC[0].start_address,
     152            0 :            bar0->DMA_DESC[0].end_address,
     153            0 :            bar0->DMA_DESC[0].read_ptr);
     154              : 
     155            0 :     printf("\nBuffer after DMA write:\n");
     156            0 :     dump_buffer(vaddr);
     157              : 
     158            0 :     for (i = 0;; i++) {
     159            0 :       printf("\n--------------------\n  %d:\n", i);
     160            0 :       flxCard.dma_advance_ptr(DMA_ID, paddr, BUFSIZE, 512);
     161              :       // flxCard.dma_wait(DMA_ID);
     162              : 
     163            0 :       printf("Read Ptr:    0x%016lx\n", bar0->DMA_DESC[0].read_ptr);
     164            0 :       printf("Write Ptr:   0x%016lx\n", bar0->DMA_DESC_STATUS[0].current_address);
     165            0 :       printf("Descriptor done DMA0: 0x%lx\n", bar0->DMA_DESC_STATUS[0].descriptor_done);
     166            0 :       printf("Even Addr. DMA  DMA0: 0x%lx\n", bar0->DMA_DESC_STATUS[0].even_addr_dma);
     167            0 :       printf("Even Addr. PC   DMA0: 0x%lx\n", bar0->DMA_DESC_STATUS[0].even_addr_pc);
     168              : 
     169            0 :       dump_buffer(vaddr);
     170            0 :       sleep(1);
     171              :     }
     172              : 
     173              :     // reset to initial state
     174              :     flxCard.cfg_set_option(BF_GBT_EMU_ENA_TOHOST, opt_emu_ena_to_host);
     175              :     flxCard.cfg_set_option(BF_GBT_EMU_ENA_TOFRONTEND, opt_emu_ena_to_frontend);
     176              : 
     177              :     ret = CMEM_SegmentFree(handle);
     178              :     if (!ret)
     179              :       ret = CMEM_Close();
     180              :     if (ret)
     181              :       rcc_error_print(stdout, ret);
     182              : 
     183              :     flxCard.card_close();
     184            0 :   } catch (FlxException& ex) {
     185            0 :     std::cout << "ERROR. Exception thrown: " << ex.what() << std::endl;
     186            0 :     exit(-1);
     187            0 :   }
     188              : 
     189              :   exit(0);
     190              : }
        

Generated by: LCOV version 2.0-1