Folgendes Modul soll eine Meldung ausgeben, wenn der Parallelport einen
Interrupt auslöst:
--- ackint.c ---
[includes gesnippt]
#define BASE 0x278
#define IRQ 5
void intr_handler(int irq, void *dev_id, struct pt_regs *regs) {
  printk("ACKINT: Interrupt handler called\n");
}
int init_module(void) {
  printk("ACKINT: Loading...\n");
  printk("ACKINT: Trying Interrupt %i...\n", IRQ);
  if(request_irq(IRQ, intr_handler, 0, "ACKINT", NULL)) {
    printk("ACKINT: Error while installing interrupt handler\n");
    return -1;
  } else {
    outb(0x10, BASE+2);
    printk("ACKINT: Interrupt handler installed\n");
  }
  printk("ACKINT: Succesfully loaded\n");
  return 0;
}
void cleanup_module(void) {
  free_irq(IRQ, NULL);
  printk("ACKINT: Interrupt freed\n");
  printk("ACKINT: Removed\n");
}
--- ende ---
Dieses Programm kompiliert sich brav, lässt sich ohne Probleme inserten,
/proc/interrupts zeigt mir, dass der IRQ von meinem Modul belegt ist,
Interrupt und BASE sind korrekt, meine Testschaltung funktioniert, ich habe
mit einem anderen Programm die Eingänge überprüft und sie liefern das
korrekte Ergebnis. Die Meldung wird allerdings nicht ausgegeben. Wenn ihr
nicht wisst, woran es liegt, sagt mir wenigstens, dass der Code richtig ist,
solange ihr euch dabei sicher seid.
Danke im Vorraus...
--
www.luthersworld.de - Bald...
Meine Güte, hier ist keine Kernel Hacking Schule!  Das ist halt
untrivial und es ist anstrengend genug, die eigenen Kernel Module
bugfrei zu kriegen.  Wie kommst du darauf, daß hier a) jemand ist, der
dir überhaupt helfen kann und b) derjenige willens ist, das auch zu tun?
Es besteht kein Anspruch auf Hilfe im Usenet!
> Folgendes Modul soll eine Meldung ausgeben, wenn der Parallelport einen
> Interrupt auslöst:
Und wie kommst du da auf IRQ 5?  Warum kopierst du nicht den Code von
parport_pc?  Bist du sicher, daß da überhaupt ein Interrupt ausgelöst
wird?  Bei mir ist der Parallelport z.B. auf IRQ 7.  Als ich den
Parport zuletzt programmiert habe, hat man da einfach Sachen
reingeschrieben und Zurücklesen ging nicht.  Ich vermute mal, daß man
die IRQ-Benutzung irgendwie aktivieren muß, die werden die ja wohl
optional gemacht haben wegen der Rückwärtskompatibilität.
Was hat das mit Unix-Programmierung zu tun?
> Linux scheint sich da nicht ganz sicher zu sein. Normalerweise sollte bei
> Low-To-High an ACK vom Parallelport den interrupt auslösen, aber die Meldung
> erscheint bei L>H und bei H>L, und das nicht allzu konsequent. Manchmal
> erscheinen pro Tastendruck 3 Meldungen. Ist mein Taster nur schlecht und
> wackelkontaktet ein wenig?
Hast du da etwa keinen Prellschutz drin?
> Aber eine Frage hätte ich: Wann genau wird der Interrupt immer ausgelöst?
> Linux scheint sich da nicht ganz sicher zu sein. Normalerweise sollte bei
> Low-To-High an ACK vom Parallelport den interrupt auslösen, aber die Meldung
> erscheint bei L>H und bei H>L, und das nicht allzu konsequent. Manchmal
> erscheinen pro Tastendruck 3 Meldungen. Ist mein Taster nur schlecht und
> wackelkontaktet ein wenig?
Schon mal was von Prellen gehoert?
Entweder ein flipflop einsetzen oder softwaremaessig entprellen, indem Du
den Interrupt am Interface im Interrupthandler deaktivierst und erst nach
einem kurzen Delay wieder aktivierst. Ich meine mich erinnern zu koennen,
dass man den IRQ der parallelen Schnittstelle softwaremaessig ein und
ausschalten kann.
Sven
-- 
"Thinking of using NT for your critical apps?
                                  Isn't there enough suffering in the world?"
                   (Advertisement of Sun Microsystems in Wall Street Journal)
/me is giggls@ircnet, http://geggus.net/sven/ on the Web
In einer Newsgroup, wo viele Leute sind und wo meine Frage nicht OT ist, ist
die Chance ziemlich gross, dass mir jemand helfen kann...
> Und wie kommst du da auf IRQ 5?  Warum kopierst du nicht den Code von
> parport_pc?  Bist du sicher, daß da überhaupt ein Interrupt ausgelöst
> wird?  Bei mir ist der Parallelport z.B. auf IRQ 7.  Als ich den
> Parport zuletzt programmiert habe, hat man da einfach Sachen
> reingeschrieben und Zurücklesen ging nicht.  Ich vermute mal, daß man
> die IRQ-Benutzung irgendwie aktivieren muß, die werden die ja wohl
> optional gemacht haben wegen der Rückwärtskompatibilität.
So ist es. Den IRQ 5 habe ich selbst per Jumper eingestellt, ganz blöd bin
ich auch nicht. Der Interrupt wird aktiviert, indem man ein bestimmtes Bit
im Controlregister setzt, was ich auch getan habe. Meine Controllerkarte
scheint Probleme damit zu haben, am Port des Motherboards funktionierte es
plötzlich...