I'm having an issue trying to do a synchronous multiple (burst) read (4, 8, 16 Word16) with the sDMA.
Currently, it seems like my sDMA is requesting the data from the GPMC as single word reads. I believe I have the GPMC configured properly for burst reads because I am able to perform a 4 word burst with the following.
volatile u64 *ptr = gpmc_cs_phys_base;
u64 return_data;
u16 *word_p;
return_data = *ptr;
Looks like the method above forces the system to request the 64bits from the GPMC causing it to do a 4 word burst, while the DMA evidently does not do this. So, how do I get the system DMA to request 64, 128, and 256 bits at a time for 4, 8, and 16 word bursts, respectively?
My DMA setup consists of the following:
dma_params.data_type = OMAP_DMA_DATA_TYPE_S16;
dma_params.src_start = 0x1000000; //GPMC phys base dma_params.src_amode = OMAP_DMA_AMODE_CONST;
dma_params.dst_start = 0x88100000; //RAM destination address
dma_params.dst_amode = OMAP_DMA_AMODE_POST_INC;
dma_params.dst_ei = 1;
dma_params.dst_fi = 1;
dma_params.elem_count = 4; //Just want a single 4 word transfer
dma_params.frame_count = 1;
omap_set_dma_params(info->dma_channel_num, &dma_params);
omap_set_dma_src_burst_mode(info->dma_channel_num,
OMAP_DMA_DATA_BURST_4);
omap_set_dma_dest_burst_mode(info->dma_channel_num,
OMAP_DMA_DATA_BURST_4); omap_start_dma(info->dma_channel_num);
With this setup I get 4 independent CS assertions and 1
word read for each CS assertion, I was instead expecting a burst (one CS assertion
with 4 read words since my FPGA device is writing 4 words per CS
assertion). For what its worth, I was able to use the sDMA to perform RAM to RAM data transfer, so that tells me that my DMA configuration is not completely hosed. Is there anything else I have to take into consideration for performing 64, 128, 256 word reads with the DMA to trigger a GPMC burst?