Usando drivers FTDI D2XX com Python de Raspberry Pi em soft-float raspbian

Temos um dispositivo USB controlado pelos drivers D2XX da FTDI. É atualmente controlado a partir de uma máquina Windows através de uma interface Python e como um projeto divertido eu tentei mover o controle para um Raspberry Pi (cerca de 1 / 10th o custo de um PC, não incluindo o custo do sistema operacional).

Havia muitos obstáculos para limpar, mas depois de algumas semanas eu finalmente encontrei todas as respostas e consegui trabalhar. As respostas foram espalhadas por vários fóruns, como agradecimento à comunidade do Stack Overflow que eu pensei que as consolidaria aqui.

Primeiro, o projeto exigiu:

Um sistema operacional: eu peguei o mais recente"Wheezy" Raspbian (hard-float 2012-12-16) doPágina de Raspberry Pi. Isso incluía o Python.oFTDI D2XX drivers para falar com o nosso dispositivo FTDI.Uma interface Python para o driver D2XX. eu useiPyUSBNosso script em Python

Eu baixei a distribuição Wheezy e usei o Win32DiskImager para gravar em um cartão SD de 4 GB. O Raspberry Pi foi iniciado sem problemas. Eu então descompactei a biblioteca D2XX (libftd2xx.so) e instalei-a/usr/local/lib.

O PyUSB (1.6) atualmente é testado apenas no Windows, mas eles fornecem o código-fonte. É bastante simples compilar uma cópia para o Raspberry Pi. Basicamente, modifique o arquivo setup.py para vinculá-lo à biblioteca libftd2xx.so (não é necessário copiá-lo). Também edite d2xx / _d2xx.c para comentar as rotinas sem a implementação do Linux (atualmente ftobj_Rescan, ftobj_Reload ftobj_GetComPortNumber). Copie WinTypes.he ftd2xx.h do diretório de download do driver FTDI D2XX (no release) para o ftdi-win32 e executepython setup.py install que irá compilar e instalar o módulo Python.

Depois de tudo o que foi feito, escrevi um script Python simples para falar com o chip FTDI. Note que você precisa rodar via sudo.

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

O módulo d2xx parece não encontrar o arquivo libftd2xx.so. Então, eu ajustei o script setup.py para vincular à cópia estática da biblioteca, libftd2xx.a. Voila, eu tive minha primeira pista do problema: A biblioteca D2XX foi construída usando soft-float, e minha distribuição Wheezy foi configurada para usar registradores de ponto flutuante. Ou seja, o gcc no meu sistema gerou um código que era incompatível com as bibliotecas do D2XX e não permitiria que eles fossem vinculados.

Para corrigir isso eu baixei odistribuição "wheezy" debian soft-float (2012-08-08) e escreveu para o cartão SD de 4 GB. Desta vez a imagem não inicializaria. Depois de olhar ao redor eu encontrei esteresposta útil. Em suma, há um problema com a imagem de inicialização do soft-float, de modo que, para algumas placas Raspberry Pi, ele não inicialize. A solução é substituir o arquivo start.elf na distribuição soft-float por um que funcione, e. uma cópia da imagem Raspbian de hard-float. Felizmente, o cartão SD tem duas partições: uma FAT e uma ext3 (?). A imagem de inicialização está na partição FAT, por isso, foi trivial colocar o cartão SD de disco rígido em uma caixa do Windows, copiar o arquivo start.elf, inserir o cartão SD de soft-float e atualizar seu start.elf com o disco rígido. -float um. Depois disso, o Raspberry Pi arrancou sem problemas.

Depois de instalar os drivers D2XX do FTDI e construir um módulo Python d2xx do PyUSB, tentei o script de teste novamente. Mais uma vez, falhou. O módulo d2xx podia ler a biblioteca libftd2xx.so sem problemas, mas por algum motivo, simplesmente não podia falar com o dispositivo.

questionAnswers(2)

yourAnswerToTheQuestion