get0malloc
驱动牛犊
驱动牛犊
  • 注册日期2014-01-09
  • 最后登录2014-04-01
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3811回复:3

求助,PCIE驱动在win7上的收不到MSI中断问题

楼主#
更多 发布于:2014-01-09 16:08
     最近在做一个ALTERA cylone III的PCIE驱动,在linux系统中驱动已经基本调试通过,MSI中断,DMA读写都没有问题,现在在做windows系统中驱动,采用的WDF驱动架构,主要参考《Windows设备驱动程序WDF开发》和《竹林蹊径-深入浅出Windows驱动开发》,以《Windows设备驱动程序WDF开发》提供的PCISample例程做修改。因为硬件DMA数据传输支持POLL与INTERRUPT(MSI)两种方式,之前在XP下调试,POLL方式测试基本正确读写,但是MSI中断一直没有,后来查到XP不支持MSI中断,所以在win7下测试,但现象一样,主机收不到MSI中断.
 
NTSTATUS
WUGOU_IIE_EvtDeviceAdd(
    IN WDFDRIVER       Driver,
    IN PWDFDEVICE_INIT DeviceInit
    )
{
    NTSTATUS                status;
    WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
    WDF_OBJECT_ATTRIBUTES   deviceAttributes;
    WDFDEVICE                device;
    PDEVICE_CONTEXT            pDeviceContext;
    WDF_INTERRUPT_CONFIG    interruptConfig;
    WDF_IO_QUEUE_CONFIG        ioQueueConfig;

    PAGED_CODE();

     KdPrint(("Enter EvtDeviceAdd \n"));

    //采用WdfDeviceIoDirect方式
    WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);

    //初始化即插即用和电源管理例程配置结构
    WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);

    //设置即插即用基本例程
    pnpPowerCallbacks.EvtDevicePrepareHardware = WUGOU_IIE_EvtDevicePrepareHardware;
    pnpPowerCallbacks.EvtDeviceReleaseHardware = WUGOU_IIE_EvtDeviceReleaseHardware;


    pnpPowerCallbacks.EvtDeviceD0Entry         = PCIEEvtDeviceD0Entry;
    pnpPowerCallbacks.EvtDeviceD0Exit          = PCIEEvtDeviceD0Exit;

    //注册即插即用和电源管理例程
    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, DEVICE_CONTEXT);

    //
    // Set WDFDEVICE synchronization scope. By opting for device level
    // synchronization scope, all the queue and timer callbacks are
    // synchronized with the device-level spinlock.
    //
    deviceAttributes.SynchronizationScope = WdfSynchronizationScopeDevice;

    status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device);
    if (!NT_SUCCESS(status)) {

        KdPrint((" WdfDeviceCreate fail!  \n"));
        return status;
    }

    pDeviceContext = GetDeviceContext(device);

    //设置中断服务例程和延迟过程调用
    WDF_INTERRUPT_CONFIG_INIT(&interruptConfig,
                              WUGOU_IIE_EvtInterruptIsr,
                              WUGOU_IIE_EvtInterruptDpc);



    interruptConfig.AutomaticSerialization = TRUE;
    //interruptConfig.ShareVector = WdfTrue;//WdfFalse WdfDefault

    //创建中断对象
    status = WdfInterruptCreate(device,
                                &interruptConfig,
                                WDF_NO_OBJECT_ATTRIBUTES,
                                &pDeviceContext->Interrupt);
    if (!NT_SUCCESS (status)) {


        KdPrint((" WdfInterruptCreate fail!  \n")); 
        return status;
    }
 其中中断初始化及创建部按参考例程写几乎没做任何修改,WUGOU_IIE_EvtInterruptIsr与WUGOU_IIE_EvtInterruptDpc我按自己硬件工作进行修改,
 但问题是,我进行DEBUG时,对DMA进行配置后,驱动无法进入到我的WUGOU_IIE_EvtInterruptIsr例程中,然后我能过WINIO把PCIE空间信息读了出来,发现MSI使能位没有被置位,message addr寄存器也没有被设值。好像是我的驱动没能使能MSI并配置好相应的寄存器,但WDF提供给我们的有关中断初始化相关的就WdfInterruptCreate和WDF_INTERRUPT_CONFIG_INIT。网上查了很久,好像没有遇到类似的问题,本人第一次做windows开发,我怀疑是不是某个很常识的地方搞错了引起这个问题(INF文件中什么错了?还是某个参数没有设置)
    在此问题已纠结了快一个星期了,无任进展,跪求大牛解惑







驱动菜鸟
get0malloc
驱动牛犊
驱动牛犊
  • 注册日期2014-01-09
  • 最后登录2014-04-01
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2014-01-10 08:48
     不会是问题太简单了,在家不屑于回答吧,鄙人 着实卡在这个问题上求点拨!
驱动菜鸟
get0malloc
驱动牛犊
驱动牛犊
  • 注册日期2014-01-09
  • 最后登录2014-04-01
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2014-01-10 08:51
        推荐点关相的贴子或资料也行呀。
驱动菜鸟
get0malloc
驱动牛犊
驱动牛犊
  • 注册日期2014-01-09
  • 最后登录2014-04-01
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2014-01-14 10:48
    结贴,确实是个很简单的问题,INF文件中关于MSI中断部分写错一点导致没有能加入到注册表中,所以MSI中断一个未能初始化成功。
驱动菜鸟
游客

返回顶部