Добрый день!У меня возникла проблема, решить которую не могу уже более месяца. У меня в PCI-слот установлена карточка, которая "сидит" на 5-ом прерывании и генерирует последовательность импульсов. Проблема заключается в том, что я нигде не могу найти информацию о том, как же, всё-таки, в Linux можно обрабатывать аппаратные прерывания. Мне нужно при получении сигнала 5-го прерывания послать в порт принтера на 1-ый контакт какой-нибудь сигнал. Как работать с портами, я разобрался. Посылаю сигнал на первый контакт порта принтера, а на осциллографе вижу импульс. Для меня это было настоящим открытием :)
А вот с прерываниями что-то никак не получается. Все, что удалось найти в Интернете - в подавляющем большинстве - обработка программных прерываний. А аппаратных нет...
Если кто-то сталкивался с подобной проблемой - очень прошу, поделитесь, пожалуйста, опытом. Может быть, найдется какой-нибудь рабочий пример?
Заранее благодарен!
-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com
>Добрый день!
>
>У меня возникла проблема, решить которую не могу уже более месяца. У
>меня в PCI-слот установлена карточка, которая "сидит" на 5-ом прерывании и
>генерирует последовательность импульсов. Проблема заключается в том, что я нигде не
>могу найти информацию о том, как же, всё-таки, в Linux можно
>обрабатывать аппаратные прерывания. Мне нужно при получении сигнала 5-го прерывания послать
>в порт принтера на 1-ый контакт какой-нибудь сигнал. Как работать с
>портами, я разобрался. Посылаю сигнал на первый контакт порта принтера, а
>на осциллографе вижу импульс. Для меня это было настоящим открытием :)
>
>
>А вот с прерываниями что-то никак не получается. Все, что удалось найти
>в Интернете - в подавляющем большинстве - обработка программных прерываний. А
>аппаратных нет...
>
>Если кто-то сталкивался с подобной проблемой - очень прошу, поделитесь, пожалуйста, опытом.
>Может быть, найдется какой-нибудь рабочий пример?
>
>Заранее благодарен!
>
>-------------------------------------
>С уважением и наилучшими пожеланиями,
>Юрий В. Воробьев / Yuriy V. Vorobev
>E-Mail: Vorobev@niiteplopribor.comнедавно проходила похожая тема - во первых её найди,
во вторых обработкой прерываний в Linux может заниматься толко ядро,
то есть смотри Linux Kernel Module Programming на www.linuxdoc.org
там всё достаточно хорошо описаннно.
Ещё можно почитать linux device driver programming - полезная книжка. В целом, идея должна быть какая-то такая: мутишь модуль, туда пихаешь вызов request_irq(..), где в параметрах указываешь адрес функции-обработчика и кой-какие вещи ещё. Пример можно взять из любого драйвера, например усбишного хост-контроллера, сетевухи..
>Ещё можно почитать linux device driver programming - полезная книжка. В целом,
>идея должна быть какая-то такая: мутишь модуль, туда пихаешь вызов request_irq(..),
>где в параметрах указываешь адрес функции-обработчика и кой-какие вещи ещё. Пример
>можно взять из любого драйвера, например усбишного хост-контроллера, сетевухи..БОЛЬШОЕ спасибо всем, что утешили - похоже ситуация не безвыходная :)
А что касается примеров - я пытался посмотреть в kernel-source исходники драйверов и для USB, и для сетевой карточки, но когда я увидел сколько там всего - произошло помутнение рассудка, глаза полезли на лоб, а волосы встали дыбом... Наверное просто с непривички разбираться в исходниках драйвера. Попытаюсь что-нибудь придумать с request_irq(). Этот вызов я видел в каждом из драйверов.Еще раз по поводу примеров - может быть есть какой нибудь учебный пример - совсем маленький и в то же время понятный? Если есть - пожалуйста, поделитесь опытом.
http://www.oreilly.de/openbook/ldd/chapter/book/ch09.html
Ага? :)
Там и примеры, и всё на свете.. Рульная книжка.
>http://www.oreilly.de/openbook/ldd/chapter/book/ch09.htmlVadim, ОГРОМНОЕ СПАСИБО !!!
Ей Богу, мир не без добрых людей!
>Там и примеры, и всё на свете.. Рульная книжка.Да, книжка действительно рульная, там не только про прерывания написано. Мне кажется, что эта книга мне очень поможет :)
Еще раз спасибо!
-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com
Добрый день!После того, как я скачал книгу Linux Device Drivers с сайта http://www.oreilly.com/catalog/linuxdrive2/chapter/book, многие вещи стали более понятными. Я сделал распайку для LPT-разъема, соединил на плате 9 и 10 линии, начал писать программу. Но обработать аппаратное прерывыание пока так и не удалось, хотя работа с регистрами проходит на ура. Делаю, вроде бы, всё, как описано в главах 8 и 9. Но, пока, к сожалению, ничего не получается.
Вот текст моей программы:
**********************************
#include <stdio.h>
#include <asm/io.h>
#include <asm/irq.h>#include <linux/sched.h>
#define BASE378 0x378
void irq7_interrupt()
{
outb(0xFF,BASE378);
outb(0x20,0x20);
};int main ()
{
unsigned int irq7 = 7;
unsigned int i = 0;
void enable_irq(unsigned int irq7);
if (ioperm(0x20,2,1)) {perror("ioperm"); exit(1);};
if (ioperm(BASE378,3,1)) {perror("ioperm"); exit(2);};
outb((inb(BASE378+1) && 0x10),BASE378+1);
/*
0x10 - этот бит разрешает прерывания от параллельного порта
*/
request_irq(irq7, irq7_interrupt, SA_INTERRUPT, irq7_interrupt);
if (ioperm(0x20,2,0)) {perror("ioperm"); exit(3);};
if (ioperm(BASE378,3,0)) {perror("ioperm"); exit(4);};
void disable_irq(unsigned int irq7);
return 0;
}**********************************
Файл сохранил как ex01.c, компилирую его - # gcc ex01.c -o ex01,
а в ответ получаю кучу предупреждений и ошибок (похоже, что не связанных с тем, что я написал) - в общем всё, кроме испольняемого файла.Вот вовод "ответов" компилятора:
**********************************[root@YuOffice irq]# gcc ex01.c -o ex01
In file included from /usr/include/linux/sched.h:13,
from ex01.c:5:
/usr/include/linux/times.h:5: parse error before "clock_t"
/usr/include/linux/times.h:7: parse error before "tms_cutime"
/usr/include/linux/times.h:8: parse error before "tms_cstime"
In file included from /usr/include/linux/sched.h:14,
from ex01.c:5:
/usr/include/linux/timex.h:173: field `time' has incomplete type
In file included from /usr/include/linux/bitops.h:69,
from /usr/include/asm/system.h:7,
from /usr/include/linux/sched.h:16,
from ex01.c:5:
/usr/include/asm/bitops.h:327:2: warning: #warning This includefile is not available on all architectures.
/usr/include/asm/bitops.h:328:2: warning: #warning Using kernel headers in userspace: atomicity not guaranteed
In file included from /usr/include/linux/signal.h:4,
from /usr/include/linux/sched.h:25,
from ex01.c:5:
/usr/include/asm/signal.h:107: parse error before "sigset_t"
/usr/include/asm/signal.h:110: parse error before '}' token
In file included from /usr/include/linux/signal.h:5,
from /usr/include/linux/sched.h:25,
from ex01.c:5:
/usr/include/asm/siginfo.h:26: parse error before "pid_t"
/usr/include/asm/siginfo.h:38: parse error before "pid_t"
/usr/include/asm/siginfo.h:41: parse error before '}' token
/usr/include/asm/siginfo.h:45: parse error before "pid_t"
/usr/include/asm/siginfo.h:48: parse error before "_utime"
/usr/include/asm/siginfo.h:49: parse error before "_stime"
/usr/include/asm/siginfo.h:62: parse error before '}' token
/usr/include/asm/siginfo.h:63: parse error before '}' token
In file included from /usr/include/linux/sched.h:78,
from ex01.c:5:
/usr/include/linux/time.h:10: parse error before "time_t"
/usr/include/linux/time.h:12: parse error before '}' token
/usr/include/linux/time.h:18: parse error before "time_t"
/usr/include/linux/time.h:44: field `it_interval' has incomplete type
/usr/include/linux/time.h:45: field `it_value' has incomplete type
/usr/include/linux/time.h:49: field `it_interval' has incomplete type
/usr/include/linux/time.h:50: field `it_value' has incomplete type
In file included from /usr/include/linux/sched.h:80,
from ex01.c:5:
/usr/include/linux/resource.h:22: field `ru_utime' has incomplete type
/usr/include/linux/resource.h:23: field `ru_stime' has incomplete type
In file included from /usr/include/linux/sched.h:81,
from ex01.c:5:
/usr/include/linux/timer.h:32: field `vec' has incomplete type
/usr/include/linux/timer.h:37: field `vec' has incomplete type
/usr/include/linux/timer.h:45: parse error before "spinlock_t"
/usr/include/linux/timer.h:53: parse error before '}' token
/usr/include/linux/timer.h:63: field `list' has incomplete type
/usr/include/linux/timer.h:67: parse error before "tvec_base_t"
/usr/include/linux/timer.h:101: parse error before "tvec_bases"
/usr/include/linux/timer.h: In function `init_timer':
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:106: dereferencing pointer to incomplete type
/usr/include/linux/timer.h: In function `timer_pending':
/usr/include/linux/timer.h:121: dereferencing pointer to incomplete type
[root@YuOffice irq]#**********************************
Соответственно, возникает несколько вопросов. Первый, естественно - что не так? Второй - может быть, все-таки, кто-то уже общался с аппаратными прерываниями, имеет опыт борьбы с ними?
Пожалуйста, если вы можете чем-нибудь помочь в моей глупой ситуации - откликнитесь!
Заранее благодарен!
-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com
request_irq нельзя делать из программы - только из модуля.
>request_irq нельзя делать из программы - только из модуля.Тогда у меня к Вам огромная просьба - если у Вас есть какой-нибудь ПРИМЕР, как обрабатывать прерывания из модуля, пожалуйста, поделитесь опытом. Я еще не очень уверенно знаю, что и где нужно писать в программе, чтобы достичь желаемого результата - иногда спотыкаюсь на банальных вещах.
А так, когда есть пример перед глазами - можно было бы по образу и подобию научиться делать что-то самому. В общем, если у Вас (или кого-либо еще) есть такая программа-пример-обучалка и не жалко ею поделиться - очень прошу - откройте заветную тайну обработки аппаратных прерываний. Мой почтовый ящик всегда к вашим услугам. У меня самого чего-то не хватает, чтобы совладать с ними.
Наверное, руки не оттуда растут :)
-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com