Hi all-
I am having an issues getting a stream to memory msgdma working. I posted the code below. Can anyone point out where a problem may exist. Thanks!
#include <stdio.h>
// DMA transfer definitions
#include <altera_msgdma_descriptor_regs.h>
#include <altera_msgdma_csr_regs.h>
#include <altera_msgdma.h>
#define BUFFER_A 0x40000000 // SDRAM Buffer A address
// Modular Scatter-Gather DMA Globals
alt_msgdma_dev *DATA_DMA_A;
alt_msgdma_standard_descriptor *DATA_DMA_A_desc = &DATA_DMA_A_desc;
// DMA variables
alt_u32 *DMA_write_addr_ptr_A; // Pointer for DMA A transfer write address
alt_u32 DMA_write_addr_A; // DMA A transfer write address
// Declare functions
void DATA_DMA_A_callback_function(void* context);
// Configure DMA A for next transfer
void DATA_DMA_A_callback_function(void* context) {
alt_msgdma_construct_standard_st_to_mm_descriptor ( DATA_DMA_A,
DATA_DMA_A_desc, DMA_write_addr_ptr_A, dma_len_bytes,
ALTERA_MSGDMA_DESCRIPTOR_CONTROL_TRANSFER_COMPLETE _IRQ_MASK);
alt_msgdma_standard_descriptor_async_transfer(DATA _DMA_A, DATA_DMA_A_desc);
IOWR_ALTERA_AVALON_PIO_DATA(NIOS_DATA1_READY_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(NIOS_DATA1_READY_BASE, 0);
}
int main() {
// Open the streaming scatter-gather DMA controllers
DATA_DMA_A = alt_msgdma_open("/dev/data1_msgdma_csr");
if(DATA_DMA_A == NULL)
printf("Could not open the mSG-DMA1\n");
// Configure DMA callback functions
alt_msgdma_register_callback(DATA_DMA_A, DATA_DMA_A_callback_function, ALTERA_MSGDMA_CSR_GLOBAL_INTERRUPT_MASK, NULL);
// Configure the DMA write address
DMA_write_addr_A = (alt_u32) BUFFER_A ;
DMA_write_addr_ptr_A = (alt_u32*)(DMA_write_addr_A);
// Construct the DMA descriptors
alt_msgdma_construct_standard_st_to_mm_descriptor ( DATA_DMA_A,
DATA_DMA_A_desc, DMA_write_addr_ptr_A, dma_len_bytes,
ALTERA_MSGDMA_DESCRIPTOR_CONTROL_TRANSFER_COMPLETE _IRQ_MASK);
// Start DMA transfers
alt_msgdma_standard_descriptor_async_transfer(DATA _DMA_A, DATA_DMA_A_desc);
return 0;
}
I am having an issues getting a stream to memory msgdma working. I posted the code below. Can anyone point out where a problem may exist. Thanks!
#include <stdio.h>
// DMA transfer definitions
#include <altera_msgdma_descriptor_regs.h>
#include <altera_msgdma_csr_regs.h>
#include <altera_msgdma.h>
#define BUFFER_A 0x40000000 // SDRAM Buffer A address
// Modular Scatter-Gather DMA Globals
alt_msgdma_dev *DATA_DMA_A;
alt_msgdma_standard_descriptor *DATA_DMA_A_desc = &DATA_DMA_A_desc;
// DMA variables
alt_u32 *DMA_write_addr_ptr_A; // Pointer for DMA A transfer write address
alt_u32 DMA_write_addr_A; // DMA A transfer write address
// Declare functions
void DATA_DMA_A_callback_function(void* context);
// Configure DMA A for next transfer
void DATA_DMA_A_callback_function(void* context) {
alt_msgdma_construct_standard_st_to_mm_descriptor ( DATA_DMA_A,
DATA_DMA_A_desc, DMA_write_addr_ptr_A, dma_len_bytes,
ALTERA_MSGDMA_DESCRIPTOR_CONTROL_TRANSFER_COMPLETE _IRQ_MASK);
alt_msgdma_standard_descriptor_async_transfer(DATA _DMA_A, DATA_DMA_A_desc);
IOWR_ALTERA_AVALON_PIO_DATA(NIOS_DATA1_READY_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(NIOS_DATA1_READY_BASE, 0);
}
int main() {
// Open the streaming scatter-gather DMA controllers
DATA_DMA_A = alt_msgdma_open("/dev/data1_msgdma_csr");
if(DATA_DMA_A == NULL)
printf("Could not open the mSG-DMA1\n");
// Configure DMA callback functions
alt_msgdma_register_callback(DATA_DMA_A, DATA_DMA_A_callback_function, ALTERA_MSGDMA_CSR_GLOBAL_INTERRUPT_MASK, NULL);
// Configure the DMA write address
DMA_write_addr_A = (alt_u32) BUFFER_A ;
DMA_write_addr_ptr_A = (alt_u32*)(DMA_write_addr_A);
// Construct the DMA descriptors
alt_msgdma_construct_standard_st_to_mm_descriptor ( DATA_DMA_A,
DATA_DMA_A_desc, DMA_write_addr_ptr_A, dma_len_bytes,
ALTERA_MSGDMA_DESCRIPTOR_CONTROL_TRANSFER_COMPLETE _IRQ_MASK);
// Start DMA transfers
alt_msgdma_standard_descriptor_async_transfer(DATA _DMA_A, DATA_DMA_A_desc);
return 0;
}