各位好,我们公司的应用是:
(1)在linux3.2内核下,ARM与FPGA通过GPMC接口通信,由FPGA给ARM不定时发送数据包,每包为192字节数据,通过EDMA方式将FPGA中的数据搬移至内存。
(2)FPGA端数据由CS2口出来,假设FPGA端数据地址为cs2_base_addr。
(3)在linux3.2内核中通过dma_alloc_coherent()函数申请大小为192*80的内存缓冲区,假设内存缓冲区首地址为dma_mem_in。
(4)设置EDMA如下:
edma_transfer(unsigned long dma_mem_in,unsigned long cs2_base_addr,192,80);
static s32 edma_transfer(unsigned long dst_buf,unsigned long src_buf,u32 len,u32 num_package)
{
……
……
result=edma_alloc_channel(..,..,..,..);//假设申请通道号为12
dma_ch=result;
edma_set_src(dma_ch,src_buf,INCR,W8BIT);//源端为FPGA cs2_base_addr
edma_set_dest(dma_ch,dst_buf,INCR,W8BIT);//目的端为内存dma_mem_in
edma_set_src_index(dma_ch,0,0);//源端同一个地址出数据
edma_set_dest_index(dma_ch,len,0);//目的端内存acnt=192字节
edma_set_transfer_params(dma_ch,len,package_num,1,package_num,ASYNC);//目的端acnt=192字节,bcnt=80,ccnt=1,采用A同步模式
……
……
}
(5)由于源端FPGA在系统启动后,会一直不定时的给内存发送数据,再将内存数据传入应用层,因此需要开辟足够大的内存缓冲区来存放数据。由于应用层过一定时间从内存中取数,因此当开辟内存缓冲区大小为192*80,EDMA采用二维acnt=192,bcnt=80,ccnt=1,A同步模式,当bcnt减到0时,需要将其链接回通道12的第1个array,保证下一次数据继续从内存的起始地址开始存放,以此来控制内存的循环buffer。在linux3.2内核下,采用edma_link(12,12)或者iowrite16(0x4000+0x20*12,(u32*)(am3359_edma_kernel_base+0x4194))方式将PaRAM 12链接到自身。
现在的问题是:PaRAM 12链接到自身后,当FPGA端第81包及其之后的数据到来时,数据存放到PaRAM 12的第80个array对应的内存空间,而不是从第一个array对应的内存空间开始存放,造成后续数据大量丢失。
因此想咨询各位有没有解决方法,保证PaRAM 12链接后,从第一个array开始。
Jian Zhou:
推荐看下这篇文档
Jian Zhou:
回复 Jian Zhou:
不好意思:http://blog.chinaunix.net/uid-28818752-id-3750016.html
Bruce li:
回复 Jian Zhou:
非常感谢,我们先研读一下这个帖子
chunyu ma:
回复 Jian Zhou:
您好,我现在在进行一个FPGA和DM3730通过GPMC通信的一个项目,需要很高的速度,至少60M/s以上,异步模式无法满足,所以准备采用同步+brust模式,但是配置了好几天都不行,您能不能给我提供一个参考配置,关于config1~config7那几个寄存器的。谢谢!! 邮箱是machunyu19891215@163.com
AM335x上倒是可以
enki_fang:
您好,请问这个问题解决了吗?我现在碰到类似的问题,第二次之后就一直往最后的buf字节拷贝数据。
大致是哪里的配置问题呢?谢谢