OpenCores
URL https://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [soft/] [linux/] [application/] [board_exam/] [main.cpp] - Blame information for rev 55

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
 
2 6 v.karak
#ifndef __BOARD_H__
3
#include "board.h"
4 2 dsmv
#endif
5
 
6
#include <cassert>
7
#include <cstdlib>
8
#include <cstring>
9
#include <iostream>
10
#include <iomanip>
11
#include <climits>
12
#include <cstdio>
13 6 v.karak
#include <dlfcn.h>
14 2 dsmv
 
15
//-----------------------------------------------------------------------------
16
 
17
using namespace std;
18
 
19
//-----------------------------------------------------------------------------
20 6 v.karak
#define NUM_BLOCK   8
21
#define BLOCK_SIZE  0x10000
22 2 dsmv
//-----------------------------------------------------------------------------
23
 
24
int main(int argc, char *argv[])
25
{
26 6 v.karak
    if(argc != 3) {
27
        std::cerr << "usage: " << argv[0] << " <libname.so> </dev/devname>" << endl;
28 2 dsmv
        return -1;
29
    }
30
 
31 6 v.karak
    char *libname = argv[1];
32
    char *devname = argv[2];
33 2 dsmv
    int dmaChan = 0;
34 6 v.karak
    void* pBuffers[NUM_BLOCK] = {NULL,NULL,NULL,NULL};
35
    void *hlib = NULL;
36
    board_factory factory = NULL;
37
    board *brd = NULL;
38
    u32 *buffer = NULL;
39 2 dsmv
 
40 6 v.karak
    std ::cout << "Loading library: " << libname << endl;
41
 
42
    hlib = dlopen(libname, RTLD_LAZY);
43
    if(!hlib) {
44
        fprintf(stderr, "%s\n", dlerror());
45
        return -1;
46
    }
47
 
48
    factory = (board_factory)dlsym(hlib, "create_board");
49
    if(!factory) {
50
        fprintf(stderr, "%s\n", dlerror());
51
        dlclose(hlib);
52
        return -1;
53
    }
54
 
55
    std ::cout << "Start testing device " << devname << endl;
56
 
57
    brd = factory();
58
    if(!brd) {
59
        dlclose(hlib);
60
        return -1;
61
    }
62
 
63
    if(brd->brd_open(devname) < 0) {
64
 
65
        delete brd;
66
 
67
        if(hlib) {
68
            int res = dlclose(hlib);
69
            if(res < 0) {
70
                fprintf(stderr, "%s\n", dlerror());
71
                return -1;
72
            }
73
        }
74
 
75
        return -1;
76
    }
77
 
78 2 dsmv
    brd->brd_init();
79
    brd->brd_pld_info();
80
 
81
    std ::cout << "Press enter to allocate DMA memory..." << endl;
82
    getchar();
83
 
84
    // Check BRDSHELL DMA interface
85
    BRDctrl_StreamCBufAlloc sSCA = {
86 6 v.karak
        1,      //dir
87 2 dsmv
        1,
88
        NUM_BLOCK,
89
        BLOCK_SIZE,
90 6 v.karak
        pBuffers,
91 2 dsmv
        NULL,
92
    };
93
 
94 54 v.karak
    brd->dma_allocate_memory(dmaChan, &sSCA);
95 2 dsmv
 
96 55 v.karak
    brd->dma_set_local_addr(dmaChan, 0x1000);
97
    brd->dma_stop(dmaChan);
98
    brd->dma_reset_fifo(dmaChan);
99 6 v.karak
 
100 55 v.karak
    brd->brd_reg_poke_dir(0, 0x1, 0x1);
101
    brd->brd_reg_poke_dir(0, 0x1, 0x1);
102
    brd->brd_reg_poke_ind(0, 0xC, 0x1);
103
    brd->brd_reg_poke_ind(0, 0x0, 0x2);
104
    brd->brd_reg_poke_ind(0, 0x0, 0x0);
105
 
106 2 dsmv
    std ::cout << "Press enter to start DMA channel..." << endl;
107
    getchar();
108
 
109 6 v.karak
    // fill data buffers
110
    for(int j=0; j<NUM_BLOCK; j++) {
111
        buffer = (u32*)pBuffers[j];
112
        for(unsigned i=0; i<32; i++) {
113
            buffer[i] = 0xAA556677;
114
        }
115
    }
116
 
117 2 dsmv
    brd->dma_start(dmaChan, 0);
118
 
119
    std ::cout << "Press enter to stop DMA channel..." << endl;
120
    getchar();
121
 
122 6 v.karak
 
123 2 dsmv
    brd->dma_stop(dmaChan);
124
 
125 6 v.karak
    // show data buffers
126
    for(int j=0; j<NUM_BLOCK; j++) {
127 2 dsmv
 
128 55 v.karak
        fprintf(stdout, "DMA BLOCK %d\n", j);
129 6 v.karak
        buffer = (u32*)pBuffers[j];
130 54 v.karak
        for(unsigned i=0; i<8; i++) {
131 55 v.karak
            fprintf(stdout, "0x%08X ", buffer[i]);
132 6 v.karak
        }
133 55 v.karak
        fprintf(stdout, "\n\n");
134 2 dsmv
    }
135
    std::cout << dec << endl;
136
 
137
    std ::cout << "Press enter to free DMA memory..." << endl;
138
    getchar();
139
 
140
    brd->dma_free_memory(dmaChan);
141
 
142
    brd->brd_close();
143
 
144
    delete brd;
145
 
146 6 v.karak
    if(hlib) {
147
        int res = dlclose(hlib);
148
        if(res < 0) {
149
            fprintf(stderr, "%s\n", dlerror());
150
            return -1;
151
        }
152
    }
153
 
154 2 dsmv
    return 0;
155
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.