Getting started with HackRF Jawbreaker

| tagged with
  • hackrf
  • software-defined radio
  • gnuradio
  • ubuntu

This was done on Ubuntu 13.04. We’ll assume that $ROOT is set to the directory within which you will be working. For this you’ll need (at very least) the build-essential and cmake packages.

Compiling libhackrf and hackrf-tools

$ cd $ROOT
$ git clone git://
$ cd hackrf/host
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

By default cmake will install things in /usr/local. We’ll need this in PATH and LD_LIBRARY_PATH,

$ PATH=$PATH:/usr/local/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

Compiling new firmware

To compile the firmware we’ll need mossmann’s libopencm3 branch as well as the gcc-arm-embedded toolchain available.

We’ll be compiling two separate firmware images. The image compiled by Makefile is compiled assuming the device will be booting the firmware directly from RAM while that built by Makefile_rom_to_ram will be built under the assumption that it was loaded from ROM.

$ cd $ROOT/hackrf
$ git clone git://
$ cd libopencm3
$ make
$ cd $ROOT/hackrf/firmware/hackrf_usb
$ make LIBOPENCM3=$ROOT/hackrf/libopencm3
$ make LIBOPENCM3=$ROOT/hackrf/libopencm3 -f Makefile_rom_to_ram

Updating firmware

$ lsusb
Bus 002 Device 008: ID 1d50:604b OpenMoko, Inc. 
$ sudo chmod ugo+rw /dev/bus/usb/002/008
$ hackrf-spiflash -w $ROOT/hackrf/firmware/hackrf-usb/hackrf_usb_rom_to_ram.bin

Fetching and installing gnuradio

As it turns out, Python 3 tends to confuse gnuradio’s cmake configuration. For this reason, we force cmake to build against Python 2.7,

$ cd $ROOT
$ git clone git://
$ cd gnuradio
$ mkdir build
$ cd build
$ cmake -DPYTHON_EXECUTABLE=/usr/bin/python2.7 -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/ ../ -DENABLE_GR_WAVELET=ON -DEANBLE_GR_

You should check over the output of cmake at this point and find any missing dependencies (look for gr-* modules which are listed as disabled). I happened to lack the cheetah, sdl, and fftw packages,

$ sudo apt-get install python-cheetah libfftw3-dev libsdl1.2-dev

After installing dependencies you should re-run cmake.

The build itself will take awhile,

$ make
$ sudo make install

Fetching and installing gr-osmosdr

The gr-osmosdr block provides an interface between the Jawbreaker hardware and GnuRadio,

$ cd $ROOT
$ git clone git://
$ cd gr-osmosdr
$ mkdir build
$ cmake -DPYTHON_EXECUTABLE=/usr/bin/python2.7 -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/ ../
$ make
$ sudo make install

Starting GnuRadio Companion

After starting GnuRadio Companion,

$ export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages
$ gnuradio-companion

You should see an osmocom source and sink. This can be used to pull or push samples from the Jawbreaker.

To test, connect an osmocom source (Sources group) to a WX GUI FFT Sink (Instrumentation/WX group), press the “Generate flow graph” button and then “Execute flow graph”. You should see a window like,

Spectrum from HackRF

Press your thumb against the antenna to confirm a change in the spectrum.

Tuning to FM bands

See this graph for an example signal chain decoding a standard FM radio station (88.5 MHz, by default).