Pages

Thursday, December 6, 2012

MPS - Exercise 11 – Linux Device Model


Formål

Måden hvorpå vi hidtil har skrevet driver skalerer ikke godt til større systemer. Linux har en device model som på en ensartet måde repræsenterer selv sammensatte enheder ved: Bus, device og driver. Formålet med denne øvelse er at omskrive en GPIO device driver således at den lader sig registrere i SysFS som er en fil-system abstraktion på Linux' device model.


Øvelsen

a) Verificere at sysLed4 driveren virker

Den gamle driver for sysLed4 blev testet vha. insmod --> mknod /dev/led --> echo 1-0 > /dev/led.
Når der skrives 1 slukker LED'en og når der skrives 0 tænder LED'en. 
Terminal Output



b) Tilføj en sysfs klasse "ledKlasse"

Vores driver får sin egen klasse under /sys/class/.
Metoderne beskrevet i device.h(~/sources/linux-3.2.6/include/linux/device.h), anvendes i init/exit:

INIT
Nedenstående metoder tilføjes i init:

EXIT
Nedenstående metoder tilføjes i exit:
NB: Tilføjes lige efter printk

c) Kompiler og kopier modulet til target.

To ssh forbindelser laves til target(terminal1+terminal2). På den ene(terminal1) startes "udevadm monitor" og via den anden forbindelse(terminal2) indsættes modulet. 

Kommando på terminal1
Herunder er terminal output for den ene forbindelse, som skal vis de events der sker når man indsætter/fjerne drivermodulet igennem den anden terminal(terminal2).






Terminal output (gammel sysLed4)
Herunder er outputtet for den gamle sysLed4 driver:








Terminal output (sysLed4_devModel)
Herunder er outputtet for sysLed4_devModel driver:









d) Dynamisk allokering af major numre

Ændre linien med funktionskaldet fra register_chrdev_region() til alloc_chrdev_region():
For dynamisk allokering ændres definitioner for minor, ch derudover fjernes major:


I init tilføjes alloc_chrdev_region() og register_chrdev_region() slettes.

Terminal output Target
Programmet testes og vi aflæser følgende major og minor numre:





e) Opret en device_attribute struct

Show metoden implementeres. Den skal kun lave en printk("SHOW !!!"), den anden venter vi lidt med (dvs. at den implementeres tom). Herunder er kodeløsningen for show metoden:



f) Attribute output

Processen fra opgave c gentages













NB: Bemærk at der er kommet en folder med forskellige attributter, inklusiv den netop oprettede. 
Herunder laves der cat  på attributen ledAttrs:






Dernæst tjekke i dmesg om der bliver udskrevet "SHOW !!!". Herunder ses et vellykket terminal output fra Target:




g) Opret en global int gpio_sysled4_no = 164 i init

Et hvert device kan gemme private data i driveren. Til dette benyttes drvdata som er en void pointer i device_create() metoden. Show/store metoderne har hver især en device pointer, således at man ved med hvilket device de er kaldt. Vha device pointeren kan de private data udtrækkes vha dev_get_data()metoden.

i) Ændrer navn på gpio device’t

Evt. prøv at oprette en regel under /etc/udev/rules.d som giver gpio device't et andet navn.



FILERNE


På nedenstående link kan du se hele koden for alle programmer:


No comments:

Post a Comment