Opgave+9

= 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.

Det virker.
 * a) Kompilér mygpio_basic.**


 * b) Sammenhold eksemplerne 5.6 og 5.7 i bogen og vær opmærksom på forskellene. Bemærk at der i 5.7 benyttes en makro til pre-compileren for at få den til at generere 8 ens funktioner: glow_led0, glow_led1....glow_led7.**

Forskellen mellem eksempel 5.6 og 5.7 er at i 5.7 bliver sysfs brugt til at kontrollere alle LED'er, dette gør den gennem et kobject.

Fra //device.h//([|~/sources/linux-3.2.6/include/linux/device.h]).
 * c) Tilføj en sysfs klasse "mygpio", således at vores driver får sin egen klasse under /sys/class/. Benyt metoderne beskrevet nedenfor i jeres init/exit metoder:**

Vi startede med at oprette struct pointerne til device.h. code format="cpp" struct class *gpio_class; struct device *c_d; code De implementeres i init rutinen. Her bruger vi class_create og device_create fra 5.7 og device.h desuden tilføjes linux/err.h for at kunne benytte IS_ERR metoden. code format="cpp" gpio_class = class_create(THIS_MODULE, "myGpio"); if(IS_ERR(gpio_class)) printk("No class created!!!\n");

c_d = device_create(gpio_class, NULL, devno, NULL, "myGpio137"); printk("The device myGpio137 was created!\n"); code

For exit delen bentyttes device_destroy og class_destroy fra device.h: code format="cpp" device_destroy(gpio_class, devno); class_destroy(gpio_class); code THIS_MODULE benyttes for gpio_class code format="cpp" struct file_operations mygpio_Fops = {   .owner   = THIS_MODULE, ... ... } code
 * d) Kompiler og kopier modulet til target. Lav to ssh forbindelser til target. På den ene startes "udevadm monitor" og via den anden forbindelse indsættes modulet. Bemærk hvad som sker og undersøg forandringerne i /sys/class, samt under /dev/ med ls -l. **

Der køres nu make og kernemodulet sendes over på target. På target køres udevadm monitor for at se hvorvidt klasse og device oprettes korrekt. Følgende observeres når modulet blev indsat: code root@beagleboard:~# udevadm monitor monitor will print the received events for: UDEV - the event which udev sends out after rule processing KERNEL - the kernel uevent

KERNEL[257.371687] add     /module/mygpio_basic (module) UDEV [257.379987] add      /module/mygpio_basic (module) 2000 Jan 1 00:04:13 beagleboard [  257.446624] Mygpio Module Inserted KERNEL[257.396923] add     /class/myGpio (class) UDEV [257.403667] add      /class/myGpio (class) KERNEL[257.409740] add     /devices/virtual/myGpio/myGpio138 (myGpio) UDEV [257.428446] add      /devices/virtual/myGpio/myGpio138 (myGpio code Det ses at klassen **myGpio** og device **myGpio138** oprettes.

.