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 : }
|