
The Swiss Army Knife for Ham Radio & Coding on iPad
My heart beats digital. For over 35 years, I’ve been an entrepreneur, but my passion for technology goes much deeper. Whether as a licensed radio amateur (73 de DL1GKK!) or while coding.
My focus in everything I do is on efficiency and minimalism. That is exactly why I choose not to use an additional Mac; iPhone and iPad are completely sufficient for my daily workflow. A Windows PC is simply not an alternative for me for many reasons. If I were to start all over again today, probably I would likely go all-in on Linux from the very beginning. But i like the great hardware from Apple. However, anyone who has tried to run specialized Ham Radio software or native Linux development on iOS or iPadOS inevitably hits a wall.
Apple heavily restricts the USB-C interface of these devices, and the available apps are often just a shadow of what is possible under Linux. Whether it’s digital modes like VARA (via Wine), WSJT-X, or complex compilers – everything runs on the Raspberry Pi. Until now, getting there was a rocky road: configuring the Pi as a hotspot, using a smartphone as a bridge… more often than not, it failed due to unstable Wi-Fi connections in the field. Headless troubleshooting without a monitor? A nightmare for any portable radio operation.
The Solution: The iPad as the Terminal, the Pi 5 as the Powerhouse
I have found the perfect solution to tear down that wall: the Raspberry Pi 5 in USB Gadget Mode. A single, high-quality USB-C data cable connects the iPad directly to the Pi. The result? The iPad provides the power, and the Pi provides a stable Ethernet signal over the cable and do all the great ham radio stuff.
It is the ultimate all-rounder:
- On the go: True “Plug & Play” on the iPad. Full access via VNC or SSH – without unstable Wi-Fi.
- At home: Simply plug it into a power supply and use it as a standalone server via LAN or Wi-Fi.
- Universal: Works on any modern computer with a high-performance USB-C port that can deliver enough power.
A crucial tip from the radio shack: Not every USB-C cable is a data cable! Make sure to use high-quality cables capable of both high-speed data transfer and power delivery. Below, I will show you step-by-step how to “arm” your Pi 5 for this setup.
- Operating System Choice: This guide covers both 32-bit and 64-bit setups. However, for Ham Radio use (especially if you plan to run VARA HF, Winlink, or Wine), I strongly recommend using the 32-bit version of Raspberry Pi OS. It is significantly more stable for these specific radio applications.
- Prerequisite: Ensure that SSH and/or VNC are enabled in your Raspberry Pi settings (via
sudo raspi-config). Important for Pi 5: You must switch the Display Backend from Wayland to X11 (Advanced Options inraspi-config), otherwise the RealVNC server will not function. - Login Note: Since modern OS versions no longer have a default “pi” user, remember to use the username and password you created during the initial setup with the Raspberry Pi Imager.
For a deep dive into setting up your Pi for radio use, check out my Raspberry Pi Ham Radio Best Practice 2026 guide.
Maintenance Philosophy: “Never Change a Running System”
In a complex environment like this—with Wine, Vara HF, and custom Gadget scripts—a single automatic update can break your entire workflow. Operating a “Pi-Go” is like operating a specialized piece of machinery: stability is more important than having the latest version of every minor background tool.
My advice: Turn off the automatic update notifications in your taskbar. Only perform manual updates (sudo apt update && sudo apt upgrade) when you have the time to troubleshoot potential issues.
Rule of thumb: No updates shortly before a field day or a DX-pedition!
Critical Maintenance & Safety Note
A Raspberry Pi is not a simple USB thumb drive. When using it as a USB-C Gadget, you must perform a proper shutdown (e.g., via SSH using sudo halt) before disconnecting the cable.
Unplugging it while it’s running carries a high risk of corrupting the SD card’s file system, which will prevent it from booting next time.
Pro-Tip: Use the SD Card Copier tool on your Pi regularly to create a full backup on a second SD card. Field operations can be tough on gear—whether it’s technical failure, loss, or theft, having a ready-to-go backup card at home ensures you’re back on the air in minutes!
The Bookworm 32bit OS Setup (for ham radio)
Note: Operating on a 32-bit OS (essential for Wine/Vara stability) with the specific Pi 5 kernel requires a few special tweaks. Here is my field-tested, step-by-step guide so you can skip the troubleshooting and get straight to work.
Step 1: Prepare the Hardware Driver
We need to tell the Pi 5 that its USB-C port should act as a network interface rather than just a power input.
sudo nano /boot/firmware/config.txt
- Find the line
otg_mode=1and comment it out with a#:# otg_mode=1 - Find
dtoverlay=dwc2,dr_mode=hostand comment it out as well:# dtoverlay=dwc2,dr_mode=host - Ensure
kernel=kernel8.img(required for Wine/Vara) remains active. - Add the following lines at the very end of the file under the
[all]section:
[all] dtoverlay=dwc2,dr_mode=peripheral
Step 2: Load Kernel Modules at Boot
Next, we enable the network emulation within the operating system.
sudo nano /boot/firmware/cmdline.txt
Go to the end of the first line, add a space, and append the following (must stay on one single line!):
modules-load=dwc2,g_ether
Step 3: Create the Gadget Script
This script defines the Pi’s identity (e.g., my callsign DL1GKK) so the iPad recognizes it correctly.
sudo nano /usr/local/bin/usb-gadget.sh
Paste the following code block entirely:
#!/bin/bash modprobe libcomposite 2>/dev/null modprobe dwc2 2>/dev/null mount -t configfs none /sys/kernel/config/ 2>/dev/null cd /sys/kernel/config/usb_gadget/ mkdir -p g1 && cd g1 echo 0x1d6b > idVendor echo 0x0104 > idProduct echo 0x0100 > bcdDevice echo 0x0200 > bcdUSB mkdir -p strings/0x409 echo "fedcba9876543210" > strings/0x409/serialnumber echo "DL1GKK" > strings/0x409/manufacturer echo "Pi5 Gadget" > strings/0x409/product mkdir -p configs/c.1/strings/0x409 echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration echo 250 > configs/c.1/bmAttributes echo 500 > configs/c.1/MaxPower mkdir -p functions/ecm.usb0 echo "00:22:82:ff:ff:01" > functions/ecm.usb0/host_addr echo "00:22:82:ff:ff:02" > functions/ecm.usb0/dev_addr ln -s functions/ecm.usb0 configs/c.1/ UDC_NAME=$(ls /sys/class/udc | head -n 1) echo "$UDC_NAME" > UDC
Make the script executable:
sudo chmod +x /usr/local/bin/usb-gadget.sh
Step 4: Automation & Hardware Switch (CRITICAL!)
To ensure the script runs on every boot, we use rc.local.
sudo nano /etc/rc.local
Insert the following (including the Shebang if the file is empty):
#!/bin/bash /usr/local/bin/usb-gadget.sh & exit 0
Make rc.local executable:
sudo chmod +x /etc/rc.local
IMPORTANT: A simple reboot is not enough at this stage!
Shut down the Pi completely (sudo halt). Disconnect the power supply.
Now, connect the Pi directly to your iPad using a high-quality USB-C data cable.
The Pi will now boot using the iPad’s power.
Step 5: First-Time Network Initialization
Once the Pi has booted up via the iPad (you should see “Ethernet” appear in your iPad settings), run these commands once on the Pi to wake up the connection:
sudo ip link set usb0 up sudo nmcli device set usb0 managed yes sudo nmcli con add type ethernet con-name usb-ipad ifname usb0 ip4 10.42.0.1/24 ipv4.route-metric 1000 sudo nmcli con mod usb-ipad connection.zone trusted sudo nmcli con up usb-ipad
Step 6: iPad Settings
On your iPad, navigate to Settings > Ethernet and tap the connection:
- Configure IPv4: Manual
- IP Address: 10.42.0.10
- Subnet Mask: 255.255.255.0
- Router: Leave it blank
Note: The reason we don’t enter anything under “Router” is that we want to continue using the iPad’s Wi-Fi or 5G connection to access the internet. Once the PI5 is connected to the internet (via Wi-Fi, Ethernet, or a smartphone hotspot), you can enter 10.42.0.1.
The Bookworm 64bit OS Setup (Not recommended for ham radio)
Phase 1: The USB-C Gadget (The Data Link)
Now we “weld” the virtual network card so the USB-C cable handles both power and data.
1.1 Enable Kernel Modules
echo "dtoverlay=dwc2" | sudo tee -a /boot/firmware/config.txt
sudo nano /boot/firmware/cmdline.txt
Go to the end of the line (don’t delete anything!). After a space, add exactly this: modules-load=dwc2,g_ether
1.2 Create the Network Profile
sudo nmcli con add type ethernet con-name usb-gadget ifname usb0 save yes autoconnect yes 802-3-ethernet.cloned-mac-address 12:34:56:78:9a:bc ipv4.method shared ipv4.addresses 10.42.0.1/24
1.3 Permanent Assignment (systemd)
To ensure the IP 10.42.0.1 is ready every time you plug in:
sudo nano /etc/systemd/network/10-usb0.network
Paste this content:
[Match]
Name=usb0
[Network]
Address=10.42.0.1/24
1.4 Hardware Rule (udev)
sudo nano /etc/udev/rules.d/99-usb-gadget.rules
Paste this content:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="usb0", RUN+="/usr/sbin/ip link set usb0 up"
Activate the service: sudo systemctl enable systemd-networkd
Phase 2: The Shutdown Ritual & iPad Connect
2.1 The Professional Shutdown
- Type in terminal:
sudo shutdown -h now. - Patience: Wait for the monitor signal to cut off.
- LED Check: Watch the red LED on the Pi. Wait for 1 to 2 minutes until the green flashing (SD card activity) stops completely. Once only the red LED stays solid, unplug the power and monitor.
2.2 Connecting to the iPad
- Connect the Pi 5 to the iPad via a USB-C cable. It will boot using the iPad’s power.
- On your iPad, go to Settings -> Ethernet (appears after ~30s).
- Tap the connection and select Configure IP -> Manual:
- IP Address:
10.42.0.10 - Subnet Mask:
255.255.255.0 - Router:
leave blank
- IP Address:
- Open your VNC app (RealVNC or Jump Desktop) and connect to
10.42.0.1. It works also great with SSH.
Disclaimer: This setup was developed in collaboration with Gemini AI.
While we’ve worked hard to make this guide as “bulletproof” as possible, tech is always evolving—errors may occur, or specific functions might need a bit of extra tweaking.
The solution? Don’t hesitate to ask Gemini yourself if you get stuck. Good luck with your build!


