阅读:1621回复:9
哪里出的问题?作过5933开发的朋友看过来
我们的pci板子用5933,要从硬盘不断传送大量数据到外设。
pci端负责把数据通过dma传送至5933的fifo。add-on端把数据不停取出,向外发送。 我负责写驱动。思路是这样的: 在驱动中开辟了一个1M的缓冲区――〉把缓冲区地址通过DeviceIoctl经过映射后传给应用程序――〉应用程序把数据写进缓冲区――〉驱动把缓冲区物理地址赋给5933的MRAR寄存器,把缓冲区大小赋给MRTC寄存器,设置中断寄存器只允许读完成产生中断,设置MCSR寄存器开始传送――〉传送完成产生中断――〉中断函数Dpc通知应用程序写缓冲区――〉如此循环…… 现在的现象是,传送开始后过程截止,此时pci-add_on fifo为满(通过读MCSR寄存器得知),而MRAR寄存器值由0x100000变为0x100020,MRTC寄存器的值由1048576变为1048544(十进制)。 我分析的结果是,显然dma过程已经开始,但由于fifo为满,使传送停止,5933交出总线控制权。此时传送了32字节,刚好是5933的pci-Add_on fifo的大小,也就是说,外设一直没有把fifo中的数据取走,导致fifo写满,传送中止。问题应该出在硬件通路上或外部cpld上。大家以为如何? 另外,我分配的缓冲区物理首址为100000,正常吗? 驱动要和外设打交道吗?多谢指点 |
|
|
沙发#
发布于:2002-07-05 12:03
还没解决吗?
/* 另外,我分配的缓冲区物理首址为100000,正常吗? */ 好象挺怪的。 /* 驱动要和外设打交道吗? */ 驱动就是控制DMA,传送数据就完事了。不应该处理协议,协议最好上层来处理。 |
|
|
板凳#
发布于:2002-07-05 12:33
觉得你的思路蛮正取的,不应该有什么问题。
另外,我分配的缓冲区物理首址为100000,正常吗? 我觉得正常,我分配的比你的大一些,但是在同一个数量级里。 驱动要和外设打交道吗? 你用的是总线DMA,buffer模式吧?驱动就告诉设备启动dma就可以了,然后在完成dma的时候接到通知。你问一下你们硬件设计人员,如果dma写fifo写不进去,dma是否停止工作,是否也发出操作完成的中断? |
|
|
地板#
发布于:2002-07-05 12:48
还没解决吗? 那为什么怪呢?缓冲区我是按照你说的方法分配的,应该是非分野内存吧?即使这里有问题,但dma也不应该只传32字节啊,而且也没有任何内存访问错误的迹象。 |
|
|
地下室#
发布于:2002-07-05 12:57
觉得你的思路蛮正取的,不应该有什么问题。 这一点我可以肯定,如果dma没有进行完就停止了,那肯定不会有中断,因为5933的MRTC为零才产生中断。 对了,我看了一下设备管理中的资源分配,发现设备有两个IO映射空间和一个内存映射空间。但我只是对第一个IO配置空间进行操作,因为它是PCI配置空间中BaseAddress0指向的内容。 其它的映射是干什么用的?这会不会就是问题所在?? 我现在只会瞎猜了。 |
|
|
5楼#
发布于:2002-07-06 13:59
我是一个新手,接触pci没几天,说说自己的想法,请各位老大指教
我觉得要不是cpld的问题,要不就是协议问题。因为add―on并不知道对方已进入dma状态并开始传送数据,也就不会去fifo中取数,是否应该先联络一下? |
|
6楼#
发布于:2002-07-08 10:52
我是一个新手,接触pci没几天,说说自己的想法,请各位老大指教 我们的硬件工程师说cpld控制会自动检测fifo是否为空,如非空就取数。现在的情况就是说不清那里出错了。 所以才问大家驱动和设备是否需要其它的通信工作。 |
|
|
7楼#
发布于:2002-07-08 12:17
我觉得 硬件有问题的可能性大。我对pci是接触不久,但对软硬件联调还有点经验,说说自己的看法,莫笑!
1. 既然硬件工程师说cpld会自动读取fifo,那么你可以让他看一下是否真的读了。比如说,你让他把数据显示一下或者回送过来,你与原数据比较一下。 2.在联调不通时,为了尽快找出错误,软件应越简单越好,你在驱动程序中直接分配内存后,不用把地址传给应用程序。让应用程序送一个启动命令后直接把地址赋给mrar,启动DMA看一下。 |
|
8楼#
发布于:2002-07-08 13:15
显然是没读,不然就没故障了。现在正查硬件呢,我想是不是先把地址传到应用程序并不重要,因为无论里面内容是否改变,我向mrar中写入的地址是缓冲区的物理地址是不会变的。
|
|
|
9楼#
发布于:2002-07-10 16:49
应该是硬件的问题,问清楚,PCI的配置是否设置正确,0x45位置的bit7是否为1?是同步方式还是异步方式?向系统提供的用于DMA仲裁计算的参数设置是否正确?
|
|