BR2_EXTERNAL framework for Analog Device's PlutoSDR Zynq
This repository provides buildroot based support for ADALM-pluto board (based on Analog Device's plutosdr-fw).
At the moment, this repository provides support for rootfs, linux and bootloader.
It uses the BR2_EXTERNAL mechanism to add this support to buildroot.
This support has been tested with the latest stable release of buildroot (2018.11.1) and git master branch.
Download the tested buildroot tarball:
wget https://buildroot.org/downloads/buildroot-2024.08.tar.gz
If you wish to rename the directory, do so before running make zynq_pluto_defconfig
(below) since some links in the tree structure created by the configuration will break if renaming the directory name afterward.
Adding support for the PlutoSDR requires sourcing the sourceme.ggm file to add the BR2_EXTERNAL
variable definition (alternatively, one might want to add export
BR2_EXTERNAL=/somewhere/PlutoSDR
to the .bashrc initialization file).
In the buildroot directory
make zynq_pluto_defconfig
will configure buildroot for minimal PlutoSDR support. More ambitious, after git cloning the latest release of buildroot,
make zynq_pluto_gnuradio_defconfig
will configure buildroot for PlutoSDR support in addition to GNURadio. The default configuration is
to not support Python, yielding a 13.4 MB image. Activating Python requires going to Target Packages --> Interpreter
languages --> python
and then Miscellaneous --> gnuradio --> python support
. We also
activate gr-zeromq support to stream I/Q coefficients from the PlutoSDR to the PC. Do not attempt adding Python
support after compiling an image without Python support: the gnuradio packages would not be compiled properly.
Start from scratch from a clean output directory (rm -rf output
). For the resulting image to be
smaller than 32 MB, we remove wpa_supplicant
and associated 802.11 packages as well as avahi
.
Overall, make menuconfig
allows for configuring
additional settings of the buildroot environment, especially Target Packages, make
builds
the images to be found at the end of the compilation in output/images
.
The output/images/pluto.frm
file is then copied to the mass storage mounted from the PlutoSDR (in
most cases /dev/sdb1
)
and then written after ejecting the associated mass storage root (in this example sudo eject /dev/sdb
) as
explained at Analog Device's PlutoSDR firmware information
In case of failure, DFU programming provides a backup solution. MAKE SURE TO POWER THE DIO PIN OF THE FTDI INTERFACE WITH 1.8V and NOT the default 3.3 or 5V (that will definitely destroy the Zynq)
Doing so does not necessarily require the FTDI USB to R232 converter, although this peripheral will provide a prompt to check what
is happening on the PlutoSDR. Switching to DFU mode is achieved by mounting the first mass storage partition (let's say /dev/sdb1),
modifying config.txt
to set dfu = 1
, and saving the change + rebooting the board with sudo eject
/dev/sdb
. Once the board is in DFU mode, the DFU image is flashed with dfu-util -D /tmp/pluto.dfu -a firmware.dfu
.
Listening to an FM station demodulated by the WBFM block running on the Zynq PS requires activating the second CPU core, extending the AD9363 carrier frequency band to those of the AD9364, and compiling fftw with speed optimization. With such considerations, the following processing block runs on the PS of the Zynq to fetch samples from the AD9363 (local IIO connection), filter and demodulate the signal, and push to a 0MQ stream the sound signal at 24 or 48 kS/s. On the 0MQ receiver side, the following processing block is run on the PC to fetch data through a 0MQ socket and play sound on the PC speaker.
Here is a movie demonstrating the acquisition of a FM station in the commercial broadcast band, processing using the WBFM block running on the Zynq, streaming the data to the PC (at 24 kS/s rather than the >200 kS/s needed to demodulate FM) and using the PC as a sound card.
Activating hard-floating point processing is mandatory to achieve continuous FM demodulated sound stream: indeed, lacking the ~40% processing gain would result in discontinuous sound output due to insufficient computational power to run the WBFM block on the minimum 200-kS/s input stream.
Customizing the PL bitstream meets some requirement for full control of the PlutoSDR features: in this example, an ALSA-compatible audio output is added to make the PlutoSDR a fully autonomous FM-broadcast radio receiver. Adding such functionalities requires generating a new bitstream including the additional block, generating a new DFU image to send to the PlutoSDR, and telling GNU/Linux about the new reconfigurable hardware (devicetree entry). The documentation aims at describing all these steps.
The BR2_EXTERNAL includes in the for_next branch packages that are not (yet) officially integrated in Buildroot,
including UHD (USRP Hardware Device from Ettus Research). Because this package is not officially integrated in Buildroot,
support for UHD in GNU Radio (which is officially supported in Buildroot) requires tuning the gnuradio package
configuration. In package/gnuradio/gnuradio.mk
of the official Buildroot release, add -DENABLE_GR_UHD=ON
to the GNURADIO_CONF_OPTS
variable. If GNU Radio was already compiled before setting this option, then
make gnuradio-reconfigure
. This option is mandatory for activating UHD support in gnss-sdr as well for live decoding
GNSS messages received by an USRP (e.g. B210).