阅读:3254回复:6
pci9656驱动、DMA传输问题
刚接触PCI9656(工作在C模式下),原来没有接触过驱动方面,所以驱动程序也是用的9054的(寄存器我看了看也不用改),现在想进行DMA数据传输,本地控制线号只使用了ads,blast,ready,lwr,lhold,lholda这个几个,大家看可以吗?现在读数据读的全不对(在FPGA发送端数据是正确的),可是我观测这几个控制信号的时序还是正确的;写数据每次都重启蓝屏,数据也不对。大家感觉可能是什么问题呢?可能是驱动的问题吗?对应这两种芯片驱动有什么不同吗?各位大仙帮帮忙吧
|
|
沙发#
发布于:2010-07-02 12:48
大仙指教指教啊!PCI9054和9656驱动可以混用吗?谢谢
|
|
板凳#
发布于:2010-07-05 16:08
首先看你配置的硬件空间是否相同,其次,9054和9056的本地端时序是否相同。
总之,都极有可能是直接或者间接的驱动问题。 别省事,会付出代价的。 |
|
地板#
发布于:2010-07-07 00:02
谢谢ls的
|
|
地下室#
发布于:2010-07-07 19:20
回 2楼(adamite) 的帖子
我把DMA读出的数据保存下来,发现读出的数据不是FPGA发送的数据而是配置空间内寄存器的值,这是什么原因造成的呢?我如何才能知道DMA操作的数据在哪个BAR对应的存储区呢?配置空间是否也在某个BAR对应的存储区内呢?我目前驱动程序内实例化了两个KIoRange类和两个KMemoryRange类,DMA操作时具体操作(一部分)如下:VOID PCI9656Device::StartDMA(ULONG PAddress,ULONG NBytes) { //下面几条语句设置DMA通道0寄存器,启动块传输方式,从FIFO读数据 //Channel0 interrupt to the PCI Bus interrupt,Done Interrupt Enable,FIFO m_IoPortRange0.outd(DMAMODE0,0x20D43); //DMA Channel0 PCI Address m_IoPortRange0.outd(DMAPADR0,PAddress); //DMA Channel0 Local Address,自己设计的FIFO地址 m_IoPortRange0.outd(DMALADR0,0x8); //DMA Channel0 Transfer Size(Bytes) m_IoPortRange0.outd(DMASIZ0,NBytes); //from the Local Bus to the PCI Bus if(read) { m_IoPortRange0.outd(DMADPR0,(ULONG)0x08); } else { m_IoPortRange0.outd(DMADPR0,(ULONG)0x00); } //Channel0 Enable,Start m_IoPortRange0.outb(DMACSR0,0x03); } 这块应该没什么问题吧 偶是菜鸟,可能问些比较白痴的问题,望大仙不吝赐教啊,谢谢了 |
|
5楼#
发布于:2010-07-08 21:03
我用windriver读数据时,发现只有bar3(memory)读出的数据是配置空间内寄存器的值,其他三个读出的不知道是什么数据(但三个读出的是一样的数据),但是利用bar3写数据,fpga端接收的正确的。这可能是什么原因造成的呢?配置空间设置有问题?还是硬件连接的问题?麻烦大家了
|
|
6楼#
发布于:2011-06-24 16:16
有可能是对PCI9054的寄存器配置没有看懂吧。你可以把相关的资源研究一下。
还有是否让PCI9054的中断生效了,没有中断产生数据也会传输失败的。 我没有接触过PCI9054,但在开发别的PCI驱动时,也研究了一下。希望对你有帮助。 |
|