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