Hi all,
我们集成了一颗FPGA到系统(通过GPMC总线),现在希望通过dma读取FPGA数据,遇到点问题,如下:
1. 我应该使用哪个DMA通道?
根据TRM 10.3.20, 一些通道已经绑定到特定的模块了,所以我只能使用那些没有被绑定的通道,比如通道4,对吗?
2. 如何正确地使用dma api:
bool fpga_dma_filter_fn(struct dma_chan *chan, void *param)
{
int chan_id = *(unsigned int *)param;
if (chan_id == chan->chan_id)
return true;
return false;
}
void dma_init()
{
dma_cap_mask_t mask;
dma_cap_zero(mask);
dma_cap_set(DMA_SLAVE, mask);
unsigned int id = 4;
gFpgaDmaChan = dma_request_channel(mask, fpga_dma_filter_fn, &id);
}
int fpga_dma_read(dma_addr_t dst, unsigned int len)
{
struct dma_slave_config config;
struct dma_async_tx_descriptor *desc;
unsigned long flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
config.direction = DMA_DEV_TO_MEM;
config.dst_addr = dst;
config.src_addr = FPGA_PHY_BASE + 6; --> the source address
config.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
config.dst_maxburst = 16;
config.src_maxburst = 16;
dmaengine_slave_config(gFpgaDmaChan, &config);
desc = dmaengine_prep_slave_single(
gFpgaDmaChan, dst, len, DMA_DEV_TO_MEM, flags);
desc->callback = fpga_dma_callback;
dmaengine_submit(desc);
dma_async_issue_pending(gFpgaDmaChan);
return 1;
}
void fpga_test()
{
dma_addr_t dest;
char *ptr = dma_alloc_coherent(NULL, 1024, &dest, GFP_DMA);
memset(ptr, 0x11, 1024);
fpga_dma_read(dest, 1024);
mdelay(1000);
for (int i=0;i<33;i++){
printk("0x%x ", ptr[i]);
}
}
我在调用fpga_test时候,发现dma仅仅拷贝了config.src_maxburst * config.src_addr_width = 16 * 2 = 32 bytes,然后就停止了,ptr[32]及后面的数据仍为0x11,并且fpga_dma_callback也没有被调用到,是我哪里使用、配置的不对吗?
烦请大牛们帮帮忙啊,谢谢了!!!