Elomax I/O solution


Enige tijd geleden kocht in bij elomax een io module op USB. Deze werkt best aardig onder windows, maar aangezien het systeem wat het meeste aanstaat, een linux doos is, werd de zoektocht gestart naar een linux driver.

Klaas Noordstra heeft in 2005 een muis driver omgebouwd naar een I/O solution driver. (ookwel IOsolution) en deze ben ik dan ook gaan gebruiken. zie zijn site: home.wanadoo.nl/k.noordstra/iosolution/

Echter, kost het een klein beetje moeite om deze aan de gang te krijgen. Hierbij dus mijn bevindingen met SuSE 10.2 en Klaas' zijn driver.

het stappenplan is relatief simpel:

En dan nu uitgeschreven:

Downloaden driver

De driver is te vinden op Klaas zijn site: http://home.wanadoo.nl/k.noordstra/iosolution/
Een eventuele versie is ook hier te downloaden. De door mij aangepaste versie hier.

Aanpassen huidige kernel module.

De elomax IO solution wordt standaard onder linux herkend als een hid (human interface device), ookwel muis of toetsenbord. We moeten dus linux wijsmaken van deze hardware af te blijven en hiervoor de specifieke module te installeren:

ga naarde hid-core.c en edit deze

/usr/src/linux/drivers/usb/input # vi hid-core.c
        { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE },
        { 1952,4097,HID_QUIRK_IGNORE }, // I/O solution van elomax
        { 1952,4098,HID_QUIRK_IGNORE }, // AnIn solution van elomax
        { 1952,4099,HID_QUIRK_IGNORE }, // Fan solution van elomax

        { 0, 0 }
Voeg dan, zoals bovenstaand plaatje, de dikgedrukte regels toe.

Compileer dan de modules, en installeer deze:
/usr/src/linux # make cloneconfig (voor het overzetten van de huidige draaiende kernel naar een .config bestand)
/usr/src/linux # make modules
/usr/src/linux # make modules_install

Aanpassen io module voor de huidige kernel

Met de gedownloade versie van de site van Klaas, is nog een beetje extra werk nodig om deze aan de gang te krijgen in een kernel zoals bij SuSE 2.6.18-2.34 meegeleverde versie.

pak Klaas zijn source uit met:
/usr/src # tar xvzf /tmp/iosolutionxx.tar.gz
/usr/src # cd iosolution-0.6
/usr/src/iosolution-0.6 #

Pas maak aan als volgt:
#!/bin/bash
make -C /usr/src/linux SUBDIRS=$PWD modules

Draai maak
/usr/src/iosolution-0.6g # ./maak
make: Entering directory `/usr/src/linux-2.6.18.2-34'
  CC [M]  /usr/src/iosolution-0.6g/iosolution.o
/usr/src/iosolution-0.6g/iosolution.c:35:35: error: linux/devfs_fs_kernel.h: No such file or directory
/usr/src/iosolution-0.6g/iosolution.c:443: error: unknown field ‘mode’ specified in initializer
/usr/src/iosolution-0.6g/iosolution.c:608: error: unknown field ‘owner’ specified in initializer
/usr/src/iosolution-0.6g/iosolution.c:608: warning: initialization from incompatible pointer type
make[1]: *** [/usr/src/iosolution-0.6g/iosolution.o] Error 1
make: *** [_module_/usr/src/iosolution-0.6g] Error 2

Als je de ongewijzigde versie draait krijg je bovenstaande fouten.
Even aanpassen dus: (ga met het commando :35 naar regel 35)

Fout in regel 35:
#include <asm/uaccess.h>
#include <linux/device.h>

//GJ Unmaintained since 2005#include <linux/devfs_fs_kernel.h>

Fout in regel 443:
        .name =         "iosolution000",
        .fops =         &iosolution_fops,
        //GJ.mode =             S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH,
        .minor_base =   IOSOLUTION_MINOR_BASE,

Fout in regel 608:
static struct usb_driver usb_iosolution_driver = {
        //GJ.owner =    THIS_MODULE,
        .name =         "iosolution",


Denk overigens niet dat ik programmeren kan. Dit is het betere trial and error principe en veel geluk :-)

Hierna werkt het maak commando zoals we verwachten:
/usr/src/iosolution-0.6g # ./maak
make: Entering directory `/usr/src/linux-2.6.18.2-34'
  CC [M]  /usr/src/iosolution-0.6g/iosolution.o
  Building modules, stage 2.
  MODPOST
  CC      /usr/src/iosolution-0.6g/iosolution.mod.o
  LD [M]  /usr/src/iosolution-0.6g/iosolution.ko
make: Leaving directory `/usr/src/linux-2.6.18.2-34'
/usr/src/iosolution-0.6g # cp iosolution.ko /lib/modules/2.6.18.2-34-default/ (dit moet de huidige kernel versie zijn)


Installeren IO device

Nu het aanmaken van devices tegenwoordig makkelijker is gemaakt, kun je dus met udev automatisch devices aanmaken.

Echter, het concept van udev is nieuw, dus nog redelijk aan verandering onderhevig:
wijzig 20-iosolution.rules (in 1 regel toevoegen en de originele weghalen)
KERNEL=="usb*", SYSFS{idVendor}=="07a0", SYSFS{idProduct}=="1001", NAME="iosolution%m", MODE="666" ,SYMLINK+="iosolution"


Kopieer het meegeleverde 20-iosolution.rules naar /etc/udev/rules.d
/usr/src/iosolution-0.6g # cp 20-iosolution.rules /etc/udev/rules.d/
/usr/src/iosolution-0.6g # cp 20-fansolution.rules /etc/udev/rules.d/
(in mijn versie maken we ook een device voor de fansolution.... voor mijn toekomstige webcam op servo's)

Installeren IO module

Nu kan de module geladen worden, nadat we het io bordje met de usb-bus verbonden hebben.
Dec 23 19:48:59 mars kernel: usb 1-1: new low speed USB device using uhci_hcd and address 3
Dec 23 19:48:59 mars kernel: usb 1-1: new device found, idVendor=07a0, idProduct=1001
Dec 23 19:48:59 mars kernel: usb 1-1: new device strings: Mfr=1, Product=2, SerialNumber=0
Dec 23 19:48:59 mars kernel: usb 1-1: Product: I/O Solution
Dec 23 19:48:59 mars kernel: usb 1-1: Manufacturer: Leiderdorp Instruments
Dec 23 19:48:59 mars kernel: usb 1-1: configuration #1 chosen from 1 choice
Dec 23 19:49:00 mars kernel: Leiderdorp Instruments I/O Solution Aangesloten op device :iosolution0
Dec 23 19:49:00 mars kernel: usbcore: registered new driver iosolution
Dec 23 19:49:00 mars kernel: /usr/src/iosolution-0.6g/iosolution.c: v0.6:USB I/O solution driver Geladen
Dec 23 19:49:00 mars kernel: usbcore: registered new driver hiddev
Dec 23 19:49:00 mars kernel: usbcore: registered new driver usbhid
Dec 23 19:49:00 mars kernel: drivers/usb/input/hid-core.c: v2.6:USB HID core driver         

Controleren met lsmod:
/usr/src/iosolution-0.6g # lsmod | grep iosolution
iosolution             11424  0
usbcore               114896  6 usbhid,iosolution,pwc,snd_usb_audio,snd_usb_lib,uhci_hcd
/usr/src/iosolution-0.6g #   

Kijken of het device automatisch gemaakt is:
/ # ls -l /dev/iosolution
lrwxrwxrwx 1 root root 11 Dec 23 20:48 /dev/iosolution -> iosolution0

Nu de module geladen is, kunnen we de module uitlezen en aansturen.

Downloaden IO software

Nu alles eigenlijk werkt moeten we het alleen nog kunnen aansturen of juist uitlezen. Hiervoor heeft Klaas io geschreven. Deze kun je natuurlijk weer op zijn site downloaden.

Compileren IO software

uitpakken met tar xvzf io-0.1.tar.gz
daarna configure, make, make install
/usr/src/io-0.1 # ./configure 
....
configure: creating ./config.status
fast creating Makefile
fast creating io/Makefile
fast creating io/docs/Makefile
fast creating io/docs/en/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing default-1 commands
/usr/src/io-0.1 # make
/usr/src/io-0.1 # make install
/bin/sh ../admin/mkinstalldirs /usr/local/bin
  /bin/sh ../libtool --silent --mode=install /usr/bin/install -c -p  io /usr/local/bin/io

En in /usr/local/bin staat io. Nu kunnen we deze gaan gebruiken.

gebruik IO software

/usr/src/io-0.1 # io -d2
byte 0 :stroom P0.2 :15   stroom P0.3 :15
byte 1 :stroom P0.0 :15   stroom P0.1 :15
byte 2 :stroom P1.2 :15   stroom P1.3 :15
byte 3 :stroom P1.0 :15   stroom P1.1 :15
byte 4 :Pullup (+=aan): P1.0:+ P1.1:+ P1.2:+ P1.3:+ P1.4:+ P1.5:+ P1.6:+ P1.7:+
byte 5 :Pullup (+=aan): P0.0:+ P0.1:+ P0.2:+ P0.3:+ P0.4:+ P0.5:+ P0.6:+ P0.7:+
byte 6 :Data Poort 1  : P1.0:1 P1.1:1 P1.2:1 P1.3:1 P1.4:1 P1.5:1 P1.6:1 P1.7:1
byte 7 :Data Poort 0  : P0.0:1 P0.1:1 P0.2:1 P0.3:1 P0.4:1 P0.5:1 P0.6:1 P0.7:1

Als je, zoals ik, een ledje op poort 1 hebt staan, dan kun je deze laten knipperen:
# while sleep 0.5 ; do io -p0.1 h; sleep 0.5; io -p0.1 l; done

Ennuh, twee ledjes:
# while sleep 0.5 ; do io -p0.0 h; io -p0.1 l ; sleep 0.5; io -p0.0 l; io -p0.1 h ; done

Grinnik, dit moest even. Ik ben nu eenmaal gek op knipperende ledjes, vooral als het veel moeite kost om deze aan en uit te zetten :-)


back