реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Подтверждение прерывания PCI
GrAlexI
сообщение Jan 13 2012, 07:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 22-06-11
Пользователь №: 65 818



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

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Shivers
сообщение Jan 16 2012, 09:50
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



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

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

Вообще, система прерываний в PCI очень примитивна, это вам не VME.
Go to the top of the page
 
+Quote Post
GrAlexI
сообщение Jan 17 2012, 12:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 22-06-11
Пользователь №: 65 818



Спасибо!
Go to the top of the page
 
+Quote Post
otv116
сообщение Mar 19 2015, 08:25
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466



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

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

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

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

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

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

Go to the top of the page
 
+Quote Post
otv116
сообщение Mar 20 2015, 07:49
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466



Вроде как полечил это дело.
Я в обработчике IRP_MN_STOP_DEVICE (в DispatchPnP) сделал IoDisconnectInterrupt. Сильно не тестировал еще, но пару раз прошло все хорошо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 16:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.0135 секунд с 7
ELECTRONIX ©2004-2016