• Keine Ergebnisse gefunden

IO-Warrior-Erweiterung und Kernelmodule unter OpenWrt

OpenWrt auf dem WLAN-Router WL-500g Premium

3.6 IO-Warrior-Erweiterung und Kernelmodule unter OpenWrt

Die IO-Warrior-Bausteine der Firma Code Mercenaries werden ausf¨uhrlich in Abschnitt 7.5 vorgestellt, und dort wird auch die Installation unter Debian erl¨autert. An dieser Stelle soll lediglich auf die Besonderheiten bei einem Be-trieb unter OpenWrt eingegangen werden.

Zum Betrieb eines IO-Warriors wird ein Kernel-Modul ben¨otigt, welches Routinen zur Kommunikation mit dem IO-Warrior-Baustein bereitstellt und auch weitere Kernel-Module zum USB-Zugriff verwendet. Die Erstellung ei-nes Kernel-Moduls f¨ur OpenWrt erfolgt ¨ahnlich der Erzeugung eigener Pakete (vgl. Abschnitt 3.5), es m¨ussen allerdings noch einige weitere Details beachtet werden.

Zun¨achst wird f¨ur das neue Paket ein Verzeichnis im Paketordner angelegt:

$ m k d i r < openwrt - dir >/ p a c k a g e / i o w a r r i o r

Wie jedes OpenWrt-Paket, so m¨ussen auch Kernel-Module ¨uber eine Beschrei-bung in Form einer DateiMakefilein das OpenWrt BS integriert werden. F¨ur das Paketkmod-iowarriorsieht diese folgendermaßen aus9:

i n c l u d e $( T O P D I R ) / r u l e s . mk

# C o m m a n d s f o r t h e c o m p i l e p r o c e s s d e f i n e B u i l d / C o m p i l e

$( M A K E ) - C "$( L I N U X _ D I R ) " \

C R O S S _ C O M P I L E = "$( T A R G E T _ C R O S S ) " \ A R C H = "$( L I N U X _ K A R C H ) " \

S U B D I R S = "$( P K G _ B U I L D _ D I R ) " \ E X T R A _ C F L A G S = "$( B U I L D F L A G S ) " \ m o d u l e s

e n d e f

# S p e c i f y w h a t to do in t h e i n s t a l l a t i o n p r o c e s s

# $( I N S T A L L _ B I N ) c o p i e s u d e v r u l e s d e f i n e K e r n e l P a c k a g e / i o w a r r i o r / i n s t a l l

$( I N S T A L L _ D I R ) $(1) / etc / u d e v / r u l e s . d /

$( I N S T A L L _ B I N ) ./ src /10 - i o w a r r i o r . r u l e s $(1) / etc / u d e v / r u l e s . d / e n d e f

# C o m p i l e p a c k a g e

$( e v a l $( c a l l K e r n e l P a c k a g e , i o w a r r i o r ) )

Besonders relevant ist der ZusatzKernelPackageam Dateiende. Hiermit wird angezeigt, dass es sich beim vorliegenden Paket nicht um ein regul¨ares Modul, sondern um ein Kernel-Modul handelt. Es muss entsprechend auch anders

¨ubersetzt werden.

Weiterhin unterscheiden sich Build-Verzeichnis und Paketbeschreibung von je-nen eines regul¨aren Paketes.

Nach dem Kopieren der Dateibeschreibung und des Quellcodes und einem anschließenden Aufruf des Konfigurationseditors sollte das eigene Modul kmod-iowarriorin der RubrikKernel modules->Other modulesauftauchen:

$ cp - r < e m b e d d e d - linux - dir >/ src / o p e n w r t / kmod - i o w a r r i o r /* < openwrt - dir >/

p a c k a g e / i o w a r r i o r /

$ m a k e m e n u c o n f i g

Um das Flash-Image nicht neu aufspielen zu m¨ussen, wird das Modul nicht per<*>in den Kernel integriert, sondern lediglich mit<M>als Modul gebaut.

Nach dem Beenden und ¨Ubersetzen mittels make liegt nach eini-gen Minuten im Verzeichnis <openwrt-dir>/bin/packages/ eine Datei kmod-iowarrior 2.6.22-brcm47xx-1 mipsel.ipk. Diese ist auf den WL-500 zu ¨ubertragen und dort ¨uber folgenden Aufruf zu installieren:

$ i p k g i n s t a l l kmod - i o w a r r i o r _ 2 .6.22 - b r c m 4 7 x x -1 _ m i p s e l . ipk

Durch die Installationsanweisungen sollte nun auch in /etc/udev/rules.d/

ein Eintrag 10-iowarrior.rules angelegt worden sein. In dieser Datei ist die Verbindung zwischen Kernel-Modul und Ger¨atenamen hinterlegt. Erkennt das IO-Warrior-Modul eine angeschlossene Platine, so werden neue Ger¨ate au-tomatisch als/dev/iowarrior<num>erzeugt. Da das Kernel-Modul auf USB-Basisfunktionen angewiesen ist, werden auch die Paketeusbcoreunduhci hcd ben¨otigt. Abschließend stellt das Paket usbutils wichtige Befehle wie z. B.

3.6 IO-Warrior-Erweiterung und Kernelmodule unter OpenWrt 73 lsusbzur Verf¨ugung, die im Umgang mit USB-Ger¨aten h¨aufiger Anwendung finden:10

$ i p k g i n s t a l l kmod - usb - c o r e

$ i p k g i n s t a l l kmod - usb - u h c i

$ i p k g i n s t a l l u s b u t i l s

Nach einem Neustart kann nun das Moduliowarriorgeladen werden:

$ i n s m o d i o w a r r i o r

Die Ausgabe vonlsmodsollte das neue Modul unter den geladenen Modulen auflisten und dessen Benutzung des Moduls usbcore anzeigen. Der Befehl dmesg11zeigt den Nachrichtenpuffer des Kernels an. Dieser enth¨alt als letzten Eintrag eine Nachricht des Modulsusbcore, welches mitteilt, dass gerade ein neuer Treiber registriert wurde. Sollten Probleme beim Laden der Module auftreten (hervorgerufen durch eine falsche Reihenfolge oder unterschiedliche Kernelversionen), so ist dies eine M¨oglichkeit, der Ursache auf den Grund zu gehen.

Nun ist es sinnvoll, das IO-Warrior-Modul beim Start automatisch zu laden.

Eine saubere Vorgehensweise hierf¨ur ist die Erstellung eines Skripts im Ver-zeichnis/etc/init.d/. Dazu ist eine Datei/etc/init.d/iowarrior anzule-gen und folanzule-gender Inhalt einzugeben:

S T A R T =99 s t a r t () {

i n s m o d i o w a r r i o r }

Die Startnummer gibt dabei die Reihenfolge des Skripts an, um die Aufrufe zu ordnen. Im vorliegenden Fall wird das Skript erst ganz am Ende aufgeru-fen. Eine Aktivierung legt das Skript in /etc/rc.d/ ab, und beim n¨achsten Systemstart wird das Modul automatisch geladen:

$ / etc / i n i t . d / i o w a r r i o r e n a b l e

Eine wichtige Anwendung fehlt noch, bevor die ersten Tests erfolgen k¨onnen:

F¨ur die Erzeugung von Ger¨aten wurden bereits Regeln hinterlegt. Das eigent-liche Programmudevzur Ger¨ateverwaltung muss jedoch noch ¨uber folgenden Befehl nachinstalliert werden:

$ i p k g i n s t a l l u d e v

Das Nachladen der Regeln ohne die Notwendigkeit eines Neustarts erfolgt durch den Befehludevcontrol:

$ u d e v c o n t r o l r e l o a d _ r u l e s

10Solltelsusbtrotz eines eingesteckten Adapters kein Ger¨at anzeigen, so hilft oft-mals ein Aufruf vonmount -t usbfs none /proc/bus/usb.

11Diagnostic Message.

Hiermit ist nun die Basis f¨ur einen ersten Testlauf geschaffen: Nach dem Ein-stecken der IO-Warrior-Platine zeigt ein Aufruf vonlsusb, ob das neue USB-Ger¨at erkannt wurde. Mit etwas Gl¨uck wurden jetzt sogar zwei USB-Ger¨ate als /dev/iowarrior0bzw./dev/iowarrior1erzeugt, die zur Kommunikation in den beiden ModiStandard undSpecial verwendet werden k¨onnen.

Die mitgelieferten I2C-Beispiele in <embedded-linux-dir>/examples/iic k¨onnen mit dem Zusatz CROSS=1cross-compiliert, und auf dem WL-500 aus-gef¨uhrt werden:12

$ m a k e C R O S S =1

Das Beispiel<embedded-linux-dir>/examples/iic/iic iowarriorzeigt die Verwendung der iowarrior i2c-Routinen: Zuerst werden alle vorhandenen IO-Warrior-Ger¨ate mit Seriennummern aufgelistet. Dann sucht das Programm nach einer Platine mit der Seriennummer00001FEC, um bei Erfolg einen daran angeschlossenen Temperatursensor vom Typ DS1631 mit Adresse0x4f auszu-lesen.

F¨ur eine ausf¨uhrliche Erkl¨arung deriowarrior i2c-Hilfsroutinen sei an dieser Stelle auf Abschnitt 8.3.4 verwiesen.

12Zu beachten ist dabei der passende Aufruf zur Erstellung des I2C-Bus-Objektes als nativ oderIO-Warrior – n¨ahere Informationen hierzu werden in Kapitel 9 gegeben.

4