Uso de los controladores FTDI D2XX con Python de Raspberry Pi en el raspbian soft-float

Tenemos un dispositivo USB controlado por los controladores D2XX de FTDI. Actualmente se controla desde una máquina Windows a través de una interfaz Python y, como un proyecto divertido, intenté mover el control a una Raspberry Pi (aproximadamente la décima parte del costo de una PC, sin incluir el costo del sistema operativo).

Había muchos obstáculos por resolver, pero después de unas pocas semanas finalmente encontré todas las respuestas y las puse a funcionar. Las respuestas se distribuyeron en varios foros, así que como agradecimiento a la comunidad de Stack Overflow, pensé que las consolidaría aquí.

Primero, el proyecto requería:

Un sistema operativo: recogí lo último."Ruidoso" Raspbian (hard-float 2012-12-16) de laPágina de Raspberry Pi. Esto incluía a Python.losDrivers FTDI D2XX para hablar con nuestro dispositivo FTDI.Una interfaz de Python para el controlador D2XX. solíaPyUSBNuestro script en Python

Descargué la distribución de Wheezy y utilicé Win32DiskImager para escribir en una tarjeta SD de 4 GB. La Raspberry Pi arranca sin problemas. Luego desempaqué la biblioteca D2XX (libftd2xx.so) y la instalé en/usr/local/lib.

PyUSB (1.6) actualmente se prueba solo contra Windows, pero proporciona el código fuente. Es bastante sencillo compilar una copia para Raspberry Pi. Básicamente, modifique setup.py para vincularlo a la biblioteca libftd2xx.so (no es necesario copiarlo). También edite d2xx / _d2xx.c para comentar las rutinas sin implementación de Linux (actualmente ftobj_Rescan, ftobj_Reload ftobj_GetComPortNumber). Copie WinTypes.h y ftd2xx.h desde el directorio de descarga del controlador FTDI D2XX (en la versión) en ftdi-win32 y ejecutepython setup.py install que compilará e instalará el módulo de Python.

Una vez hecho todo eso, escribí un sencillo script de Python para hablar con el chip FTDI. Tenga en cuenta que necesita ejecutar a través de sudo.

import d2xx
jd = d2xx.open(0)
pd = jd.eeRead()
print pd

Parece que el módulo d2xx no pudo encontrar el archivo libftd2xx.so. Entonces, modifiqué el script setup.py para vincularlo a la copia estática de la biblioteca, libftd2xx.a. Voila, tuve mi primera pista del problema: la biblioteca D2XX se creó utilizando soft-float, y mi distribución de Wheezy se configuró para usar registros de punto flotante. Es decir, el gcc en mi sistema generó un código que era binario incompatible con las bibliotecas D2XX y no permitiría que se vincularan.

Para solucionar esto descargué elSoft-float debian "wheezy" distribucion (2012-08-08) y escribió a la tarjeta SD de 4 GB. Esta vez la imagen no arrancaría. Después de mirar alrededor encontré esto.respuesta útil. En resumen, hay un problema con la imagen de inicio del soft-float, por lo que para algunas tarjetas Raspberry Pi no se inicia. La solución es reemplazar el archivo start.elf en la distribución de soft-float por uno que sí funcione, por ejemplo. Una copia de la imagen de Raspbian. Afortunadamente, la tarjeta SD tiene dos particiones: una FAT una y una ext3 (?) Una. La imagen de inicio está en la partición FAT, por lo que fue trivial colocar la tarjeta SD de flotación fija en una caja de Windows, copiar el archivo start.elf, insertar la tarjeta SD de flotación suave y actualizar su start.elf con el disco duro - flotar uno. Después de eso, la Raspberry Pi arrancó sin problemas.

Después de instalar los controladores D2XX de FTDI y construir un módulo Python d2xx desde PyUSB, probé nuevamente el script de prueba. De nuevo fracasó. El módulo d2xx podría leer la biblioteca libftd2xx.so sin ningún problema, pero por alguna razón simplemente no podría hablar con el dispositivo.