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.
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/.
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).
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)
Terminal output (sysLed4_devModel)
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
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:
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:
.png)







No comments:
Post a Comment