Draft-AN-445: Difference between revisions
Line 35: | Line 35: | ||
==Update and Install dependencies== | ==Update and Install dependencies== | ||
Before building UHD and GNU Radio, you need to make sure that all the dependencies are | Before building UHD and GNU Radio, you need to make sure that all the dependencies are installed. | ||
The following commands will install all the required dependencies. Before running them, you should [https://help.ubuntu.com/community/Repositories/Ubuntu ensure that the "Main" and "Universe" repositories are enabled in "Software Sources"]. | |||
Next, on a terminal screen, run: | |||
sudo apt-get update | sudo apt-get update | ||
Once the system has been updated, then install the required dependencies below. | |||
=== Focal Fossa (20.04) through Kinetic Kudu (22.10) === | |||
GNU Radio version 3.8.x with Python 3 support: | |||
<pre> | |||
sudo apt install git cmake g++ libboost-all-dev libgmp-dev swig python3-numpy \ | |||
python3-mako python3-sphinx python3-lxml doxygen libfftw3-dev \ | |||
libsdl1.2-dev libgsl-dev libqwt-qt5-dev libqt5opengl5-dev python3-pyqt5 \ | |||
liblog4cpp5-dev libzmq3-dev python3-yaml python3-click python3-click-plugins \ | |||
python3-zmq python3-scipy python3-gi python3-gi-cairo gir1.2-gtk-3.0 \ | |||
libcodec2-dev libgsm1-dev | |||
</pre> | |||
GNU Radio version 3.9.x <b>in addition to above</b> requires: | |||
<pre> | |||
sudo apt install pybind11-dev python3-matplotlib libsndfile1-dev \ | |||
python3-pip libsoapysdr-dev soapysdr-tools | |||
pip install pygccxml | |||
pip install pyqtgraph | |||
</pre> | |||
GNU Radio version 3.10.x and the 'main' branch <b>in addition to above</b> require: | |||
<pre> | |||
sudo apt install libiio-dev libad9361-dev libspdlog-dev python3-packaging python3-jsonschema | |||
</pre> | |||
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio. | If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio. |
Revision as of 19:59, 31 March 2023
Application Note Number
AN-445
Abstract
This Application Note provides a comprehensive guide for building and installing the open-source toolchain for the USRP (UHD and GNU Radio) from source code on a Linux platform. The Ubuntu distribution is specifically discussed.
UHD on Linux
UHD is fully supported on Linux, using the GCC compiler, and should work on most major Linux distributions.
Devices
This document applies only to the USRP X300, X310, B200, B210, B200mini, N200, and N210 devices. The E310 and E312 devices are embedded devices which are fundamentally different from the other non-embedded devices. They are not addressed in this document.
Install Linux
If you already have a recent version of Linux installed, then you may be able to skip this section. If you are starting from scratch, or simply want to start with a new installation of Linux, then please follow the instructions and recommendations in this section.
We suggest that you use either Ubuntu 22.04, Ubuntu 20.04, or Debian Bullseye with a 64-bit architecture. There are several variants of Ubuntu, such as Xubuntu, Lubuntu, Kubuntu, Linux Mint, all of which should work. For the purposes of this document, these variants can be considered equivalent.
Download and install Ubuntu or Debian from the links below. Download the appropriate ISO image, and write it to a USB flash drive. Be sure to verify that the ISO file was not corrupted during the download process by checking the MD5 and/or SHA1 hash.
There are many tools for writing an ISO image to a USB flash drive. On most Ubuntu systems, there is the Startup Disk Creator utility. For other Linux OSs, MacOS, or Windows you can use Balena Etcher, UNetbootin, or many others. See 6 Best Bootable USB Creators for Linux for example.
Be sure to use a USB flash drive with at least 8 GB capacity, and use a USB 3.0 flash drive, not a USB 2.0 flash drive. If you use a slower USB 2.0 flash drive, then the install process will take significantly longer.
Update and Install dependencies
Before building UHD and GNU Radio, you need to make sure that all the dependencies are installed.
The following commands will install all the required dependencies. Before running them, you should ensure that the "Main" and "Universe" repositories are enabled in "Software Sources".
Next, on a terminal screen, run:
sudo apt-get update
Once the system has been updated, then install the required dependencies below.
Focal Fossa (20.04) through Kinetic Kudu (22.10)
GNU Radio version 3.8.x with Python 3 support:
sudo apt install git cmake g++ libboost-all-dev libgmp-dev swig python3-numpy \ python3-mako python3-sphinx python3-lxml doxygen libfftw3-dev \ libsdl1.2-dev libgsl-dev libqwt-qt5-dev libqt5opengl5-dev python3-pyqt5 \ liblog4cpp5-dev libzmq3-dev python3-yaml python3-click python3-click-plugins \ python3-zmq python3-scipy python3-gi python3-gi-cairo gir1.2-gtk-3.0 \ libcodec2-dev libgsm1-dev
GNU Radio version 3.9.x in addition to above requires:
sudo apt install pybind11-dev python3-matplotlib libsndfile1-dev \ python3-pip libsoapysdr-dev soapysdr-tools pip install pygccxml pip install pyqtgraph
GNU Radio version 3.10.x and the 'main' branch in addition to above require:
sudo apt install libiio-dev libad9361-dev libspdlog-dev python3-packaging python3-jsonschema
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio.
Building and installing UHD from source code
UHD is open-source, and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.14.0.0, which is the the latest release at the time of this writing.
There are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple UHD versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.
To build UHD from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.
First, make a folder to hold the repository.
cd $HOME mkdir workarea cd workarea
Next, clone the repository and change into the cloned directory.
git clone https://github.com/EttusResearch/uhd cd uhd
Next, checkout the desired UHD version. You can get a full listing of tagged releases by running the command:
git tag -l
Example truncated output of git tag -l
:
$ git tag -l ... release_003_009_004 release_003_009_005 release_003_010_000_000 ...
Note: As of UHD Version 3.10.0.0, the versioning scheme has changed to be a quadruplet format. Each element and version will follow the format of: Major.API.ABI.Patch. Additional details on this versioning change can be found here.
After identifying the version and corresponding release tag you need, check it out:
# Example: For UHD 3.9.5: git checkout release_003_009_005
# Example: For UHD 3.14.0.0 git checkout v3.14.0.0
Next, create a build folder within the repository.
cd host mkdir build cd build
Next, invoke CMake.
cmake ..
Note: if the shell PATH
is set such that /bin
comes before /usr/bin
, then this step is likely to fail because cmake will set the FIND_ROOT_PATH
to /
and this setting will fail as a prefix for Boost headers or libraries. The cmake output will include messages such as
-- Boost include directories: /include -- Boost library directories: /lib/x86_64-linux-gnu
and
CMake Error in lib/CMakeLists.txt: Imported target "Boost::chrono" includes non-existent path "/include" in its INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include: * The path was deleted, renamed, or moved to another location. * An install or uninstall procedure did not complete successfully. * The installation package was faulty and references files it does not provide.
One of the following 3 options should fix this situation:
1./usr/bin/cmake ..
2.PATH=/usr/bin:$PATH cmake ..
3.cmake -DCMAKE_FIND_ROOT_PATH=/usr ..
Once the cmake command succeeds without errors, build UHD.
make
Next, you can optionally run some basic tests to verify that the build process completed properly.
make test
Next, install UHD, using the default install prefix, which will install UHD under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.
sudo make install
Next, update the system's shared library cache.
sudo ldconfig
Finally, make sure that the LD_LIBRARY_PATH
environment variable is defined and includes the folder under which UHD was installed. Most commonly, you can add the line below to the end of your $HOME/.bashrc
file:
export LD_LIBRARY_PATH=/usr/local/lib
On Fedora 22/23/24/25 you will need to set the LD_LIBRARY_PATH
to /usr/local/lib64
.
export LD_LIBRARY_PATH=/usr/local/lib64
If the LD_LIBRARY_PATH
environment variable is already defined with other folders in your $HOME/.bashrc
file, then add the line below to the end of your $HOME/.bashrc
file to preserve the current settings.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
For Fedora 21/22/23/24/25
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
For this change to take effect, you will need to close the current terminal window, and open a new terminal.
At this point, UHD should be installed and ready to use. You can quickly test this, with no USRP device attached, by running uhd_find_devices
. You should see something similar to the following.
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.000.HEAD-0-g6e1ac3fc No UHD Devices Found
Downloading the UHD FPGA Images
You can now download the UHD FPGA Images for this installation. This can be done by running the command uhd_images_downloader
.
$ sudo uhd_images_downloader
Note: Since this installation is being installed to a system level directory (e.g. /usr/local
), the uhd_images_downloader
command requires sudo
privileges.
Example ouput for UHD 3.13.3.0:
$ sudo uhd_images_downloader Images destination: /usr/local/share/uhd/images Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.010.003.000-release.zip Downloading images to: /tmp/tmpm46JDg/uhd-images_003.010.003.000-release.zip 57009 kB / 57009 kB (100%) Images successfully installed to: /usr/local/share/uhd/images
Example output for UHD 3.13:
$ sudo uhd_images_downloader [INFO] Images destination: /usr/local/share/uhd/images [INFO] No inventory file found at /usr/local/share/uhd/images/inventory.json. Creating an empty one. 00006 kB / 00006 kB (100%) usrp1_b100_fw_default-g6bea23d.zip 19484 kB / 19484 kB (100%) x3xx_x310_fpga_default-g494ae8bb.zip 02757 kB / 02757 kB (100%) usrp2_n210_fpga_default-g6bea23d.zip 02109 kB / 02109 kB (100%) n230_n230_fpga_default-g494ae8bb.zip 00522 kB / 00522 kB (100%) usrp1_b100_fpga_default-g6bea23d.zip 00474 kB / 00474 kB (100%) b2xx_b200_fpga_default-g494ae8bb.zip 02415 kB / 02415 kB (100%) usrp2_n200_fpga_default-g6bea23d.zip 05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip 15883 kB / 15883 kB (100%) n3xx_n310_fpga_default-g494ae8bb.zip 00506 kB / 00506 kB (100%) b2xx_b205mini_fpga_default-g494ae8bb.zip 18676 kB / 18676 kB (100%) x3xx_x300_fpga_default-g494ae8bb.zip 00017 kB / 00017 kB (100%) octoclock_octoclock_fw_default-g14000041.zip 04839 kB / 04839 kB (100%) usb_common_windrv_default-g14000041.zip 00007 kB / 00007 kB (100%) usrp2_usrp2_fw_default-g6bea23d.zip 00009 kB / 00009 kB (100%) usrp2_n200_fw_default-g6bea23d.zip 00450 kB / 00450 kB (100%) usrp2_usrp2_fpga_default-g6bea23d.zip 00142 kB / 00142 kB (100%) b2xx_common_fw_default-g3ff4186b.zip 00460 kB / 00460 kB (100%) b2xx_b200mini_fpga_default-g494ae8bb.zip 00319 kB / 00319 kB (100%) usrp1_usrp1_fpga_default-g6bea23d.zip 00009 kB / 00009 kB (100%) usrp2_n210_fw_default-g6bea23d.zip 11537 kB / 11537 kB (100%) n3xx_n300_fpga_default-g494ae8bb.zip 05349 kB / 05349 kB (100%) e3xx_e310_fpga_default-g494ae8bb.zip 00866 kB / 00866 kB (100%) b2xx_b210_fpga_default-g494ae8bb.zip [INFO] Images download complete.
Building and installing GNU Radio from source code
As with UHD, GNU Radio is open-source and is hosted on GitHub. You can browse the code online at the link below, which points to version v3.7.13.4
, which is the the latest release at the time of this writing.
Note: GNU Radio is currently transitioning from major branches of 3.7.x.x to 3.8.x.x. It is generally recommend at this time to use either the v3.7.13.4
or maint-3.7
branch of GNU Radio. The master
branch includes many major changes such as converting to use Python 3 and may be unstable.
As with UHD, there are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple GNU Radio versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.
Similar to the process for UHD, to build GNU Radio from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.
First, make a folder to hold the repository.
cd $HOME cd workarea
Next, clone the repository.
git clone --recursive https://github.com/gnuradio/gnuradio
Next, go into the repository and check out the desired GNU Radio version.
cd gnuradio
To checkout the v3.7.13.4
branch:
git checkout v3.7.13.4
Or to checkout the maint-3.7
branch:
git checkout maint-3.7
Next, update the submodules:
git submodule update --init --recursive
Next, create a build folder within the repository, invoke CMake, and build GNU Radio:
mkdir build cd build cmake ../ make
Next, you can optionally run some basic tests to verify that the build process completed properly.
make test
Next, install GNU Radio, using the default install prefix, which will install GNU Radio under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.
sudo make install
Finally, update the system's shared library cache.
sudo ldconfig
At this point, GNU Radio should be installed and ready to use. You can quickly test this, with no USRP device attached, by running the following quick tests.
gnuradio-config-info --version gnuradio-config-info --prefix gnuradio-config-info --enabled-components
There is a simple flowgraph that you can run that does not require any USRP hardware. It's called the dialtone test, and it produces a PSTN dial tone on the computer's speakers. Running it verifies that all the libraries can be found, and that the GNU Radio run-time is working.
python $HOME/workarea/gnuradio/gr-audio/examples/python/dial_tone.py
You can try launching the GNU Radio Companion (GRC) tool, a visual tool for building and running GNU Radio flowgraphs.
gnuradio-companion
If "gnuradio-companion" does not start and complains about the PYTHONPATH
environment variable, then you may have to set this in your $HOME/.bashrc
file, as shown below.
export PYTHONPATH=/usr/local/lib/python2.7/dist-packages
On Fedora 21/22/23/24, the PYTHONPATH
environment variable will need to be set to:
export PYTHONPATH=/usr/lib/python2.7/site-packages:/usr/local/lib64/python2.7/site-packages/
Configuring USB
On Linux, udev handles USB plug and unplug events. The following commands install a udev rule so that non-root users may access the device. This step is only necessary for devices that use USB to connect to the host computer, such as the B200, B210, and B200mini. This setting should take effect immediately and does not require a reboot or logout/login. Be sure that no USRP device is connected via USB when running these commands.
cd $HOME/workarea/uhd/host/utils sudo cp uhd-usrp.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger
Configuring Ethernet
For USRP devices that use Ethernet to connect to the host computer, such as the N200, N210, X300, X310, set a static IP address for your system of 192.168.10.1, with a netmask of 255.255.255.0. The default IP address of the USRP is 192.168.10.2, with a netmask of 255.255.255.0. You should probably set the IP address using the graphical Network Manager. If you set the IP address from the command line with ifconfig
, Network Manager will probably overwrite these settings.
Connect the USRP
The installation of UHD and GNU Radio should now be complete. At this point, connect the USRP to the host computer.
If the interface is Ethernet, then open a terminal window, and try to ping the USRP with "ping 192.168.10.2". The USRP should respond to the ping requests.
If the interface is USB, then open a terminal window, and run "lsusb
". You should see the USRP listed on the USB bus with a VID of 2500
and PID of 0020
, 0021
, 0022
, for B200, B210, B200mini, respectively.
Also try running "uhd_find_devices
" and "uhd_usrp_probe
".
Thread priority scheduling
When UHD spawns a new thread, it may try to boost the thread's scheduling priority. If setting the new priority fails, the UHD software prints a warning to the console, as shown below. This warning is harmless; it simply means that the thread will retain a normal or default scheduling priority.
UHD Warning: Unable to set the thread priority. Performance may be negatively affected. Please see the general application notes in the manual for instructions. EnvironmentError: OSError: error in pthread_setschedparam
To address this issue, non-privileged (non-root) users need to be given special permission to change the scheduling priority. This can be enabled by creating a group usrp
, adding your user to it, and then appending the line @usrp - rtprio 99
to the file /etc/security/limits.conf
.
sudo groupadd usrp sudo usermod -aG usrp $USER
Then add the line below to end of the file /etc/security/limits.conf
:
@usrp - rtprio 99
You must log out and log back into the account for the settings to take effect. In most Linux distributions, a list of groups and group members can be found in the /etc/group
file.
There is further documentation about this in the User Manual at the link below.