Forum Discussion
Altera_Forum
Honored Contributor
12 years agoDear all,
I build ST->Mem->St system by using SGDMA Stream to memory and SGDMA Memory to stream. In my nios the callback work at once. Am I do some wrong? Thanks for your help doddy # include <stdio.h> # include "altera_avalon_sgdma_descriptor.h" # include "altera_avalon_sgdma_regs.h" # include "altera_avalon_sgdma.h" # include "system.h" # include "alt_types.h" alt_sgdma_dev *sgdma_rx_dev; alt_sgdma_dev *sgdma_tx_dev; alt_sgdma_descriptor *desc; alt_sgdma_descriptor *desc_2; alt_u32 *buffer; int rx=0, tx=0, rxfnl=0; void sgdma_rx_isr(void * context, u_long intnum); void sgdma_tx_isr(void * context, u_long intnum); int main() { desc = (alt_sgdma_descriptor *)DESCRIPTOR_MEMORY_BASE; sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME); if(!sgdma_rx_dev) { printf(" Error opening RX SGDMA\n"); return -1; } buffer = (alt_u32 *) (DESCRIPTOR_MEMORY_BASE); /* Reset RX-side SGDMA */ IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x10000); usleep(1000); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x10000); usleep(1000); alt_avalon_sgdma_construct_stream_to_mem_desc( &desc[0], //主描述字 &desc[0], //次描述字 buffer, //接收地址 0, //length,为0时当收到EOP时结束 0); //write_fixed desc[0].control = 128; alt_avalon_sgdma_register_callback( sgdma_rx_dev, (alt_avalon_sgdma_callback) &sgdma_rx_isr, (ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_PARK_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_DESC_COMPLETED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_CHAIN_COMPLETED_MSK ), 0); desc_2 = (alt_sgdma_descriptor *)DESCRIPTOR_MEMORY_FNL_BASE; sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME);//"/dev/tx_sgdma"); if(!sgdma_tx_dev) { printf(" Error opening TX SGDMA\n"); return -1; } /* Reset TX-side SGDMA */ IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_BASE, 0); IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_BASE, 0xFF); printf("Melewati reset register\n"); alt_avalon_sgdma_construct_mem_to_stream_desc( &desc_2[0], &desc_2[0], buffer, (4096), //4096 for 1024 data, 1 data = 4byte 0, 1, 1, 0); desc_2[0].control = 128; alt_avalon_sgdma_register_callback( sgdma_tx_dev, (alt_avalon_sgdma_callback) &sgdma_tx_isr, (ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_PARK_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_DESC_COMPLETED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_CHAIN_COMPLETED_MSK ), 0); alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[0]); printf("Wait for stream in....\n"); while(1); free(desc_2); } void sgdma_rx_isr(void * context, u_long intnum) { alt_avalon_sgdma_stop(sgdma_rx_dev); alt_avalon_sgdma_do_async_transfer(sgdma_tx_dev, &desc_2[0]); printf("in callback rx\n"); } void sgdma_tx_isr(void * context, u_long intnum) { alt_avalon_sgdma_stop(sgdma_tx_dev); alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[0]); printf("in callback tx\n"); } and the output like this: Melewati reset register in callback rx in callback tx Wait for stream in....