Open Source im professionellen Einsatz
Linux-Magazin 10/2013
© psdesign1, Fotolia

© psdesign1, Fotolia

Kernel- und Treiberprogrammierung mit dem Linux-Kernel – Folge 70

Kern-Technik

,

Der Linux-Kernel abstrahiert und verwaltet die Zugriffe auf GPIOs, also jene Ein- und Ausgabekanäle, die beispielsweise auf dem Raspberry Pi zu finden sind. Wer sich mit einem eigenen Treiber dort einklinkt, kann mit erheblich schnelleren Peripheriezugriffen rechnen.

605

Es ist einfacher als gedacht und macht Spaß, den Raspberry Pi zum Ansteuern von Hardware zu verwenden. Die 26-polige Steckerleiste des preiswerten Kleincomputers stellt dazu insgesamt 17 von den 54 Ein- und Ausgabeleitungen des Prozessors zur Verfügung, die so genannten GPIOs (General Purpose Input Output).

Jeder GPIO-Pin ist flexibel konfigurierbar: Er kann als Ausgabeleitung dienen, an der programmgesteuert entweder 3,3  V (logisch 1) oder 0  V (logisch 0) anliegen. Als Eingabe konfiguriert, übernimmt der Prozessor nach Aufforderung eine 1, falls Spannung anliegt, ansonsten eine 0.

Wer eine gelbe, grüne oder rote Leuchtdiode (LED), einen Widerstand um die 300 Ohm und ein paar Kabel zur Hand hat, kann schon mit den ersten Versuchen loslegen.

Bastelzeit

Wie in Abbildung 1 zu sehen ist, sind Widerstand und LED in Serie geschaltet und mit der Steckerleiste auf dem Raspberry Pi verbunden. Die Seite der Reihenschaltung, an der die Kathode der LED (die Seite mit dem kürzeren Beinchen beziehungsweise mit der abgeflachten Unterkante) liegt, wird mit GND (Pin 6) verbunden; die andere Seite mit GPIO 4 (Pin 7). Hilfreich für den Aufbau ist ein so genanntes Breadboard, in das man die Drähte der Bauteile steckt.

Abbildung 1: Mit Breadboard, Kabeln und Widerstand: Schaltung zum Ansteuern einer LED über die GPIOs eines Raspberry Pi.

Ein einfacher Test der Schaltung ist über das »/sys« -Dateisystem mit einem Shellskript möglich. Bevor dieses den Wert der Ausgabeleitung GPIO 4 auf 0 oder 1 setzen kann, muss es die Leitung reservieren und konfigurieren (Abbildung 2). Zur Reservierung schreibt das Skript die Nummer der GPIO-Leitung (aus Sicht der CPU, also nicht die Nummer des Pins an der Doppelstiftleiste) in die Datei »/sys/class/gpio/export« . Dazu sind allerdings Rootrechte notwendig. Daraufhin legt der Kernel ein neues Verzeichnis an, für GPIO 4 beispielsweise »gpio4« .

Abbildung 2: Aktionen und Zugriffsmöglichkeiten auf GPIOs unter Linux.

In diesem Verzeichnis gibt es eine Datei »direction« , in der man mit den Schlüsselworten »out« und »in« festlegt, ob es sich um eine Ausgabe- oder eine Eingabeleitung handelt. Das Kommando

echo "1" >/sys/class/gpio/gpio4/value

setzt die Spannung auf 3,3  V – die LED leuchtet. Eine 0 in diese Datei geschrieben stellt eine Spannung von 0  V ein und schaltet die LED wieder aus.

Listing 1 zeigt ein Skript, das aus der LED ein Blinklicht macht. Dazu schaltet es die LED ein, schläft eine Sekunde, schaltet sie aus und schläft nochmals eine Sekunde. Der Befehl »trap« dient übrigens dazu, beim Abbrechen des Skripts, beispielsweise per [Strg]+[C], den Pin wieder freizugeben.

Listing 1

Zugriff per Shellskript

01 #!/bin/bash
02
03 trap "echo \"4\" >/sys/class/gpio/unexport" EXIT
04
05 echo "4" >/sys/class/gpio/export
06 echo "out" >/sys/class/gpio/gpio4/direction
07
08 while true
09 do
10     echo "1" >/sys/class/gpio/gpio4/value
11     sleep 1
12     echo "0" >/sys/class/gpio/gpio4/value
13     sleep 1
14 done

250-mal schneller

Eine Messung ergibt, dass sich eine solche Ein-Aus-Sequenz per Sys-Filesystem (ohne die Sleep-Befehle) abhängig vom Kernel und dessen Konfiguration 1000- bis 1500-mal pro Sekunde (mit 1 kHz bis 1,5 kHz) auf dem Raspberry Pi ausführen lässt. Wer die GPIOs jedoch über einen dedizierten Treiber im Kernel anspricht, kann Steigerungen dieser Frequenz um den Faktor 250 erreichen.

Ein normaler, zeichenorientierter Gerätetreiber implementiert typischerweise Schnittstellenfunktionen, die der Kernel beim Laden des Treibers (»mod_init()« ) aufruft, beim Entladen (»mod_exit()« ), beim Öffnen der zugeordneten Gerätedatei (»driver_open()« ), beim Schließen derselben (»driver_close()« ), beim Lesen von der Gerätedatei (»driver_read()« ) und beim Schreiben auf die Gerätedatei (»driver_write()« ).

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Kern-Technik

    Interrupts informieren die CPU über externe Ereignisse und im Kern warten passende Interrupt-Service-Routinen. Programmieren und testen lässt sich das Ganze prima auf einem Raspberry Pi.

  • Gnublin

    Dass Embedded Linux kein Hexenwerk sein muss, zeigt das Gnublin-Board der Hochschule Augsburg. Wer lernen will, wie er auf einem ARM-Linux Sensoren ausliest, Schalter benutzt und LEDs schaltet, ist bei dem kleinen Rechner richtig. Gegen Aufpreis gibt es eine stattliche Liste an Zubehör.

  • Hummingboard

    Mit Quadcore-Power, mehr Speicher und schnelleren Interfaces richtet sich das Hummingboard an Raspberry-Pi-Besitzer, die mit einem Aufstieg liebäugeln. Auf weitgehende Kompatibilität der Schnittstellen haben die Macher geachtet, doch der Teufel steckt, wie so oft, auch hier im Detail.

  • Kern-Technik

    In Device Trees lagern Hardware-Spezifikationen, damit die Treiber beim Booten erfahren, worum sie sich kümmern müssen. Wegen der Aufsteckboards für Raspberry und Co. legen die Entwickler nun dynamische Device Trees nach, die lange nach dem Booten Peripherie-Neuankömmlinge willkommen heißen.

  • Kern-Technik

    In PCs und Embedded-Geräten sind Sensoren und Aktoren oft mit dem I2C-Bus angebunden. Linux unterstützt das mit einem eigenen Subsystem, das sich auf dem Raspberry Pi ausprobieren lässt.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.