Перейти к содержанию
    

Подтверждение прерывания PCI

У меня возник такой вопрос.

При цикле подтверждения порывание необходимо возвратить вектор - Что за вектор, откуда берется - это не Interrupt Line из конфигураций и этот вектор я устанавливаю или считываю?

post-65818-1326439641_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это какой то специальный цикл, вероятно для моста P2P. Это цикл обращения к контроллеру прерываний на PCI. В простом master/slave (я так понимаю это ваш случай) такие циклы не используются.

 

По стандарту для прерываний есть только регистр IntLine - по сути это маска используемых линий прерывания, обычно (рекомендовано) использовать только одну - INTA.

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

Реально в системе все работает так - прерывание пришло, смотрим какие устройства на нем сидят(на одной линии может быть несколько прерывателей), отдаем команду драйверам(этих устройств) на обработку. А драйвера уже лезут в свои устройства. При этом выходит что некоторые драйвера залезут в обработчик понапрасну.

 

Вообще, система прерываний в PCI очень примитивна, это вам не VME.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

Столкнулся с проблемой при обработке прерывания от PCI target устройства.

Устройство на альтеровской корке. Выставляет прерывание по записи в один из своих регистров (в Bar0), снимается аналогично.

Проблема где-то в драйвере. Распишу по порядку.

1.В StartDevice устанавливаю обработчик (IoConnectInterrupt....)

2. В обработчике кидаю мессагу (DebugPrint), что вызвался ISR, потом лезу в девайс, проверяю от него ли прерывание. Если от него, то сбрасываю это прерывание, иначе выхожу с FALSE. Причем, если из регистра вычитывается 0xFFFFFFFF, то считаем, что power down и выхожу из обработчика с FALSE.

3. Если прерывание было от моего устройства, то назначаю отложенную процедуру (KeInsertQueueDpc...)

4. В DPCforISR просто кидаю мессагу, что вызван DPCforISR.

 

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

 

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

 

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

 

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде как полечил это дело.

Я в обработчике IRP_MN_STOP_DEVICE (в DispatchPnP) сделал IoDisconnectInterrupt. Сильно не тестировал еще, но пару раз прошло все хорошо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...