阅读:4252回复:3
求助,PCIE驱动在win7上的收不到MSI中断问题
最近在做一个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文件中什么错了?还是某个参数没有设置) 在此问题已纠结了快一个星期了,无任进展 ![]() ![]() |
|
|
沙发#
发布于:2014-01-10 08:48
不会是问题太简单了,在家不屑于回答吧,鄙人 着实卡在这个问题上求点拨!
|
|
|
板凳#
发布于:2014-01-10 08:51
推荐点关相的贴子或资料也行呀。
|
|
|
地板#
发布于:2014-01-14 10:48
结贴,确实是个很简单的问题,INF文件中关于MSI中断部分写错一点导致没有能加入到注册表中,所以MSI中断一个未能初始化成功。
|
|
|