Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: WDF и конфигурационное пространство PCI-Express  (Прочитано 4267 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cppdev
Интересующийся

ru
Offline Offline

« : 24-11-2011 08:10 » 

Необходимо отключить генерацию прерываний платой. OC WinXP, плата на Xilinx Vertex 6.
Делаю через Command-регистр. Все стандартно:

получение интерфейса

Код: (C)
status = WdfFdoQueryForInterface(DevExt->Device,
&GUID_BUS_INTERFACE_STANDARD,
(PINTERFACE) &DevExt->BusInterface,
sizeof(BUS_INTERFACE_STANDARD), 1, NULL);

if (!NT_SUCCESS(status)){
        return status;
    }

далее

Код: (C)
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) совпадают. Есть идеи, в чем может быть проблема?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines