>> Artikelansicht

03.09.2014 /He [Druckansicht]

Lattice iCEstick Evaluation Kit unter openSUSE13.1-64bit

Lattice iCEstick Evaluation Kit iCE40 Für einen Versuch zum Anschluß von verschiedenen Sensoren, soll diesmal ein FPGA eingesetzt werden. Die Wahl fiel auf einen Lattice FPGA der Reihe iCE40 LP/HX/LM.Wichtig war, dass die komplette Entwicklung unter Linux möglich ist.Um dies zu testen, wurde ein günstiges Entwicklungs-Kit geordert, das eine Programmierung direkt im System über den USB-Bus ermöglicht.
Hier kommen die ersten Fallstricke, die es zu umschiffen gilt.Das Entwicklungs-Kit hat zur Kommunikation und Programmierung des FPGA(bzw. des SPI-EEproms) einen FTDI FT2232HL an Bord. Von Vorteil ist, dass man so zwei serielle Schnittstellen zur Verfügung hat. Was jedoch auch gleich einen "Nachteil" darstellt, da der FTDI FT2232HL automatisch die Kerneltreiber ftdi_sio.so den Schnittstellen zuweist.Was zur Folge hat, dass eine Programmierung des FPGA(bzw. des SPI-EEproms) über die mitgelieferte Software nicht funktioniert, da die Software ihren eigenen Treiber verwendet, der entsprechende Kanal jedoch schon mit dem ftdi_sio Modul vorbelegt ist und somit von der Software nicht angesprochen werden kann.Die einfachste Lösung ist, den Treiber ftdi_sio.so per rmmod ftdi_sio zu entfernen.
Die elegantere Lösung ist, gezielt nur den ersten Kanal des FT2232HL mit dem nachfolgenden Befehl von ftdi_sio zu "lösen"

> echo "1-1.1:1.0" /sys/bus/usb/drivers/ftdi_sio/unbind
Die 1-1.1:1.0 kann aus dem Logfile hergeleitet werden siehe *1) und kann auf jedem Rechner anders lauten!
tail -f /var/log/messages
  1. usb 1-1.1: new high-speed USB device number 8 using ehci-pci
  2. usb 1-1.1: New USB device found, idVendor=0403, idProduct=6010
  3. usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
  4. usb 1-1.1: Product: Lattice FTUSB Interface Cable
  5. usb 1-1.1: Manufacturer: Lattice
  6. mtp-probe: checking bus 1, device 8: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1"
  7. mtp-probe: bus: 1, device: 8 was not an MTP device
  8. usbcore: registered new interface driver usbserial
  9. usbcore: registered new interface driver usbserial_generic
  10. usbserial: USB Serial support registered for generic
  11. usbcore: registered new interface driver ftdi_sio
  12. usbserial: USB Serial support registered for FTDI USB Serial Device
  13. ===1. Kanal ttyUSB0===
  14. *1)
  15. ftdi_sio 1-1.1:1.0: FTDI USB Serial Device converter detected
  16. usb 1-1.1: Detected FT2232H
  17. usb 1-1.1: Number of endpoints 2
  18. usb 1-1.1: Endpoint 1 MaxPacketSize 512
  19. usb 1-1.1: Endpoint 2 MaxPacketSize 512
  20. usb 1-1.1: Setting MaxPacketSize 512
  21. usb 1-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
  22. ===2. Kanal ttyUSB1===
  23. ftdi_sio 1-1.1:1.1: FTDI USB Serial Device converter detected
  24. usb 1-1.1: Detected FT2232H
  25. usb 1-1.1: Number of endpoints 2
  26. usb 1-1.1: Endpoint 1 MaxPacketSize 512
  27. usb 1-1.1: Endpoint 2 MaxPacketSize 512
  28. usb 1-1.1: Setting MaxPacketSize 512
  29. usb 1-1.1: FTDI USB Serial Device converter now attached to ttyUSB1
Das Ganze kann nun auch noch über eine udev-Regel automatisiert werden.Im Internet kursiern einige udev-Regeln für diesen Fall, jedoch hat keine unter openSUSE13.1-64bit funktioniert.
Sollte der Befehl echo ttyUSB0 > /sys/bus/usb/drivers/ftdi_sio/unbind auf Ihrem System funktionieren, könnte die folgende udev-Regel greifen.(Auf dem Testrechner ist Kernel 3.15.0 installiert)Es kann auch an der verwendeten libFTDI-Version liegen [http://www.intra2net.com/en/developer/libftdi/]Siehe auch: [http://www.ikalogic.com/ftdi-d2xx-linux-overcoming-big-problem/]

*NOT_WORKING FOR ME*
/etc/udev/rules.d/10-ftdi.rules
  1. SUBSYSTEM=="usb",ATTRS{product}=="Lattice FTUSB Interface Cable",ATTRS{bInterfaceNumber}=="00",RUN+="/bin/sh -c 'basename %p > /sys/bus/usb/drivers/ftdi_sio/unbind'"
Anscheinend wird ATTRS{bInterfaceNumber}=="00" nicht ausgewertet.Abhilfe schafft ein kleines Hilfs-Script und folgende udev-Regel.
*WORKING*
/etc/udev/rules.d/10-ftdi.rules
  1. ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ATTRS{product}=="Lattice FTUSB Interface Cable", RUN+="/bin/sh -c '/usr/local/bin/lattice-udev.sh'"
Das folgende Script muss ausführbar sein.
/usr/local/bin/lattice-udev.sh
  1. #!/bin/sh
  2. #udev-script use udev-rule /etc/udev/rules.d/10-ftdi.rules
  3. #ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ATTRS{product}=="Lattice FTUSB Interface Cable", RUN+="/bin/sh -c '/usr/local/bin/lattice-udev.sh'"
  4. #ATTRS{bInterfaceNumber}=="00" not working so i have to use ID_USB_INTERFACE_NUM from env (vars) /herzog 08/2014
  5. #if [ "${DEVNAME}" = '/dev/ttyUSB0' ]; then
  6. if [ "${ID_USB_INTERFACE_NUM}" = '00' ]; then
  7. IFS="/"
  8. #DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0/tty/ttyUSB0
  9. C=$DEVPATH
  10. arr=($C)
  11. echo ${arr[7]} > /sys/bus/usb/drivers/ftdi_sio/unbind
  12. fi
Neustart von udev.
> /etc/init.d/boot.udev restart

Die Software

Eine Übersicht für das Entwiklungs-Kit (iCEstick/iCE40) findet man hier:
[http://www.latticesemi.com/icestick]

Die passende Design und HDL-Entwiklungssoftware Software iCEcube2™ kann unter diesem Link heruntergeladen werden.
[http://www.latticesemi.com/Products/DesignSoftwareAndIP/FPGAandLDS/iCEcube2.aspx]

Unter dem folgenden Link kann die FPGA-Programmier-Software Lattice Diamond Programmer (3.2) heruntergeladen werden.
[http://www.latticesemi.com/Products/DesignSoftwareAndIP/ProgrammingAndConfigurationSw/Programmer.aspx]

Vorbereitung

Zuerst muss man sich auf der Homepage von Lattice [http://www.latticesemi.com] registrieren, da man für den Download einen (kostenlosen)Zugang und für die Software eine (kostenlose)Lizenz benötigt, die an die MAC-Adresse der Netzwerkkarte gebunden ist.

Beispiel:(FAKE MAC-Aresse)

> ifconfig eth0
  1. eth0 Link encap:Ethernet HWaddr 00:11:AC:42:A6:B4
  2. UP BROADCAST MULTICAST MTU:1500 Metric:1
  3. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  4. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  5. collisions:0 txqueuelen:1000
  6. RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
  7. Interrupt:20 Memory:f2500000-f2520000
Notieren Sie sich zuerst die MAC-Ardesse(Ethernet HWaddr) ohne ':' 00:11:AC:42:A6:B4 -> 0011AC42A6B4
Diese benötigen Sie später für die Linzenzdatei.Wenn man wie zu Beginn des Artikels den ftdi_sio Kanal von ttyUSB0 "entfernt" hat, kann man mit der Installation der Programmier-Software beginnen.
Zum Zeitpunkt der Installation wurde folgende Datei verwendet [programmer_3_2_x64-134-x86_64-linux.rpm]
Die Software wurde unter /opt/lattice/software gespeichert.Man kann die Software nun mit dem Befehl:
> cd /opt/lattice/software
  1. > rpm -i ./programmer_3_2_x64-134-x86_64-linux.rpm
installieren.
Defaultmässig wird das Programm nun unter:/usr/local/programmer/3.2_x64/ installiert.
> ls /usr/local/programmer/3.2_x64/
  1. bin data docs embedded_source ispfpga license tcltk
Nun sollte man die Lizenz-Datei anfordern, die per e-Mail zugesendet wird.Die Lizenz-Datei "license.dat" kopiert man am besten in den globalen Lizenz-Ordner /usr/local/flexlm/licenses sollte dieser nicht existieren, muss er mit mkdir -p /usr/local/flexlm/licenses erzeugt werden.

  1. > mkdir -p /usr/local/flexlm/licenses
  2. > cp license.dat /usr/local/flexlm/licenses

Programmierung des FPGA unter der Grafischen Oberfläche

Für erste Versuche kann man sich unter [http://www.latticesemi.com/icestick] Downloads einen IP(Intellectual Property) core herunterladen.

Hier LED_rotation.zip der in diesem Beispiel unter /opt/lattice/ip/ entpackt wird.
Der Programmer wird mit diesem Befehl aufgerufen.
> /usr/local/programmer/3.2_x64/bin/lin64/programmer

Lattice Diamond Programmer Nach dem Start erzeugen wir eine neue Projektdatei.
(X) [Create a new projekt]









Lattice Diamond Programmer - Hauptfenster Im Hauptfenster wält man in den Feldern durch Doppel-Klick:
[Device Family] = ICE40
[Device] = ICE40HXK1
[Operation] Doppel-Klick öffnet ein neues Unter-Fenster *1)





*1) Unter-Fenster

Lattice Diamond Programmer - Unter-Fenster Hier wählt man der Reihe nach:
-Device Operation
Access mode = SPI FLASH PROGRAMMING
-Programming Options
Programming file = /opt/lattice/ip/LED_rotation/LED_Rotation_bitmap.bin
-SPI Flash Options
Family = SPI Serial Falsh
Vendor = Micron
Device = SPI-N25Q032
Package = 8-pin VDFPN8








Wenn alles eingestellt ist [OK] drücken, um wieder auf das Hauptfenster zu gelangen.
Nun kann man "[Design]/Check XCF Project" ausführen, was keine Fehlermeldung ausgeben sollte.

  1. INFO - Check XCF Project: The current XCF Project is valid.
Danach speichert man das Projekt unter ledtest.xcf (um es später auch von der Kommandozeile ohne grafische Oberfälache programmieren zu können)
Nun kann man das Programm(Bitstream) auf das SPI-EEprom mit "[Desing]/Program" übertragen.
Das Logfile sollte so aussehen.
  1. Lattice VM Drivers detected (HW-USBN-2B (FTDI))
  2. Programmer device database loaded
  3. INFO - Check configuration setup: Start.
  4. INFO - Check configuration setup: Successful (Ignored JTAG Connection Checking).
  5. INFO - Device1 iCE40HX1K: SPI-N25Q032: SPI Flash Erase,Program,Verify
  6. Initializing...
  7. IDCode Checking...
  8. Enabling...
  9. Erasing...
  10. Disabling...
  11. Enabling...
  12. Programming...
  13. Disabling...
  14. Verifying...
  15. Finalizing...
  16. INFO - Execution time: 00 min : 41 sec
  17. INFO - Elapsed time: 00 min : 41 sec
  18. INFO - Operation: successful.

Programmierung des FPGA mit der Kommandozeile

Der Einfachheit halber verwenden wir hierfür das unter der Grafischen Oberfläche erstellte und gespeicherte Projektfile ledtest.xcf

> cd /usr/local/programmer/3.2_x64/bin/lin64/
  1. > ./pgrcmd -cabletype USB2 -portaddress FTUSB-0 -infile /opt/lattice/ip/LED_rotation/ledtest.xcf

Fehlermeldungen

Fehlermeldung

ERROR - Programming failed.ERROR - Failed to Open FTDI USB port. Make sure to select the right cable type.If you have not installed the FTDI Windows USB Driver, follow the instructions in the Programmer Help topic:"Installing/Uninstalling Parallel Port Driver and USB Driver".If you have installed the driver, if you recently plugged in the cable, please wait a few seconds and try again.This will give the operating system time to recognize the cable.

Lösung

ftdi_sio.so ist geladen, siehe Anfang des Artikels.

Fehlermeldung

ERROR - Programming failed.
ERROR - The other process currently running. Cannot continue

Lösung

Die Software beenden.
> ps ax | grep -i JTAGLServer
  1. 6882 pts/6 Sl 0:00 JTAGLServer
danach den Prozess mit kill -9 PID (hier 6882) beenden.

nächster Artikel