Verwendung von FTDI D2XX-Treibern mit Python von Raspberry Pi auf Raspbian Soft-Float
Wir haben ein USB-Gerät, das von den D2XX-Treibern von FTDI gesteuert wird. Es wird derzeit von einem Windows-Computer über eine Python-Oberfläche gesteuert und als Spaßprojekt habe ich versucht, das Steuerelement auf einen Raspberry Pi zu verschieben (ungefähr 1/10 der Kosten für einen PC, ohne die Betriebssystemkosten).
Es gab viele Hürden zu nehmen, aber nach ein paar Wochen fand ich endlich alle Antworten und brachte es zum Laufen. Die Antworten waren auf mehrere Foren verteilt. Als Dankeschön an die Stack Overflow-Community dachte ich, ich würde sie hier konsolidieren.
Erstens benötigte das Projekt:
Ein Betriebssystem: Ich habe das neueste aufgegriffen"Wheezy" Raspbian (Hard-Float 2012-12-16) aus demRaspberry Pi Webseite. Dies beinhaltete Python.DasFTDI D2XX Treiber um mit unserem FTDI-Gerät zu sprechen.Eine Python-Schnittstelle zum D2XX-Treiber. ich benutztePyUSBUnser Python-SkriptIch habe die Wheezy-Distribution heruntergeladen und mit Win32DiskImager auf eine 4-GB-SD-Karte geschrieben. Der Raspberry Pi bootete ohne Probleme. Ich habe dann die D2XX-Bibliothek (libftd2xx.so) entpackt und installiert/usr/local/lib
.
PyUSB (1.6) wird derzeit nur unter Windows getestet, es wird jedoch der Quellcode bereitgestellt. Es ist ziemlich einfach, eine Kopie für Raspberry Pi zu kompilieren. Ändern Sie im Allgemeinen die Datei setup.py, um eine Verknüpfung zur Bibliothek libftd2xx.so herzustellen (Sie müssen sie nicht kopieren). Bearbeiten Sie auch d2xx / _d2xx.c, um die Routinen ohne Linux-Implementierung zu kommentieren (derzeit ftobj_Rescan, ftobj_Reload ftobj_GetComPortNumber). Kopieren Sie WinTypes.h und ftd2xx.h aus dem FTDI D2XX-Treiber-Downloadverzeichnis (im Release) in ftdi-win32 und führen Sie es auspython setup.py install
Dadurch wird das Python-Modul kompiliert und installiert.
Als alles erledigt war, schrieb ich ein einfaches Python-Skript, um mit dem FTDI-Chip zu sprechen. Beachten Sie, dass Sie über sudo ausgeführt werden müssen.
import d2xx
jd = d2xx.open(0)
pd = jd.eeRead()
print pd
Das d2xx-Modul konnte die Datei libftd2xx.so nicht finden. Also habe ich das setup.py-Skript optimiert, um eine Verknüpfung mit der statischen Kopie der Bibliothek libftd2xx.a herzustellen. Voila, ich hatte den ersten Hinweis auf das Problem: Die D2XX-Bibliothek wurde mit Soft-Float erstellt, und meine Wheezy-Distribution wurde für die Verwendung von Gleitkommaregistern konfiguriert. Das heißt, der gcc auf meinem System hat Code generiert, der binär inkompatibel mit den D2XX-Bibliotheken war und keine Verknüpfung mit ihnen zuließ.
Um dies zu beheben, habe ich die heruntergeladenSoft-Float-Debian "Wheezy" -Verteilung (2012-08-08) und schrieb auf die 4 GB SD-Karte. Diesmal würde das Image nicht booten. Nachdem ich mich umgesehen hatte, fand ich dashilfreiche Antwort. Kurz gesagt, es gibt ein Problem mit dem Boot-Image des Soft-Floats, sodass es bei einigen Raspberry Pi-Boards nicht bootet. Die Lösung besteht darin, die Datei start.elf in der Soft-Float-Distribution durch eine zu ersetzen, die z. eine Kopie des Raspbian-Bildes. Glücklicherweise verfügt die SD-Karte über zwei Partitionen: eine FAT-Partition und eine ext3-Partition (?). Das Boot-Image befindet sich auf der FAT-Partition. Daher war es einfach, die SD-Karte mit festem Speicher in eine Windows-Box einzufügen, die Datei start.elf zu kopieren, die SD-Karte mit festem Speicher einzufügen und ihren start.elf mit dem Festspeicher zu aktualisieren -float ein. Danach bootete der Raspberry Pi kein Problem.
Nachdem ich die D2XX-Treiber von FTDI installiert und ein d2xx-Python-Modul aus PyUSB erstellt hatte, versuchte ich es erneut mit dem Testskript. Wieder scheiterte es. Das d2xx-Modul konnte die libftd2xx.so-Bibliothek problemlos lesen, konnte aber aus irgendeinem Grund einfach nicht mit dem Gerät kommunizieren.