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