| 
			| 
					
						| sergeyvass 
								Интересующийся    Offline | 
								|  | «  : 02-08-2016 13:23 »  |  | 
 
 Здравствуйте!Разрабатываю kmdf драйвер для pci устройства. Оно имеет один бар размером 0х80000 байт. За основу взял стандартный пример PLX9x5x. Переделал его под своё устройство.
 На данный момент работает чтение, запись в устройство, обработка прерываний от него.
 
 Моя главная проблема в том, что драйвер не всегда встаёт на устройство. Чтобы драйвер встал с первой или второй попытки необходимо:
 1) удалить его из системы и перезагрузить целевую машину.
 2) после загрузки операционной системы установить драйвер через диспетчер задач.
 
 Признаком успешной установки драйвера служит запрос на запись (WRITE_REGISTER_ULONG) к устройству при вызове функции PLxEvtInterruptEnable. Этот запрос фиксирую через JTAG на ПЛИСе устройства.
 Если этого запроса нет, то и остальные запросы до устройства не доходят. Приходится переустанавливать драйвер несколько раз, или перезагружать компьютер, и повторять установку драйвера. Как-будто что-то не так с указателем на базовый адрес устройства.
 При удачной установке и при неудачной я вижу, что ОС находит и инициализирует память как регистровую (я веду обмен данными через регистровую память).
 
 Подскажите, пожалуйста, в чём может быть данная проблема? Хочется чтобы драйвер оставался в системе и после перезагрузке корректно устанавливался.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Ochkarik | 
								|  | « Ответ #1 : 02-08-2016 15:46 »  |  | 
 
 что происходит если драйвер не встает? как это выглядит со стороны операционной системы? |  
						| 
								|  |  
								|  |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    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 | 
								|  | « Ответ #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 уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    Offline | 
								|  | « Ответ #4 : 03-08-2016 11:25 »  |  | 
 
 Спасибо за пояснения. Поспешил я с празднованием. Драйвер вёл себя хорошо только при нескольких перезагрузках, потом стал опять слетать. Возможно проблемы есть и в самой плате.Добавлено через 52 минуты и 2 секунды: Убрал из драйвера инициализацию прерываний, очередей ввода\вывода, создание интерфейса.  При установке драйвер транслирует память, записывает в устройство слово (по нему я смотрю правильно ли встал драйвер) и регистрирует callback на освобождение памяти при удалении драйвера. Проблема осталась та же.  NTSTATUSPLxPrepareHardware(
 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 | 
								|  | « Ответ #5 : 03-08-2016 17:08 »  |  | 
 
 лог отладки и TraceEvents можете записать?
 Добавлено через 3 минуты и 47 секунд:
 и после загрузки - проведите процедуру отключения или удаления устройства вручную через диспечер устройств  - и тоже лог давайте посмотрим..
 |  
						| 
								|  |  
								| « Последнее редактирование: 03-08-2016 17:12 от Ochkarik » |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    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 | 
								|  | « Ответ #7 : 04-08-2016 21:03 »  |  | 
 
 ну собственно я этот лог и имел в виду... криминала на первый взгляд не видно
 правда вот этого не понял: (PULONG)(&DevExt->Regs->Space0_Range + 0xA008
 а дело точно в драйвере? смущает то, что вы говорите иногда перезапуск драйвера не помогает - приходится комп перезагружать.
 
 такое, мне кажется, либо при некорректной деинициализации или выгрузке драйвера происходит обычно, но тогда драйвер просто не устанавливался второй раз без перезагрузки. либо что то с железом не то что-то...
 правильно я понимаю, что если после загрузки машины драйвер встал то дальше работает. а если с первого раза не встал то и перестановка без перезагрузки не помогает ?
 кстати, если не путаю, PCITree позволял писать в устройства напрямую - попробуйти им писать - всегда реакция есть?
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    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 | 
								|  | « Ответ #9 : 08-08-2016 14:17 »  |  | 
 
 да, похоже либо на некорректное действие драйвера либо какая то особенность совместно с железом. там что то по PnP происходит, кроме отображения памяти и записи в ее?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    Offline | 
								|  | « Ответ #10 : 09-08-2016 08:21 »  |  | 
 
 pnpPowerCallbacks.EvtDevicePrepareHardware = PLxEvtDevicePrepareHardware;pnpPowerCallbacks.EvtDeviceReleaseHardware = PLxEvtDeviceReleaseHardware;
 
 Регистрирую только эти два callback'a. В них происходит инициализация памяти и удаление.
 Делал версию драйвера, в которой убрал все функции кроме инициализации памяти ( никаких прерываний, никакой обработки запросов ввода-вывода). Поведение такое же. Наверное, проблема или в установке драйвера и памяти, или в самой плате.
 
 Почему PCITree не мог работать с устройством даже после удаления неправильно установленного драйвера? Моё устройство в системе осталось, его адрес не поменялся, диапазон системной памяти, выделенной ему БИОСом остался темже. Почему же тогда я не видел запросов на чтение\запись в шине? Ведь чтобы послать запрос устройству нужно знать диапазон системной памяти, чтобы её протранслировать (думаю PCITree работает по этому принципу). Что мог сломать драйвер при своей неправильной установке, что потом может починиться при последующей правильной установке?
 
 Зайдём со стороны устройства. При установке драйвера и при его удалении к устройству приходит ряд запросов по PCI шине. Думаю происходит считывание конфигурационного пространства. Среди запросов встречается начало диапазона системной памяти, выделенной данному устройству (значит читается BAR и переопределяется диапазон, который остаётся тем же, или повторно записывается). В принципе можно проанализировать и эти запросы, может там будет что-то интересное.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Ochkarik | 
								|  | « Ответ #11 : 09-08-2016 12:48 »  |  | 
 
 инициализация памяти  - имеется в виду мапирование LocalMmMapIoSpace? то что PCITree не работает - может плата попросту зависла? точнее контролер PCI в ней. его никак посмотреть нельзя? в каком он состоянии ?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    Offline | 
								|  | « Ответ #12 : 09-08-2016 13:29 »  |  | 
 
 Да, инициализация памяти, маппирование, транслирование, для меня синонимы.У меня есть возможность смотреть сигналы шины PCI (входные сигналы для платы, ими не управляет контроллер PCI платы). По адресу моей платы (№ шины, № устройства, № функции) нет никаких запросов, после неправильной установки, а так же после удаления неправильно установленного драйвера.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Ochkarik | 
								|  | « Ответ #13 : 10-08-2016 10:22 »  |  | 
 
 плата поддерживает 64-битные адреса? может CmResourceTypeMemoryLarge?если ресурсы вообще не трогать не мапировать - убрать это из драйвера, PCITree что покажет?
 вы говорили прерывание есть, не обработанное прерывание не может такой эффект давать?
 
 
 Добавлено через 42 секунды:
 кстати код сильно от примера сейчас отличается?
 |  
						| 
								|  |  
								| « Последнее редактирование: 10-08-2016 10:22 от Ochkarik » |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    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 
								Интересующийся    Offline | 
								|  | « Ответ #15 : 11-08-2016 07:22 »  |  | 
 
 64 -х битная адресация не поддерживается в моём устройстве. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Ochkarik | 
								|  | « Ответ #16 : 12-08-2016 15:55 »  |  | 
 
 чудеса. может с настройками компилятора/линкера что не так?Inf файл - из примера?
 хм. драйвер точно грузится? мож в кеше драйверов где застряла другая версия?(шизоидные предположения пошли)
 в BIOS - PNP OS Installed = YES/NO ?
 так. посмотрите в PCITree - все конфигурационное пространство в этих случаях. в частности интересно содержание поля Command и Status. нет отличий?
 
 
 PS входные параметры приведенных выше функции вы только при вставке на форум удалили?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    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 
								Интересующийся    Offline | 
								|  | « Ответ #18 : 24-08-2016 06:46 »  |  | 
 
 Входные параметры я убрал при вставке на форум |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Ochkarik | 
								|  | « Ответ #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 уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    Offline | 
								|  | « Ответ #20 : 24-08-2016 11:28 »  |  | 
 
 первый Bus Master Enableа второй - это что?
 Второй это - Memory Space а со стасусом что? Статус один и тот же 0х0200 (DEVSEL Timing выставлен на medium). В прошивке ПЛИС не реализовано энергосберегающих режимов.Из драйвера убрал все операции с ними. Провёл следующий удачный эксперимент. После неправильной установки драйвера выставил через pciTree правильную конфигурацию регистра control и всё заработало. Сейчас хочу после трансляции памяти выставлять этот регистр принудительно в нужное состоянии (и вернуться к этому если будет много времени и желания). Насколько я понял есть рекомендуемый путь записи в конфигурационное пространство (составить запрос для драйвера шины и получить от него ответ в виде считанного конфигурационного пространства), и устаревший (прямая запись через SetBusData). Что получится напишу. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| sergeyvass 
								Интересующийся    Offline | 
								|  | « Ответ #21 : 24-08-2016 13:18 »  |  | 
 
 Пошёл плохим путём, добавил функцию   сразу после трансляции памяти чтобы выставить регистр control в нужное значение. Пока всё работает как надо, хоть проблема и не решена, но оставлю так.  Большое Вам спасибо, Ochkarik!)    |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Ochkarik | 
								|  | « Ответ #22 : 24-08-2016 13:54 »  |  | 
 
 PLxEvtDevicePrepareHardware в рамках  EvtDeviceD0Entry же выполняется. D0 -это одно из состояний PowerState. вот тут что то подобное обсуждали, но похоже не нашли выход. http://osronline.com/showThread.CFM?link=211479http://osronline.com/showThread.CFM?link=220564 попробуйте посмотреть повнимательнее. у меня к сожалению нет возможности подробно вчитываться. может натолкнет на мысль. PS ну наверное это не очень красивый путь... такая мина замедленного действия)  попробуйте вернуться - расскажите обязательно что будет получаться) PPS всегда пожалуйста) |  
						| 
								|  |  
								|  |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	| 
			| 
					
						| Ochkarik | 
								|  | « Ответ #23 :  24-08-2016 14:01 »   |  | 
 
 попробуйте WdfDeviceSetPowerCapabilities() сделать... вдруг с ней что не так по умолчанию. или прочитать что там по умолчанию стоит.
 или почитать что там поумолчанке в WDF_DEVICE_POWER_CAPABILITIES стоит, она в каком то обработчике должна присылаться.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 RTFM уже хоть раз наконец!     :[ ну или хотя бы STFW ... |  |  | 
	|  |