Altera USB-Blaster with Ubuntu 14.04
I was having the problem: unable to program the Altera FPGA board with USB-Blaster, and even failed to auto-detect.
Auto-detect gave me a message: «Unable to scan device chain. Please check the hardware setup.»
Thanks to the fpga-dev.com blogger so I got it solved, and here is the article.
With some work, I got Alteras on-board USB-Blaster working on my Ubuntu 14.04-64 installation with Quartus II 13.1.0 64-bit. I was connecting to a Terasic SocKit board. In this article, I’ll describe how I got it working.
To facilitate working with the Altera software, I suggest adding the bin/ folder of the Quartus installation ( /opt/altera/13.1/quartus/bin on my system) to $PATH . This gives command-line access to the commands jtagd and jtagconfig which I use in this post.
Verify USB connection and check Product ID
At first, connect the cable and make sure the USB device is recognized. These are the commands I used and the output I got:
$ dmesg|tail [. ] [16059.962298] usb 2-2: New USB device found, idVendor=09fb, idProduct=6010 [16059.962301] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [16059.962303] usb 2-2: Product: CV SoCKit [16059.962305] usb 2-2: Manufacturer: Altera [16059.962307] usb 2-2: SerialNumber: ARCVSC-123-457 $ $ lsusb|grep Altera Bus 002 Device 007: ID 09fb:6010 Altera
Take note of the Product ID listed — 6010 in the above example.
Fix USB driver permissions
The Quartus software will use the Linux built-in usb_device drivers. By default, only root has access to these so we must make sure the user is allowed to access them as well.
jtagd , part of the Quartus tools, is a deamon that provides the interface between the Altera tool accessing the JTAG chain and the USB driver. If not already running, jtagd will be startetd automatically when the Quartus software or jtagconfig is run. You’ll usually run these as a user, which means jtagd will also run as a user. That is why edited permission for the usb_device is necessary.
Create a file /etc/udev/rules.d/51-usbblaster.rules , make sure it has read permissions for root, and fill it with this content:
# For Altera USB-Blaster permissions. SUBSYSTEM=="usb",\ ENV=="usb_device",\ ATTR=="09fb",\ ATTR=="6010",\ MODE="0666",\ NAME="bus/usb/$env/$env",\ RUN+="/bin/chmod 0666 %c"
Edit the value for ATTR to match the Product ID determined before.
If you have more than one Product ID you want this to work for, simply repeat the above lines in the same file and use the other Product IDs for ATTR .
For the changes to take effect, reboot the machine or run:
$ sudo udevadm control --reload
Copy devices data for jtagd
Make sure jtagd has access to the list of devices:
$ sudo cp /opt/altera/13.1/quartus/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts
Also make sure this file has read access for the user.
This file allows Altera tools to translate Device IDs (left column of terminal listing below) to device names (right column) for found devices.
Test that it’s all working
To test that the connection works, execute jtagconfig and hope for an output giving the board and the devices:
$ jtagconfig 1) CV SoCKit 2 02D020DD 5CSEBA6(.|ES)/5CSEMA6/.. 4BA00477 SOCVHPS
The cable should now be recognized as a valid hardware by the Quartus tools. From Quartus, select Tools, Programmer, Hardware Setup. and then select the board from the drop-down list. Now, the Programmer, JTAG Chain Debugger and System console should all recognize and use the USB-Blaster device.
Trouble-shooting and common error messages
For general problems, start trouble-shooting by making sure jtagd is not started, then start it as root and then run jtagconfig . This should eliminate all possible permission problems, and should work also without the udev rights.
$ sudo killall -9 jtagd # Kill jtagd, . $ sudo killall -9 jtagd # . and verify jtagd is indeed not running. jtagd: no process found # Good, verified. $ jtagconfig 1) CV SoCKit 2 02D020DD 5CSEBA6(.|ES)/5CSEMA6/.. 4BA00477 SOCVHPS
Other trouble-shooting includes verifying that the usb device is found ( dmesg|tail and ps aux|grep Altera ). Also check that jtagd runs, and if it runs as user or root:
$ ps aux|grep jtagd root 21733 0.0 0.0 25076 1580 ? S 11:05 0:00 /opt/altera/13.1/quartus/linux64/jtagd # Obviously, jtagd is running, and it's running as root.
If an Altera tool started jtagd , it will typically be started with some command-line options:
$ ps aux|grep jtagd carl 5399 0.0 0.0 25080 1612 ? S 19:37 0:00 /opt/altera/13.1/quartus/linux64/jtagd --user-start --config /home/carl/.jtagd.conf
For some reason, as can be seen above, the Altera tool has provided a specific Device ID file as command-line argument, however, even if this file doesn’t exist, at least on my system jtagd will also check /etc/jtagd/jtagd.pgm_parts . It can also be noted that the Altera tool has started jtagd with a —user-start argument. In this case, jtagd will terminate two minutes after the last client has disconnected from it. The next Altera tool needing to use it will simply start it again.
Typical permission problems will yield this message from jtagconfig :
$ jtagconfig No JTAG hardware available
If you get an error message like Unable to lock chain (Insufficient port permissions) , this is due to the driver permissions.
It can also be useful to try to start jtagd with some debug options for verbose output:
$ jtagd --foreground --debug JTAG daemon started Using config file /etc/jtagd/jtagd.conf Remote JTAG permitted when password set
(Still, at least on my system, jtagd will also check /etc/jtagd/jtagd.pgm_parts although it says otherwise in the output above.)
An error message about not being able to bind to port 1309 typically means jtagd is already running:
$ jtagd --foreground --debug JTAG daemon started Using config file /etc/jtagd/jtagd.conf Remote JTAG permitted when password set Cant bind to TCP port 1309 - exiting
If jtagconfig indicates that the connection is OK, but using the Quartus Programmer fails and is giving this message in the Quartus console:
Error (209042): Application SLD HUB CLIENT on 127.0.0.1 is using the target device
. then restarting jtagd will usually work. This goes for any application occupying the target device. If the applicatoin in question is System Console , then this is usually the Nios console window in Eclipse. Terminate its connection to Nios (icon with red square).
Work-around for driver permission problems
If you don’t manage to fix driver permission problems, you can run jtagd as root instead. This is also an alternative solution to creating the udev rules as described above. However, you should be aware that this is not typically regarded as a ‘good’ solution due to security issues.
If starting jtagd manually, start it as root with sudo jtagd . You must make sure jtagd is not running in prior to this — if it is, it will continue to run as the user that started it previously.
For a permanent solution, start jtagd as root at each boot. That can, for example, be done by adding a call to the jtagd executable in /etc/rc.local . Add the line and make sure the file has execute permissions (that is for some reason not always the case for a standard Ubuntu installation). Reboot the machine and check that jtagd is started, and that it runs as root. (A more correct, but more complicated, way to do this is to add init.d scripts for jtagd . Then shutdown and restart can also be handled correctly.)
ModelSim Altera Edition
Most other Altera tools I’ve used has worked without problems (QuartusII, Qsys, SBT/Eclipse, Programmer, System Console and others). However, ModelSim typically won’t run without tweaking on Ubuntu 14.
Trying to lauch ModelSim from within Quartus gave the following error message:
Can't launch ModelSim-Altera Simulation software -- make sure the software is properly installed and the environment variable LM_LICENSE_FILE or MGLS_LICENSE_FILE points to the correct license file.
However, the problem is not about the licensing in this case. Trying to lauch from the command line gave a more informative error message:
$ ./vsim Error while loading shared libraries: libXft.so.2: cannot open shared object file: No such file or directory.
Remedy: install the 32-bit version of libXft:
$ sudo apt-get install libxft2:i386
When any missing packages are installed, expect a segmentation fault when trying to launch ModelSim:
$ vsim ** Fatal: Read failure in vlm process (0,0) Segmentation fault (core dumped)
This is due to ModelSim being incompatible with the latest version of the libfreetype package.
I got this problem working by following the instructions here:
The same instructions can also be found here:
This solved the problems for me and ModelSim is now runnning fine.
References
Comments
Contents © 2021 Adam Basfop Cavendish — Powered by Nikola
Using Altera’s Intel’s USB-Blaster on Debian Linux
I’ve tested this on a Terasic DE4 board, but in theory it should work with any board which uses a USB-Blaster interface to the JTAG chain for programming Altera FPGA devices, such as the DE2 commonly used for education.
Additionally, Carl Wernhoff also solved the same problem: Altera USB-Blaster with Ubuntu 14.04
The usbfs instructions are obsolete, as usbfs has ceased to exist in the Linux kernel as of 3.5. I’m keeping them here for historical interest, and also because the debugging guide at the end is still relevant.
Create a new udev rule: /etc/udev/rules.d/51-altera-usb-blaster.rules # USB-Blaster SUBSYSTEM=="usb", ATTR=="09fb", ATTR=="6001", MODE="0666" SUBSYSTEM=="usb", ATTR=="09fb", ATTR=="6002", MODE="0666" SUBSYSTEM=="usb", ATTR=="09fb", ATTR=="6003", MODE="0666" # USB-Blaster II SUBSYSTEM=="usb", ATTR=="09fb", ATTR=="6010", MODE="0666" SUBSYSTEM=="usb", ATTR=="09fb", ATTR=="6810", MODE="0666" Then, reload that file using udevadm: # udevadm control --reload
The rest of the instructions remain essentially the same: jtagd must run as root to ensure sufficient permissions.
Allowing non-root access to the USB-Blaster device
To do this, create a file called /etc/udev/rules.d/altera-usb-blaster.rules containing a single line:
This grants rw-rw-rw- permision to the device. A more proper configuration involves creating a group for the device, say usbblaster , placing your user(s) in that group, and defining the device permisions like so:
Note that this is not perfect: multiple USB device entries are created for the USB-Blaster, and not all will have the new permissions, which is why jtagd must run as root. (see below)
Mounting the usbfs filesystem
Add the following entry to /etc/fstab and mount it:
none /proc/bus/usb usbfs defaults 0 0
You’ll know its good if /proc/bus/usb/devices appears and spits out a bunch of textual device info when printed.
Note that Ubuntu no longer ships with usbfs enabled. This makes for more complicated workarounds, which you will find online.
Configuring jtagd
Quartus uses a daemon, jtagd , as intermediate bewteen the programming software and the device. This seems needlessly complicated, but does enable remote host programming apparently. The key points to configuring it correctly are: it must be able to access a list of FPGA descriptions, and run as root.
Copy the descriptions from your Quartus installation to the configuration directory of jtagd :
mkdir /etc/jtagd
cp /linux/quartus/linux/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts (Note the change of name!)
Have jtagd start at boot by either placing it in the rc.d system, or simply place the followwing line in /etc/rc.local :
Although it might get created automatically, you can create an empty file named .jtagd.conf in your home directory. I hear it’s possible to edit it to allow external hosts to connect and program/debug. This is only necessary if you want to use that feature.
Testing your setup
As a final test, plug in your device, run dmesg to see if the USB-Blaster device is found, then run (as your usual user) jtagconfig . You should see output similar to this:
1) USB-Blaster [USB 1-1.1] 020B30DD EP2C15/20
If USB device permissions are insufficient (they shouldn’t, given the rule added in /etc/udev/rules.d/altera-usb-blaster.rules ), you will instead get:
No JTAG hardware available
If USB permissions are OK, but jtagd is not running as root, you will see:
1) USB_Blaster [USB 4-1.2] Unable to lock chain (Insufficient port permissions)
Finally, if permissions are OK and jtagd is running as root, but it cannot access the FPGA device descriptions, you will see:
1) USB-Blaster [USB 4-1.2] 024030DD
Programming your FPGA device
You should now be able to use the Programmer in Quartus to load a bitstream onto your target FPGA. Alternately, you can use the following shell script to do it at the command line:
#!/bin/bash quartus_pgm -z -m JTAG -o "p;$1"