Необходимо отключить генерацию прерываний платой. OC WinXP, плата на Xilinx Vertex 6.
Делаю через Command-регистр. Все стандартно:
получение интерфейса
status = WdfFdoQueryForInterface(DevExt->Device,
&GUID_BUS_INTERFACE_STANDARD,
(PINTERFACE) &DevExt->BusInterface,
sizeof(BUS_INTERFACE_STANDARD), 1, NULL);
if (!NT_SUCCESS(status)){
return status;
}
далее
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) UCHAR buffer[sizeof(PCI_COMMON_CONFIG)];
PPCI_COMMON_CONFIG pPciConfig = (PPCI_COMMON_CONFIG) buffer;
bytesRead = DevExt->BusInterface.GetBusData(DevExt->BusInterface.Context,
PCI_WHICHSPACE_CONFIG,
buffer,
FIELD_OFFSET(PCI_COMMON_CONFIG, VendorID),
sizeof(PCI_COMMON_CONFIG));
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT, "Command = 0x%X, Status = 0x%X", pPciConfig->Command, pPciConfig->Status); //DBG1
pPciConfig->Command = pPciConfig->Command | PCI_DISABLE_LEVEL_INTERRUPT;
bytesWritten = DevExt->BusInterface.SetBusData(DevExt->BusInterface.Context,
PCI_WHICHSPACE_CONFIG,
buffer,
FIELD_OFFSET(PCI_COMMON_CONFIG, VendorID),
sizeof(PCI_COMMON_CONFIG));
bytesRead = DevExt->BusInterface.GetBusData(DevExt->BusInterface.Context,
PCI_WHICHSPACE_CONFIG,
buffer,
FIELD_OFFSET(PCI_COMMON_CONFIG, VendorID),
sizeof(PCI_COMMON_CONFIG));
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT, "Command = 0x%X, Status = 0x%X", pPciConfig->Command, pPciConfig->Status); //DBG2
Проверка результата вызова функций есть, здесь не приведена, запись \ чтение без ошибок.
В точке DBG1 command-регистр = 0x100, в точке DBG2 command-регистр = 0x500 те бит устанавливается,
НО если посмотреть состояние этого регистра через сторонние утилиты (я смотрю PciTree),
то он все время равен 0х107 (похоже на правду вообще говоря, сравниваю с результатами из ChipScop'а). При этом все остальные
регистры (DevId, VenId, Status) совпадают. Есть идеи, в чем может быть проблема?