Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подтверждение прерывания PCI
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
GrAlexI
У меня возник такой вопрос.
При цикле подтверждения порывание необходимо возвратить вектор - Что за вектор, откуда берется - это не Interrupt Line из конфигураций и этот вектор я устанавливаю или считываю?
Shivers
Это какой то специальный цикл, вероятно для моста P2P. Это цикл обращения к контроллеру прерываний на PCI. В простом master/slave (я так понимаю это ваш случай) такие циклы не используются.

По стандарту для прерываний есть только регистр IntLine - по сути это маска используемых линий прерывания, обычно (рекомендовано) использовать только одну - INTA.
Все остальное - device specific, т.е. у каждого устройства использующего прерывание где то есть регистры отвечающие за источник прерывания, и где то есть статусные регистры (вектор). Где они находятся, определяет разработчик.
Реально в системе все работает так - прерывание пришло, смотрим какие устройства на нем сидят(на одной линии может быть несколько прерывателей), отдаем команду драйверам(этих устройств) на обработку. А драйвера уже лезут в свои устройства. При этом выходит что некоторые драйвера залезут в обработчик понапрасну.

Вообще, система прерываний в PCI очень примитивна, это вам не VME.
GrAlexI
Спасибо!
otv116
Добрый день.
Столкнулся с проблемой при обработке прерывания от PCI target устройства.
Устройство на альтеровской корке. Выставляет прерывание по записи в один из своих регистров (в Bar0), снимается аналогично.
Проблема где-то в драйвере. Распишу по порядку.
1.В StartDevice устанавливаю обработчик (IoConnectInterrupt....)
2. В обработчике кидаю мессагу (DebugPrint), что вызвался ISR, потом лезу в девайс, проверяю от него ли прерывание. Если от него, то сбрасываю это прерывание, иначе выхожу с FALSE. Причем, если из регистра вычитывается 0xFFFFFFFF, то считаем, что power down и выхожу из обработчика с FALSE.
3. Если прерывание было от моего устройства, то назначаю отложенную процедуру (KeInsertQueueDpc...)
4. В DPCforISR просто кидаю мессагу, что вызван DPCforISR.

Вроде как все работает - при установке прерывания я вижу, что мессаги летят и из ISR и из DPCforISR. Последующие установки прерывания так же корректно отрабатываются.

Проблема возникает, когда через диспетчер устройств пытаюсь переустановить драйвер. Даже если переустанавливаю на тот же самый sys. Последнее, что я вижу - как идет копирование в system32. Далее перезагрузка компа.

Если же после старта компьютера не генерировать прерываний, а просто пару обменов с платой сделать (или не делать ничего вообще), то переустановка драйвера проходит успешно.

У меня есть подозрение, что я выполняю не все процедуры по обработке прерывания.

Поделитесь, пожалуйста идеями по этому поводу.

otv116
Вроде как полечил это дело.
Я в обработчике IRP_MN_STOP_DEVICE (в DispatchPnP) сделал IoDisconnectInterrupt. Сильно не тестировал еще, но пару раз прошло все хорошо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.