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