Also known as: HackRF, HackRF One
Reader-supported. GopherTrunk is free, open-source software. Some
hardware links on this page go to Amazon with our Associates tag
(gophertrunk-20); if you buy through them we may earn a small
commission at no extra cost to you. It never changes which gear we recommend, and
the software stays free either way. How GopherTrunk is funded →
HackRF One is an open-source, wideband, half-duplex software-defined radio transceiver from Great Scott Gadgets, covering 1 MHz to 6 GHz with up to ~20 MHz bandwidth and the ability to transmit.1
Key takeaways Huge range, transmit-capable, 8-bit. HackRF One covers 1 MHz–6 GHz and can transmit — but its 8-bit ADC gives less dynamic range than an Airspy, and GopherTrunk uses it receive-only. For scanning it’s overkill: a ~$30 RTL-SDR or an Airspy decodes P25/DMR/NXDN better for less. Buy it if you also want 6 GHz reach or transmit for other projects. ~$150. Like every receiver, it can’t decode AES encryption.
Overview
Its huge range and TX capability make it popular for experimentation, but it uses 8-bit sampling (less dynamic range than Airspy) and transmit is irrelevant to receive-only scanning.
Relevance to SDR
For decoding trunked voice, HackRF is overkill; an RTL-SDR or Airspy is usually the better fit, but GopherTrunk can use it as a receiver. Among transmit-capable peers the bladeRF, LimeSDR and PlutoSDR trade the HackRF’s 6 GHz reach for higher-bit ADCs and, in some cases, full-duplex operation.
Setup (Linux)
GopherTrunk talks to the HackRF directly over USB — no libhackrf or
hackrf-tools install required. The one host-side step is a udev rule so
non-root processes can open the device node. Without it, gophertrunk sdr list
still shows the device (it only reads sysfs), but opening it — sdr list
--probe, sdr doctor, and normal capture — fails with permission denied on
/dev/bus/usb/….
sudo tee /etc/udev/rules.d/20-hackrf.rules <<'EOF'
# HackRF One / Jawbreaker / Rad1o (Great Scott Gadgets, VID 0x1d50)
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="6089", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="604b", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="cc15", MODE="0666"
EOF
sudo udevadm control --reload
sudo udevadm trigger
Unplug and re-plug the HackRF once so the rule applies to a freshly-enumerated
device. Swap MODE="0666" for MODE="0660", GROUP="plugdev" if you’d rather
scope access. Then confirm:
gophertrunk sdr list --probe
Setup (Windows)
GopherTrunk drives the HackRF through the in-box WinUSB driver — no
libhackrf/hackrf-tools and no SoapySDR install
required. A HackRF One advertises a Microsoft OS (WCID) descriptor, so Windows
10/11 usually binds WinUSB automatically and it just works: plug it in and run
gophertrunk sdr list --probe
gophertrunk sdr doctor
sdr doctor prints a row per known SDR (RTL-SDR and HackRF) showing which
function driver is bound and whether it’s the expected WinUSB. If the HackRF row
shows STATUS BAD — or sdr list --probe reports WinUsb_Initialize failed —
a different driver is bound. Fix it with Zadig:
- Run Zadig, then Options → List All Devices.
- Select the HackRF One entry (Interface 0).
- Choose WinUSB as the target driver and click Replace Driver.
If --probe fails with an access-denied error, another program (SDR#, GQRX,
SDRangel, the HackRF tools) already holds the device — close it and retry.
Using the HackRF with the daemon
gophertrunk sdr list only enumerates devices; the daemon (and the web UI
Devices panel) opens the SDRs named in your config.yaml. If the panel says
“No SDRs known to the daemon”, add the HackRF under sdr.devices:
sdr:
sample_rate: 8_000_000
devices:
- serial: "0000000000000000457863c8284a625f" # from `gophertrunk sdr list`
role: control # or voice / wideband
gain: auto # or tenths-of-dB, e.g. "320" for 32.0 dB
bias_tee: false
# rf_amp: true # front-end RF amp on the "auto" preset — see below
# narrowband_filter: true # HackRF Pro only — see below
# fpga_dc_block: true # HackRF Pro only — see below
The HackRF has no true AGC, so gain: auto maps to a fixed LNA 16 / VGA 20 dB
split with the front-end RF amplifier off. Set rf_amp: true to turn the
amp on for that preset: it lowers the noise figure by ~14 dB and can recover a
weak-signal site, but because it adds gain ahead of everything it can overload
the front end near a strong transmitter — so it is opt-in and off by default.
(SDRTrunk defaults the amp on but likewise lets you disable it.) A manual
tenths-of-dB gain: value is unaffected by rf_amp; rf_amp is ignored, with
a one-line startup warning, on a device that has no switchable amplifier.
Copy the serial straight from gophertrunk sdr list. The match is
case-insensitive and tolerant of a partial serial — a distinctive tail like
457863c8284a625f, or a value captured from an older build that displayed only
the 0000000000000000 prefix, still binds as long as it’s unambiguous (the
daemon logs when it matches by a partial serial). With multiple HackRFs, use the
full serial so each entry pins exactly one device.
Serial number. A HackRF reports a full 32-hex-digit
part_id + serial_nostring — the leading 16 digits are a constant prefix (commonly all zeros) and the trailing digits are the unique part.gophertrunk sdr listprints the whole string, matchinghackrf_info’s “Serial number”.
HackRF Pro
GopherTrunk identifies the board from the firmware’s board_id readback at
open, so a HackRF Pro (board ID 5, codename Praline) reports HackRF Pro
as its product name in gophertrunk sdr list, the Devices panel, and the
startup log — distinct from the original HackRF One (board ID 2) and the
HackRF One R9 (board ID 4). No configuration is needed for detection.
The Pro adds a switchable narrowband anti-alias filter in its RF front end. Engaging it tightens adjacent-channel rejection, which can lift a marginal decode on a crowded band where a strong neighbour is spilling into a narrowband voice channel (e.g. 12.5 kHz P25). The trade-off is reduced usable bandwidth, so it is off by default; enable it per device:
sdr:
devices:
- serial: "…"
role: voice
narrowband_filter: true # HackRF Pro only
The option is ignored — with a one-line startup warning — on any board that lacks the filter, including the original HackRF One, so it is safe to leave in a shared config.
The Pro can also strip the zero-IF DC-offset spike in its FPGA, before the
samples ever leave the device. This is the same spur GopherTrunk’s P25 voice
path removes in software (a first-order DC-block), but doing it in the gateware
is cheaper and — unlike the software block, which only sits on the voice decode
path — it also cleans the control channel. Measured on hardware, engaging it
drops the raw stream’s DC magnitude from several counts to zero. Enable it per
device with fpga_dc_block: true:
sdr:
devices:
- serial: "…"
role: control
fpga_dc_block: true # HackRF Pro only
Both options are ignored — with a startup warning — on any board without the hardware, so they are safe to leave in a shared config.
Extended precision is blocked in firmware, not here. The Pro advertises a 16-bit extended-precision RX mode (FPGA down-conversion + decimation, ~9–11 ENOB). The host command to select the bitstream exists (
hackrf_set_fpga_bitstream), and the gateware itself is complete, but the coordinated mode is not implemented in the released Pro firmware: as ofmaster(Aug 2026)fpga_init()only programs the standard bitstream’s registers (// TODO support the other bitstreams), theRADIO_CONFIG_EXT_PRECISION_RXpath is dead code, and the MCU’s SGPIO capture stays hardwired to the standard 2-byte sample format with no host request to change it. So loading bitstream 2 from the host produces an incoherent stream — this is a Great Scott Gadgets firmware to-do, not something a host driver can work around. When GSG ships the mode switch, the driver side is well-understood (interleaved int16 LE I/Q, 4 bytes/pair carrying a sign-extended 12-bit value; decimation register = log2 of 16×–128×). Detection, the narrowband filter, and the FPGA DC-block above are the Pro pieces that work today.
Where to buy
The HackRF One is sold by Great Scott Gadgets and resellers; the Amazon listing below is a Nooelec bundle that adds an ANT500 telescopic antenna and SMA adapters — a convenient way to get on the air. If you only want to scan trunked systems, a RTL-SDR or Airspy is the cheaper, better- suited pick — see best SDR for GopherTrunk and Airspy vs RTL-SDR vs HackRF.
As an Amazon Associate, GopherTrunk earns from qualifying purchases — at no extra cost to you. It never changes what we recommend.
Sources
-
HackRF One — Wikipedia, on the HackRF One wideband half-duplex transceiver and its specifications. ↩
Frequently asked questions
Is the HackRF One good for police scanning with GopherTrunk?
It works, but it is overkill. HackRF’s 8-bit ADC gives less dynamic range than an Airspy, and its transmit and 6 GHz reach are wasted on receive-only VHF/UHF scanning. For following P25/DMR/NXDN trunked systems, a $30 RTL-SDR or an Airspy is usually the better buy. Reach for a HackRF when you also want its huge tuning range or transmit for other projects.
Can GopherTrunk transmit with a HackRF?
No. GopherTrunk is a receive-only decoder — it uses the HackRF purely as a receiver. Transmitting also requires appropriate licensing and is outside GopherTrunk’s scope.
Does GopherTrunk need libhackrf or hackrf-tools?
No. GopherTrunk speaks the HackRF’s USB protocol directly with a pure-Go driver. On Linux you add one udev rule; on Windows the in-box WinUSB driver usually binds automatically. No SoapySDR or vendor C libraries required.
HackRF One or Airspy for GopherTrunk?
For scanning, the Airspy — its 12-bit ADC and cleaner front end decode weak and busy channels better than the HackRF’s 8-bit sampling. Choose the HackRF only if you need 1 MHz–6 GHz coverage or transmit for other work.