MPS E7 - IOCTL calls, LDD timers



Formål

I en device driver ønsker vi nogle gange at foretage noget autonomt, uden at vi tilgår denne, eks vha read / write. Et godt eksempel kunne være en driver som henter værdier fra en A/D konverter med et fast interval og gemmer værdierne i en fifo buffer. User space applikationen kan herved læse en mængde samples ad gangen og ikke have nær så stramme tidskrav, som hvis der skulle læses én sample ad gangen. Dette vil øge den præcisionen af samplingstidspunktet.
I denne øvelse skal vi lave en tilføjelse til vores eksisterende SYS_LED4 GPIO driver. Vha et ioctl kald skal det være muligt at sætte LED'en til at toggle med et fast interval.
Du vil komme til at lære om:
§  IOCTL kald
§  Kernel Timers
§  Kernel Interrupts
§  Blocking I/O

Øvelses Steps

I den oprindelige SYS_LED4 driver skrev vi til driveren via en device fil /dev/sys_led4, hvorved write metoden for driven blev kaldt således at vi kunne tænde og slukke for LED'en. Opgaven er denne gang at gøre det muligt at få SYS_LED4 til at starte med at blinke med en specifik frekvens. Det vil vi opnå ved at tilføje 2 ioctl kald til hhv at starte/stoppe for at LED'en blinker og til at styre den frekvens den skal blinke med.

a) Implementer ioctl kald


Start med at implementere et ioctl kald i driveren og en lille tilhørende testapplikation. Du kan i driveren evt blot udskrive til kernen ved hjælp af printk(), når en given IOCTL funktion kaldes.

Sysled_4.c: addition to the created code in lab 5

Note: remember to include common.h


UserSpaceApp.c:

Common.h:


By running dmesg after insmod and mknod:


 

b) Implementer toggler


Implementer en periodisk timer til at styre et SYS_LED4. Det indbefatter både det at starte/stoppe timeren og styre den frekvens.

Sysled_4.c:


Note: SYS_LED4_UNLOCKED_ioctl included to fops

UserSpaceApp.c:

Common.h:


 
By running dmesg:



c) Når det virker, kan du prøve at køre ”top” fra linux prompten og check hvor belastet processoren er. Prøv at ændre din implementation til at bruge en busy-wait metode og se hvad der sker ifht processor belastningen.

The processor is not very much loaded (about 3%) when the timer "sleeps" in the second we choose. However, if you do busywait with mdelay (), the processor is much more congested.

Ingen kommentarer:

Send en kommentar