Cross Compile and Install a GNURadio OOT Module

One of the first things you should want to do with your new embedded device is install a GNURadio OOT module on it and see it work. Recently I worked through process with gr-air-modes and the Ettus Research E312. The end result is running modes_rx on the E300 and watching planes go by on the console. Next step is figure out a remote display for the data!

Before diving in to building gr-air-modes for the embedded device, I first built it for the PC and tested with an Ettus B200 mini, antenna and filter from FlightAware. Get some cables from Wifi Expert and you'll be ready to go. This lets you validate and debug any code or RF issues before trying the flow graph on a less powerfull processor.

Once you have confirmed the OOT module and the hardware are good, you can cross compile and install the OOT module on the E300. There are several web pages that cover pieces of the proceess, here we will point out the pages and highlight the interesting bits.

I used the files from a recent test release of the E300 filesystem. You'll need the sdimage-gnuradio-dev.direct.xz image the matche sthe speed grade of your unit (most likely sg3) and the oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh file containing the sdk. Write the image file to a card using bmaptool and install the sdk. I install my sdks in my home directory to avoid using sudo and install multiple versions in different directories to make it easy to test different file systems.

Once the unit boots, you'll need to get it connected to a network and mount the SD card to the development PC using sshfs.

At this point, you are ready to check, build and install gr-air-modes!

The general process for building and installing an OOT module is documented in the GNURadio Wiki. Here, I will go through the process focused on gr-air-modes. Be sure to source the environment file for the sdk before starting!

Let's start by cloning the source and preparing the source tree for building:

$ git clone https://github.com/bistromath/gr-air-modes.git
$ mkdir build-arm
$ cd build-arm

Now, configure and build the module:

$ cmake -Wno-dev -DCMAKE_TOOLCHAIN_FILE=../../gnuradio/cmake/Toolchains/oe-sdk_cross.cmake \
      -DENABLE_DOXYGEN=OFF ../
$ make

Note the path to the toolchain file, this assumes you checked out the gnuradio source in the same directory you have the current sourece checkout. You could just download the file from git, or copy it out of the gnuradio source and save it somewhere clever, just make sure the path tells cmake how to find it.

When you are finished compiling the module, install it onto the E300. We assume you mounted the the E300 root file system in your home directory in ~/mydevice. Also, you need to use the allow_root flag with sshfs:

$ sudo make install DESTDIR=~/mydevice

Now review the info about setting up the ld.so.conf file and PYTHONPATH variable in the building and installing an OOT module page.

Now move the antenna and fitler from the test system to the E300 and run:

$ modes_rx

This should return something that looks like this (after UHD initializes):

(-53 2.90735269) Type 0 (short A-A surveillance) from a50096 at 32975ft (Vertical TCAS resolution only)
(-53 2.91161469) Type 0 (short A-A surveillance) from c07f08 at 39000ft (Vertical TCAS resolution only)
(-52 2.91369594) Type 0 (short A-A surveillance) from c07f08 at 39000ft (Vertical TCAS resolution only)
(-52 2.97632219) Type 11 (all call reply) from a50096 in reply to interrogator 0 with capability level 2
(-53 3.01756419) Type 11 (all call reply) from a50096 in reply to interrogator 0 with capability level 2

The Airframes.org website provides a form you can use to lookup the hex ICAO24 address into the aiplane information. For example, C07F08 is a Boeing 737 operated by Westjet.