CPAC+Øvelse+6

toc =Interrupts=

Implementer init
IRQ request skal placeres efter GPIO request for hvis GPIO'en ikke er fri så giver det ingen mening at vores program får et interrupt på en indgang som den ikke har kontrollen over. code format="c" /* * Get IRQ number mapped to GPIO */ for (i=0; i 0) // if gpio is input IRQ will be > 0 (set by above loop) if ((err = request_irq(gpio[i].irq, irq_handler, IRQF_TRIGGER_RISING, gpio[i].label, NULL)) < 0) {           printk (KERN_ALERT "Error requesting irq for %i\n", gpio[i].irq); return err; } code

Implementer exit
Vi frigiver requested IRQ'er. code format="c" /* * Free IRQ Ressources */ for (i=0; i<gpio_len; ++i) free_irq(gpio[i].irq, NULL); code

Implementer ISR (IRQ hander)
Vores IRQ handler gør ikke rigtig noget, men det er også kun for at teste om det virker. Vi skal huske at sætte vores flag og vække køen op. code format="c" static irqreturn_t irq_handler(int irq, void *dummy, struct pt_regs * regs) {   printk(KERN_DEBUG "Interrupt handler executed for IRQ: %i\n", irq); flag = 1; wake_up_interruptible(&wq); return IRQ_HANDLED; } code

Implementer read
I vores read funktion indsætter vi denne kode udmiddelbart før vi læser på benet. Men vi skal kun lægge os til at sove hvis vi har valgt et IRQ interrupt at vente på. Når det intterrupt kommer vil vores IRQ handler vække denne del af koden op og vi sætter flaget til 0 hvorefter vi så læser værdien på benet. code format="c" /* * Sleep until input changes * (where appropriate) */ if (gpio[minor].irq > 0) {   printk(KERN_DEBUG "process %i (%s) going to sleep\n",current->pid, current->comm); wait_event_interruptible(wq, flag != 0); flag = 0; printk(KERN_DEBUG "awoken %i (%s)\n", current->pid, current->comm); } code

=Test= Vi indsætter modulet i kernen. code root@DevKit8000:~# insmod myinterrupt.ko code

Tjekker dmesg for at se hvilke numre vores GPIO'er er blevet tildelt. code root@DevKit8000:~# dmesg

GPIO gpio0_0 assigned to IRQ 290 GPIO gpio0_1 assigned to IRQ 291 GPIO gpio0_2 assigned to IRQ 292 GPIO gpio0_3 assigned to IRQ 293 code

Vi sætter en lus mellem et par ind og ud ben og observere at der kommer interrupts. code root@DevKit8000:~# cat /proc/interrupts

290:      1067        GPIO  gpio0_0 291:         0        GPIO  gpio0_1 292:         0        GPIO  gpio0_2 293:      9706        GPIO  gpio0_3 code Det første tal er IRQ nummeret, det næste er antal interrupts og det sidste er forklarende tekst som f.eks "labels".

Grunden til der er 2 ben med interrupts er fordi den ene var meget følsom og stod derfor og svingede.