- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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 ---Link Copied
5 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Do you mean the setting in SOPC builder? I set DMA to 32-bit and everything is left as default.

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page