Installation von Xilinx ISE 6.3 oder ISE 7.1 unter Linux (Kernel 2.6.9 / 2.6.11)

Inhalt

Vorwort

Diese Anleitung basiert auf dem Artikel FPGA-FAQ: How to get the Xilinx parallel cable to work on Linux kernels 2.6.x auf http://www.fpga-faq.org/. Mein System war Linux Debian mit dem Kernel 2.6.9 und mit dem Kernel 2.6.11, selbstcompiliert.

Wenn möglich, sollte man das neuere ISE installieren, denn scheinbar wurde in der Version 7.1 das Problem behoben, daß wärend eines Compilierungsvorgangs das System komplett blockiert war.

Bei Fragen, Hinweisen oder Problemlösungen freue ich mich über eMails.

Installation von Xilinx ISE/EDK unter Debian

Die Installation muss unter root ausgeführt werden und die CD-Rom mit Ausführungsrechten gemountet werden. Also beispielsweise folgendes unter root ausführen:
apt-get install libmotif3 libcurl3
mount -o exec /cdrom
cd /cdrom/
export DISPLAY=:0
./setup
Ich habe als Installationsverzeichnis /opt/xilinx angegeben.

Bei der Auswahl der Xilinx-Module sollte man Platform Cable USB Driver und Parallel Cable Drivers abwählen, wenn man nicht mit Red Hat Enterprise 3.0, Kernel 2.4 arbeitet. In meinem Fall (Debian, Kernel 2.6.11) habe ich also die Installation ohne die beiden Module fortgesetzt.

Wenn die Installation der 1. CD fertig ist, die CD unmounten und CD 2 und 3 gleichermaßen installieren.

Danach habe ich das ISE Service Packe 3 installiert (entpacken und setup starten).

Auf die gleiche Weise hab ich auch das EDK installiert.

Da das ISE (und das EDK) die dumme Angewohnheit hat, Dateien in dem Verzeichnis abzulegen, von dem aus es gestartet wurde, habe ich mir ein Script angelegt, daß dem ISE das Verzeichnis ~/.xilinx für diese Zwecke gibt. Es lädt gleichzeitig die Umgebungsvariable (settings.sh) für das ISE.
#!/bin/bash
############################
#     ISE start script     #
#                          #
#    by Stefan Endrullis   #
############################

# Please adapt these values to your system configuration.
XILINX_DIR=/opt/xilinx
# less importantly
XILINX_USER_DIR=~/.xilinx


### script begin ###

# create XILINX_USER_DIR if nessessary and change dir
if [ ! -d ${XILINX_USER_DIR} ]; then
mkdir ${XILINX_USER_DIR}
fi
cd ${XILINX_USER_DIR}

# load settings
. ${XILINX_DIR}/settings.sh

# start xilinx ise
${XILINX_DIR}/bin/lin/ise
Und hier das gleiche für das EDK, wobei ich mir noch eine setup.sh angelegt habe, die einige Umgebungsvariablen zusätzlich setzt.
#!/bin/bash
############################
#     EDK start script     #
#                          #
#    by Stefan Endrullis   #
############################

# Please adapt these values to your system configuration.
XILINX_DIR=/opt/xilinx
EDK_DIR=/opt/edk
# less importantly
XILINX_USER_DIR=~/.xilinx


### script begin ###

# create XILINX_USER_DIR if nessessary and change dir
if [ ! -d ${XILINX_USER_DIR} ]; then
mkdir ${XILINX_USER_DIR}
fi
cd ${XILINX_USER_DIR}

# load settings
. ${XILINX_DIR}/settings.sh
. ${EDK_DIR}/setup.sh

# start xilinx ise
${EDK_DIR}/bin/lin/XPS_GUI
Hier nun die setup.sh:
export XILINX_EDK=/opt/edk
export LD_LIBRARY_PATH=${XILINX_EDK}/bin/lin:${LD_LIBRARY_PATH}
export PATH=${XILINX_EDK}/bin/lin:${XILINX_EDK}/gnu/microblaze/lin/bin:\
${XILINX_EDK}/gnu/powerpc-eabi/lin/bin:${PATH}

WinDriver installieren

Zuerst sollte man die Kernel-Sourcen für den laufenden Kernel installieren.

Danach kann man den WinDriver von http://www.jungo.com/dnload.html herunterladen. Dies erfordert eine freie Registrierung. Nun kann man die heruntergeladene Datei entpacken usw.:
tar xzf WD700LN.tgz
cd WinDriver/redist
./configure
make
make install
Bei mir kam bei make install folgende Fehlermeldung zurück:
FATAL: Error inserting windrvr6 (/lib/modules/2.6.11stefan/kernel/drivers/misc/wi
ndrvr6.ko): Invalid module format
make: *** [install] Fehler 1
Lösung dafür ist, keinen zu neuen Compiler zu verwenden, indem man z.B. im Makefile folgende Zeile einfügt:
CC=gcc-3.3
Die Installation hat auch gleich den Treiber geladen und es wurde das neue Device /dev/windrvr6 angelegt. Zugriff hat standardgemäß nur root. Also gegebenenfalls noch die rw-Rechte ändern, falls man ISE impact auch als normaler User nutzen möchte. In meinem Fall:
chown stefan:users /dev/windrvr6
chmod 660 /dev/windrvr6

Xilinx-Treiber installieren

Die Kernel-Sourcen müssen installiert sein.

Danach wie im gelben Kasten dargestellt: herunterladen, entpacken, patchen. Den Patch bitte vorher auf bösen Code untersuchen (ich übernehme keine Garantie).
wget ftp://ftp.xilinx.com/pub/utilities/fpga/linuxdrivers.tar.gz
wget http://stefan.endrullis.de/downloads/fpga/linuxdrivers.patch
tar xzf linuxdrivers.tar.gz
cd linuxdrivers
patch -Np1 <../linuxdrivers.patch
Nun in xpc4drvr wechseln und das alte Xilinx-Makefile umbenennen:
cd xpc4drvr
mv Makefile Makefile_old
Jetzt erstellen wir ein neues Makefile (muss Makefile heißen) mit folgendem Inhalt ( durch Tabulator ersetzen):
RUN_VERSION=`uname -r`

KERNEL_SOURCE_DIR=/lib/modules/${RUN_VERSION}/build
MODULE_INSTALL_DIR=/lib/modules/${RUN_VERSION}/kernel/drivers/misc/

GCC_BIN=gcc-3.3

obj-m := xpc4drv.o
xpc4drv-objs := xpc4.o ioctl_3.a

1:
make CC=${GCC_BIN} -C ${KERNEL_SOURCE_DIR} M=`pwd`

default:
make CC=${GCC_BIN} -C ${KERNEL_SOURCE_DIR} M=`pwd` modules

install:
cp ./xpc4drv.ko ${MODULE_INSTALL_DIR}

help:
make CC=${GCC_BIN} -C ${KERNEL_SOURCE_DIR} M=`pwd` help

clean:
rm *.o *.mod.c *.ko

.PHONY: default
Danach:
make
insmod ./xpc4drv.ko
insmod sollte nichts ausgeben. Falls doch, z.B.
insmod: error inserting './xpc4drv.ko': -1 Invalid module format
kann der Aufruf von dmesg | tail nützliche Informationen liefern, z.B. folgende:
xpc4drv: version magic '2.6.11 SMP preempt PENTIUM4 gcc-4.0' should be '2.6.11 SMP preempt PENTIUM4 gcc-3.3'
Wenn dmesg | tail die Zeile xpc4drvr: init_module ausspuckt, wurde das Modul korrekt geladen und man kann das Modul installieren:
make install

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.