• Keine Ergebnisse gefunden

Zugriff auf die Alekto-Hardware

Debian auf dem Embedded-PC OpenRISC-Alekto

5.5 Zugriff auf die Alekto-Hardware

Grunds¨atzlich gibt es zwei M¨oglichkeiten, die Hardware-Schnittstellen des Alekto anzusprechen. Im Verzeichnis /proc/vsopenrisc/ sind virtuelle Ger¨atedateien abgelegt, ¨uber welche Schnittstellen konfiguriert und Daten ge-lesen oder geschrieben werden k¨onnen. Im ersten Abschnitt wird die einfa-che Variante in Form eines direkten Zugriffs auf diese Ger¨atedateien mittels Konsolenbefehlen vorgestellt, im zweiten Abschnitt die Verwendung innerhalb eigener Anwendungen mithilfe derioctl()-Funktionen.

5.5.1 Anwendung der/proc-Erweiterungen in der Konsole

¨Uber den echo-Befehl k¨onnen Daten in die Ger¨atedateien geschrieben und so Hardware-Komponenten angesprochen werden. Um bspw. den eingebau-ten Summer an- oder abzuschaleingebau-ten, m¨ussen in der Konsole lediglich folgende Befehlszeilen eingegeben werden:

$ e c h o 1 > / p r o c / v s o p e n r i s c / b u z z e r

$ e c h o 0 > / p r o c / v s o p e n r i s c / b u z z e r

Mittelscatwird der Inhalt der Ger¨atedateien auf der Konsole angezeigt. Um den Status der LEDs auszugeben oder diese an- bzw. auszuschalten, wird fol-gendermaßen vorgegangen:

$ cat / p r o c / v s o p e n r i s c / l e d s

$ e c h o G R E E N > / p r o c / v s o p e n r i s c / l e d s

$ e c h o g r e e n > / p r o c / v s o p e n r i s c / l e d s

Etwas anders verh¨alt es sich mit den digitalen Ein- und Ausg¨angen (GPIO).

¨Uber/proc/vsopenrisc/gpio ctrlmuss zun¨achst festgelegt werden, ob die jeweiligen Pins als Ein- oder Ausg¨ange verwendet werden sollen, bevor ¨uber /proc/vsopenrisc/gpio datadie eigentlichen Daten gelesen und geschrieben werden k¨onnen. Auch wenn es sich nur um acht GPIO-Leitungen und damit um ein zu schreibendes Daten-Byte handelt, m¨ussen dennoch immer Daten vom Typlong, also vier Bytes, ¨ubermittelt werden. Vor der ¨Ubertragung der Daten wird zuerst eine Maske ¨ubertragen. Sie gibt an, welche der nachfolgen-den Daten-Bits zu ber¨ucksichtigen sind. Jede Vorgabe erfolgt demnach in der Form:

$ e c h o < mask > < value > / p r o c / v s o p e n r i s c / gpio_ < r e g i s t e r >

Dies ist besonders dann relevant, wenn verschiedene Anwendungen auf die-se Schnittstelle zugreifen und die jeweilige Ausgabe auf bestimmte Bits be-schr¨ankt werden soll. Folgende Befehlszeilen setzen das Kontrollregister f¨ur alle acht GPIO-Pins und konfigurieren die unteren vier Bits als Ausgang, die oberen vier als Eingang. Anschließend wird eine Maske gesetzt, um die

¨Anderung auf die ersten beiden und die letzten beiden Pins zu beschr¨anken

94 5 Debian auf dem Embedded-PC OpenRISC-Alekto

(0x000000C3). Aufgrund der Konfiguration werden beim ¨Ubertragen des Wer-tes 0x000000FFnur die Pins 0 und 1 auf logisch 1 gesetzt:

$ e c h o 0 x 0 0 0 0 0 0 F F 0 x 0 0 0 0 0 0 0 F > / p r o c / v s o p e n r i s c / g p i o _ c t r l

$ cat / p r o c / v s o p e n r i s c / g p i o _ c t r l

$ e c h o 0 x 0 0 0 0 0 0 C 3 0 x 0 0 0 0 0 0 F F > / p r o c / v s o p e n r i s c / g p i o _ d a t a

$ cat / p r o c / v s o p e n r i s c / g p i o _ d a t a

F¨ur die seriellen Schnittstellen und den I2C-Bus ist diese Art der Ansteuerung aufgrund der h¨oheren Komplexit¨at und des verwendeten Protokolls nicht emp-fehlenswert. Hier sollte die Ansteuerung ausschließlich ¨uber ioctl()-Befehle erfolgen (vgl. hierzu den n¨achsten Abschnitt).

5.5.2 Zugriff ¨uber ioctl()-Befehle

Der Zugriff ¨uber ioctl()-Befehle ist der Ansteuerung ¨uber das /proc -Dateisystem vorzuziehen, falls eine Nutzung nicht nur innerhalb voncronjobs oder Bash-Skripten, sondern auch aus eigenen C- oder C++-Anwendungen heraus erfolgen soll. Dar¨uber hinaus ist diese Variante schneller als ¨uber die Konsole. Notwendige Makros und Strukturen sind in der Dateivsopenrisc.h definiert.

Diese Datei muss gemeinsam mit einigen weiteren Header-Dateien eingebunden werden, die f¨ur Standardausgabe, Fehlerbehandlung oder Dateizugriff notwen-dig sind.8

Um aus einer Anwendung heraus auf die Ger¨atedateien zugreifen zu k¨onnen, wird das jeweilige Ger¨at ¨uber den Befehlopen()zun¨achst ge¨offnet, dann wer-den mittelsioctl()die einzelnen Register angesprochen. F¨ur den Zugriff auf die GPIO-Pins wird eine Struktur vom Typgpio structben¨otigt, die Maske und Daten enth¨alt. Damit sieht das Kommandozeilenbeispiel aus dem vorigen Abschnitt in C-Quellcode folgendermaßen aus9:

# i n c l u d e < s t d i o . h >

8Die Dateivsopenrisc.hist, zusammen mit einigen von VisionSystems gelieferten Beispielen, unter/home/user/oder im Alekto-Beispielverzeichnis verf¨ugbar.

9Verf¨ugbar als Beispielgpiounter<embedded-linux-dir>/examples/alekto/.

e x i t (1) ;

Die vollst¨andige GPIO-API ist im Benutzerhandbuch bzw. im Kernel-Quelltext unterdrivers/char/gpio vsopenrisc.cdokumentiert.

Wie bereits die Linksys NSLU2, so verf¨ugt auch der Alekto ¨uber einen nati-ven I2C-Bus. Diese Schnittstelle ist nach außen gef¨uhrt und kann verwendet werden, um IO-Erweiterungen, A/D-Wandler oder Schrittmotortreiber anzu-sprechen (vgl. hierzu auch die ausf¨uhrliche Beschreibung in Abschnitt 8.3.2).

Der I2C-Bus ist im System als Ger¨at/dev/i2c-0 eingebunden und wird in-tern dazu verwendet, um mit einer Realzeituhr vom Typ Dallas DS1337 zu kommunizieren.

Das Beispiel <embedded-linux-dir>/examples/iic/iic native zeigt die grundlegende Verwendung des I2C-Busses hinsichtlich ¨Offnen, Setzen der I2 C-Adresse mittelsioctl()und Schreib- bzw. Lesezugriffen.

Anzumerken ist, dass bei den Schreib- und Lesezugriffen nur die Daten an-gegeben werden – die I2C-Adresse wird bereits vom Treiber am Anfang je-der I2C-Nachricht eingef¨ugt. Wird im Quelltext des genannten Beispieles die Adresse0x68der Alekto-Realzeituhr eingestellt, so folgt nach dem ¨Ubersetzen und Ausf¨uhren (mit den entsprechenden Dateirechten) die Antwort:

$ s u d o ./ i i c _ n a t i v e w r i t e : 0 x0

r e a d : 0 x29

96 5 Debian auf dem Embedded-PC OpenRISC-Alekto

Diese Ausgabe besagt, dass ein Daten-Byte mit Wert 0 erfolgreich zu Adres-se 0x68 abgeschickt und ein Daten-Byte mit Wert 0x29 empfangen wurde (der R¨uckgabewert kann variieren). Um eine sinnvolle Zeitanfrage zu starten und auszuwerten, m¨usste das Protokoll des Bausteins implementiert sein. An dieser Stelle interessiert aber zun¨achst nur die grundlegende Funktionalit¨at.

Weitere Informationen zum I2C-Bus und zum I2C-Protokollaufbau werden in Kapitel 8 gegeben. Kapitel 9 f¨uhrt in eine I2C-Bibliothek zum Ansteuern einer Vielzahl von Bausteinen ein und erkl¨art die einzelnen Komponenten und deren Protokolle.

Weiterhin sei f¨ur die Nutzung der seriellen Schnittstellen f¨ur verschiedene Be-triebsmodi wie RS-232, RS-422 oder RS-485 auf das ausf¨uhrliche Beispiel in Kapitel 6.5.4 des Alekto-Benutzerhandbuchs verwiesen. Eine Verwendung der RS-232-Schnittstelle mit komfortablem C++-Interface wird im vorliegenden Buch in Abschnitt 7.2 beschrieben.