各位好,我们公司的应用是:
(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开始。