阅读:4845回复:5
确定 PCI9054本地LINT信号产生,程序检测中断时始终返回"等待中断超时";源码贴上来,请指点一下
自己作的PCI卡,安装SDK里的驱动程序9054.sys,自己在VC++ 6.0下写了个应用程序,希望检测到本地中断信号后开启一次DMA传输。程序如下:
//////公共函数的定义///////////// //*****************************// void DeviceParam() { m_DL.SerialNumber[0]='\0'; m_DL.BusNumber = (U8)-1; m_DL.SlotNumber = (U8)-1; m_DL.DeviceId = (U16)-1;//0x9054; m_DL.VendorId = (U16)-1;//0x10B5; } //开启指定设备的 LINT中断 void EnableLocalIntr(HANDLE pDevice) { PLX_INTR intr; memset( (void *)&intr,0x0,sizeof(PLX_INTR)); intr.PciMainInt=1; intr.IopToPciInt=1; intr.PciDmaChannel0 = 1; rc=PlxIntrEnable(pDevice,&intr); } //关闭指定设备的 所有中断 void DisableAllIntr(HANDLE pDevice) { PLX_INTR intr; memset((void *)&intr, 0xFF, sizeof(PLX_INTR)); rc=PlxIntrDisable(pDevice,&intr); } //将事件与指定设备的中断事件联系起来 void AttachLntIntr(HANDLE pDevice,HANDLE *pHdl) { PLX_INTR intr; memset( (void *) &intr, 0x0, sizeof(PLX_INTR)); pHdl = (HANDLE *)malloc(sizeof(HANDLE)); intr.PciMainInt=1; intr.IopToPciInt=1; intr.PciDmaChannel0 = 1; rc=PlxIntrAttach(pDevice,intr,pHdl); } //DMA的初始化 void InitDma(HANDLE pDevice) { memset(&m_SDD,0,sizeof(DMA_CHANNEL_DESC)); m_SDD.EnableReadyInput = 1; m_SDD.EnableBTERMInput = 1; m_SDD.EnableIopBurst = 0; m_SDD.DmaStopTransferMode = AssertBLAST; m_SDD.DmaChannelPriority = Channel0Highest; m_SDD.IopBusWidth = BitSize32; m_SDD.HoldIopAddrConst = 1;//Local Address bus constant(not incremented) m_SDD.HoldIopSourceAddrConst = 1; m_SDD.EnableDoneInt = 1; rc=PlxDmaBlockChannelOpen(hDevice,PrimaryPciChannel0,&m_SDD); } //入口函数 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } DWORD WINAPI DmaData(HANDLE pDevice) { int i=0; HADNLE pEventHandle; RETURN_CODE sat; //复位 PlxPciBoardReset(pDevice); //初始化DMA通道 InitDma(pDevice); DisableAllIntr(pDevice); //把中断事件和对应的句柄联系起来 AttachLntIntr(pDevice,pEventHandle); EnableLocalIntr(pDevice); //开启数据源 U32 uCmd3; uCmd3=0; PlxBusIopWrite(hDevice,IopSpace0,DataSource_ADDR,false,&uCmd3,4,BitSize32); sat=PlxIntrWait(hDevice,clDevice->hEventHandle,500); ResetEvent(clDevice->hEventHandle); if(sat==ApiWaitTimeout) { ...... continue; } if(sat==ApiSuccess) { ...... } return 0; } 调试的时候返回值sat始终是ApiWaitTimeout。我通过本地CPU直接使能9054的LINT#信号,并且在9054对应引脚上检测到了该信号,sat仍然是ApiWaitTimeout。怀疑是不能使用9054.sys来支持我的PCI卡,有办法验证么? 请高手指点一下,不胜感激。 |
|
沙发#
发布于:2007-08-22 16:37
查到原因了,开启PCI中断的时候INTCSR第11位“Local interrupt input enable”没有开启成功。问题是怎么解决涅~~~~~~偶明明在中断向量中设置了“IOPToPCi”的呱!!!~~~~~~~~难道不幸踩到Plx Api的bug……Orz……
走过路过的大人们啊,伸出你们友爱之手的时候到了,上吧!!! (路人甲:让我们给你填坑米门……) (偶:暴走……) (斑竹:……) |
|
板凳#
发布于:2007-08-22 17:55
我现在也在写9054的中断,用的是plx专用的SDK中的函数,刚开始用PlxPci_InterruptEnable函数的时候,9054中断寄存器的相应位的值会变化,可是现在不知道什么原因中断寄存器没变化了,请问楼主知道怎么回事么?谢谢!
|
|
地板#
发布于:2007-08-22 23:31
直接自己写个驱动,就没有这么麻烦了。
|
|
|
地下室#
发布于:2009-10-30 16:50
Re:确定 PCI9054本地LINT信号产生,程序检测中断时始终返回"等待中断超时";源码贴上来,请指点 ..
我现在也遇到了同样的问题,头痛死了,快疯了 |
|
|
5楼#
发布于:2009-11-02 11:15
Re:确定 PCI9054本地LINT信号产生,程序检测中断时始终返回"等待中断超时";源码贴上来,请指点 ..
直接写寄存器。。。。 |
|