Installation von Xilinx ISE 8.1 unter Linux (Kernel 2.6.16)

Inhalt

Vorwort

Diese Anleitung basiert auf dem Artikel Installing Xilinx Webpack 8.1i (or ISE Foundation 8.1i) on debian 3.1. Mein System war Linux Debian mit dem Kernel 2.6.16, selbstcompiliert.

Bei Problemen könnten auch noch folgende Webseiten helfen:
Bei Fragen, Hinweisen oder Problemlösungen freue ich mich über eMails.

Installation von Xilinx ISE/EDK unter Debian

WinDriver und Xilinx-Treiber installieren

Xilinx stellt mittlerweile selbst ein Source-Paket speziell für den Kernel 2.6 zum Selbstcompilieren der Treiber bereit. Das macht die Sache ungemein einfacher und schneller, da man sich nicht mehr bei jungo registrieren muss.

Hier der kurze Weg. Man wechsle in ein Verzeichnis, in welches man die Sourcen entpacken möchte und führe im Falle eines 2.6.16er Kernels folgendes aus:
wget ftp://ftp.xilinx.com/pub/utilities/M1_workstation/linuxdrivers.2.6.tar.gz
tar zxvf linuxdrivers.2.6.tar.gz
cd linuxdrivers.2.6
cd windrvr
./configure
cp makefile makefile.orig
perl -p -i -n -e 's/-DKBUILD_MODNAME=windrvr6/-D"KBUILD_STR(s)=\\#s" -D"KBUILD_BASENAME=KBUILD_STR(windrvr6)" -D"KBUILD_MODNAME=KBUILD_STR(windrvr6)"/' makefile
make
make install
dmesg
[...]
WinDriver v7.00 Jungo (c) 1997 - 2005 Build Date: Apr 26 2005 X86 loaded
Wenn die Ausgabe von dmesg so endet, ist das Modul funktionsfähig. Anderenfalls sollte man zu den oben genannten Seiten schauen, um das Problem zu lösen.

Das Modul kann ab jetzt jederzeit mit modprobe windrvr6 geladen werden.

Nun aber zum xpc4drvr:
cd ..
cd xpc4drvr/
./configure
make
make install
[...]
Loading /lib/modules/2.6.16/kernel/drivers/misc/xpc4drvr.ko
ERROR: Module xpc4drvr does not exist in /proc/modules
depmod

Gerät bei hotplug registrieren

cd path_to_ise_installation/bin/lin/
touch /etc/hotplug/usb.usermap
sh setup_pcusb
Bei mir lief das Scipt setup_pcusb lieder nicht fehlerfrei, hab deshalb Anpassungen vorgenommen. Ich weiß leider nicht mehr, welche das waren.

Wer das XUP-Board in Betrieb nehmen möchte und ISE 7.1 verwendet, sollte nach diesem Artikel noch eine kleine Änderung in der /etc/hotplug/usb.usermap vornehmen. Ob das ganze für ISE 8.1 auch nötig ist, weiß ich nicht. Jedenfalls stört es auch nicht. Und zwar muss der Wert für idProduct von 0x0007 auf 0x0009 gesetzt werden. In neueren ISE-Versionen ist dies vielleicht wieder überflüssig.

Danach habe ich hotplug neugestartet.
/etc/init.d/hotplug restart
Unter anderem wurde folgendes ausgegeben:
      xusbdfwu: loaded successfully
microcontroller type: fx2
single stage:  load on-chip memory
open RAM hexfile image usb/xusbdfwu.fw/xusbdfwu.hex
stop CPU
write on-chip, addr 0x1b2f len   10 (0x000a)
write on-chip, addr 0x0178 len   53 (0x0035)
write on-chip, addr 0x15fd len  112 (0x0070)
write on-chip, addr 0x1000 len  543 (0x021f)
...
write on-chip, addr 0x047a len  486 (0x01e6)
write on-chip, addr 0x1509 len  128 (0x0080)
write on-chip, addr 0x0479 len    1 (0x0001)
write on-chip, addr 0x0660 len  115 (0x0073)
... WROTE: 6934 bytes, 71 segments, avg 97
reset CPU
Nun, erst mal schön, daß überhaupt etwas passiert und daß das Board erkannt wird.

Interessanterweise änderte sich dadurch die Product id des XUP-Boardes von 0x0009 auf 0x0008 (nachprüfbar mit lsusb). Und ohne diese Änderung funktionierte die USB-Datenübertragung bei mir nicht.

USB-Übertragung in iMPACT

iMPACT kann entweder direkt gestartet werden ( path_to_ise_installation/bin/lin/impact) oder vom ISE heraus.

Nach jedem System-Neustart müssen die beiden Treiber-Module geladen werden, um die USB-Datenübertragung in iMPACT nutzen zu können. Da dies in meinem Fall nicht gereicht hat, habe ich sämtliche Tests durchgeführt, um herauszufinden, was noch und in welcher Reihenfolge nötig ist, und schließlich ist folgendes USB init scipt dabei herausgekommen (rote Markierungen anpassen):
#!/bin/bash
##############################
# USB init script for iMPACT #
#                            #
#     by Stefan Endrullis    #
##############################

VENDOR_ID=03fd
PRODUCT_ID=0008

##############################

# prevent hacking
PATH=/sbin:/bin:/usr/sbin:/usr/bin

rmmod xpc4drvr
rmmod windrvr6

modprobe windrvr6
chown stefan:users /dev/windrvr6
chmod 660 /dev/windrvr6
modprobe xpc4drvr

echo -n "Please turn on the board."
while [ `lsusb -d "$VENDOR_ID:$PRODUCT_ID" | wc -l` != "1" ]; do
  printf ".";
  sleep 1;
done
echo "OK"

echo -n "Initialising USB devices..."
/etc/hotplug/usb.rc restart
echo "OK"

Nachdem das Script ausgeführt wurde, sollte die USB-Übertragung funktionieren.

Ob das Board über USB erreichbar ist, läßt sich im ISE iMPACT am besten durch Cable Auto Connect im Menu Output feststellen. Wenn die Verbindung nicht zu stande gekommen ist, hilft vielleicht ein Blick in das Log von iMPACT - dazu auf View->View Log File klicken. Hier erfährt man sinnvolle Informationen, wie z.B.
Connecting to cable (Usb Port - USB21).
Checking cable driver.
File version of /opt/xilinx/bin/lin/xusbdfwu.hex = 1018(dec), 03FA.
File version of /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex = 1018(dec), 03FA.
 Cannot access /dev/windrvr6 - Permission denied.
Cable connection failed.
Wenn folgendes im Log steht,
Connecting to cable (Usb Port - USB21).
Checking cable driver.
File version of /opt/xilinx/bin/lin/xusbdfwu.hex = 1018(dec), 03FA.
File version of /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex = 1018(dec), 03FA.
Cable connection failed.
empfehle ich, nochmal das USB init scipt auszuführen und es danach mit iMPACT zu probieren.

Beim Arbeiten mit dem EDK ist evtl. der schnellste Weg zur Übertragung, im Project-Verzeichnis make -f system.make download auszuführen. Vorher muss man aber die Xilin-Setup-Scripte ausführen, damit iMPACT und alle anderen Programme gefunden werden. Da ich sehr schreibfaul bin, habe ich zu diesem Zweck im Project-Verzeichnis ein settings.sh-Script der folgenden Form abgelegt
#!/bin/bash

. /opt/ise/settings.sh
. /opt/edk/setup.sh
. /opt/edk/settings.sh
Auf diese Weise muss ich nur noch . settings.sh aufrufen und alle Einstellungen sind geladen. Der Punkt darf dabei nicht vergessen werden. Er sorgt dafür, daß die Variablen, die durch die Scripte gesetzt wurden, von der Shell übernommen werden.

Hinweis: Mit lsusb kann man sich die angeschlossenen USB-Geräte anzeigen lassen. Da ich das XUP-Board verwende, liefert mir dieser Befehl die Ausgabe:
Bus 002 Device 008: ID 03fd:0008 Xilinx, Inc.
Sollte die Verbindung mit iMPACT mal nicht klappen, sollte man mal schauen, ob lsusb das Gerät noch findet. Es scheint so, als würde sich das Board nach einiger Zeit im Leerlauf abschalten. Dann hilft es, es einmal aus- und einzuschalten. Danach müßte auch lsusb wieder das Gerät finden.

FAQ

Q: Beim Aufruf von ./setup erhalte ich folgende Fehlermeldung:
/cdrom/platform/lin/bin/lin
/cdrom/platform/lin/xilsetup: error while loading shared libraries: libXm.so.3: cannot open shared object file: No such file or directory


************ setup done! ***************
A: libXm.so.3 ist in dem Paket libmotif3 (unter Debian: apt-get install libmotif3 libcurl3).

Q: Beim Aufruf von make -f system.make download erhalte ich folgende Fehlermeldung:
make -f system.make download

*********************************************
Downloading Bitstream onto the target board
*********************************************
impact -batch etc/download.cmd
make: impact: Command not found
make: *** [download] Fehler 127
A: Die Systemvariablen wurden nicht gesetzt. Ein Aufruf von . settings.sh löst das Problem.

Bei weitere Fragen kann vielleicht die Seite FPGA-FAQ: How to get the Xilinx parallel cable to work on Linux kernels 2.6.x helfen.