Forum Discussion
Altera_Forum
Honored Contributor
14 years agoSO I DID WHAT YOU SAID. INITIALIZED AN ARRAY AND USED IT TO STORE THE VALUES T MAKE SURE CODE AND DATA DONT OVE
LAP AS FOLLOWS: volatile static int rx_done = 0; static void done_DMA(void* handle, void* data) { rx_done = 1; printf("Thanks Jeez\n"); } int main(int argc, char* argv[], char* envp[]) { int rc,i; long data_dma[4]={0xAAAAAAAA,0xABCD1234, 0x12345678, 0x945207616}; unsigned long DDR_write_OFFSET_ADDRESS_dma=0x03000000; unsigned long read_data1[4],read_data3[4]; for (i=0;i<4;i++){ IOWR(ALTMEMDDR_BASE,DDR_write_OFFSET_ADDRESS_dma + i, data_dma);printf("data %08x is correctly written to memory offset %08x on ddr\n",data_dma,DDR_write_OFFSET_ADDRESS_dma+4*i); } for(i=0;i<4;i++){ read_data1=iord(altmemddr_base,ddr_write_offset_address_dma+i);
printf("read %08x from address %08x on ddr\n",read_data1,(DDR_write_OFFSET_ADDRESS_dma+ 4*i)); } //DMA opeartion alt_dma_txchan txchan; alt_dma_rxchan rxchan; unsigned long* tx_data = (unsigned long*)DDR_write_OFFSET_ADDRESS_dma ;// pointer to data to send unsigned long* rx_buffer = (unsigned long*) read_data3; printf("\n\nTesting DMA transfer from DDR to SRAM\n\n"); alt_dcache_flush_all(); // // 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); } if(alt_dma_txchan_ioctl(txchan,ALT_DMA_SET_MODE_32,NULL)<0) { exit(1); } if(alt_dma_rxchan_ioctl(rxchan,ALT_DMA_SET_MODE_32,NULL)<0) { exit(1); } if(alt_dma_txchan_ioctl(txchan,ALT_DMA_TX_ONLY_OFF,NULL)<0) { exit(1); } if(alt_dma_rxchan_ioctl(rxchan,ALT_DMA_RX_ONLY_OFF,NULL)<0) { exit(1); } // Post the transmit request if ((rc = alt_dma_txchan_send (txchan,tx_data,16,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,16,done_DMA,NULL)) < 0) { printf ("Failed to post read request, reason = %i\n", rc); exit (1); } // wait for transfer to complete while (!rx_done); printf ("Transfer successful!\n\n"); for(i=0;i<4;i++){ printf("Read %08x from address %08x \n",read_data3,&read_data3); } return 0; } Results: Read 00000001 from address 3fffffd0 Read 000001ff from address 3fffffd4 Read 3fffffec from address 3fffffd8 Read deadbeef from address 3fffffdc //DEADBEEF!! what the heck?? Still not working Badomen!! :(