Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Amateur Radio Linux Machine Provisioning

Amateur Radio Linux Machine Provisioning

IN PROGRESS - Still working out a few bugs and filling in a few details

These are some notes I use for configuring my amateur radio Linux machines. The base operating system is Ubuntu 22.04 LTS. This is not a comprehensive guide, just a quick reference for myself and others to install commonly used amateur radio applications on a Linux machine. Please don't blindly copy and paste these into your terminal without understanding what they do. I will include links in the reference section for more detailed newbie instructions.


The system that these instructions intends to build is a Linux system using the Ubuntu distribution. The goal is to use as much open source software as possible. I think currently all the amateur radio software used in this guide is open source. Additionally, the software chosen provides a good cross-section of capabilities needed for emcomm, as well as for more recreational activities. Here's a list of software and the capabilities they provide:

  • chirp
    • Radio programming
  • gpsd
    • GPS daemon, provides GPS support for a variety of other applications
  • hamlib
    • Library and applications for rig control
  • xastir
    • APRS client
  • YAAC
    • APRS client
    • Offline OpenStreetMap view with search feature
  • gpredict
    • Satellite pass predictor
  • gqrx-sdr
    • SDR receiver
  • rtl-sdr
    • SDR tools and library needed to use RTL based SDRs
  • direwolf
    • AFSK KISS TNC with additional APRS capabilities included
  • pat
    • Winlink client
  • ax25-tools
  • flrig
    • Rig control application compatible with fldigi
  • fldigi
    • Digital mode application. Supports PSK, RTTY, MFSK, and more
  • js8call
    • Weak signal digital mode for messaging
  • wsjtx
    • Weak signal digital mode (FT8, etc)
  • noaa-apt
  • gpxsee
    • TODO Add installation instructions


These are some variables that will be used throughout this guide:

<CALL_SIGN> = My call sign

<SSID> = An SSID is used to differentiate other instances using this call sign. It's known as the substation id

<RIG_MODEL> = Hamlib rig model number

<RIG_SERIAL> = Rig serial port

<RIG_SERIAL_BAUD> = Baud rate for rig's serial port

<RIG_ALSA_DEVICE> = The ALSA device for the rig

<APRS_PASSWORD> = The password for APRS-IS for my call sign

<GPS_SERIAL> = The serial device for my GPS

Install Packages

This will install most applications we need through Ubuntu's package manager:

sudo apt-get install \
    chirp \
    gpsd \
    hamlib4 \
    hamlib-utils \
    xastir \
    gpredict \
    gqrx-sdr \
    rtl-sdr \
    direwolf \
    pat \
    ax25-tools \
    flrig \
    fldigi \
    js8call \
    wsjtx \
    openjdk-11-jre \
    openjdk-17-jre \

To install ARDOP we'll need to do the following:

sudo wget -O /usr/local/bin/ardopc64 ""
sudo chmod +x /usr/local/bin/ardopc64

To install noaa-app:

sudo dpkg -i noaa-apt_1.3.1-1_amd64.deb

Configure gpsd

sudo nano /etc/default/gpsd and set:




We use this config to pin to our GPS serial device explicitly and prevent gpsd from latching onto out rig's serial device.

sudo systemctl enable gpsd to enable gpsd on boot.

sudo systemctl start gpsd to start gpsd on the spot.

Configure ntpd

sudo timedatectl set-ntp no to turn off timesyncd.

sudo nano /etc/ntp.conf to edit config and add:

# GPS Serial data reference
server minpoll 4 maxpoll 4
fudge time1 0.0 refid GPS

# GPS PPS reference
server minpoll 4 maxpoll 4 prefer
fudge refid PPS

After restarting ntpd use ntpq -p and gpsmon for testing.

Rig Serial Port Permissions

We need to configure udev rules to allow our user to read/write to the rig's USB serial port. In this example I'm creating one for my IC-705. The idVendor and idProduct can be found using sudo lsusb -v.

sudo nano /etc/udev/rules.d/50-radios.rules to create/open a file for radio udev rules. I place the following in that file for my IC-705:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0c26", ATTRS{idProduct}=="0036", GROUP="users", MODE="0666"

sudo usermod -a -G dialout $USER to add the current user to the dialout group so it can get permissions for the rig's USB serial port.

sudo udevadm control --reload to reload the udev rules.

Find Rig's ALSA SoundCard Device

arecord --list-pcms

USB Audio CODEC, USB Audio
Hardware device with all software conversions

My IC-705's <RIG_ALSA_DEVICE> would be plughw:CARD=CODEC. This value would also work for my IC-7100 and IC-7300.

Find Rig's Serial Device

Afterwards find the serial device for CAT control ls /dev/serial/by-id/. My output looks like:


After looking at this list, I've identified the second to last as being my IC-7100's CAT control. Therefore the serial device is /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7100_02012442_A-if00-port0

This will be used where we see <RIG_SERIAL>

Find hamlib Rig Model Number

rigctld -l to find hamlib rig model numbers

This number will be used where we see <RIG_MODEL>

Configure Direwolf

sudo nano ~/direwolf.conf

MODEM 1200
GPSD localhost

Configure Direwolf ARPS

These are optional and used as needed


This will digipeat but also emit the station's position as a fill-in digipeater. This is what I would add to the existing config:

DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$ ^WIDE[12]-[12]$


This will listen for ARPS traffic and send it over to the internet APRS servers. This should be added to the existing config:


Run Direwolf

direwolf -c ~/direwolf.conf


sudo nano /etc/ax25/axports to open the config file for AX.25 ports. I put the following on one line in that file:

wl2k <CALL_SIGN> 0 255 7 Winlink

sudo kissattach $(readlink -f /tmp/kisstnc) wl2k whenever I connect my rig and start direwolf. This will bind the direwolf KISS TNC to Linux AX.25 stack.

sudo kissparms -p wl2k -t 300 -l 10 -s 12 -r 80 -f n to set the correct parameters.

sudo killall kissattach after finished using the AX.25 port.

Virtual Device for ARDOP

echo 'pcm.ARDOP {type rate slave {pcm "<RIG_ALSA_DEVICE>" rate 48000}}' > ~/.asoundrc will create a new ALSA device, tied to my rig's ALSA device, that will have the correct sample rate for use with ARDOP.


ardopc 8515 <RIG_ALSA_DEVICE> <RIG_ALSA_DEVICE> -l /tmp if the rig ALSA device can support the needed sample rate. Otherwise use ardopc 8515 -l /tmp which will use the virtual device we setup earlier.

Note: Make sure that when using ARDOP that the radio filter is set to the selected gateway's bandwidth. For example, if using a gateway with 500 then set the filter at 600 Hz.

Rig Control for Pat Winlink

rigctld -m <RIG_MODEL> -r <RIG_SERIAL> -s <RIG_SERIAL_BAUD> will open rigctld for Pat Winlink to use to control my rig.

Configure Pat Winlink

pat configure to do a one time configuration.

For rigs we'll just make one called my_rig, it'll point to our rigctld process.

"hamlib_rigs": {
    "my_rig": {"address": "localhost:4532", "network": "tcp"}

Default ARDOP settings:

"ardop": {
    "rig": "my_rig",
    "ptt_ctrl": true,
    "addr": "localhost:8515",
    "arq_bandwidth": {
    "beacon_interval": 0,
    "cwid_enabled": false

Default AX.25 settings:

"ax25": {
    "port": "wl2k",
    "beacon": {
        "every": 0,
        "message": "Winlink P2P",
        "destination": "IDENT"


"gpsd": {
    "enable_http": true,
    "allow_forms": true,
    "use_server_time": true,
    "addr": "localhost:2947"

Run Pat

pat --listen="ardop,ax25" http to start the UI for Pat Winlink, listening for ARDOP and AX25.

Running YAAC

sudo update-alternatives --config java to select Java 11 if the machine as more than one version of Java on it.

java -jar YAAC.jar

Sending SMS via APRS

Register number with SMSGTE: #mynumber {add, delete, show} <number>.

Registration example:

#mynumber add 6135551234

Send SMS example:

@6135551234 No cell coverage here, ping me on radio 

Send APRS message example (from phone):

To: 2015551234
@VE3OTB-10 Did you forget your cellphone? 

Sending Email via APRS

Send email example:

To: EMAIL-2 Test Email


Rig Serial Parameters for My Radios

These are the settings I'd need for setting up applications like JS8Call, WSJT-X, and Flrig.


Rig as IC-7300
19200 baud
8 data bits
1 stop bit
No handshake
Force DTR and RTS to low
Set CI-V Address on Radio: 94h

Set modes to -D (e.g. USB-D, FM-D) so the radio uses the USB device instead of microphone.


Rig as IC-7100
19200 baud
8 data bits
1 stop bit
No handshake
Force DTR and RTS to low
Data Mod USB

Set modes to -D (e.g. USB-D, FM-D) so the radio uses the USB device instead of microphone.


19200 baud
8 data bits
2 stop bit
No handshake
Force DTR and RTS to low
CI-V Address: 94h

Set modes to -D (e.g. USB-D, FM-D) so the radio uses the USB device instead of microphone.

My Variables


<RIG_SERIAL> = /dev/serial/by-id/usb-Icom_Inc._IC-705_IC-705_12004306-if00
<RIG_BAUD> = 19200

Udev rules:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0c26", ATTRS{idProduct}=="0036", GROUP="users", MODE="0666"


<RIG_SERIAL> = /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7100_02012442_A-if00-port0
<RIG_BAUD> = 19200

Udev rules:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c3", ATTRS{idProduct}=="ea60", GROUP="users", MODE="0666"

Notes: alsamixer to 50%.


<RIG_SERIAL> = /dev/serial/by-id/usb-Silicon_Labs_CP2102N_USB_to_UART_Bridge_Controller_226d25d349a4ec11bff2e789a29c855c-if00-port0
<RIG_ALSA_DEVICE> = plughw:CARD=Device,DEV=0

Udev rules:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="013c", GROUP="users", MODE="0666"

Notes: Set speakers and microphone with alsamixer to 100% and disable auto gain using the m key.

U-blox7 GPS

<GPS_SERIAL> = /dev/serial/by-id/usb-u-blox_AG_-_www.u-blox.com_u-blox_7_-_GPS_GNSS_Receiver-if00


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment