Programmable Devices
CPLDs, FPGAs, SoC FPGAs, Configuration, and Transceivers

Urgent: Dma

Altera_Forum
Honored Contributor II
1,296 Views

I have problem with DMA. I have lost idea of how to debug anymore. My DMA Controller setting in SOPC is Width of the DMA Register Length is set to 32bit and the rest is left at default. However, my system stucks (infinite loop) at  

 

while (!txrx_done); 

printf ("Transfer successful!\n"); 

 

I dont know why. i just follow the code exactly without editing anything.. but the creator can run it but i cant. i dont know what's the prob, i tried msg in the thread but no one replies. 

 

my code (taken from one of the threads in the forum) 

 

 

--- Quote Start ---  

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

}  

 

--- Quote End ---  

0 Kudos
5 Replies
Altera_Forum
Honored Contributor II
607 Views

Either your DMA does not finish for some reason, or your txrxDone callback is not called. 

Have you tried replacing the while(!txrxDone); line with a sleep() and checking wether the destination RAM was updated?
0 Kudos
Altera_Forum
Honored Contributor II
607 Views

I have the exact same problem. 

The DMA stucks with 4 Bytes left in the Length-Register. This will end in an infinite loop. 

Are there any issues in the Q10.1 DMA? 

 

------------ code ----------------- 

IOWR_32DIRECT(DMA_0_BASE,0x04,FIFO_INTERFACE_BASE); //Readaddress ist FIFO 

IOWR_32DIRECT(DMA_0_BASE,0x08,ALTMEMDDR_0_BASE); //Writeadress 

IOWR_32DIRECT(DMA_0_BASE,0x0c,ALTMEMDDR_0_SPAN); //Length 

 

IOWR_32DIRECT(DMA_0_BASE,0x18,0x18c); //Start Read from Constant adress, write to ddr 

while((IORD_32DIRECT(DMA_0_BASE,0) & 0x01) != 0x01); //Test Doine-Bit 

 

---------------- code end -------------------- 

 

Its an Memory Filler... My Programm and data is in onchip ram. 

Why does the DMA ends with rest length 4?  

 

Marco
0 Kudos
Altera_Forum
Honored Contributor II
607 Views

mcr42 (http://www.alteraforum.com/forum/member.php?u=31121): Yes, i tried but dest RAM does not update. How to fix this prob? Thanks!

0 Kudos
Altera_Forum
Honored Contributor II
607 Views

It was rather meant as a hint, as to where to start to look. 

If the DMA does not transfer a single character, maybe your preparation is not correct?
0 Kudos
Altera_Forum
Honored Contributor II
607 Views

Do you mean the setting in SOPC builder? I set DMA to 32-bit and everything is left as default.

0 Kudos
Reply