Push-to-Talk
Control radio keying and channel access
Push-to-talk (PTT) configuration tells graywolf how to key your radio
for transmission. Each radio channel has
its own PTT configuration. If a channel has no output device or PTT
method set to none, it operates in receive-only mode.
Detect Devices
Click Detect Devices at the top of the page and
graywolf scans your hardware: USB audio adapters with CM108 PTT,
/dev/gpiochip* nodes on Linux, USB-serial ports, and so
on. Two lists come back:
- Recommended for PTT — the best match for
your hardware (e.g. an AIOC or Digirig adapter showing as
cm108 on
/dev/hidraw1). Click it to pre-fill the form. - Other Detected Devices — everything else worth showing, with type and path. Pick one only if you know it’s right for your adapter. Some entries carry hints — for example, an AIOC’s serial port is annotated Use /dev/hidraw1 for PTT on this adapter; this serial port is for data — so you don’t accidentally pick the wrong one.
Detection is the fastest way to set up PTT correctly. Use Add PTT manually if your hardware doesn’t enumerate the way you expected.
PTT Methods
| Method | Description | Typical Hardware |
|---|---|---|
none |
No PTT control (receive only) | — |
serial_rts |
Assert RTS pin on a serial port | USB-to-serial adapter, Digirig |
serial_dtr |
Assert DTR pin on a serial port | USB-to-serial adapter |
gpio |
Linux GPIO pin via gpiochip character device | Raspberry Pi GPIO header |
cm108 |
USB HID GPIO on CM108/CM119 audio codec | USB sound cards with built-in PTT |
rigctld |
Hamlib rigctld over TCP (CAT control) | Any rig supported by hamlib |
PTT Settings
| Field | Default | Description |
|---|---|---|
method |
none |
PTT control method (see table above) |
device |
— | Serial device path (e.g., /dev/ttyUSB0), CM108 hidraw node, or gpiochip device (e.g., /dev/gpiochip0) |
gpio_line |
0 |
GPIO line offset on the selected gpiochip for the gpio method. 0-indexed, matches the kernel’s line numbering shown by gpioinfo. |
gpio_pin |
3 |
CM108 HID GPIO pin number for the cm108 method. 1-indexed (1–4 on CM108/CM108B, 1–8 on CM119). Not used by the gpio method. |
invert |
false |
Reverse PTT polarity (for backwards-wired rigs) |
Serial PTT
Serial RTS or DTR is the most common PTT method. The modem asserts the chosen pin when transmitting and de-asserts it when done. Most USB sound card interfaces (Digirig, SignaLink USB) use this approach.
# Find your serial device
ls /dev/ttyUSB* /dev/ttyACM*
The graywolf user must have permission to access the serial device.
Adding the user to the dialout group (Linux) handles
this. The systemd service file includes this group by default.
GPIO PTT (Raspberry Pi)
GPIO PTT is Linux-only. It targets single-board
computers with exposed GPIO headers — Raspberry Pi, BeagleBone,
and similar — where you can wire a GPIO line directly to your
radio’s PTT input. On non-Linux hosts the gpio
method is hidden from the method dropdown and the backend returns
gpio ptt is only supported on Linux if forced via API.
Graywolf uses the chardev v2 API (/dev/gpiochipN). The
legacy sysfs interface (/sys/class/gpio) is deprecated
and not supported.
In the PTT dialog, select gpio, then pick the gpiochip
device from the auto-detected list (typically /dev/gpiochip0
on a Pi). The UI then calls
/api/ptt/gpio-lines and populates a line selector with
the lines reported by the chip. Each entry shows the offset and the
kernel’s line name (for example, Line 14 — TXD1).
Lines already claimed by another kernel driver — SPI, I2C,
UART, and so on — are annotated [in use: <consumer>]
in the label and are rejected by the form before submit with a message
like Line 2 is claimed by i2c-bcm2835. Pick another line.
When GPIO PTT is active, the consumer label graywolf-ptt
shows up in gpioinfo output so you can confirm which
process is holding the line. Graywolf drives the line low before
releasing it, so the PTT input is left inactive when graywolf stops
or the channel is reconfigured.
If you run graywolf on a Linux host where no gpiochip devices are
available — for example, inside a container without a bind mount
for /dev/gpiochip*, or as a user without read/write
access — the GPIO method stays visible in the dropdown but the
line selector reports No GPIO chips detected. Check that you
have access to /dev/gpiochip* (typically the ‘gpio’ group
on Raspberry Pi OS).
Linux permissions: the graywolf user must have
read/write access to /dev/gpiochipN — typically
the gpio group on Raspberry Pi OS, or
plugdev on other distros. If a line open fails with
permission denied, add the user to the appropriate
group and re-login (or reboot):
sudo usermod -aG gpio $USER
GPIO pins output 3.3V. If your radio requires a different voltage or current, use a transistor or optocoupler circuit to interface the GPIO pin with your radio’s PTT line.
CM108 PTT (USB HID GPIO)
CM108-family USB audio codecs (C-Media CM108, CM108AH, CM108B, CM109, CM119) expose a HID interface alongside audio that can toggle GPIO pins for PTT. This is the method used by Digirig, AIOC, and many homebrew adapters that combine a USB sound card with PTT on a single device.
Select the cm108 method and choose the detected hidraw
device. The GPIO pin selector is annotated for you: pin 3 (the
default) is the most common, pin 2 is unavailable on CM108AH/B, and
pins 5–8 only exist on CM109/CM119.
| Device | VID:PID | Notes |
|---|---|---|
| CM108 / CM108AH / CM108B | 0d8c:* | Generic C-Media, Digirig |
| CM109 / CM119 / CM119A | 0d8c:* | Extended GPIO (1–8) |
| AIOC (All-In-One-Cable) | 1209:7388 | STM32-based CM108 emulation |
Linux permissions: The /dev/hidraw*
devices are typically root-only. Graywolf ships a udev rule
(99-graywolf-cm108.rules) that grants access to the
plugdev group for CM108-compatible devices. The systemd
service includes this group by default. If you installed manually,
add your user to the plugdev group and reload udev
rules:
sudo usermod -aG plugdev $USER
sudo udevadm control --reload-rules
sudo udevadm trigger
USB audio latency: USB sound cards add audio latency (typically 5–20 ms). If the beginning of your transmissions is clipped, increase TX Delay to compensate.
macOS: CM108 HID GPIO PTT is supported on macOS via the IOKit HID interface. Device enumeration and GPIO control work the same as on Linux and Windows. Unlike Linux, there is no automatic audio–HID correlation — select the correct device from the list manually.
CSMA Channel Access
CSMA (Carrier Sense Multiple Access) prevents graywolf from transmitting while another station is on the air. The TX governor checks the DCD (Data Carrier Detect) state before keying.
| Field | Default | Description |
|---|---|---|
slot_time_ms |
10 |
Time slot duration for p-persistence algorithm |
persist |
63 |
Persistence value (0–255). Higher = more aggressive |
dwait_ms |
0 |
Dwell/backoff time after DCD clears |
The p-persistence algorithm works as follows: when the channel is
clear (DCD inactive), graywolf generates a random number 0–255.
If it’s less than persist, it transmits immediately.
Otherwise, it waits one slot_time_ms and tries again.
TX Rate Limiting
The TX governor enforces per-channel rate limits to prevent excessive transmissions. Configure these through the TX timing API:
rate_1min |
Maximum packets per minute (0 = unlimited) |
rate_5min |
Maximum packets per 5 minutes (0 = unlimited) |
full_dup |
Skip CSMA entirely (for full-duplex setups) |