I3CPAC+-+Exercise+5

=Exercise 5 - LDD GPIO Device Driver=

Vi skal skrive en Linux Device Driver til GPIO bank 0 på devkit8000's add-on board Målet er at lære at skrive driver, indsætte og teste. Link til øvelsen: http://mps.iha.dk/mediawiki/index.php/EXERCISE_LDD_GPIO
 * Kort beskrivelse:**

init og exit funktionerne bliver kaldt henholdsvis når modulet bliver indsat i kernen med insmod og fjernet med rmmod det fortæller vi når vi kalder føldende funktioner, hvor GPIO_init er vores init funktion og GPIO_exit er vores exit funktion. module_init(GPIO_init); module_exit(GPIO_exit); Først allokerer vi device numrene med følgende funktion ==
 * a) Implementer ”init” og ”exit”**

Kernen bruger en cdev struktur til at representere et device, strukturen skal initialiseres, og dernæst skal der gives signal til kernen at dette er sket

Så anmoder vi om gpio numrene

tilsidst konfigurere vi dem til henholdsvis input eller output

I exit funktionen frigiver vi gpio numrene, dealokerer device numrene og nedlægger char device i systemet

Open kaldes når vi vil tilgå vores driver node. Her er det vigtigt at der ikke er flere der bruger vores fil samtidigt, derfor anvender vi en semaphore (i funktionen try_module_get) Tilsvarende slipper vi semaphoren når vi ikke bruger filen mere. Det sker i release med module_put.
 * b) Implementer ”open” og ”release”**

Write funktionen bliver kaldt når der skrives til vores node. Da vi har lavet driveren generisk, skal vi tjekke om den aktuelle GPIO er sat til input eller output, da vi ikke vil skrive en værdi til en input.
 * c) Implementer ”write”**

Read funktionen bliver kaldt når der læses fra noden. vi vil kun læse fra noden hvis den er sat til input.
 * d) Implementer ”read”**

Der er dog lige en detalje med write og read, og det er at de flytter data fra kernel space til user space og omvendt, hvilket medføre at vi skal bruge funktionerne: unsinged long copy_to_user(void __user *to, const void *from, unsigned long count);__ __unsinged long copy_from_user(void *to, const void__ user *from, unsigned long count);

Ved test af driveren forbinder vi en input og in output med hinanden og læser på den ene, mens vi skriver til den anden. shell kommandoerne echo og cat kan let bruges til at tilgå vores noder. modulet skal dog være oprettet og noden dannet først, med komandoerne: insmod [MODULE_NAME] mknod [NODE_NAME] c [MAJOR] [MINOR]