Verwenden Sie Raspberry Pi Gpio Header als Memory Mapped Interface

Raspberry Pi ist wirklich ein interessantes Gerät, da es so viele Funktionen in einem so kleinen und einfachen Formfaktor unterstützt. Wenn auf den GPIO-Erweiterungsheader wie auf eine normale speicherabgebildete Schnittstelle zugegriffen werden kann, können mehr Projekte ihn als Entwicklungsplattform verwenden. Ein paar Fragen dazu:

  1. Können die GPIO-Pins auf dem Header in seiner Hardware (Chip) zu einem einzigen Speicherzugriffsbefehl zusammengefasst werden? Wenn nicht (was ich annehme), kann eine Erweiterungskarte / Schaltung an den Anschluss angeschlossen werden, um das Verhalten so zu ändern, dass eine solche Zugriffsmethode unterstützt werden kann? Wie sehen Sie ein solches Design?

  2. Wenn all dies unmöglich oder zu mühsam erscheint, sehe ich eine praktikable Lösung darin, den Zugriff in eine Bibliothek oder eine Abstraktionsschicht einzubinden. Gab es eine solche Arbeit? Gibt es ähnliche Arbeiten? Ich schaue nicht auf den Userland-Zugang, ich denke an eine Art Kernel-Bibliothek, die es einfach macht, Treiber auf Kernel-Ebene basierend auf R-Pi zu entwickeln.

Vielen Dank im Voraus für Ihre Kommentare.

SPI ist wahrscheinlich der beste Weg. Wenn Sie sich umsehen, scheint es, dass 32 MHz die maximale Geschwindigkeit ist, die funktioniert, sodass der Durchsatz maximal bei 4 MB / s liegt. Vielleicht ist es besser, nur USB FLASH und Paging oder vielleicht speicherabgebildete Dateien zu verwenden.
Peter, Irgendwelche Vorschläge, wie SPI auf der Peripherieseite wieder dem Speicherbus zugeordnet werden kann?
Nicht speziell, aber die Hauptsache, die mir in den Sinn kommt, ist ein Kernel-Speicherverwaltungs-Mod zum Laden von Seitenfehlern aus Ihrem SPI-RAM. Denken Sie daran, dass die CPU nicht nativ auf die Daten zugreifen kann, sie müssen zuerst in den "echten" Speicher geladen werden. Aus diesem Grund dachte ich, dass das Speichern einer Auslagerungsdatei auf einem USB-Speicherstick viel schneller sein würde, obwohl Schreibzeiten / Ausdauer ein Problem sein könnten. Ich denke, Sie könnten sich auch überlegen, ein USB-MSD-Gerät herzustellen, das RAM anstelle von FLASH verwendet.
Peter, ausgezeichnete Erklärung über den Seitenfehler und den Handhabungsteil. Ich bin mir nicht sicher, ob Sie verstehen, dass ich gerne auf externe speicherabgebildete Geräte zugreife, nicht auf echten Speicher.

Antworten (2)

Der Raspberry Pi stellt 17 GPIO-Pins auf P1 zur Verfügung, und das Rev. 2-Board stellt 4 weitere auf P5 zur Verfügung. Diese Pins können nicht direkt als speicherabgebildeter E/A-Bus verwendet werden, wie Sie ihn vielleicht bei einem alten mikroprozessorbasierten System gefunden haben.

Ich nehme an, Sie könnten einen solchen Bus bit-bangen, aber die begrenzte Anzahl von Pins wäre ein Problem. Sie könnten beispielsweise einen 8-Bit-Datenbus, einen Lese-Strobe, einen Schreib-Strobe definieren und die restlichen 7 (oder 11) Bits als Adressbus verwenden. Da die verfügbaren GPIO-Bits jedoch nicht sequentiell sind, wäre dies langsam zu betreiben; Der Treiber auf dem RPi müsste Bits einzeln setzen und löschen.

Ein besserer Ansatz wäre die Verwendung der I2C- und/oder SPI-Busse (seriell), die auf dem P1-Header verfügbar sind, um externen Speicher und/oder speicherabgebildete E/A zu implementieren.

Dave, Gute Punkte. Irgendeine Idee, welcher Chip verwendet werden kann, um den I2C oder SPI zurück auf den Speicherbus abzubilden? Ich weiß, dass das Hinzufügen einer MMU-Seite auf der Hostseite und das Ändern des Fehlerhandlers einen Speicherzugriff auf eine SPI- oder I2C-Transaktion abbilden können.
Geben Sie an, an welchem ​​​​Speicherbus Sie interessiert sind. Es gibt viele. (Harvard ist keine Antwort). Im Allgemeinen ist die bereitgestellte E / A bereits im Speicher des Raspi-Adressraums abgebildet, sodass Sie nicht tun müssen, was Sie tun möchten. Schließen Sie einfach das Peripheriegerät an und verwenden Sie die E / A für den Peripheriebus (spi, i2c usw.). Es gibt RAMs und ROMs, die diese Busse (spi, i2c usw.) verwenden, wenn Sie nur nach Speicher suchen

Tatsächlich können Sie speicherbasierte E/A ausführen, werfen Sie einfach einen Blick auf das WiringPI-Beispiel unter http://elinux.org/RPi_Low-level_peripherals .

Es gibt jedoch einige Einschränkungen, Sie müssen das /dev/memGerät öffnen, was bedeutet, dass Sie root sein müssen. Ich weiß, dass einige Leute planen, ein spezielles /dev/gpio-memGerät zu erstellen, um nur diesen Teil des Adressraums zugänglich zu machen (für weniger privilegierte Benutzer/Gruppen).

Um sich tatsächlichen Code anzusehen, der dies bereits tut, werfen Sie einen Blick auf Wiring Pi ( https://projects.drogon.net/raspberry-pi/wiringpi/ ) oder LogAn ( https://github.com/r42/logan ).

LogAn liest alle GPIO-Pins in nur einem Speicherzugriff - Es wurde bereits zum Debuggen/Diagnostizieren des SPI-Protokolls auf dem RPI verwendet (siehe https://github.com/R42/pinokia ). Beachten Sie, dass Pinokia speicherbasierte E/A verwendet, um auf die Pins zu schreiben.

Beispiele für Boards, die den GPIO intensiv nutzen, finden Sie auf Gertboard ( http://www.element14.com/community/docs/DOC-51726?ICID=hp-gertboard-banner ) und PiFace ( http:// uk.farnell.com/jsp/search/productdetail.jsp?SKU=2218566&MER=baynote-2218566-pr ).