bloomrain
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度27点
  • 原创分0分
  • 专家分0分
阅读:4845回复:5

确定 PCI9054本地LINT信号产生,程序检测中断时始终返回"等待中断超时";源码贴上来,请指点一下

楼主#
更多 发布于:2007-08-21 16:25
自己作的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卡,有办法验证么?
请高手指点一下,不胜感激。
bloomrain
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度27点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-22 16:37
查到原因了,开启PCI中断的时候INTCSR第11位“Local interrupt input enable”没有开启成功。问题是怎么解决涅~~~~~~偶明明在中断向量中设置了“IOPToPCi”的呱!!!~~~~~~~~难道不幸踩到Plx Api的bug……Orz……
走过路过的大人们啊,伸出你们友爱之手的时候到了,上吧!!!
(路人甲:让我们给你填坑米门……)
(偶:暴走……)
(斑竹:……)
gushi84
驱动牛犊
驱动牛犊
  • 注册日期2006-05-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-08-22 17:55
我现在也在写9054的中断,用的是plx专用的SDK中的函数,刚开始用PlxPci_InterruptEnable函数的时候,9054中断寄存器的相应位的值会变化,可是现在不知道什么原因中断寄存器没变化了,请问楼主知道怎么回事么?谢谢!
xp4105
论坛版主
论坛版主
  • 注册日期2006-04-02
  • 最后登录2014-03-29
  • 粉丝1
  • 关注0
  • 积分905分
  • 威望570点
  • 贡献值1点
  • 好评度162点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-08-22 23:31
直接自己写个驱动,就没有这么麻烦了。
时光如流水 抓紧时间实现自我价值
litao10586
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2009-11-07
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-10-30 16:50
Re:确定 PCI9054本地LINT信号产生,程序检测中断时始终返回"等待中断超时";源码贴上来,请指点 ..
我现在也遇到了同样的问题,头痛死了,快疯了      
只有胡萝卜才能理解胡萝卜的烦恼,白萝卜是理解不了的~~~
green_pine
驱动太牛
驱动太牛
  • 注册日期2002-10-22
  • 最后登录2019-06-10
  • 粉丝3
  • 关注0
  • 积分48分
  • 威望599点
  • 贡献值1点
  • 好评度144点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2009-11-02 11:15
Re:确定 PCI9054本地LINT信号产生,程序检测中断时始终返回"等待中断超时";源码贴上来,请指点 ..
直接写寄存器。。。。
游客

返回顶部