TI中文支持网
TI专业的中文技术问题搜集分享网站

AM335x 使用EDMA方式通过GPMC接口与FPGA通信

各位好,我们公司的应用是:

(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字节拷贝数据。

大致是哪里的配置问题呢?谢谢

赞(0)
未经允许不得转载:TI中文支持网 » AM335x 使用EDMA方式通过GPMC接口与FPGA通信
分享到: 更多 (0)