Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 03.09.04 09:07
Оценка:
Написал драйвер для PCI устройства.
PNP менеджер вешает IRQ моего устройства на прерывание USB, у меня в него мышь воткута.
В общем не могу различить в обработчике прерывания от какого усройства оно приходит от моего или от мыши.
Соответственно когда вожу мышкой многократно вызвается мой обработчик и мыши.
Как различить от кого оно пришло?
request_irq вызываю с флагом SA_SHIRQ.
Спасибо!
Re: Разделяемые прерывания в LINUX
От: Murr Россия  
Дата: 03.09.04 14:03
Оценка:
Здравствуйте, OpenGL, Вы писали:

OGL>Написал драйвер для PCI устройства.

OGL>PNP менеджер вешает IRQ моего устройства на прерывание USB, у меня в него мышь воткута.
OGL>В общем не могу различить в обработчике прерывания от какого усройства оно приходит от моего или от мыши.
OGL>Соответственно когда вожу мышкой многократно вызвается мой обработчик и мыши.
OGL>Как различить от кого оно пришло?
OGL>request_irq вызываю с флагом SA_SHIRQ.
OGL>Спасибо!

А что за устройство такое, что нельзя определить от него ли пришло прерывание?
Может стоит дизассемблировать существующий драйвер?
Re[2]: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 03.09.04 17:36
Оценка:
Дело в том что я и не пытаюсь в обработчике определить от кого пришло прерывание, вернее пытался , но не знаю как корректно это сделать, читаю из 0-го порта наш ID он правильный. Без портов как узнать от кого пришло?
Устройство 8-ми канальное АЦП.
Re[3]: Разделяемые прерывания в LINUX
От: postmaster  
Дата: 03.09.04 18:37
Оценка:
Здравствуйте, OpenGL, Вы писали:

OGL>Дело в том что я и не пытаюсь в обработчике определить от кого пришло прерывание, вернее пытался , но не знаю как корректно это сделать, читаю из 0-го порта наш ID он правильный. Без портов как узнать от кого пришло?

OGL>Устройство 8-ми канальное АЦП.

Обычно устройство перед вызовом прерывания устанавливает некий флаг, который можно из этого устройства прочитать (через память или порт). Обработчик прерывания проверяет этот порт и, если флаг установлен, делает всё нужное для обработки этого прерывания, после чего сбрасывает флаг.

Если такой флаг не предусмотрен, то можно попробовать использовать какой-нибудь суррогат, например кол-во байт в приёмном буфере (если приёмный буфер пустой, то устройство, скорее всего, не вызывало прерывание).
Re[4]: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 04.09.04 06:33
Оценка:
Здравствуйте, postmaster, Вы писали:

P>Здравствуйте, OpenGL, Вы писали:


OGL>>Дело в том что я и не пытаюсь в обработчике определить от кого пришло прерывание, вернее пытался , но не знаю как корректно это сделать, читаю из 0-го порта наш ID он правильный. Без портов как узнать от кого пришло?

OGL>>Устройство 8-ми канальное АЦП.

P>Обычно устройство перед вызовом прерывания устанавливает некий флаг, который можно из этого устройства прочитать (через память или порт). Обработчик прерывания проверяет этот порт и, если флаг установлен, делает всё нужное для обработки этого прерывания, после чего сбрасывает флаг.


Не предусмотрен

P>Если такой флаг не предусмотрен, то можно попробовать использовать какой-нибудь суррогат, например кол-во байт в приёмном буфере (если приёмный буфер пустой, то устройство, скорее всего, не вызывало прерывание).


Да но вот как это реализовать?
Да и вообще как я смогу мою мышь в этом случае отличить от моего устройства?
Re[5]: Разделяемые прерывания в LINUX
От: Murr Россия  
Дата: 04.09.04 08:32
Оценка:
Здравствуйте, OpenGL, Вы писали:

OGL>Да но вот как это реализовать?

OGL>Да и вообще как я смогу мою мышь в этом случае отличить от моего устройства?

Обычно статусные порты ввода-вывода для мыши и других устройств разные,
поэтому, если вы прочитаете данные из регистров своего устройства, то убедитесь
от вашего или не от вашего устройства пришло прерывание.

Насколько я знаю, в соответствующих спецификациях (напр. PCI) определено требование того,
чтобы устройство предоставляло интерфейс определения от него ли пришло прерывание.

Т.о. у Вас либо кривое устройство, либо нет нормальной спецификации на него.

Можно, конечно, попытаться выделить ему отдельный IRQ, но это тупиковый путь, IMHO.
Re[6]: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 04.09.04 10:02
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, OpenGL, Вы писали:


OGL>>Да но вот как это реализовать?

OGL>>Да и вообще как я смогу мою мышь в этом случае отличить от моего устройства?

M>Обычно статусные порты ввода-вывода для мыши и других устройств разные,

M>поэтому, если вы прочитаете данные из регистров своего устройства, то убедитесь
M>от вашего или не от вашего устройства пришло прерывание.

M>Насколько я знаю, в соответствующих спецификациях (напр. PCI) определено требование того,

M>чтобы устройство предоставляло интерфейс определения от него ли пришло прерывание.

M>Т.о. у Вас либо кривое устройство, либо нет нормальной спецификации на него.


M>Можно, конечно, попытаться выделить ему отдельный IRQ, но это тупиковый путь, IMHO.


У меня просто мое устройство , такое ощущение перехватывает прерывание мыши, конечно они сидят на одном так и должно быть, но когда из ф-ии прерывания я читаю по портам что либо он возвращает значения Id устройства такой какой я жду, т.е. мой. Даже не знаю чего и делать. Без портов ни как нельзя?
Re[7]: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 06.09.04 16:56
Оценка:
Как мне объяснили разработчики — сигнал подтверждении прерывания выставлять не обязательно, в pci можно как-то прочитать на каком слоте возникло прерывание и далее соответственно обрабатывать его или нет! Но вот таких ф-ии в linux pci я что-то не знаю. Может кто сталкивался?
Re: Разделяемые прерывания в LINUX
От: anna_savelieva  
Дата: 08.09.04 10:44
Оценка:
Во-первых должна быть поддержка со стороны устройства, что-то наподобие регистра статуса, и если твое устройство не поддерживает возможность разделения прерываний — то все усилия напрасны.

Теперь, если же твое устройство поддерживает возможность разделения прерываний.

Когда ты регистрируешь обработчик c помощью
request_irq(irq, handler, flags, name, void *dev_id)
последний аргумент dev_id как раз нужен будет для идентификации твоего устройства.

То есть в обработчике вторым аргументом будет передаваться именно твой dev_id, который ты указал при регистрации. Соответственно тебе нужно в обработчике всего лишь проверить, твой это dev_id или не твой
Re[2]: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 08.09.04 11:08
Оценка:
Здравствуйте, anna_savelieva, Вы писали:

_>Во-первых должна быть поддержка со стороны устройства, что-то наподобие регистра статуса, и если твое устройство не поддерживает возможность разделения прерываний — то все усилия напрасны.


_>Теперь, если же твое устройство поддерживает возможность разделения прерываний.


_>Когда ты регистрируешь обработчик c помощью

_>request_irq(irq, handler, flags, name, void *dev_id)
_>последний аргумент dev_id как раз нужен будет для идентификации твоего устройства.

_>То есть в обработчике вторым аргументом будет передаваться именно твой dev_id, который ты указал при регистрации. Соответственно тебе нужно в обработчике всего лишь проверить, твой это dev_id или не твой


Дак вот в том то и прикол что он всегда мой, я в нем передаю локальный контекст (свою структуру данных устройста).
Устройство на прямую не дает этой возможности (подтверждения прерывания), но факт что в Windows аналогичный драйвер работатет, а в Linux нет, при том и там и там несколько устр-в сидят на одном прерывании.
Нужно просто в обработчике узнать с какого слота pci было прерывание, но вот как?
Re: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 20.09.04 06:03
Оценка:
Что ни кто не знает как опросить контроллер прерываний, на коком слоте было прерывание?
Re[3]: Разделяемые прерывания в LINUX
От: anna_savelieva  
Дата: 22.09.04 14:50
Оценка:
Здравствуйте, OpenGL, Вы писали:

OGL>Здравствуйте, anna_savelieva, Вы писали:


_>>Во-первых должна быть поддержка со стороны устройства, что-то наподобие регистра статуса, и если твое устройство не поддерживает возможность разделения прерываний — то все усилия напрасны.


_>>Теперь, если же твое устройство поддерживает возможность разделения прерываний.


_>>Когда ты регистрируешь обработчик c помощью

_>>request_irq(irq, handler, flags, name, void *dev_id)
_>>последний аргумент dev_id как раз нужен будет для идентификации твоего устройства.

_>>То есть в обработчике вторым аргументом будет передаваться именно твой dev_id, который ты указал при регистрации. Соответственно тебе нужно в обработчике всего лишь проверить, твой это dev_id или не твой


OGL>Дак вот в том то и прикол что он всегда мой, я в нем передаю локальный контекст (свою структуру данных устройста).

OGL>Устройство на прямую не дает этой возможности (подтверждения прерывания), но факт что в Windows аналогичный драйвер работатет, а в Linux нет, при том и там и там несколько устр-в сидят на одном прерывании.
OGL>Нужно просто в обработчике узнать с какого слота pci было прерывание, но вот как?
Вообще-то я тебе неправтльно объяснила
По структуре на которую указывает dev_id ты никак не сможешь распознать, товое устройство кинуло прерывание или нет.

Короче, когда устройство на PCI бросает прерывание, то выполняются все обработчики, которые зарегестированы на этом прерывании. И каждому обработчику передается его dev_id.

То есть единственный способ — это считать статус с устройства.
Re[4]: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 23.09.04 06:09
Оценка:
Здравствуйте, anna_savelieva, Вы писали:

_>Здравствуйте, OpenGL, Вы писали:


OGL>>Здравствуйте, anna_savelieva, Вы писали:


_>>>Во-первых должна быть поддержка со стороны устройства, что-то наподобие регистра статуса, и если твое устройство не поддерживает возможность разделения прерываний — то все усилия напрасны.


_>>>Теперь, если же твое устройство поддерживает возможность разделения прерываний.


_>>>Когда ты регистрируешь обработчик c помощью

_>>>request_irq(irq, handler, flags, name, void *dev_id)
_>>>последний аргумент dev_id как раз нужен будет для идентификации твоего устройства.

_>>>То есть в обработчике вторым аргументом будет передаваться именно твой dev_id, который ты указал при регистрации. Соответственно тебе нужно в обработчике всего лишь проверить, твой это dev_id или не твой


OGL>>Дак вот в том то и прикол что он всегда мой, я в нем передаю локальный контекст (свою структуру данных устройста).

OGL>>Устройство на прямую не дает этой возможности (подтверждения прерывания), но факт что в Windows аналогичный драйвер работатет, а в Linux нет, при том и там и там несколько устр-в сидят на одном прерывании.
OGL>>Нужно просто в обработчике узнать с какого слота pci было прерывание, но вот как?
_>Вообще-то я тебе неправтльно объяснила
_>По структуре на которую указывает dev_id ты никак не сможешь распознать, товое устройство кинуло прерывание или нет.

_>Короче, когда устройство на PCI бросает прерывание, то выполняются все обработчики, которые зарегестированы на этом прерывании. И каждому обработчику передается его dev_id.


Неа ты опять не права просто когда устр-во вызывает прерывание, я в своем модуле просто не смогу определить что это не мой dev_id потому что я "сижу" только в своем модуле ядра! Ну и естественно вызываются все обработчики которые зарегены на этом прерываниии.
_>То есть единственный способ — это считать статус с устройства.
Re[5]: Разделяемые прерывания в LINUX
От: Аноним  
Дата: 24.09.04 11:43
Оценка:
_>>Короче, когда устройство на PCI бросает прерывание, то выполняются все обработчики, которые зарегестированы на этом прерывании. И каждому обработчику передается его dev_id.

OGL>Неа ты опять не права просто когда устр-во вызывает прерывание, я в своем модуле просто не смогу определить что это не мой dev_id потому что я "сижу" только в своем модуле ядра! Ну и естественно вызываются все обработчики которые зарегены на этом прерываниии.


Я мела в виду, что твоему обработчику всегда передается через dev_id именно тот указатель, который был указан при регистрации обработчика
Re[2]: Разделяемые прерывания в LINUX
От: Аноним  
Дата: 24.09.04 12:00
Оценка:
Здравствуйте, OpenGL, Вы писали:

OGL>Что ни кто не знает как опросить контроллер прерываний, на коком слоте было прерывание?


В виндах у тебя работало потому, что там немного по-другому вызываются ISR для разделяемых прерываний. Там также они вызываются последовательно, но в отличае от Линукса, если хотя бы один обработчик распознал, что прерывание пришло от его устройства, остальные обработчики уже не вызываются. В Линуксе же в любом случае вызываются все обработчики. Наверное в виндах ISR мыши был зарегестрирован раньше ISR твоего устройтва и соответственно имел более высокий приоритет. И при возникновении прерывания с мыши сначала выполнялся ISR мыши, который распознавал, что прерывание пришло от мыши и до обработчика твоего устройства дело не доходило. А ты попробуй в виндах зарегестрируй обработчик мыши позже обработчика твоего устройства (насколько я знаю чем раньше зарегестрирован обработчик, тем выше его приоритет и у тебя будет такая же ситуация как и в Линуксе;


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

Кстати, а разделять одно прерывание с мышью — это не очень накладно для твоего устройства?
Re[3]: Разделяемые прерывания в LINUX
От: OpenGL  
Дата: 24.09.04 17:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, OpenGL, Вы писали:


OGL>>Что ни кто не знает как опросить контроллер прерываний, на коком слоте было прерывание?


А>В виндах у тебя работало потому, что там немного по-другому вызываются ISR для разделяемых прерываний. Там также они вызываются последовательно, но в отличае от Линукса, если хотя бы один обработчик распознал, что прерывание пришло от его устройства, остальные обработчики уже не вызываются. В Линуксе же в любом случае вызываются все обработчики. Наверное в виндах ISR мыши был зарегестрирован раньше ISR твоего устройтва и соответственно имел более высокий приоритет. И при возникновении прерывания с мыши сначала выполнялся ISR мыши, который распознавал, что прерывание пришло от мыши и до обработчика твоего устройства дело не доходило. А ты попробуй в виндах зарегестрируй обработчик мыши позже обработчика твоего устройства (насколько я знаю чем раньше зарегестрирован обработчик, тем выше его приоритет и у тебя будет такая же ситуация как и в Линуксе;



А>А так по-хорошему и в виндах и в Линуксе тебе нужно считывать состояние регистра устройства, чтобы узнать от кого пришло прерывание.


А>Кстати, а разделять одно прерывание с мышью — это не очень накладно для твоего устройства?


Нет не накладно вполне нормально, разработчики кстати признали свою ошибку, будут сигнал о подтверждении прерывания делать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.