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

Generated by: LCOV version 2.0-1