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

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

ru
Offline Offline

« : 02-08-2016 13:23 » 

Здравствуйте!
Разрабатываю kmdf драйвер для pci устройства. Оно имеет один бар размером 0х80000 байт. За основу взял стандартный пример PLX9x5x. Переделал его под своё устройство.
На данный момент работает чтение, запись в устройство, обработка прерываний от него.

Моя главная проблема в том, что драйвер не всегда встаёт на устройство. Чтобы драйвер встал с первой или второй попытки необходимо:
   1) удалить его из системы и перезагрузить целевую машину.
   2) после загрузки операционной системы установить драйвер через диспетчер задач.

Признаком успешной установки драйвера служит запрос на запись (WRITE_REGISTER_ULONG) к устройству при вызове функции PLxEvtInterruptEnable. Этот запрос фиксирую через JTAG на ПЛИСе устройства.
Если этого запроса нет, то и остальные запросы до устройства не доходят. Приходится переустанавливать драйвер несколько раз, или перезагружать компьютер, и повторять установку драйвера. Как-будто что-то не так с указателем на базовый адрес устройства.
При удачной установке и при неудачной я вижу, что ОС находит и инициализирует память как регистровую (я веду обмен данными через регистровую память).

Подскажите, пожалуйста, в чём может быть данная проблема? Хочется чтобы драйвер оставался в системе и после перезагрузке корректно устанавливался.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 02-08-2016 15:46 » 

что происходит если драйвер не встает? как это выглядит со стороны операционной системы?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #2 : 03-08-2016 05:59 » 

Если драйвер встаёт неправильно, то со стороны операционной системы это никак не проявляется. Ошибок никаких от операционной системы. Вывод самого драйвера тоже ничем не отличается от правильной установки. Сейчас посмотрю, может будет разница в setupapi.dev.log.

Добавлено через 34 минуты и 2 секунды:
логи тоже одинаковые

Добавлено через 1 час, 8 минут и 35 секунд:
Поскольку я взял драйвер-пример и изменил его под свои нужды в нём осталось очень много мусора (невызываемые функции, структуры, переменные, функции которые вызываются, но в них ничего не происходит).
Я закомментировал две строчки потому что соответствующие функции у меня не вызываются.

   #ifdef ALLOC_PRAGMA
   #pragma alloc_text (INIT, DriverEntry)
   #pragma alloc_text (PAGE, PLxEvtDeviceAdd)
   #pragma alloc_text (PAGE, PLxEvtDevicePrepareHardware)
   #pragma alloc_text (PAGE, PLxEvtDeviceReleaseHardware)
   //#pragma alloc_text (PAGE, PLxEvtDeviceD0Exit)
   #pragma alloc_text (PAGE, PlxEvtDriverContextCleanup)
   //#pragma alloc_text (PAGE, PLxSetIdleAndWakeSettings)
   #endif

В результате драйвер ведёт себя нормально уже в течении нескольких перезапусков. Тестирование продолжу.
Я обычно пишу на С. Можете мне объяснить что делает данная директива и как это влияло на поведение драйвера? Прочитав справку https://msdn.microsoft.com/ru-ru/library/sw8ty6zf.aspx мало что понял.
Спасибо).
« Последнее редактирование: 03-08-2016 07:42 от sergeyvass » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 03-08-2016 09:25 » 

директива помечает, что функция размещена в paged памяти. в отличии от non-paged, данная память может быть свопирована на диск, поэтому данные размещенные в ней нельзя использовать на DISPATCH_LEVEL и выше(или APC_LEVEL - тоже? забыл уже). то есть, чтобы иметь доступ к этой памяти должно быть возможно переключение контекста (APC или PASSIVE_LEVEL) который происходит при подгрузке ее из свопа.

Добавлено через 49 секунд:
это пометка для линкера когда он функции по сегментам раскладывает.

Добавлено через 57 секунд:
но вообще такое поведение больше похоже на ошибки в других местах которые приводят к непредсказуемым результатам.
« Последнее редактирование: 03-08-2016 09:27 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #4 : 03-08-2016 11:25 » 

Спасибо за пояснения. Поспешил я с празднованием. Драйвер вёл себя хорошо только при нескольких перезагрузках, потом стал опять слетать. Возможно проблемы есть и в самой плате.

Добавлено через 52 минуты и 2 секунды:
Убрал из драйвера инициализацию прерываний, очередей ввода\вывода, создание интерфейса.
При установке драйвер транслирует память, записывает в устройство слово (по нему я смотрю правильно ли встал драйвер) и регистрирует callback на освобождение памяти при удалении драйвера. Проблема осталась та же.

Код:
NTSTATUS
PLxPrepareHardware(
IN PDEVICE_EXTENSION DevExt,
IN WDFCMRESLIST     ResourcesTranslated
)
{
ULONG               i;
NTSTATUS            status = STATUS_SUCCESS;
CHAR              * bar;

BOOLEAN             foundRegs = FALSE;
PHYSICAL_ADDRESS    regsBasePA = { 0 };
ULONG               regsLength = 0;

PCM_PARTIAL_RESOURCE_DESCRIPTOR  desc;

PAGED_CODE();

for (i = 0; i < WdfCmResourceListGetCount(ResourcesTranslated); i++)
{

desc = WdfCmResourceListGetDescriptor(ResourcesTranslated, i);

if (!desc)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfResourceCmGetDescriptor failed");
return STATUS_DEVICE_CONFIGURATION_ERROR;
}

TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "--->Type=%I64X  Memory.Length =%I64X", desc->Type, desc->u.Memory.Length);

switch (desc->Type)
{

case CmResourceTypeMemory:

bar = NULL;

if (desc->u.Memory.Length == PCI9656_SRAM_SIZE)
{

regsBasePA = desc->u.Memory.Start;
regsLength = desc->u.Memory.Length;
foundRegs = TRUE;
bar = "BAR0";
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "---> -BAR0");
}

TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,
" - Memory Resource [%I64X-%I64X] %s",
desc->u.Memory.Start.QuadPart,
desc->u.Memory.Start.QuadPart +
desc->u.Memory.Length,
(bar) ? bar : "<unrecognized>");
break;

default:
//
// Ignore all other descriptors
//
break;
}
}
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "---> after for !");

if (!foundRegs)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"PLxMapResources: Missing resources foundSram=");
return STATUS_DEVICE_CONFIGURATION_ERROR;
}


//
// Map in the Registers Memory resource: BAR0
//
if (foundRegs)
{
DevExt->RegsBase = (PUCHAR)LocalMmMapIoSpace(regsBasePA,
regsLength);


if (!DevExt->RegsBase)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
" - Unable to map Registers memory %08I64X, length %d",
regsBasePA.QuadPart, regsLength);
return STATUS_INSUFFICIENT_RESOURCES;
}

DevExt->RegsLength = regsLength;

TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,
" - Registers %p, length %I64x",
DevExt->RegsBase, DevExt->RegsLength);

//
// Set seperated pointer to PCI9656_REGS structure.
//

DevExt->Regs = (PPCI9656_REGS)(DevExt->RegsBase);
WRITE_REGISTER_ULONG((PULONG)(&DevExt->Regs->Space0_Range + 0xA008), 0x34);  // по этой строчке я понимаю, что драйвер встал правильно
}
    return status;
}

Это урезанная стандартная функция. Может есть ещё места которые можно проверить? Повторюсь, кроме инициализации памяти эта версия драйвера больше ничего не может.
« Последнее редактирование: 03-08-2016 12:17 от sergeyvass » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 03-08-2016 17:08 » 

лог отладки и TraceEvents можете записать?

Добавлено через 3 минуты и 47 секунд:
и после загрузки - проведите процедуру отключения или удаления устройства вручную через диспечер устройств  - и тоже лог давайте посмотрим..
« Последнее редактирование: 03-08-2016 17:12 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #6 : 04-08-2016 12:29 » 

Здравствуйте!
TraceEvents - это отладочные сообщения в режиме ядра?

Первый столбец это ядро процессора.
Вывод TraceView при правильной установке и удалении:
Код:
0 1 08\04\2016-15:08:21:607 Pci9656 Sample - Driver Framework Edition.
0 2 08\04\2016-15:08:21:608 --> PLxEvtDeviceAdd+
0 3 08\04\2016-15:08:21:608 --> registration callbacks
0 4 08\04\2016-15:08:21:608 Creating Device
0 5 08\04\2016-15:08:21:608      AddDevice PDO (0x857C1B58) FDO (0x85D515B0), DevExt (0x8712C190)
0 6 08\04\2016-15:08:21:608 Creating intarface
0 7 08\04\2016-15:08:21:609 MaximumTransferLength 8192
0 8 08\04\2016-15:08:21:609 Number of DTEs 3
0 9 08\04\2016-15:08:21:609 ----> Queue Init
0 10 08\04\2016-15:08:21:609 ----> Queue Write Inited
0 11 08\04\2016-15:08:21:609 ----> Queue Read init
0 12 08\04\2016-15:08:21:609 - The DMA Profile is WdfDmaProfileScatterGather64Duplex
0 13 08\04\2016-15:08:21:609 WriteCommonBuffer 0x85D91000  (#0x7E791000), length 96
0 14 08\04\2016-15:08:21:609 ReadCommonBuffer  0x85DA8000  (#0x7E7A8000), length 96
0 15 08\04\2016-15:08:21:609 <-- PLxEvtDeviceAdd STATUS_SUCCESS
0 16 08\04\2016-15:08:21:616 --> PLxEvtDevicePrepareHardware
0 17 08\04\2016-15:08:21:616 ---> PLxPrepareHardware
0 18 08\04\2016-15:08:21:616 --->Type=3  Memory.Length =80000
0 19 08\04\2016-15:08:21:616 ---> -BAR0
0 20 08\04\2016-15:08:21:616 - Memory Resource [FDB80000-FDC00000] BAR0
0 21 08\04\2016-15:08:21:616 --->Type=81  Memory.Length =0
0 22 08\04\2016-15:08:21:616 --->Type=2  Memory.Length =3
0 23 08\04\2016-15:08:21:616 ---> after for !
0 24 08\04\2016-15:08:21:616 - Registers C7000000, length 80000
0 25 08\04\2016-15:08:21:616 <-- PLxEvtDevicePrepareHardware, status STATUS_SUCCESS
1 26 08\04\2016-15:08:21:616 PLxEvtInterruptEnable: Interrupt 0x791BDDD8, Device 0x78ED3FE8
1 27 08\04\2016-15:08:21:616 -->InterruptEnable: END RegsBASE=C7000000 csr=C7000068


0 1068 08\04\2016-15:11:16:799 PLxEvtInterruptDisable: Interrupt 0x791BDDD8, Device 0x78ED3FE8
1 1069 08\04\2016-15:11:16:799 --> PLxEvtDeviceReleaseHardware
1 1070 08\04\2016-15:11:16:799 --> release REGISTERS
1 1071 08\04\2016-15:11:16:799 <-- PLxEvtDeviceReleaseHardware
0 1072 08\04\2016-15:11:16:809 PlxEvtDriverContextCleanup: enter

Это вывод при неправильной установке драйвера:
Код:
1 1073 08\04\2016-15:14:31:187 Pci9656 Sample - Driver Framework Edition.
1 1074 08\04\2016-15:14:31:187 --> PLxEvtDeviceAdd+
1 1075 08\04\2016-15:14:31:187 --> registration callbacks
1 1076 08\04\2016-15:14:31:187 Creating Device
1 1077 08\04\2016-15:14:31:187      AddDevice PDO (0x857C1B58) FDO (0x86973A08), DevExt (0x870D1B68)
1 1078 08\04\2016-15:14:31:187 Creating intarface
1 1079 08\04\2016-15:14:31:189 MaximumTransferLength 8192
1 1080 08\04\2016-15:14:31:189 Number of DTEs 3
1 1081 08\04\2016-15:14:31:189 ----> Queue Init
1 1082 08\04\2016-15:14:31:189 ----> Queue Write Inited
1 1083 08\04\2016-15:14:31:189 ----> Queue Read init
1 1084 08\04\2016-15:14:31:189 - The DMA Profile is WdfDmaProfileScatterGather64Duplex
1 1085 08\04\2016-15:14:31:189 WriteCommonBuffer 0x85D31000  (#0x7E731000), length 96
1 1086 08\04\2016-15:14:31:189 ReadCommonBuffer  0x85D32000  (#0x7E732000), length 96
1 1087 08\04\2016-15:14:31:189 <-- PLxEvtDeviceAdd STATUS_SUCCESS
1 1088 08\04\2016-15:14:31:196 --> PLxEvtDevicePrepareHardware
1 1089 08\04\2016-15:14:31:196 ---> PLxPrepareHardware
1 1090 08\04\2016-15:14:31:196 --->Type=3  Memory.Length =80000
1 1091 08\04\2016-15:14:31:196 ---> -BAR0
1 1092 08\04\2016-15:14:31:196 - Memory Resource [FDB80000-FDC00000] BAR0
1 1093 08\04\2016-15:14:31:196 --->Type=81  Memory.Length =0
1 1094 08\04\2016-15:14:31:196 --->Type=2  Memory.Length =3
1 1095 08\04\2016-15:14:31:196 ---> after for !
1 1096 08\04\2016-15:14:31:196 - Registers B4400000, length 80000
1 1097 08\04\2016-15:14:31:196 <-- PLxEvtDevicePrepareHardware, status STATUS_SUCCESS
1 1098 08\04\2016-15:14:31:196 PLxEvtInterruptEnable: Interrupt 0x79013518, Device 0x78F2E610
1 1099 08\04\2016-15:14:31:196 -->InterruptEnable: END RegsBASE=B4400000 csr=B4400068


0 1104 08\04\2016-15:15:21:110 PLxEvtInterruptDisable: Interrupt 0x79013518, Device 0x78F2E610
1 1105 08\04\2016-15:15:21:110 --> PLxEvtDeviceReleaseHardware
1 1106 08\04\2016-15:15:21:110 --> release REGISTERS
1 1107 08\04\2016-15:15:21:110 <-- PLxEvtDeviceReleaseHardware
0 1108 08\04\2016-15:15:21:116 PlxEvtDriverContextCleanup: enter

Подскажите, пожалуйста, как получить лог отладки? Для этого нужно подключиться к процессу установки драйвера через windbg, запущенный на host-машине? Я не смог поднять отладку через нульмодемный кабель.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 04-08-2016 21:03 » 

ну собственно я этот лог и имел в виду...
криминала на первый взгляд не видно
правда вот этого не понял: (PULONG)(&DevExt->Regs->Space0_Range + 0xA008
а дело точно в драйвере? смущает то, что вы говорите иногда перезапуск драйвера не помогает - приходится комп перезагружать.

такое, мне кажется, либо при некорректной деинициализации или выгрузке драйвера происходит обычно, но тогда драйвер просто не устанавливался второй раз без перезагрузки. либо что то с железом не то что-то...
правильно я понимаю, что если после загрузки машины драйвер встал то дальше работает. а если с первого раза не встал то и перестановка без перезагрузки не помогает ?
кстати, если не путаю, PCITree позволял писать в устройства напрямую - попробуйти им писать - всегда реакция есть?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #8 : 05-08-2016 10:06 » 

1) Так и не понял, нужен лог из winDbg?
Я настраивал соединение host-target через нуль модемный кабель. На целевой машине разрешил отладку через Com port. Но подключиться так и не смог удалённо через winDbg. Может нужно что-то настроить в дополнительных параметрах брандмауэра, касающихся подключений?

2) (PULONG)(&DevExt->Regs->Space0_Range + 0xA008 - это указатель и смещение на регистр в моём устройстве для функции записи. Если запись проходит, значит драйвер встал правильно.
3) Плата сделана на нашем предприятии, на ней много переделок, ошибок и глюки тоже встречаются. Я отлаживал её под QNX  и таких проблем не было. Железу я сам до конца не доверяю.
4) После перезагрузки драйвер встал самостоятельно всего два раза, за всё время разработки. Обычно перезагружаю с удалённым драйвером и затем чаще всего драйвер встаёт с 1-3 установки. Таким образом если с первого раза не встал, то может встать и после некоторого количества неудачных установок. Каких либо закономерностей не заметил.
5) Работа с PCITree.
Могу- могу и писать, и читать из устройства через PCITree.
Код:
1) Установил драйвер правильно
   могу
2) Удалил драйвер
   могу
3) Установил драйвер не правильно
   не могу
4) Удалил драйвер
   не могу
5) Перезагрузил компьютер
   могу (драйвер не установлен)
6) Установил не правильно
   не могу
7) Удалил драйвер
   не могу
8) Перезагрузил
   могу
9) Установил не правильно
   не могу
10) Удалил
   не могу
11) Перезагрузил
12) Установил драйвер правильно
   могу
13) Удалил
   могу
14) Установил правильно
   могу
15) Удалил
   могу
16) Установил не правильно
   не могу
17) Установил правильно
   могу
18) удалил
   могу
19) Установил правильно
20) Перезагрузка
   не могу
21) удалил
   не могу
22) Установил правильно
   могу
23) удалил
   могу
...

Нашёл другую плату с тем же функционалом, но другой ПЛИС. Попробую переделать проект под неё и посмотреть на поведение. Хотя она считалась ещё глючнее.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 08-08-2016 14:17 » 

да, похоже либо на некорректное действие драйвера либо какая то особенность совместно с железом.
там что то по PnP происходит, кроме отображения памяти и записи в ее?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #10 : 09-08-2016 08:21 » 

pnpPowerCallbacks.EvtDevicePrepareHardware = PLxEvtDevicePrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = PLxEvtDeviceReleaseHardware;

Регистрирую только эти два callback'a. В них происходит инициализация памяти и удаление.
Делал версию драйвера, в которой убрал все функции кроме инициализации памяти ( никаких прерываний, никакой обработки запросов ввода-вывода). Поведение такое же. Наверное, проблема или в установке драйвера и памяти, или в самой плате.

Почему PCITree не мог работать с устройством даже после удаления неправильно установленного драйвера? Моё устройство в системе осталось, его адрес не поменялся, диапазон системной памяти, выделенной ему БИОСом остался темже. Почему же тогда я не видел запросов на чтение\запись в шине? Ведь чтобы послать запрос устройству нужно знать диапазон системной памяти, чтобы её протранслировать (думаю PCITree работает по этому принципу). Что мог сломать драйвер при своей неправильной установке, что потом может починиться при последующей правильной установке?

Зайдём со стороны устройства. При установке драйвера и при его удалении к устройству приходит ряд запросов по PCI шине. Думаю происходит считывание конфигурационного пространства. Среди запросов встречается начало диапазона системной памяти, выделенной данному устройству (значит читается BAR и переопределяется диапазон, который остаётся тем же, или повторно записывается). В принципе можно проанализировать и эти запросы, может там будет что-то интересное.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 09-08-2016 12:48 » 

инициализация памяти  - имеется в виду мапирование LocalMmMapIoSpace?
то что PCITree не работает - может плата попросту зависла? точнее контролер PCI в ней. его никак посмотреть нельзя? в каком он состоянии ?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #12 : 09-08-2016 13:29 » 

Да, инициализация памяти, маппирование, транслирование, для меня синонимы.
У меня есть возможность смотреть сигналы шины PCI (входные сигналы для платы, ими не управляет контроллер PCI платы). По адресу моей платы (№ шины, № устройства, № функции) нет никаких запросов, после неправильной установки, а так же после удаления неправильно установленного драйвера.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 10-08-2016 10:22 » 

плата поддерживает 64-битные адреса? может CmResourceTypeMemoryLarge?
если ресурсы вообще не трогать не мапировать - убрать это из драйвера, PCITree что покажет?
вы говорили прерывание есть, не обработанное прерывание не может такой эффект давать?


Добавлено через 42 секунды:
кстати код сильно от примера сейчас отличается?
« Последнее редактирование: 10-08-2016 10:22 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #14 : 11-08-2016 07:17 » 

Убрал инициализацию ресурсов, создание интерфейсов, отключил отладочный вывод. Ничего из этого не помогло. PCITree ведёт себя точно также (иногда драйвер встаёт правильно и я могу прочитать через PCITree, а иногда не правильно и я не могу читать из устройства).

Про поддержку 64-х битных адресов спрошу у разработчика. Я об этом не думал никогда.

 Вот минимальный код который у меня установился на устрйоство, но проблема осталась.
Код:
DriverEntry()
{
 WPP_INIT_TRACING( DriverObject, RegistryPath );
    WDF_DRIVER_CONFIG_INIT( &config, PLxEvtDeviceAdd );
    WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
    attributes.EvtCleanupCallback = PlxEvtDriverContextCleanup;

    status = WdfDriverCreate( DriverObject,
                              RegistryPath,
                              &attributes,
                              &config,
                              WDF_NO_HANDLE);

    if (!NT_SUCCESS(status)) {
        WPP_CLEANUP(DriverObject);
    }

    return status;
}


PLxEvtDeviceAdd( )
{
    NTSTATUS                   status = STATUS_SUCCESS;
    WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
    WDF_OBJECT_ATTRIBUTES       attributes;
    WDFDEVICE                   device;
    PDEVICE_EXTENSION           devExt = NULL;

    UNREFERENCED_PARAMETER( Driver );
    PAGED_CODE();

    WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
    WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
   WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_EXTENSION);
attributes.SynchronizationScope = WdfSynchronizationScopeDevice;

status = WdfDeviceCreate( &DeviceInit, &attributes, &device );


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

    devExt = PLxGetDeviceContext(device);

    devExt->Device = device;
status = STATUS_SUCCESS;
  return status;
}

Выставленное прерывание не запрещает чтение/запись из устройства.
Код я менял не сильно, но много удалил не используемых кусков.
Записан
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #15 : 11-08-2016 07:22 » 

64 -х битная адресация не поддерживается в моём устройстве.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 12-08-2016 15:55 » 

чудеса. может с настройками компилятора/линкера что не так?
Inf файл - из примера?
хм. драйвер точно грузится? мож в кеше драйверов где застряла другая версия?(шизоидные предположения пошли)
в BIOS - PNP OS Installed = YES/NO ?
так. посмотрите в PCITree - все конфигурационное пространство в этих случаях. в частности интересно содержание поля Command и Status. нет отличий?


PS входные параметры приведенных выше функции вы только при вставке на форум удалили?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #17 : 23-08-2016 08:52 » 

inf файл взят из примера (изменены vendor и device ID).
PNP OS Installed такой опции у меня нет.
У меня стоит Resources Controlled By -> Auto(ESCD)  ( БИОС автоматически конфигурирует PnP устрйоства).
https://support.microsoft.com/ru-ru/kb/321779  - здесь прочитал, что в БИОСе с опциями ACPI параметр PNP OS Installed не учитывается. У меня как раз ACPI Function включен.

Не понимаю про кеш драйверов. Уверен, что драйвер грузится один и тот же (определяю это по отладочному выводу драйвера в traceview).

С конфигурационным пространством интереснее. При удачной установке драйвера в регистре control выставляются два бита (работа с памятью и работа в качестве мастера шины). При неудачной установке регистр равен 0. Причём меняется регистр control в момент установки драйвера.

Когда выставляется бит 1 (работа с памятью) регистра control? После удачного выделения операционной системой или БИОСом диапазона адресов запрашиваемого BARом? Может мне перед транслированием адреса вызывать перевыделение ресурсов для шины PCI если control = 0?

Записан
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #18 : 24-08-2016 06:46 » 

Входные параметры я убрал при вставке на форум
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 24-08-2016 10:17 » 

про первые два вопроса это я от безысходности)))
первый Bus Master Enable
а второй - это что?

Добавлено через 5 минут и 9 секунд:
а со стасусом что?

Добавлено через 5 минут и 8 секунд:
вроде операционка должна включать это во время IRP_MN_START_DEVICE.... и может быть от PowerState как-то зависеть
« Последнее редактирование: 24-08-2016 10:27 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #20 : 24-08-2016 11:28 » 

Цитата
первый Bus Master Enable
а второй - это что?
Второй это - Memory Space

Цитата
а со стасусом что?
Статус один и тот же 0х0200 (DEVSEL Timing выставлен на medium).

В прошивке ПЛИС не реализовано энергосберегающих режимов.Из драйвера убрал все операции с ними.
Провёл следующий удачный эксперимент. После неправильной установки драйвера выставил через pciTree правильную конфигурацию регистра control и всё заработало.
Сейчас хочу после трансляции памяти выставлять этот регистр принудительно в нужное состоянии (и вернуться к этому если будет много времени и желания).
Насколько я понял есть рекомендуемый путь записи в конфигурационное пространство (составить запрос для драйвера шины и получить от него ответ в виде считанного конфигурационного пространства), и устаревший (прямая запись через SetBusData). Что получится напишу.
Записан
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #21 : 24-08-2016 13:18 » 

Пошёл плохим путём, добавил функцию
Код:
HalSetBusDataByOffset()
сразу после трансляции памяти чтобы выставить регистр control в нужное значение.
Пока всё работает как надо, хоть проблема и не решена, но оставлю так.
Большое Вам спасибо, Ochkarik!)   
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 24-08-2016 13:54 » 

PLxEvtDevicePrepareHardware в рамках  EvtDeviceD0Entry же выполняется. D0 -это одно из состояний PowerState.
вот тут что то подобное обсуждали, но похоже не нашли выход.
http://osronline.com/showThread.CFM?link=211479
http://osronline.com/showThread.CFM?link=220564
попробуйте посмотреть повнимательнее. у меня к сожалению нет возможности подробно вчитываться. может натолкнет на мысль.

PS ну наверное это не очень красивый путь... такая мина замедленного действия)  попробуйте вернуться - расскажите обязательно что будет получаться)
PPS всегда пожалуйста)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 24-08-2016 14:01 » new

попробуйте WdfDeviceSetPowerCapabilities() сделать... вдруг с ней что не так по умолчанию.
или прочитать что там по умолчанию стоит.
или почитать что там поумолчанке в WDF_DEVICE_POWER_CAPABILITIES стоит, она в каком то обработчике должна присылаться.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines