|
Прерывание PCI, Разбираемся в процессе обработки прерывания PCI |
|
|
|
Jun 18 2012, 08:50
|
Участник

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

|
Я решил реализовать обработку прерывания по шине PCI от своего устройства. Почитав различные материалы, выяснил, что так как устройство у меня одно функциональное, то мне достаточно использовать только линую INTA, причем линия является для вывода (другие INTx могу я не подключать вообще), и в неактивном состояние должен находится в состоянии ‘Z’, а при вызове на порывание перевести в состояние ‘0’, и быть в состоянии ‘0’ до тех пор пока не будет, обработана драйвером устройства, в моем случаи прочитать с порта ввода-вывода.
Так же при конфигурации устройства моему устройстве выделяется порывание на INTA с номером 14.
Правильно я все понял?
А как реагирует контроллер обрабатывающий pci при приходе прерывания с линии? Он сперва определяет через команду “0000” Interrupt Acknowledge какой номер прерывания, после чего сообщает процессору номер прерывания. Или все же сообщает процессору о прерывании, а операционная система вызывает обработчики прерывании каждого pci устройства, а те в свою очередь определяет их устройство востребовало прерывные через команду Interrupt Acknowledge или возможно нет в этой команде необходимости, достаточно на пример считать с моего устройства какой-то регистр, с тот в свою очередь (устройство) сбросить прерывание в ‘Z’. Как вообще происходит процесс обработки прерывания и надо ли обрабатываться команду “0000” Interrupt Acknowledge.
При выполнение команды lspci -vvv (в терминале Linux), увидел параметры Control: ….. DisINTx-, и еще один Status: …… INTx-, я так понимаю это значения из конфигураций устройства, я не нашел описание этих значений их необходимо конфигурировать, как?
|
|
|
|
|
 |
Ответов
(1 - 5)
|
Jun 18 2012, 09:59
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Прокладыванием сигналов прерываний от PCI устройств до линий IRQ процессора (а точнее, контроллера прерываний) занимается BIOS, т. к. только разработчику BIOS-а известна схемотехника платы. Это называется "IRQ Routing". После того, как прерывание от найденного PCI устройства проложено до определённой линии IRQ, в ячейку памяти PCI платы BIOS-ом записывается этот номер IRQ, чтобы драйвер мог узнать, на какой номер IRQ нужно подвешивать свой обработчик прерывания. Необходимо понимать, что ячейка памяти в конфиг-пространстве платы PCI - это только байтовая ячейка памяти, и не более того. То есть, если вы туда запишете самостоятельно вместо IRQ 14 число 13 - от этого плата "не пересядет" на IRQ 13. Когда будут возникать и когда сбрасываться прерывания - это определяется полностью дизайном PCI-устройства, т. е. вашей фантазией. Так как PCI прерывания - это прерывания "по уровню" (level-sensitive), то процессор будет входить в обработчик прерывания до тех пор, пока плата не снимет активный низкий уровень на линии #INT. Этим гарантируется, что все источники прерывания рано или поздно будут обслужены, даже если событие прерывания произойдёт между тем, как процессор прочитал статус-регистр (а PCI плата в этот момент сняла прерывание) и затем вышел из обработчика прерывания.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Jun 18 2012, 10:33
|
Участник

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

|
Спасибо за ответ gerber.
То, что BIOS назначает номер прерывания я знаю и про "IRQ Routing" знаю. Что - то у меня не получается адекватно устройство работать с прерыванием, вот и начал искать пробелы в знаниях.
И все таки что за параметр Control: DisINTx случайно не рашифровыется Disable INT, то есть отключает обработку прерывания верно или нет и какой бить отвечает за этот параметр? И как я понял устанавливать пераметр не обязательно Status: INTx и какой бит отвечает за него?
Да еще один вопрос забыл: по документации написано, что прерывание обрабатывается по обратному фронту clk, то еть обязательно устанавливать и сбрасывать INTA по обратному фронту?
Я пишу на vhdl линия у INTA должна быть типа in или inout?
Сообщение отредактировал GrAlexI - Jun 18 2012, 11:24
|
|
|
|
|
Jun 18 2012, 13:18
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(GrAlexI @ Jun 18 2012, 14:33)  И все таки что за параметр Control: DisINTx случайно не рашифровыется Disable INT, то есть отключает обработку прерывания верно или нет и какой бить отвечает за этот параметр? И как я понял устанавливать пераметр не обязательно Status: INTx и какой бит отвечает за него? Почитайте всё же основной документ "PCI Local Bus Specification" - там очень подробно расписан каждый бит в конфиг-пространстве и его поведение, а также есть ответы на многие Ваши вопросы. Цитата(GrAlexI @ Jun 18 2012, 14:33)  Да еще один вопрос забыл: по документации написано, что прерывание обрабатывается по обратному фронту clk, то еть обязательно устанавливать и сбрасывать INTA по обратному фронту? Подсмотрите в какой-нибудь открытой корке PCI Target... Цитата(GrAlexI @ Jun 18 2012, 14:33)  Я пишу на vhdl линия у INTA должна быть типа in или inout? ИМХО, out.
Сообщение отредактировал gerber - Jun 18 2012, 13:19
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Jun 18 2012, 16:51
|
Местный
  
Группа: Свой
Сообщений: 462
Регистрация: 20-01-06
Пользователь №: 13 399

|
Цитата(GrAlexI @ Jun 18 2012, 14:33)  Я пишу на vhdl линия у INTA должна быть типа in или inout? я уже забыл все про PCI, но вроде бы выход с Z-состоянием На motherboard стоит pull-up резистор, ваш выход может выводить лог. 0 (INTA# активный низкий), неактивный - Z-состояние Проверяйте по спецификации
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|