|
|
#ifndef __BOARD_H__
|
#ifndef __BOARD_H__
|
#include "board.h"
|
#include "board.h"
|
#endif
|
#endif
|
|
|
#include <cassert>
|
#include <cassert>
|
#include <cstdlib>
|
#include <cstdlib>
|
#include <cstring>
|
#include <cstring>
|
#include <iostream>
|
#include <iostream>
|
#include <iomanip>
|
#include <iomanip>
|
#include <climits>
|
#include <climits>
|
#include <cstdio>
|
#include <cstdio>
|
#include <dlfcn.h>
|
#include <dlfcn.h>
|
|
|
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
|
|
using namespace std;
|
using namespace std;
|
|
|
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
#define NUM_BLOCK 8
|
#define NUM_BLOCK 8
|
#define BLOCK_SIZE 0x10000
|
#define BLOCK_SIZE 0x10000
|
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
|
|
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
{
|
{
|
if(argc != 3) {
|
if(argc != 3) {
|
std::cerr << "usage: " << argv[0] << " <libname.so> </dev/devname>" << endl;
|
std::cerr << "usage: " << argv[0] << " <libname.so> </dev/devname>" << endl;
|
return -1;
|
return -1;
|
}
|
}
|
|
|
char *libname = argv[1];
|
char *libname = argv[1];
|
char *devname = argv[2];
|
char *devname = argv[2];
|
int dmaChan = 0;
|
int dmaChan = 0;
|
void* pBuffers[NUM_BLOCK] = {NULL,NULL,NULL,NULL};
|
void* pBuffers[NUM_BLOCK] = {NULL,NULL,NULL,NULL};
|
void *hlib = NULL;
|
void *hlib = NULL;
|
board_factory factory = NULL;
|
board_factory factory = NULL;
|
board *brd = NULL;
|
board *brd = NULL;
|
u32 *buffer = NULL;
|
u32 *buffer = NULL;
|
|
|
std ::cout << "Loading library: " << libname << endl;
|
std ::cout << "Loading library: " << libname << endl;
|
|
|
hlib = dlopen(libname, RTLD_LAZY);
|
hlib = dlopen(libname, RTLD_LAZY);
|
if(!hlib) {
|
if(!hlib) {
|
fprintf(stderr, "%s\n", dlerror());
|
fprintf(stderr, "%s\n", dlerror());
|
return -1;
|
return -1;
|
}
|
}
|
|
|
factory = (board_factory)dlsym(hlib, "create_board");
|
factory = (board_factory)dlsym(hlib, "create_board");
|
if(!factory) {
|
if(!factory) {
|
fprintf(stderr, "%s\n", dlerror());
|
fprintf(stderr, "%s\n", dlerror());
|
dlclose(hlib);
|
dlclose(hlib);
|
return -1;
|
return -1;
|
}
|
}
|
|
|
std ::cout << "Start testing device " << devname << endl;
|
std ::cout << "Start testing device " << devname << endl;
|
|
|
brd = factory();
|
brd = factory();
|
if(!brd) {
|
if(!brd) {
|
dlclose(hlib);
|
dlclose(hlib);
|
return -1;
|
return -1;
|
}
|
}
|
|
|
if(brd->brd_open(devname) < 0) {
|
if(brd->brd_open(devname) < 0) {
|
|
|
delete brd;
|
delete brd;
|
|
|
if(hlib) {
|
if(hlib) {
|
int res = dlclose(hlib);
|
int res = dlclose(hlib);
|
if(res < 0) {
|
if(res < 0) {
|
fprintf(stderr, "%s\n", dlerror());
|
fprintf(stderr, "%s\n", dlerror());
|
return -1;
|
return -1;
|
}
|
}
|
}
|
}
|
|
|
return -1;
|
return -1;
|
}
|
}
|
|
|
brd->brd_init();
|
brd->brd_init();
|
brd->brd_pld_info();
|
brd->brd_pld_info();
|
|
|
std ::cout << "Press enter to allocate DMA memory..." << endl;
|
std ::cout << "Press enter to allocate DMA memory..." << endl;
|
getchar();
|
getchar();
|
|
|
int DmaChan = 1;
|
|
|
|
// Check BRDSHELL DMA interface
|
// Check BRDSHELL DMA interface
|
BRDctrl_StreamCBufAlloc sSCA = {
|
BRDctrl_StreamCBufAlloc sSCA = {
|
1, //dir
|
1, //dir
|
1,
|
1,
|
NUM_BLOCK,
|
NUM_BLOCK,
|
BLOCK_SIZE,
|
BLOCK_SIZE,
|
pBuffers,
|
pBuffers,
|
NULL,
|
NULL,
|
};
|
};
|
|
|
brd->dma_allocate_memory(dmaChan, &sSCA);
|
brd->dma_allocate_memory(dmaChan, &sSCA);
|
|
|
brd->dma_set_local_addr(DmaChan, 0x1000);
|
brd->dma_set_local_addr(dmaChan, 0x1000);
|
brd->dma_stop(DmaChan);
|
brd->dma_stop(dmaChan);
|
brd->dma_reset_fifo(DmaChan);
|
brd->dma_reset_fifo(dmaChan);
|
|
|
|
brd->brd_reg_poke_dir(0, 0x1, 0x1);
|
|
brd->brd_reg_poke_dir(0, 0x1, 0x1);
|
|
brd->brd_reg_poke_ind(0, 0xC, 0x1);
|
|
brd->brd_reg_poke_ind(0, 0x0, 0x2);
|
|
brd->brd_reg_poke_ind(0, 0x0, 0x0);
|
|
|
std ::cout << "Press enter to start DMA channel..." << endl;
|
std ::cout << "Press enter to start DMA channel..." << endl;
|
getchar();
|
getchar();
|
|
|
// fill data buffers
|
// fill data buffers
|
for(int j=0; j<NUM_BLOCK; j++) {
|
for(int j=0; j<NUM_BLOCK; j++) {
|
buffer = (u32*)pBuffers[j];
|
buffer = (u32*)pBuffers[j];
|
for(unsigned i=0; i<32; i++) {
|
for(unsigned i=0; i<32; i++) {
|
buffer[i] = 0xAA556677;
|
buffer[i] = 0xAA556677;
|
}
|
}
|
}
|
}
|
|
|
brd->dma_start(dmaChan, 0);
|
brd->dma_start(dmaChan, 0);
|
|
|
std ::cout << "Press enter to stop DMA channel..." << endl;
|
std ::cout << "Press enter to stop DMA channel..." << endl;
|
getchar();
|
getchar();
|
|
|
|
|
brd->dma_stop(dmaChan);
|
brd->dma_stop(dmaChan);
|
|
|
// show data buffers
|
// show data buffers
|
for(int j=0; j<NUM_BLOCK; j++) {
|
for(int j=0; j<NUM_BLOCK; j++) {
|
|
|
std ::cout << "DMA data buffer " << j << ":" << endl;
|
fprintf(stdout, "DMA BLOCK %d\n", j);
|
buffer = (u32*)pBuffers[j];
|
buffer = (u32*)pBuffers[j];
|
for(unsigned i=0; i<8; i++) {
|
for(unsigned i=0; i<8; i++) {
|
std::cout << hex << buffer[i] << " ";
|
fprintf(stdout, "0x%08X ", buffer[i]);
|
}
|
}
|
std ::cout << endl;
|
fprintf(stdout, "\n\n");
|
}
|
}
|
std::cout << dec << endl;
|
std::cout << dec << endl;
|
|
|
std ::cout << "Press enter to free DMA memory..." << endl;
|
std ::cout << "Press enter to free DMA memory..." << endl;
|
getchar();
|
getchar();
|
|
|
brd->dma_free_memory(dmaChan);
|
brd->dma_free_memory(dmaChan);
|
|
|
brd->brd_close();
|
brd->brd_close();
|
|
|
delete brd;
|
delete brd;
|
|
|
if(hlib) {
|
if(hlib) {
|
int res = dlclose(hlib);
|
int res = dlclose(hlib);
|
if(res < 0) {
|
if(res < 0) {
|
fprintf(stderr, "%s\n", dlerror());
|
fprintf(stderr, "%s\n", dlerror());
|
return -1;
|
return -1;
|
}
|
}
|
}
|
}
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|