DMA (memory to memory)

S

soonph87

Guest
Hello, I am having a problem using DMA. When I run my code in Altera DE
Board, the program stucks at "while (!txrx_done)". It seems like it ha
infinite loop. I dont know what happen. Please assist. Thank you i
advance!

my code:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

#include <system.h>
#include <io.h>

#include <alt_types.h>
#include "sys/alt_dma.h"
#include "sys/alt_cache.h"
#include "sys/alt_alarm.h"
#include "alt_types.h"

static volatile int txrx_done = 0;

//callback function when DMA transfer done
static void txrxDone(void * handle, void * data)
{
txrx_done = 1;
}
void initMEM(int base_addr,int len)
{
for (int i=0;i<len;i++)
{
IOWR_8DIRECT(base_addr,i,i);
}
}
int main()
{
printf("testing ssram & sdram : dma operation\n");

alt_16 buffer[10];
//memset((void *)SSRAM_0_BASE,0x7a,0x10);//this write base on byte
initMEM(SDRAM_1_BASE,0x10);
memset((void *)(SDRAM_1_BASE+0x10),0x33,0x10);

printf("content of sdram_1:before DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE,i));
}

printf("content of sdram_1(offset 0x10):before DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE+0x10,i));
}

int rc; //request
alt_dma_txchan txchan;
alt_dma_rxchan rxchan;

void* tx_data = (void*)SDRAM_1_BASE; /* pointer to data to send */
void* rx_buffer = (void*)(SDRAM_1_BASE+0x10); /* pointer to rx buffer */

/* Create the transmit channel */
if ((txchan = alt_dma_txchan_open("/dev/dma_0")) == NULL)
{
printf ("Failed to open transmit channel\n");
exit (1);
}

/* Create the receive channel */
if ((rxchan = alt_dma_rxchan_open("/dev/dma_0")) == NULL)
{
printf ("Failed to open receive channel\n");
exit (1);
}

/* Post the transmit request */
if ((rc = alt_dma_txchan_send (txchan,
tx_data,
0x10,
NULL,
NULL)) < 0)
{
printf ("Failed to post transmit request, reason = %i\n", rc);
//exit (1);
}

/* Post the receive request */
if ((rc = alt_dma_rxchan_prepare (rxchan,
rx_buffer,
0x10,
txrxDone,
NULL)) < 0)
{
printf ("Failed to post read request, reason = %i\n", rc);
//exit (1);
}

/* wait for transfer to complete */
while (!txrx_done);
printf ("Transfer successful!\n");

printf("content of sdram_1:after DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE,i));
}

printf("content of sdram_1(offset 0x10):after DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE+0x10,i));
}


return 0;
}



---------------------------------------
Posted through http://www.FPGARelated.com
 
On Mar 17, 12:41 pm, "soonph87" <soonph87@n_o_s_p_a_m.hotmail.com>
wrote:
Hello, I am having a problem using DMA. When I run my code in Altera DE2
Board, the program stucks at "while (!txrx_done)". It seems like it has
infinite loop. I dont know what happen. Please assist. Thank you in
advance!

my code:

#include <stdio.h
#include <stdlib.h
#include <stddef.h
#include <string.h

#include <system.h
#include <io.h

#include <alt_types.h
#include "sys/alt_dma.h"
#include "sys/alt_cache.h"
#include "sys/alt_alarm.h"
#include "alt_types.h"

static volatile int txrx_done = 0;

//callback function when DMA transfer done
static void txrxDone(void * handle, void * data)
{
txrx_done = 1;}

void initMEM(int base_addr,int len)
{
for (int i=0;i<len;i++)
{
IOWR_8DIRECT(base_addr,i,i);}
}

int main()
{
printf("testing ssram & sdram : dma operation\n");

alt_16 buffer[10];
//memset((void *)SSRAM_0_BASE,0x7a,0x10);//this write base on byte
initMEM(SDRAM_1_BASE,0x10);
memset((void *)(SDRAM_1_BASE+0x10),0x33,0x10);

printf("content of sdram_1:before DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE,i));

}

printf("content of sdram_1(offset 0x10):before DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE+0x10,i));

}

int rc; //request
alt_dma_txchan txchan;
alt_dma_rxchan rxchan;

void* tx_data = (void*)SDRAM_1_BASE; /* pointer to data to send */
void* rx_buffer = (void*)(SDRAM_1_BASE+0x10); /* pointer to rx buffer */

/* Create the transmit channel */
if ((txchan = alt_dma_txchan_open("/dev/dma_0")) == NULL)
{
printf ("Failed to open transmit channel\n");
exit (1);

}

/* Create the receive channel */
if ((rxchan = alt_dma_rxchan_open("/dev/dma_0")) == NULL)
{
printf ("Failed to open receive channel\n");
exit (1);

}

/* Post the transmit request */
if ((rc = alt_dma_txchan_send (txchan,
tx_data,
0x10,
NULL,
NULL)) < 0)
{
printf ("Failed to post transmit request, reason = %i\n", rc);
//exit (1);

}

/* Post the receive request */
if ((rc = alt_dma_rxchan_prepare (rxchan,
rx_buffer,
0x10,
txrxDone,
NULL)) < 0)
{
printf ("Failed to post read request, reason = %i\n", rc);
//exit (1);

}

/* wait for transfer to complete */
while (!txrx_done);
printf ("Transfer successful!\n");

printf("content of sdram_1:after DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE,i));

}

printf("content of sdram_1(offset 0x10):after DMA operation\n");
for (int i=0;i<0x10;i++)
{
printf("%d: %x\n",i,IORD_8DIRECT(SDRAM_1_BASE+0x10,i));

}

return 0;

}

---------------------------------------        
Posted throughhttp://www.FPGARelated.com
To quote every embedded programmer in the world: "That bug is a
hardware problem."

OK, paraphrase, not quote. Mea culpa.

RK
 

Welcome to EDABoard.com

Sponsor

Back
Top