MPS+Ov11

A) Virtual mouse for host: vi checker vilke input devices som hvores pc har, dette gøre i mappen /input code stud@GoldenImage:/dev/input$ ls -l total 0 drwxr-xr-x 2 root root   120 2012-04-10 08:37 by-id drwxr-xr-x 2 root root    180 2012-04-10 08:37 by-path crw-r- 1 root root 13, 64 2012-04-10 08:37 event0 crw-r- 1 root root 13, 65 2012-04-10 08:37 event1 crw-r- 1 root root 13, 66 2012-04-10 08:37 event2 crw-r- 1 root root 13, 67 2012-04-10 08:37 event3 crw-r- 1 root root 13, 68 2012-04-10 08:37 event4 crw-r--r-- 1 root root 13,  0 2012-04-10 08:37 js0 crw-r- 1 root root 13, 63 2012-04-10 08:37 mice crw-r- 1 root root 13, 32 2012-04-10 08:37 mouse0 crw-r- 1 root root 13, 33 2012-04-10 08:37 mouse1 crw-r- 1 root root 13, 34 2012-04-10 08:37 mouse2 stud@GoldenImage:/dev/input$ code vi compiler så den virtuelle mouse (cd vms) Dette gøres med medfølgende make file Herefter indsættes den virtuelle mouse med den sedvanlige kommando: sudo insmod vms.ko code stud@GoldenImage:/dev/input$ ls -l total 0 drwxr-xr-x 2 root root   120 2012-04-10 08:37 by-id drwxr-xr-x 2 root root   180 2012-04-10 08:37 by-path crw-r- 1 root root 13, 64 2012-04-10 08:37 event0 crw-r- 1 root root 13, 65 2012-04-10 08:37 event1 crw-r- 1 root root 13, 66 2012-04-10 08:37 event2 crw-r- 1 root root 13, 67 2012-04-10 08:37 event3 crw-r- 1 root root 13, 68 2012-04-10 08:37 event4 crw-r- 1 root root 13, 69 2012-05-08 23:09 event5 crw-r--r-- 1 root root 13, 0 2012-04-10 08:37 js0 crw-r- 1 root root 13, 63 2012-04-10 08:37 mice crw-r- 1 root root 13, 32 2012-04-10 08:37 mouse0 crw-r- 1 root root 13, 33 2012-04-10 08:37 mouse1 crw-r- 1 root root 13, 34 2012-04-10 08:37 mouse2 crw-r- 1 root root 13, 35 2012-05-08 23:09 mouse3 stud@GoldenImage:/dev/input$

code Vi kan nu se at der e rblevet tilføjet et ekstra mouse input i form af event 5 og mouse 3

Vi har nu mulighed for at skrive til den virtuelle mouse med kommandoen echo x y z > coordinates code stud@GoldenImage:/sys/devices/platform/vms$ echo 10 10 0 > coordinates code Vi ser at cursoren bevæger sig skråt ned af fra højre.

B) Target Vi kompiler som vil altid har gjort kernemodulet til target med kommando "make target". herefter kopiers filen vms.ko til target med scp vms.ko root@10.9.8.2: insdættes på target med insmod vms.ko

Vi kan se at vilke input devices der eksistere ved at skrive "ls -l/dev/input Inden vms.ko indsættes code root@beagleboard:/dev# ls input by-path      event1        event3        mouse0 event0        event2        mice          touchscreen0 root@beagleboard:/dev# code Efter indsættelse af vms.ko code root@beagleboard:/dev# ls input by-path       event1        event3        mice          mouse1 event0        event2        event4        mouse0        touchscreen0 root@beagleboard:/dev#

code Vi ser at event4 og mouse1 er blevet tilføjet.

Check efter copy af QT code root@beagleboard:~# echo $QWS_MOUSE_PROTO Tslib:/dev/input/touchscreen0 root@beagleboard:~# code Vi ser at vi nu benytter touchscreen0

Vi tilføjer en virtual mus med variabler XYZ code export QWS_MOUSE_PROTO="Tslib:/dev/input/touchscreen0 IntelliMouse:/dev/input/mouseXYZ" code Vi køre qt_test2 vi skriver kordinater til musen code root@beagleboard:~# echo "10 10 0"> /sys/devices/platform/vms/coordinates

code

C) Lav din egen input driver som benytter GPIO interrupts.

Til dette har vi benytte grundmodeller fra tidligere øvelser til at få oprettet vore GPIO. Vi har så derefter opsat de forskellige GPIO'er til at requeste og derefter bad vi dem blive opsat til indgange og udgange code unsigned int irq_nr_1,irq_nr_3,irq_nr_5,irq_nr_6;

irq_nr_1=(gpio_to_irq(gpio[1].num)); //geting irq nummer irq_nr_3=(gpio_to_irq(gpio[3].num)); irq_nr_5=(gpio_to_irq(gpio[5].num)); irq_nr_6=(gpio_to_irq(gpio[6].num));

printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_1); printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_3); printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_5); printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_6);

if(request_irq(irq_nr_1,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_131_int",&gpio[1].num)) //requesting/init interrupt {      printk(KERN_ALERT "could not request irq_1 \n"); }

if(request_irq(irq_nr_3,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_133_int",&gpio[3].num)) //requesting/init interrupt {      printk(KERN_ALERT "could not request irq_3 \n"); }

if(request_irq(irq_nr_5,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_135_int",&gpio[5].num)) //requesting/init interrupt {      printk(KERN_ALERT "could not request irq_5 \n"); }

if(request_irq(irq_nr_6,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_136_int",&gpio[6].num)) //requesting/init interrupt {      printk(KERN_ALERT "could not request irq_6 \n"); } code Efter at alle GPIO'er var opsatte kunne vi så opsætte vores interrupts ved at requeste irq. Vi benytter &gpio[1].num til at checke vilket interrupt der bliver benyttet/påvirket.

Opsætningen af keyboard gøres som des ses i 3 søjler. Ved at gøre dette har devkittet mulighed for at registre input fra matrix keyboardet. Om man ønsker at kunne benytte sig af det fulde matrix keyboard er man nød til på skift at sætte være søjle til 0 og så scanne rækkerne. code gpio_set_value(gpio[0].num, 0); gpio_set_value(gpio[2].num, 0); gpio_set_value(gpio[4].num, 0); code Interrupt implementeres

code irqreturn_t my_interrupt( int irq, void * dev_id) {

int* id = (int*)dev_id;

switch (*id) {    case 131: input_report_rel(vms_input_dev, REL_X, -10); input_sync(vms_input_dev); break;

case 133: input_report_rel(vms_input_dev, REL_X, 10); input_sync(vms_input_dev); break;

case 135: input_report_rel(vms_input_dev, REL_Y, -10); input_sync(vms_input_dev); break;

case 136: input_report_rel(vms_input_dev, REL_Y, 10); input_sync(vms_input_dev); break;

}

return IRQ_HANDLED;

} code I vores dev_id ligger de input elelr GPIO numre som gør at vi kan switche imellem de forskellige opsatte cases og på den måde skrive forskelligt til den virtuelle mouse og få den til at bevæge sig da vi så kalder input_sync.