Industrial IoT IIO-Framework bindet Sensoren an Linux an

Bei der Entwicklung von Linux-Treibern wurde alles, was den Horizont PC-üblicher Peripheriegeräte übersteigt, stark vernachlässigt. Aber es gibt Licht am Horizont: Das IIO-Framework bindet Sensoren und Aktoren an Linux-Systeme an.

Embedded-Linux-Geräte überneh-men immer mehr Aufgaben wie Messen, Steuern, Regeln, die bisher entweder von analoger Elektronik, einem separaten Mikrocontroller oder von einer Speicherprogrammierbaren Steuerung (SPS) erledigt wurden. Sei es um Kosten und Platz zu sparen, oder einfach weil modernere Prozessoren und SoCs so leistungsfähig geworden sind, dass sie neben ihren traditionellen Aufgabenfeldern wie Netzwerkkommunikation und Bereitstellung einer Benutzeroberfläche diese Aufgaben noch zusätzlich übernehmen können. So hat auch der bekannte Einplatinencomputer »Raspberry Pi« seinen Weg auf eine Hutschiene in manchen Schaltschrank gefunden. Auch die stetig steigende Zahl von mobilen Geräten, Hausautomatisierungslösungen und Smart Devices, die auf Linux setzen, sind mit den unterschiedlichsten Sensoren ausgestattet, mit denen sie ihre Umgebung erfassen. Um all diese neuen Aufgaben erledigen zu können, ist eine effiziente Schnittstelle zur Kommunikation mit Sensoren und Aktoren notwendig. Lange Zeit führte diese Peripherie ein Schattendasein und wurde oft mit Treibern angesteuert, die entweder im Hwmon oder Input subsystem angesiedelt waren, oder gar gleich ein komplett eigenes Interface hatten. Diese Lösungen wurden weder den immer größer werdenden Anforderungen hinsichtlich Datenrate und Steuerung des Abtastzeitpunkts gerecht, noch waren sie skalierbar. Deswegen wurde 2009 mit der Entwicklung des Industrial-IO-Treiberframeworks (IIO) im Linux-Kernel begonnen.

Funktionsumfang

Wann immer es um die Nutzung von Messdaten geht, werden auch zeitliche Aspekte wichtig. Zum einen ist es wichtig zu wissen, wann ein Datensatz aufgenommen wurde, zum anderen ist es oft notwendig, den Zeitpunkt festlegen zu können, an dem ein Datensatz ermittelt wird. Mit anderen Worten: Ein Framework zur Erfassung von Messdaten sollte erstens die Möglichkeit bieten, zu jedem Sample einen Timestamp zu erhalten und zweitens einen Mechanismus zur Einrichtung von Triggern zur Steuerung des Samplezeitpunkts. Beide Möglichkeiten bietet das IIO-Framework durch IIO-Trigger. IIO bietet verschiedene Triggermechanismen: Das Lesen eines oder mehrerer Kanäle kann entweder durch den User-Space ausgelöst, periodisch von einem Timer oder durch einen externen oder internen Interrupt gesteuert werden.

Neben der Steuerung des Samplings verwaltet das IIO-Framework auch den Speicher, in dem die Samples abgelegt werden. IIO kann dabei neben reinen Softwarepuffern auch mit Peripherie umgehen, die eigene Hardware-Ringpufffer enthält.

Die Erfassung von Messdaten kann durch IIO-Framework auch mit Ereignissen verknüpft werden, die an den User-Space weitergegeben werden. Ein Beispiel für ein solches Event ist die abrupte Beschleunigung oder ein Spannungswert, der einen bestimmten Schwellwert überschreitet. IIO bietet hierfür spezielle Character Devices, aus denen User-Space-Prozesse lesen können. Der Leseprozess wird hier so lange blockiert, bis ein Event auftritt.

Die angeführten Beispiele belegen, dass das IIO-Framework im Linux-Kernel inzwischen recht mächtig geworden ist. Allerdings zeigt es sich, dass es zwar reichlich Information zur Erstellung von neuen IIO-Treibern im Linux-Kernel gibt, aber Anleitungen, die die Nutzung des Frameworks aus dem User-Space heraus beschreiben, eher spärlich zu finden sind. Deswegen soll im Folgenden eine kurze Einführung gegeben werden.

 

IIO-Dummy-Treiber

Da die besten Lernerfolge erzielt werden, wenn man das neue Wissen gleich praktisch anwenden kann, wäre es wünschenswert, dass jeder Leser dieser Anleitung ein IIO-fähiges Gerät hat, mit dem er die Funktionen des IIO-Frameworks testen kann. Zum Glück existiert im Linux-Kernel ein IIO-Dummy-Treiber, der die Funktion einer echten Hardware simuliert und so jedem die Möglichkeit bietet, das IIO-Framework zu testen. Für diese Anleitung wurde mit dem Linux-Kernel Version 4.13 gearbeitet (es ist davon auszugehen, dass die Funktion des Treibers in allen 4.x-Versionen des Kernels gleich ist, was der Autor aus nachvollziehbaren Gründen nicht für alle überprüfen konnte). Der folgende Abschnitt führt Schritt für Schritt durch die Benutzung des Dummy-IIO-Treibers und gibt damit einen ersten Einblick in die Funktionen des Linux-IIO-Frameworks.

IIO-Dummy-Treiber im Kernel aktivieren

Um den Treiber einsetzen zu können, muss er im Linux-Kernel aktiviert werden. Neben dem IIO-Dummy-Treiber müssen noch weitere Kernel-Module geladen werden, die der Bereitstellung von Sample Triggern dienen. Die Treiber werden als Module kompiliert, um den Austausch des Kernels zu ersparen. Zuerst sollte allerdings geprüft werden, ob die Module bereits auf dem eigenen System vorhanden sind. Wenn das der Fall ist, kann man das Erstellen der Kernel-Module überspringen. Diese Prüfung geschieht durch fehlerlose Ausführung folgender Kommandos:

modprobe iio_dummy
modprobe iio_trig_sysfs
modprobe iio_trig_hrtimer

Lassen sie sich ohne Fehler ausführen, so sind die nötigen Kernel-Module bereits auf dem System vorhanden. Andernfalls müssen die Einträge aus Listing 1 im Konfigurationsmenü des Kernels aktiviert werden, um die Module zu erstellen.
Wie man die Kernel-Module kompiliert und installiert, ist bei den verschiedenen Distributionen jeweils unterschiedlich und würde den Rahmen dieses Artikels sprengen. Jedoch existieren zu verbreiteten Distributionen wie Ubuntu Linux zahlreiche Anleitungen, wie unter der jeweiligen Distribution am besten Kernelmodule erstellt und installiert werden. Diese Anleitungen sind leicht im Internet zu finden.
 

LISTING 1

Device Drivers --->
{M} Industrial I/O Support --->
<M> Enable software IIO device support
<M> Enable software triggers support
IIO dummy driver --->
<M> An example driver with no hardware requirements
[*] Event generation support
[*] Buffered capture support
Triggers - standalone --->
<M> High Resolution Timer Trigger
<M> SYSFS Trigger

 
Listing 1: Diese Einträge im Konfigurationsmenü des Kernels müssen aktiviert werden, damit die IIO-Dummy-Treiber als Kernel-Module erstellt werden.