Lernen der Linux-Treiberentwicklung mit Raspberry Pi

13

Ich möchte einen Linux-Gerätetreiber für ein echtes Hardwaregerät schreiben. Welche Raspberry Pi-Peripheriegeräte passen gut? Grundsätzlich brauche ich folgendes:

  1. Es muss klein genug für einen Anfänger sein (höchstens einige Monate, besser einige Wochen).

  2. Datenblatt muss vorhanden sein. Zuerst habe ich über USB-Ethernet-Adapter nachgedacht, aber es sieht so aus, als hätte es ein sehr begrenztes Datenblatt.

Irgendwelche Ideen? Ist es vielleicht so, dass die serielle Konsole über GPIO funktioniert?

ivan
quelle
2
Linux-Treiber sind Kernelmodule und müssen technisch gesehen überhaupt nichts mit Hardware zu tun haben. Daher möchten Sie als Erstes wahrscheinlich eine char-Geräteschnittstelle ausprobieren, dh eine char-Gerätedatei, die dies kann aus irgendeinem trivialen Grund gelesen und / oder geschrieben werden (ähnlich wie in proc).
Goldlöckchen
Ich habe das alles gemacht, Tutorials absolviert und Kernelmodule für Pseudogeräte geschrieben sowie Bücher über die Kernel- / Treiberentwicklung gelesen. Das ist alles gut, aber jetzt möchte ich mit echter Hardware arbeiten ..
ivan
Greg KH hat dies vor einiger Zeit geschrieben (es ist möglicherweise in gewisser Hinsicht etwas veraltet): linuxjournal.com/article/7353 Es gibt also USB-Geräte mit öffentlichen Datenblättern. Er hat dort einige Tipps zum Reverse Engineering (ich würde es nicht mit allzu komplizierten Dingen machen wollen). Was die GPIO-Pins angeht, würde ich davon ausgehen, dass sie im Allgemeinen mit den vorhandenen I2C-Treibern usw. funktionieren, aber Sie könnten das einfach ignorieren und selbst etwas tun.
Goldlöckchen

Antworten:

4

Es kann schwierig sein, das Schreiben von Treibern zu erlernen, wenn eine Schnittstelle zu komplizierten Geräten und / oder komplizierten Bussen besteht. Aus diesem Grund würde ich empfehlen, entweder einige einfache und bekannte Geräte zu verwenden (wobei die vorhandene Implementierung ihrer Treiber im Kernel ignoriert wird), wie I²C / SPI-Geräte, die normalerweise mit Mikrocontrollern verwendet werden. Zum Beispiel könnten Sie jedes Gerät finden, das von der Arduino-Community "unterstützt" wird (dh, es gibt eine Bibliothek / Dokumentation dafür) und versuchen, es mit RaspberryPi zu verwenden.

Wenn das nicht ausreicht oder Sie nicht zu viel Hardware kaufen möchten, können Sie eine selbst erstellen. Besorgen Sie sich einfach einen Mikrocontroller (wie atmega oder so), erstellen Sie ein Programm, um ein Gerät daraus zu machen, und versuchen Sie dann, mit Linux-Treibern eine Verbindung herzustellen. Auf diese Weise können Sie problemlos Programme erstellen, die verschiedene Geräteklassen emulieren. Und da Sie Ihre "Firmware" selbst schreiben, hilft sie Ihnen beim Debuggen von Problemen.

Sie benötigen einige Programmierkenntnisse für Mikrocontroller, aber es ist nicht schwer, das Programmieren mit Arduino zu erlernen, und ich glaube, es ist sowieso ein nützliches Wissen für Treiberprogrammierer.

Krzysztof Adamski
quelle
Wie wäre es mit der Implementierung der seriellen Kommunikation in Software über GPIO-Pins? Schließen Sie beispielsweise seriell an den PC an und versuchen Sie, zumindest etwas an die Konsole auszugeben. Ist es machbar?
Iwan
@ivan: Ich bin mir nicht sicher, ob ich das richtig verstanden habe. Wenn Sie mit seriell UART / rs232 und mit Software Bitbanging meinen, ist dies aufgrund von Zeitbeschränkungen nicht möglich. Wenn Sie andererseits ein serielles Linux-Gerät mit RaspberryPi UART-Hardware (neu) implementieren möchten, ist dies natürlich möglich. Ich glaube, dass alle Informationen, die zu dieser Hardware benötigt werden, im BCM2835 ARM PeripheralsDokument enthalten sind. Denken Sie jedoch daran, dass Sie zuerst den vorhandenen Treiber im Kernel deaktivieren müssen, um ihn verwenden zu können.
Krzysztof Adamski
Vielen Dank, aber sind Sie sich sicher, dass es unmöglich ist, UARTs zu schlagen? Ich habe diesen Link gefunden: ganssle.com/articles/auart.htm, so dass er möglicherweise für eine niedrige Baudrate und zumindest für die Implementierung eines Sendeteils (was einfacher ist) machbar ist.
Iwan
@ivan: In diesem Artikel geht es anscheinend nicht um Systeme mit Allzweckbetriebssystemen wie Linux. In UART gibt es wirklich strenge Zeiteinschränkungen, die ohne Echtzeitbetriebssystem nur sehr schwer zu erfüllen sind. Das heißt, es kann möglich sein, dies mit niedriger Baudrate zu tun, aber es ist möglicherweise nicht wirklich zuverlässig.
Krzysztof Adamski
Sieht so aus, als hätten Sie recht: raspberrypi.stackexchange.com/questions/1987/… (allerdings gibt es dort eine interessante Lösung). Danke nochmal für deine Hilfe.
Iwan
3

Persönlich würde ich mit einem sehr einfachen Gerät beginnen, wie einer oder mehreren LEDs, die direkt an GPIO-Pins angeschlossen sind.

Sie können entweder ein anschlussfertiges Gerät kaufen oder ein eigenes verkabeln.

Der Grund, warum ich dies vorschlagen würde, ist, dass das Debuggen von Treibern im Allgemeinen viel schwieriger ist als ein normales Programm. Daher ist eine einfache Aufforderung zum Starten nützlich. Sie können diesen Code auch als Debugging - Methode für komplexere Geräte verwenden (Status out to) einen GPIO-Pin zum Anschließen an ein Oszilloskop), bei dem das Timing wichtig ist.

Wenn es von Interesse ist, dass hier ein Kernel-Treiber für LedBorg verfügbar ist , sollte die Quelle ein relativ einfaches Beispiel für die regelmäßige Ansteuerung von GPIO-Pins sein.

PiBorg
quelle
Hallo @PiBorg. Können Sie einige Ressourcen nennen, mit denen ich lernen kann, einfache Treiber für ein Gerät zu codieren, z. B. eine oder mehrere LEDs, die direkt an GPIO-Pins angeschlossen sind?
Sagar
0

Das einfachste "Gerät", für das Sie einen Hardwaretreiber schreiben können (wenn Sie sich für die Entwicklung von Hardwaretreibern interessieren), kann auch so einfach wie eine LED sein (ich habe die Anführungszeichen hinzugefügt, weil eine LED technisch gesehen kein Gerät ist, aber immer noch ein Teil davon Hardware), wie @PiBorg vorgeschlagen hat.

Andere Möglichkeiten wären einfach zu bedienende Geräte / Komponenten wie Fotowiderstände, passive Infrarotsensoren (kurz: PIR), Temperatursensoren und PC-Lüfter (vorzugsweise ein 4-Draht-Lüfter, mit dem Sie nicht nur überwachen, sondern auch steuern können RPM), LED-Punktmatrizen und so weiter. Grundsätzlich ermöglichen solche einfachen Geräte, dass Sie das Minimum an Hardware haben (damit Sie sehen und anfassen können, was Sie tatsächlich erreicht haben) und gleichzeitig eine Menge Themen kennenlernen, die für viel komplexere Geräte verwendet werden Die Komplexität ergibt sich hauptsächlich aus dem verwendeten Protokoll.

Denken Sie auch daran, dass Sie nicht extra in die Kernelmodule graben müssen. Wenn du das willst, hält dich natürlich niemand auf. :)

Hier ist ein Beispiel für die Anbindung eines passiven Infrarotsensors (ich werde es bald testen, wenn mein PIR geliefert wird: 3). Sie können dies nehmen und tiefer in die Welt des Linux-Kernels eintauchen, um zu sehen, wie Sie beispielsweise einen Kerneltreiber erstellen können, der mit dem PIR funktioniert.

rbaleksandar
quelle