-
大家好:
我想请教下PCIe全双工传递数据的问题,需要实现的是DM8168通过PCIe传递给C6678EVM处理的同时将以前处理好的数据收回来。
现在实现的情况是:DM8168的A8核的ipcBitsOut Link获取数据并传输给C6678,使用了ioctl()函数:ioctl(fd, C6678_PCI_TRANS_DATA, &phyaddr),以及ioctl(fd, C6678_PCI_GET_DATA, &phyaddr);前者是负责将数据通过PCIe传送给C6678,后者是负责将数据从C6678取回来。现在单方向传输是可以实现的:也就是先调用ioctl(fd, C6678_PCI_TRANS_DATA, &phyaddr)传输数据传到C6678等待处理,再调用ioctl(fd, C6678_PCI_GET_DATA, &phyaddr)将数据取回来。那么我的问题是:如果要实现全双工的话岂不是这两条ioctl语句都必须要同时执行?这在C语言上是不可能实现的啊?
求助各位大神实现上述全双工模式传输数据的方案,不胜感激。
Andy Yin1:
读写数据可以使用EDMA,只需要发起命名,而不需要等待数据完成,即可执行下一个操作。
studying:
回复 Andy Yin1:
谢谢您的回答,现在情况是这样的:PCIe.c的ioctl()函数里面的HAL_writeDMA和HAL_readDMA函数里都有这样一段代码:
while (true) { /* check in steps of 10 usec.*/ udelay(10); tmp = myIoread32(pReg + IPR/4); if ((tmp & 0x1) == 1) { break; } }
这段代码的意思是等待当前DMA传输完成吧?现在我将这段代码注释掉了,就可以不用等待传输完成直接返回执行接下来的语句了?那么为了验证DMA确实做到了全双工,所以我使用了do_gettimeofday()获取时间戳,观察前一次调用HAL_writeDMA()和后一次调用的时间间隔和原来没注释掉上述代码相比是否减小,但测试结果两次调用该函数的时间间隔却并没有得到减小,也不知道是什么原因,麻烦帮忙看下,谢谢。
在用户空间的ipcbitsoutlink的ioctl代码:
if(ioctl(fd, C6678_PCI_TRANS_DATA, &phyaddr)<0) { printf("Call cmd C6678_PCI_TRANS_DATA fail\n"); return -1; }
在内核空间的代码:
case C6678_PCI_TRANS_DATA:{
unsigned long phys; unsigned long physfromuser; uint32_t chazhi; static uint32_t a; static uint32_t a2; if (copy_from_user(&phys, argp, sizeof(phys))) return -EFAULT;
do_gettimeofday(&test_time1);
chazhi=(test_time1.tv_sec – a)*1000000 + (test_time1.tv_usec – a2);
HAL_writeDMA(phys, DDR_START_1, DMA_TRANSFER_SIZE, 1);
printk("the gap between two time is %u\n",chazhi);
a=test_time1.tv_sec;
a2=test_time1.tv_usec;
if (copy_from_user(&physfromuser, argp, sizeof(physfromuser))) return -EFAULT; HAL_readDMA(DDR_START_2, physfromuser, DMA_TRANSFER_SIZE, 1);
}