|
阅读:4687回复: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中断一个未能初始化成功。
|
|
|
,跪求大牛解惑
!