Lattice FPGA und Linux

Um mit FPGAs zu experimentieren habe ich mir das Board von nandland.com gekauft. Unter anderem, weil auf dieser Seite viele Infos zu FPGAs stehen.

Das Problem: Die zugehörige Software iCEcube2 gibt es zwar auch für Linux doch sie hat nicht ohne Probleme funktioniert.

Beides kann man recht einfach umgehen, indem man Windows in einer VM verwendet. Das habe ich anfangs auch gemacht, doch irgendwann wurde es mir dann doch zu blöde immer Windows zu starten.

Netzwerkkarte

Das erste Problem lässt sich umgehen, indem man:

Ersteres wäre ein Rückschritt also nehmen wir die zweite Variante: Mal davon abgesehen, das es eine ziemlich schlechte Idee ist, die MAC für Lizensierungen zu verwenden, da sich diese doch recht einfach ändern lässt, hilft in diesem Fall dieser Umstand, die Software doch noch zu verwenden.
Und zwar so:

Programmer

Das Zweite Problem war etwas tricky.

Das Problem: der ftdi_sio-Treiber von Linux funkt dazwischen und verhindert, dass der Lattice Diamond mit dem Board sprechen kann. Nun wollte ich diesen nicht für alle Geräte deaktivieren.

Grundsätzlich kann man mit dem Befehl ($1 ist die Gerätedatei)

echo $1 > /sys/bus/usb/drivers/ftdi_sio/unbind

ftdi_sio für ein Gerät deaktivieren.

Um das automatisch zu machen habe ich Udev verwendet.
Dazu in der Datei /etc/udev/rules.d/98-lattice.rules folgendes eintragen:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", GROUP="users",MODE="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", RUN+="/usr/local/bin/ftdi-dis $kernel"

Die Geräteids 0403 und 6010 bekommt man mit dem Befehl:

lsusb

Dann das Entsprechende Gerät identifizieren und die Ids in die Datei eintragen. Das vor dem Doppelpunkt ist idProduct und das danach ist idVendor.

Jetzt muss noch das Script /usr/local/bin/ftdi-dis erstellt und ausführbar gemacht werden:

#!/bin/bash
substr=${1: -3}
echo $1 >> /tmp/ftdi.log
if [ $substr = "1.0" ] || [ $1 = "ttyUSB0" ]
then
echo disabled >> /tmp/ftdi.log
echo $1 > /sys/bus/usb/drivers/ftdi_sio/unbind
fi

Das if: [ $substr = "1.0" ] || [ $1 = "ttyUSB0" ] habe ich durch rumprobieren herausgefunden und funktioniert für mich ganz gut.
Wenn es nicht geht, kann man sich in der /tmp/ftdi.log ansehen was in $1 steht. Für andere USB-chips ist eventuell ein anderes If nötig.

Danach einmal den PC neu starten und hoffen dass es geht.

Ein kleines Problem gibt es immer noch: das Programm Lattice Diamond ist unter Linux etwas langsamer als unter Windows. Aber das finde ich nicht so schlimm.