<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Writing_device_drivers_in_Linux%3A_A_brief_tutorial</id>
	<title>Writing device drivers in Linux: A brief tutorial - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Writing_device_drivers_in_Linux%3A_A_brief_tutorial"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Writing_device_drivers_in_Linux:_A_brief_tutorial&amp;action=history"/>
	<updated>2026-08-30T08:36:56Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Writing_device_drivers_in_Linux:_A_brief_tutorial&amp;diff=66357&amp;oldid=prev</id>
		<title>213.176.161.198: /* destripant ahmissile */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Writing_device_drivers_in_Linux:_A_brief_tutorial&amp;diff=66357&amp;oldid=prev"/>
		<updated>2011-06-06T13:58:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;destripant ahmissile&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=Referències, llibres=&lt;br /&gt;
Un llibre sobre programació de drivers a Linux: ''LInux Device Drivers 3d Ed'':&lt;br /&gt;
*http://lwn.net/Kernel/LDD3/&lt;br /&gt;
És la 3a edició del llibre que cobreix el kernel 2.6&lt;br /&gt;
&lt;br /&gt;
Understanding the Linux Kernel:&lt;br /&gt;
*http://oreilly.com/catalog/9780596005658/&lt;br /&gt;
=Driver per al port paral.le.=&lt;br /&gt;
*http://www.freesoftwaremagazine.com/articles/drivers_linux&lt;br /&gt;
Aquest article és una introducció a la programacié de drivers a Linux per a dispositius hardware (concretament un port paral.lel)&lt;br /&gt;
&lt;br /&gt;
Creo els fitxers nothing.c i Makefile en el directori /usr/src/linux-headers-2.6.28-11-generic/pwd, doncs el make li dic on ha de buscar el Makefile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make -C /usr/src/linux-headers-2.6.28-11-generic M=pwd modules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
opció -C:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-C dir, --directory=dir&lt;br /&gt;
            Change to directory dir before reading the makefiles or doing any‐&lt;br /&gt;
            thing else. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# make -C /usr/src/linux-headers-2.6.28-11-generic M=pwd modules&lt;br /&gt;
make: se ingresa al directorio `/usr/src/linux-headers-2.6.28-11-generic'&lt;br /&gt;
  CC [M]  pwd/nothing.o&lt;br /&gt;
  Building modules, stage 2.&lt;br /&gt;
  MODPOST 1 modules&lt;br /&gt;
  CC      pwd/nothing.mod.o&lt;br /&gt;
  LD [M]  pwd/nothing.ko&lt;br /&gt;
make: se sale del directorio `/usr/src/linux-headers-2.6.28-11-generic'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S'ha creat tota una sèrie de fitxers, entre els quals nothing.ko i nothing.o&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
INSMOD(8)                                                            INSMOD(8)&lt;br /&gt;
&lt;br /&gt;
NAME&lt;br /&gt;
       insmod - simple program to insert a module into the Linux Kernel&lt;br /&gt;
&lt;br /&gt;
SYNOPSIS&lt;br /&gt;
       insmod [ filename ] [ module options ... ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
carreguel el mòdul en el linux kernel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /usr/src/linux-headers-2.6.28-11-generic/pwd&lt;br /&gt;
# insmod nothing.ko &lt;br /&gt;
&lt;br /&gt;
# lsmod | grep nothing&lt;br /&gt;
nothing                 9088  0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
i elimino el mòdul del Linux Kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# rmmod nothing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
He carregat i descarregat un mòdul que no fa res.&lt;br /&gt;
&lt;br /&gt;
'''exemple hello.c'''&lt;br /&gt;
&lt;br /&gt;
compilem igual que abans&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ insmod hello.ko&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comprovem que s'ha carregat el mòdul amb lsmod, i mirem els missatges que s'han produït en el log de dues maneres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cat /var/log/syslog&lt;br /&gt;
...&lt;br /&gt;
Feb 24 16:30:28 ubuntu-bbdd kernel: [ 3189.090368]  Hello world!&lt;br /&gt;
&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 3189.090368]  Hello world!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''exemple memory'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mknod /dev/memory c 60 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above, c means that a char device is to be created, 60 is the major number and 0 is the minor number.&lt;br /&gt;
&lt;br /&gt;
En el fitxer memory.c, he comentat la línia //#include &amp;lt;linux/config.h&amp;gt; que em donava problemes en el moment de la compilació.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# insmod memory.ko&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It’s also convenient to unprotect the device:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chmod 666 /dev/memory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If everything went well, you will have a device /dev/memory to which you can write a string of characters and it will store the last one of them. You can perform the operation like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ echo -n abcdef &amp;gt;/dev/memory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check the content of the device you can use a simple cat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cat /dev/memory&lt;br /&gt;
f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Exemple ParlelPort''': cas real de fer un driver que treballi amb el port paral.lel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /proc/ioports | grep 378&lt;br /&gt;
0378-037a : parport0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
compilo com abans, i carrego el mòdul en el kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# insmod parlelport.ko&lt;br /&gt;
&lt;br /&gt;
# lsmod | grep parlelport&lt;br /&gt;
parlelport             10116  0&lt;br /&gt;
&lt;br /&gt;
# cat /var/log/syslog&lt;br /&gt;
Feb 24 17:11:07 ubuntu-bbdd kernel: [ 5627.971102] Inserting parlelport module&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Per enviar un byte al port paral.lel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ echo -n A &amp;gt;/dev/parlelport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
això ha d'encendre els LEDs 0 i 6è (o 1r i 7è, depèn de com es miri). I com és això&lt;br /&gt;
el caràcter 'A' en el codi ASCII és el 65 (Dec) o 41 (Hex), que equival a 1000001&lt;br /&gt;
i també puc llegir la informació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cat /dev/parlelport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
hem de fer un petit array de LEDs per comprovar que funciona.&lt;br /&gt;
&lt;br /&gt;
I ara ja tenim fet el driver, podem construir les nostres aplicacions que utilitzin aquest driver. Final application: '''flashing lights'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gcc -o lights lights.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=USB missile launcher=&lt;br /&gt;
==1a prova (no funciona)==&lt;br /&gt;
Writing a Linux kernel driver for an unknown USB device: DreamCheeky USB missile launcher&lt;br /&gt;
*http://www.thinkgeek.com/geektoys/warfare/8a0f/&lt;br /&gt;
*http://www.lukecole.name/research_and_projects/personal/usb_missile_launcher/&lt;br /&gt;
*http://matthias.vallentin.net/2007/04/writing-linux-kernel-driver-for-unknown.html (ben explicat)&lt;br /&gt;
És un projecte que està a Sourceforge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
CC USBMissileLauncherUtils.o&lt;br /&gt;
En el fichero incluído de USBMissileLauncherUtils.c:40:&lt;br /&gt;
USBMissileLauncher.h:37:17: error: usb.h: No existe el fichero ó directorio&lt;br /&gt;
make: *** [USBMissileLauncherUtils.o] Error 1&lt;br /&gt;
&lt;br /&gt;
$ sudo apt-get install libusb-dev&lt;br /&gt;
&lt;br /&gt;
i ara sí&lt;br /&gt;
$ make&lt;br /&gt;
$  sudo make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
compila i s'instal.la bé, ha de funcionar sense problemes. Esperant que arribi... Imprimeixo el codi i es pot seguir bastant bé.&lt;br /&gt;
==2a prova (quasi funciona)==&lt;br /&gt;
segueixo:&lt;br /&gt;
*http://matthias.vallentin.net/2007/04/writing-linux-kernel-driver-for-unknown.html (ben explicat)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ lsusb -v&lt;br /&gt;
...&lt;br /&gt;
Bus 005 Device 002: ID 0a81:0701 Chesen Electronics Corp. &lt;br /&gt;
Device Descriptor:&lt;br /&gt;
  bLength                18&lt;br /&gt;
  bDescriptorType         1&lt;br /&gt;
  bcdUSB               1.10&lt;br /&gt;
  bDeviceClass            0 (Defined at Interface level)&lt;br /&gt;
  bDeviceSubClass         0 &lt;br /&gt;
  bDeviceProtocol         0 &lt;br /&gt;
  bMaxPacketSize0         8&lt;br /&gt;
  idVendor           0x0a81 Chesen Electronics Corp.&lt;br /&gt;
  idProduct          0x0701 &lt;br /&gt;
  bcdDevice            0.01&lt;br /&gt;
  iManufacturer           1 Dream Link&lt;br /&gt;
  iProduct                2 USB Missile Launcher v1.0&lt;br /&gt;
  iSerial                 0 &lt;br /&gt;
  bNumConfigurations      1&lt;br /&gt;
  Configuration Descriptor:&lt;br /&gt;
    bLength                 9&lt;br /&gt;
    bDescriptorType         2&lt;br /&gt;
    wTotalLength           34&lt;br /&gt;
    bNumInterfaces          1&lt;br /&gt;
    bConfigurationValue     1&lt;br /&gt;
    iConfiguration          0 &lt;br /&gt;
    bmAttributes         0xa0&lt;br /&gt;
      (Bus Powered)&lt;br /&gt;
      Remote Wakeup&lt;br /&gt;
    MaxPower              100mA&lt;br /&gt;
    Interface Descriptor:&lt;br /&gt;
      bLength                 9&lt;br /&gt;
      bDescriptorType         4&lt;br /&gt;
      bInterfaceNumber        0&lt;br /&gt;
      bAlternateSetting       0&lt;br /&gt;
      bNumEndpoints           1&lt;br /&gt;
      bInterfaceClass         3 Human Interface Device&lt;br /&gt;
      bInterfaceSubClass      0 No Subclass&lt;br /&gt;
      bInterfaceProtocol      0 None&lt;br /&gt;
      iInterface              0 &lt;br /&gt;
        HID Device Descriptor:&lt;br /&gt;
          bLength                 9&lt;br /&gt;
          bDescriptorType        33&lt;br /&gt;
          bcdHID               1.00&lt;br /&gt;
          bCountryCode            0 Not supported&lt;br /&gt;
          bNumDescriptors         1&lt;br /&gt;
          bDescriptorType        34 Report&lt;br /&gt;
          wDescriptorLength      52&lt;br /&gt;
         Report Descriptors: &lt;br /&gt;
           ** UNAVAILABLE **&lt;br /&gt;
      Endpoint Descriptor:&lt;br /&gt;
        bLength                 7&lt;br /&gt;
        bDescriptorType         5&lt;br /&gt;
        bEndpointAddress     0x81  EP 1 IN&lt;br /&gt;
        bmAttributes            3&lt;br /&gt;
          Transfer Type            Interrupt&lt;br /&gt;
          Synch Type               None&lt;br /&gt;
          Usage Type               Data&lt;br /&gt;
        wMaxPacketSize     0x0001  1x 1 bytes&lt;br /&gt;
        bInterval              20&lt;br /&gt;
Device Status:     0x0000&lt;br /&gt;
  (Bus Powered)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i fixem-nos que:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  idVendor           0x0a81 Chesen Electronics Corp.&lt;br /&gt;
  idProduct          0x0701 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
això ho he de canviar en el fitxer ''ml_driver.c'':&lt;br /&gt;
Descarrego el codi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ svn checkout http://mavam.googlecode.com/svn/trunk/ mavam-read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i compilo però dóna un error:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
scripts/Makefile.build:46: *** CFLAGS was changed in &amp;quot;/home/joan/ml-driver/hola/mavam-read-only/ml-driver/Makefile&amp;quot;. Fix it to use EXTRA_CFLAGS.  Alto.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cercant per google trobo la solució:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo joe /usr/src/linux-headers-2.6.28-11-generic/scripts/Makefile.build&lt;br /&gt;
&lt;br /&gt;
Delete -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# If the save-* variables changed error out&lt;br /&gt;
ifeq ($(KBUILD_NOPEDANTIC),)&lt;br /&gt;
        ifneq (&amp;quot;$(save-cflags)&amp;quot;,&amp;quot;$(CFLAGS)&amp;quot;)&lt;br /&gt;
                $(error CFLAGS was changed in &amp;quot;$(kbuild-file)&amp;quot;. Fix it to use EXTRA_CFLAGS)&lt;br /&gt;
        endif&lt;br /&gt;
endif&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Save&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i ara ja compila&lt;br /&gt;
&lt;br /&gt;
i es generen els fitxers del driver:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ls -la&lt;br /&gt;
total 172&lt;br /&gt;
drwxrwxrwx 4 joan joan  4096 2011-05-18 18:45 .&lt;br /&gt;
drwxrwxrwx 5 joan joan  4096 2011-05-18 17:32 ..&lt;br /&gt;
-rwxrwxrwx 1 joan joan    49 2011-05-18 17:32 AUTHORS&lt;br /&gt;
-rwxrwxrwx 1 joan joan   131 2011-05-18 17:32 ChangeLog&lt;br /&gt;
-rwxrwxrwx 1 joan joan   775 2011-05-18 17:32 INSTALL&lt;br /&gt;
-rwxrwxrwx 1 joan joan   401 2011-05-18 17:41 Makefile&lt;br /&gt;
-rwxrwxrwx 1 joan joan 15755 2011-05-18 17:32 ml_driver.c&lt;br /&gt;
-rw-r--r-- 1 joan joan 23027 2011-05-18 18:45 ml_driver.ko&lt;br /&gt;
-rw-r--r-- 1 joan joan   302 2011-05-18 18:45 .ml_driver.ko.cmd&lt;br /&gt;
-rw-r--r-- 1 joan joan  1552 2011-05-18 18:45 ml_driver.mod.c&lt;br /&gt;
-rw-r--r-- 1 joan joan 11744 2011-05-18 18:45 ml_driver.mod.o&lt;br /&gt;
-rw-r--r-- 1 joan joan 19322 2011-05-18 18:45 .ml_driver.mod.o.cmd&lt;br /&gt;
-rw-r--r-- 1 joan joan 11968 2011-05-18 18:45 ml_driver.o&lt;br /&gt;
-rw-r--r-- 1 joan joan 26421 2011-05-18 18:45 .ml_driver.o.cmd&lt;br /&gt;
-rwxrwxrwx 1 joan joan   640 2011-05-18 17:32 ml_manage.sh&lt;br /&gt;
-rw-r--r-- 1 joan joan     0 2011-05-18 18:45 Module.markers&lt;br /&gt;
-rw-r--r-- 1 joan joan    72 2011-05-18 18:45 modules.order&lt;br /&gt;
-rw-r--r-- 1 joan joan     0 2011-05-18 18:45 Module.symvers&lt;br /&gt;
-rwxrwxrwx 1 joan joan   429 2011-05-18 17:32 README&lt;br /&gt;
drwxrwxrwx 6 joan joan  4096 2011-05-18 17:32 .svn&lt;br /&gt;
drwxrwxrwx 2 joan joan  4096 2011-05-18 18:45 .tmp_versions&lt;br /&gt;
-rwxrwxrwx 1 joan joan  2221 2011-05-18 17:32 user-space.c&lt;br /&gt;
-rwxrwxrwx 1 joan joan     6 2011-05-18 17:32 VERSION&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
abans hem de crear el grup ''wheel'', i afegir el nostre usuari a aquest grup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo ./ml_manage.sh load (també es pot fer unload)&lt;br /&gt;
mknod -m 664 /dev/ml0 c 189 0&lt;br /&gt;
mknod -m 664 /dev/ml1 c 189 1&lt;br /&gt;
mknod -m 664 /dev/ml2 c 189 2&lt;br /&gt;
mknod -m 664 /dev/ml3 c 189 3&lt;br /&gt;
chgrp: grupo inválido «wheel»&lt;br /&gt;
&lt;br /&gt;
chgrp ${group} /dev/${device}[0-3]&lt;br /&gt;
sudo chgrp wheel /dev/ml0&lt;br /&gt;
sudo chgrp wheel /dev/ml1&lt;br /&gt;
sudo chgrp wheel /dev/ml2&lt;br /&gt;
sudo chgrp wheel /dev/ml3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Comprovem els missatges del sistema:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
[185521.655507] usbcore: registered new interface driver missile_launcher&lt;br /&gt;
[185521.655835] [info]  usb_ml_init(646): driver registered successfully&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ara compilo l'apliació de prova:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gcc -o ml_control user-space.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
de moment no funciona:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo ./ml_control -l&lt;br /&gt;
could not send command to -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
desconnecto i torno a connectar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
[186325.048074] usb 5-1: USB disconnect, address 2&lt;br /&gt;
[186327.672021] usb 5-1: new low speed USB device using uhci_hcd and address 3&lt;br /&gt;
[186327.849524] usb 5-1: configuration #1 chosen from 1 choice&lt;br /&gt;
[186327.875253] generic-usb 0003:0A81:0701.0003: hiddev96,hidraw1: USB HID v1.00 Device [Dream Link USB Missile Launcher v1.0] on usb-0000:00:1d.3-1/input0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
però estem igual.&lt;br /&gt;
&lt;br /&gt;
El problema està en què aquest codi no utilitza la llibreria '''libusb''', sinó que programa un mòdul del kernel directament per al dispositiu. Ara bé, jo no sé com desinstal.lar/deshabilitar el libusb sense que tot se'n vagi al garete, doncs eliminar el paquet libusb desinstal.la moltíssimes coses.&lt;br /&gt;
==3a prova: launcher (de moment no funciona)==&lt;br /&gt;
És un link dels proposats per Mathias Valentin a Related Work (*http://matthias.vallentin.net/2007/04/writing-linux-kernel-driver-for-unknown.html)&lt;br /&gt;
*http://kim.tensta.gannert.se/projects/launcher/&lt;br /&gt;
El problema està en què està molt mal documentat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./configure&lt;br /&gt;
$ make&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ja sé compilar el programes que estan a src/test, com per exemple fire.c:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make clean (si cal)&lt;br /&gt;
$ make fire&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les comandes que genera el make i que fan compilar fire.c són:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc -DHAVE_CONFIG_H -I. -I. -I../../src/include -g -O2 -MT fire.o -MD -MP -MF &amp;quot;.deps/fire.Tpo&amp;quot; -c -o fire.o fire.c;&lt;br /&gt;
gcc  -g -O2   -o fire  fire.o ../../src/lib/liblauncher.a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./fire --help&lt;br /&gt;
Failed to open device '/dev/usb/hiddev0': No such device or address (6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ho provo com a joan sense sudo i amb sudo, i com a root, però sempre obtinc el mateix missatge.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ls -la /dev/usb/hiddev0&lt;br /&gt;
crw-rw---- 1 root root 180, 96 2011-05-23 13:13 /dev/usb/hiddev0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Però això pot ser perquè no he actualitzat el id_vendor del dispositiu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make calibrate&lt;br /&gt;
$ make control&lt;br /&gt;
$ make enum&lt;br /&gt;
$ make fire&lt;br /&gt;
$ make status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Però fixem-nos:&lt;br /&gt;
&lt;br /&gt;
Amb el Rocket Launcher desconnectat:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./enum &lt;br /&gt;
Failed to enumerate devices: No such file or directory (2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Amb el Rocket Launcher connectat:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./enum &lt;br /&gt;
  /dev/usb/hiddev0: Unknown Device&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per tant no el troba, i és lógic doncs el id_vendor i id_product encara estan malament, no els he canviat per a la nova versió.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./fire &lt;br /&gt;
Failed to open device '/dev/usb/hiddev0': No such file or directory (2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ find /home/joan/launcher-1.0 -type f -print | xargs egrep -i 1941&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
la informació del '''id_vendor''' està en la línia 35 del fitxer src/lib/device.c. Canvio &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if ((info.vendor &amp;amp; 0xFFFF) == 0x1941 &amp;amp;&amp;amp; (info.product &amp;amp; 0xFFFF) == 0x8021)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
per&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if ((info.vendor &amp;amp; 0xFFFF) == 0x0a81 &amp;amp;&amp;amp; (info.product &amp;amp; 0xFFFF) == 0x0701)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
instal.lo libhid-dev i libhid0, doncs com es comenta en el README, The library uses the&lt;br /&gt;
USB HID API of the operating system for hardware access. &lt;br /&gt;
&lt;br /&gt;
Si ens fixem en la sortida de enum no s'ha arreglat res, però si veiem la sortida de ''fire'' ara veiem que sí que ha detectat el dispositiu. Tanmateix, encara no funciona. Hi ha la possibilitat de que els missatges que dóna la versió nova i la versió vella del dispositiu siguin diferents.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./enum &lt;br /&gt;
  /dev/usb/hiddev0: Unknown Device&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./fire &lt;br /&gt;
Setting feedback...&lt;br /&gt;
Failed to get 1: Invalid argument (22)&lt;br /&gt;
Failed to set feedback '/dev/usb/hiddev0': Invalid argument (22)&lt;br /&gt;
Failed to send 1: Invalid argument (22)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==4a prova: ahmissile (funciona, amb libusb)==&lt;br /&gt;
És un link dels proposats per Mathias Valentin a Related Work (*http://matthias.vallentin.net/2007/04/writing-linux-kernel-driver-for-unknown.html)&lt;br /&gt;
&lt;br /&gt;
*http://fatal.se/fulhack/ahmissile/&lt;br /&gt;
llegim en el README&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb vendor/device id example for supported device:&lt;br /&gt;
Bus 001 Device 013: ID 1941:8021 Dream Cheeky USB Missile Launcher&lt;br /&gt;
&lt;br /&gt;
Since version 0.5 the new model (which looks identical) is also supported&lt;br /&gt;
thanks to Philipp Stern &amp;lt;info@getdigital.de&amp;gt; who sent me one:&lt;br /&gt;
Bus 002 Device 049: ID 0a81:0701 Chesen Electronics Corp.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i efectivament, aquest és el nostre model, per tant segur que ha de funcionar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dependencies:&lt;br /&gt;
        libusb (http://libusb.sf.net)&lt;br /&gt;
        GTK+ (http://www.gtk.org)&lt;br /&gt;
&lt;br /&gt;
Current status:&lt;br /&gt;
        - basic movement (up, down, left, right, fire) works.&lt;br /&gt;
        - basic safety implemented (stop when reaching max position).&lt;br /&gt;
        - tested on Debian GNU/Linux Unstable AMD64 (and&lt;br /&gt;
          older versions on Debian GNU/Linux 4.0 Etch PowerPC).&lt;br /&gt;
        - Device gets claimed by the kernel usbhid driver, try running&lt;br /&gt;
          this program as root if you have problems to give it &lt;br /&gt;
          permissions to detach the attached drivers on startup.&lt;br /&gt;
          See example udev rules in contrib/ to get permissions &lt;br /&gt;
          to the missile launcher as a regular user.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
&lt;br /&gt;
The program is not actively developed. Here's a list of things that I've&lt;br /&gt;
thought would be nice to have but will probably not implement. The main &lt;br /&gt;
reason this exists is to not forget the ideas, or if someone else wants&lt;br /&gt;
to have ideas for patches that I'd be happy if I received. :)&lt;br /&gt;
&lt;br /&gt;
        == core ==&lt;br /&gt;
        - find out how to *reliably* poll the device (tested only on old&lt;br /&gt;
          device, maybe the new one can be polled without problem) to   &lt;br /&gt;
          detect and stop the fire sequence as soon as an arrow has been&lt;br /&gt;
          fired instead of just sleeping until a timeout is triggered.  &lt;br /&gt;
        - Robustness fixes.&lt;br /&gt;
          . Cache max positions to avoid triggering tiny movements again and&lt;br /&gt;
            again after reaching a max position.&lt;br /&gt;
          . Handle usb message errors (sleep to await recovery? retry?).&lt;br /&gt;
        - implement &amp;quot;goto-fixed-position&amp;quot; (maxleft, maxtop, ...).&lt;br /&gt;
        - implement &amp;quot;reset&amp;quot;.&lt;br /&gt;
        == interface ==&lt;br /&gt;
        - add nice dialog for when attaching/claiming device fails.&lt;br /&gt;
        - make it possible to record commands and then play them back.&lt;br /&gt;
        - add posibility to go to fixed positions like &amp;quot;top left corner&amp;quot;&lt;br /&gt;
        - add sound effects playback function.&lt;br /&gt;
        == not (currently) planned ==&lt;br /&gt;
        - implement support for multiple missile launchers.&lt;br /&gt;
        - restructure into a true missile-control backend library.&lt;br /&gt;
        - implement web interface.&lt;br /&gt;
        - implement motion-sensoring webcam.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Instal.lem sense problemes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./configure&lt;br /&gt;
$ make&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ara endollem el Missile Launcher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
[ 1664.108752] usb 2-1.1: new low speed USB device using ehci_hcd and address 4&lt;br /&gt;
[ 1664.224301] usb 2-1.1: configuration #1 chosen from 1 choice&lt;br /&gt;
[ 1664.227825] generic-usb 0003:0A81:0701.0002: hiddev96,hidraw1: USB HID v1.00 Device [Dream Link USB Missile Launcher v1.0] on usb-0000:00:1d.0-1.1/input0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El problema és que l'aplicació no és molt fina, i només em mostra una interfície gràfica (GTK). No és una aplicació de consola. Per la qual cosa d'entrada és difícil crear front-ends nous. S'hauria de reprogramar per extreure'n només una funcionalitat de consola.&lt;br /&gt;
&lt;br /&gt;
Ara bé, almenys funciona.&lt;br /&gt;
==destripant ahmissile==&lt;br /&gt;
del make es dedueix les següent instruccions per compilar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
generem main.o&lt;br /&gt;
&lt;br /&gt;
gcc -DHAVE_CONFIG_H -I. -I. -I.. -DPACKAGE_DATA_DIR=\&amp;quot;&amp;quot;/usr/local/share&amp;quot;\&amp;quot; -DPACKAGE_LOCALE_DIR=\&amp;quot;&amp;quot;/usr/local/share/locale&amp;quot;\&amp;quot; -pthread -D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12      -g -O2 -MT main.o -MD -MP -MF &amp;quot;.deps/main.Tpo&amp;quot; -c -o main.o main.c&lt;br /&gt;
&lt;br /&gt;
generem support.o&lt;br /&gt;
&lt;br /&gt;
gcc -DHAVE_CONFIG_H -I. -I. -I.. -DPACKAGE_DATA_DIR=\&amp;quot;&amp;quot;/usr/local/share&amp;quot;\&amp;quot; -DPACKAGE_LOCALE_DIR=\&amp;quot;&amp;quot;/usr/local/share/locale&amp;quot;\&amp;quot; -pthread -D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12      -g -O2 -MT support.o -MD -MP -MF &amp;quot;.deps/support.Tpo&amp;quot; -c -o support.o support.c&lt;br /&gt;
&lt;br /&gt;
generem interface.o&lt;br /&gt;
&lt;br /&gt;
gcc -DHAVE_CONFIG_H -I. -I. -I.. -DPACKAGE_DATA_DIR=\&amp;quot;&amp;quot;/usr/local/share&amp;quot;\&amp;quot; -DPACKAGE_LOCALE_DIR=\&amp;quot;&amp;quot;/usr/local/share/locale&amp;quot;\&amp;quot; -pthread -D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12      -g -O2 -MT interface.o -MD -MP -MF &amp;quot;.deps/interface.Tpo&amp;quot; -c -o interface.o interface.c&lt;br /&gt;
&lt;br /&gt;
generem callbacks.o&lt;br /&gt;
&lt;br /&gt;
gcc -DHAVE_CONFIG_H -I. -I. -I.. -DPACKAGE_DATA_DIR=\&amp;quot;&amp;quot;/usr/local/share&amp;quot;\&amp;quot; -DPACKAGE_LOCALE_DIR=\&amp;quot;&amp;quot;/usr/local/share/locale&amp;quot;\&amp;quot; -pthread -D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12      -g -O2 -MT callbacks.o -MD -MP -MF &amp;quot;.deps/callbacks.Tpo&amp;quot; -c -o callbacks.o callbacks.c&lt;br /&gt;
&lt;br /&gt;
genereme ahmissile.o&lt;br /&gt;
&lt;br /&gt;
gcc -DHAVE_CONFIG_H -I. -I. -I.. -DPACKAGE_DATA_DIR=\&amp;quot;&amp;quot;/usr/local/share&amp;quot;\&amp;quot; -DPACKAGE_LOCALE_DIR=\&amp;quot;&amp;quot;/usr/local/share/locale&amp;quot;\&amp;quot; -pthread -D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12      -g -O2 -MT ahmissile.o -MD -MP -MF &amp;quot;.deps/ahmissile.Tpo&amp;quot; -c -o ahmissile.o ahmissile.c;&lt;br /&gt;
&lt;br /&gt;
generem usbhelper.o&lt;br /&gt;
&lt;br /&gt;
gcc -DHAVE_CONFIG_H -I. -I. -I.. -DPACKAGE_DATA_DIR=\&amp;quot;&amp;quot;/usr/local/share&amp;quot;\&amp;quot; -DPACKAGE_LOCALE_DIR=\&amp;quot;&amp;quot;/usr/local/share/locale&amp;quot;\&amp;quot; -pthread -D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12      -g -O2 -MT usbhelper.o -MD -MP -MF &amp;quot;.deps/usbhelper.Tpo&amp;quot; -c -o usbhelper.o usbhelper.c&lt;br /&gt;
&lt;br /&gt;
generem l'executable ahmissile&lt;br /&gt;
&lt;br /&gt;
gcc  -g -O2   -o ahmissile  main.o support.o interface.o callbacks.o ahmissile.o usbhelper.o -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lusb    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interfície web per al USB Missile Launcher==&lt;br /&gt;
També es pot programar amb python:&lt;br /&gt;
*http://www.justuber.com/blog/2007/01/01/usb-missile-launcher-web-control-interface-for-linux/&lt;br /&gt;
i en aquest projecte hi ha el fitxer missile.php on es veu clarament com des d'una pàgina web s'executa un fitxer python. Per tant, des de PHP també podem executar l'aplicatiu USBMissileLauncherUtils.&lt;br /&gt;
&lt;br /&gt;
'''missile.php''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Chris -christopherrowson (at) gmail.com&lt;br /&gt;
&lt;br /&gt;
You are free to copy, modify or build upon this work, but you must keep this statement intact. &lt;br /&gt;
&lt;br /&gt;
I take no responsibility for the way in which you use this code, or any damage it may cause to you, your system or anyone else. By using it you agree that it is provided as is without any implied fitness for purpose --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content=&amp;quot;text/html; charset=ISO-8859-1&amp;quot;&lt;br /&gt;
 http-equiv=&amp;quot;content-type&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;missile&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 200px; text-align: left;&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tbody&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top; text-align: center;&amp;quot;&amp;gt;&amp;lt;a&lt;br /&gt;
 href=&amp;quot;/missile.php?cmd=up&amp;quot;&amp;gt;&amp;lt;img alt=&amp;quot;up&amp;quot;&lt;br /&gt;
 src=&amp;quot;/images/arrowup.png&amp;quot;&lt;br /&gt;
 style=&amp;quot;border: 0px solid ; width: 80px; height: 78px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/missile.php?cmd=left&amp;quot;&amp;gt;&amp;lt;img&lt;br /&gt;
 alt=&amp;quot;left&amp;quot;&lt;br /&gt;
 src=&amp;quot;/images/arrowleft.png&amp;quot;&lt;br /&gt;
 style=&amp;quot;border: 0px solid ; width: 80px; height: 82px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top; text-align: center;&amp;quot;&amp;gt;&amp;lt;a&lt;br /&gt;
 href=&amp;quot;/missile.php?cmd=stop&amp;quot;&amp;gt;&amp;lt;img alt=&amp;quot;stop&amp;quot; src=&amp;quot;/images/stop.png&amp;quot;&lt;br /&gt;
 style=&amp;quot;border: 0px solid ; width: 80px; height: 80px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/missile.php?cmd=right&amp;quot;&amp;gt;&amp;lt;img&lt;br /&gt;
 alt=&amp;quot;right&amp;quot;&lt;br /&gt;
 src=&amp;quot;/images/arrowright.png&amp;quot;&lt;br /&gt;
 style=&amp;quot;border: 0px solid ; width: 80px; height: 82px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/missile.php?cmd=fire&amp;quot;&amp;gt;&amp;lt;img&lt;br /&gt;
 alt=&amp;quot;fire&amp;quot; src=&amp;quot;images/circle.png&amp;quot;&lt;br /&gt;
 style=&amp;quot;border: 0px solid ; width: 80px; height: 80px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top; text-align: center;&amp;quot;&amp;gt;&amp;lt;a&lt;br /&gt;
 href=&amp;quot;/missile.php?cmd=down&amp;quot;&amp;gt;&amp;lt;img alt=&amp;quot;down&amp;quot;&lt;br /&gt;
 src=&amp;quot;/images/arrowdown.png&amp;quot;&lt;br /&gt;
 style=&amp;quot;border: 0px solid ; width: 80px; height: 78px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td style=&amp;quot;vertical-align: top;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;/tbody&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This code takes input from a webpage a passes it to the up.py perl script. The up.py perl script then sends an argument to the usb-missile-launcher controller perl script on a remote machine via the UDP network protocol.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Defines the switch to be used and which functions to call when a command is passed.&lt;br /&gt;
&lt;br /&gt;
switch($_REQUEST['cmd'])&lt;br /&gt;
  {&lt;br /&gt;
  case &amp;quot;up&amp;quot;:&lt;br /&gt;
	up();&lt;br /&gt;
	break;&lt;br /&gt;
  case &amp;quot;down&amp;quot;:&lt;br /&gt;
	down();&lt;br /&gt;
	break;&lt;br /&gt;
  case &amp;quot;left&amp;quot;:&lt;br /&gt;
	left();&lt;br /&gt;
	break;&lt;br /&gt;
  case &amp;quot;right&amp;quot;:&lt;br /&gt;
	right();&lt;br /&gt;
	break;&lt;br /&gt;
  case &amp;quot;stop&amp;quot;:&lt;br /&gt;
	stop();&lt;br /&gt;
	break;&lt;br /&gt;
  case &amp;quot;fire&amp;quot;:&lt;br /&gt;
	fire();&lt;br /&gt;
	break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Functions defining which command to execute. In this case the command is passed to the perl script telling it which command to send to the usb-missile-launcher controller.&lt;br /&gt;
&lt;br /&gt;
function up()&lt;br /&gt;
{&lt;br /&gt;
  echo exec('./up.py w');&lt;br /&gt;
}&lt;br /&gt;
function left()&lt;br /&gt;
{&lt;br /&gt;
  echo exec('./up.py a');&lt;br /&gt;
}&lt;br /&gt;
function right()&lt;br /&gt;
{&lt;br /&gt;
  echo exec('./up.py d');&lt;br /&gt;
}&lt;br /&gt;
function down()&lt;br /&gt;
{&lt;br /&gt;
  echo exec('./up.py x');&lt;br /&gt;
}&lt;br /&gt;
function stop()&lt;br /&gt;
{&lt;br /&gt;
  echo exec('./up.py s');&lt;br /&gt;
}&lt;br /&gt;
function fire()&lt;br /&gt;
{&lt;br /&gt;
  echo exec('./up.py f');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, febrer 2011, maig 2011&lt;/div&gt;</summary>
		<author><name>213.176.161.198</name></author>
		
	</entry>
</feed>