GrAlexI 0 13 января, 2012 Опубликовано 13 января, 2012 · Жалоба У меня возник такой вопрос. При цикле подтверждения порывание необходимо возвратить вектор - Что за вектор, откуда берется - это не Interrupt Line из конфигураций и этот вектор я устанавливаю или считываю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shivers 0 16 января, 2012 Опубликовано 16 января, 2012 · Жалоба Это какой то специальный цикл, вероятно для моста P2P. Это цикл обращения к контроллеру прерываний на PCI. В простом master/slave (я так понимаю это ваш случай) такие циклы не используются. По стандарту для прерываний есть только регистр IntLine - по сути это маска используемых линий прерывания, обычно (рекомендовано) использовать только одну - INTA. Все остальное - device specific, т.е. у каждого устройства использующего прерывание где то есть регистры отвечающие за источник прерывания, и где то есть статусные регистры (вектор). Где они находятся, определяет разработчик. Реально в системе все работает так - прерывание пришло, смотрим какие устройства на нем сидят(на одной линии может быть несколько прерывателей), отдаем команду драйверам(этих устройств) на обработку. А драйвера уже лезут в свои устройства. При этом выходит что некоторые драйвера залезут в обработчик понапрасну. Вообще, система прерываний в PCI очень примитивна, это вам не VME. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GrAlexI 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
otv116 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба Добрый день. Столкнулся с проблемой при обработке прерывания от PCI target устройства. Устройство на альтеровской корке. Выставляет прерывание по записи в один из своих регистров (в Bar0), снимается аналогично. Проблема где-то в драйвере. Распишу по порядку. 1.В StartDevice устанавливаю обработчик (IoConnectInterrupt....) 2. В обработчике кидаю мессагу (DebugPrint), что вызвался ISR, потом лезу в девайс, проверяю от него ли прерывание. Если от него, то сбрасываю это прерывание, иначе выхожу с FALSE. Причем, если из регистра вычитывается 0xFFFFFFFF, то считаем, что power down и выхожу из обработчика с FALSE. 3. Если прерывание было от моего устройства, то назначаю отложенную процедуру (KeInsertQueueDpc...) 4. В DPCforISR просто кидаю мессагу, что вызван DPCforISR. Вроде как все работает - при установке прерывания я вижу, что мессаги летят и из ISR и из DPCforISR. Последующие установки прерывания так же корректно отрабатываются. Проблема возникает, когда через диспетчер устройств пытаюсь переустановить драйвер. Даже если переустанавливаю на тот же самый sys. Последнее, что я вижу - как идет копирование в system32. Далее перезагрузка компа. Если же после старта компьютера не генерировать прерываний, а просто пару обменов с платой сделать (или не делать ничего вообще), то переустановка драйвера проходит успешно. У меня есть подозрение, что я выполняю не все процедуры по обработке прерывания. Поделитесь, пожалуйста идеями по этому поводу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
otv116 0 20 марта, 2015 Опубликовано 20 марта, 2015 · Жалоба Вроде как полечил это дело. Я в обработчике IRP_MN_STOP_DEVICE (в DispatchPnP) сделал IoDisconnectInterrupt. Сильно не тестировал еще, но пару раз прошло все хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться