工具/软件:Linux
大家好、
我们通过 GPMC 总线集成了 FPGA 模块、并在使用 EDMA 将数据从 FPGA 复制到存储器时遇到了一些问题。
我们的器件应使用哪个 DMA 通道?
请参阅 TRM 10.3.2、某些事件与特定模块绑定、因此我无法使用这些通道、我只能使用通道4等"保留"通道、对吧?
2.我已经使用 DMA 引擎 API 来使用 EDMA、如下所示:
bool fpga_dma_filter_fn (struct dma_chan *通道、void * param)
{
int cha_id =*(unsigned int *) param;
if (chan_id =chan->chan_id)
返回 true;
返回 false;
}
void dma_init()
{
dma_cap_mask_t mask;
DMA_CAP_ZERO (掩码);
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;
无符号长整型标志= DMA_CTRL_ACK | DMA_PRE_INTERRUPT;
config.Direction = dma_dev_TO_MEM;
config.dst_addr = dst;
CONFIG.src_addr = FPGA_PHY_BASE + 6; --> 源地址
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;
dmaenginer_slave_config (gFpgaDmaChan、&config);
DESC = dmaengineer_prep_slave_single (
gFpgaDmaChan、dst、len、dma_dev_TO_MEM、flags);
DESC->callback = FPGA_DMA_callback;
dmaenginer_submit (desc);
dma_async_issend_pending (gFpgaDmaChan);
返回1;
}
void FPGA_TEST()
{
dma_addr_t dest;
char * ptr = dma_alloc_相干(NULL、1024、目标、GFP_DMA);
memset (ptr、0x11、1024);
FPGA_DMA_READ (dest、1024);
mdelay (1000);
对于(int i=0;i<33;i++){
printk ("0x%x"、ptR[i]);
}
}
当我调用 FPGA_TEST 时、我发现 DMA 仅复制第一 个 CONFIG.src_maxburst * CONFIG.src_addr_width = 16 * 2 = 32字节、PTR[32]和更高版本的元素保持默认值(0x11)。
如何调试此问题? 我是否正确使用了 DMA API?
谢谢!!!
