I3CPAC+-+Exercise+6

=EXERCISE LDD INTERRUPTS=

//**a) Implementer Interrupt Start med at requeste en interrupt linie i “init” metoden og free den selv samme i ”exit” metoden. Hint! Gpio_to_irq; Benyt printk til at udskrive den tildelte IRQ linie. Kompilér din driver og indsæt modulet i kernen. Se med dmesg hvilket IRQ nummer som driveren er blevet tildelt. Check samtidig under /proc/interrupts at driveren er blevet tildelt en IRQ linie.**//

I denne opgave skulle vi bare requeste en interrupt linie i vores init metode, og sikre os at den blev "free'et" i exit metoden.

Init metoden: Exit metoden: //**c) Implementer ”read” Vi kan genbruge read koden fra sidst, blot skal vi vente indtil at data er klar, dvs at ISR er blevet kaldt. Her skulle man måske overveje at benytte en wait_event_int… på et strategisk sted. Se eksemplet fra LDD3 side 160.**//

Vi skulle nu implementere således at vores funktion read kun kunne køres igennem hvis vores interrupt blev kaldt. Det blev gjort ved at bruge en static int FLAG og at få processen til at sove indtil denne ikke længere var 0. Interrupt funktionen ændrede naturligvis flaget til 1. Mens read venter på at flag bliver sat til noget forskellig fra 0 sover den, så når interrupt funktionen har ændret flag vækker den read tråden vha. funktionen: wake_up_interrubtible. (ses herudner:

HANDLER: READ: