CHIRP: free radio programming (and why not for DMR codeplug)

Category: AccessoriesDifficulty: ★★☆~8 minutes

If you've ever punched repeater frequencies into a Baofeng by hand from the keypad, you know the pain: scrolling through menus with buttons, one digit at a time, praying you don't mix up the offset. CHIRP solves this problem once and for all. It's a free, open-source program that can read the memory of hundreds of radio models, show the channels in an ordinary table (like Excel) and write everything back with a single click. Windows, macOS and Linux are supported. But CHIRP has a hard limit: it's strong on analog, while a full DMR codeplug — contacts, talkgroups, zones, RX groups, DMR ID — it generally cannot build. Let's break down what CHIRP can really do, how to install it and get the cable working, and why DMR still needs the manufacturer's native CPS.

Back up before writingThe very first thing to do in any flashing program is to read the radio's current memory and save the file. Any write wipes the channels entirely. For backups and building a config from scratch, see the article about codeplug.

What CHIRP is and why it's handy

CHIRP (pronounced "chirp", project chirpmyradio.com) is a volunteer open-source effort that has been in development for more than fifteen years. The main idea: instead of keeping a dozen different proprietary programs for each radio, you install one tool that understands most mainstream transceivers. Here's why it's genuinely good:

The current, up-to-date version is called CHIRP-next — it's the branch rewritten in Python 3, and that's the one you should download (the old "legacy" CHIRP hasn't been developed for a long time). Builds come out almost daily: make a fix today, a fresh build is ready tomorrow.

What CHIRP programs (and what it leaves alone)

To avoid disappointment, let's clearly split the areas of responsibility. CHIRP works confidently with the analog part of a channel:

CHIRP can do thisWhat exactly
RX/TX frequenciesReceive, transmit, offset and the repeater offset direction
Sub-tonesCTCSS (analog tone) and DCS (digital code) on receive and transmit
Channel namesAlphanumeric labels in memory
Power and bandwidthHigh/Low, narrow/wide band (NFM/FM)
Grid step, scan listsStep, channel skip during scanning, basic settings

And here's what CHIRP in most cases does not do for DMR radios — the entire digital part:

On some DMR models CHIRP doesn't open digital channels at all, or it can only generate a CSV contacts template for import into the proprietary software — but that's a long way from a full codeplug. The rule is simple: analog — CHIRP, DMR digital — native CPS.

Don't expect DMR miracles from CHIRPCHIRP is first and foremost a tool for analog FM channels. For handheld DMR radios (TYT MD-380/UV380, Baofeng DM-1701/DM-32, AnyTone AT-D878UV, Retevis RT3S, etc.) the digital codeplug is built with the manufacturer's proprietary CPS. If someone promises to "set up all of DMR in CHIRP" — it's either about one exotic model, or it's not true.

How to install CHIRP

Download strictly from the official site — chirpmyradio.com, the Download section. Third-party "driver bundles" and mirrors can slip in junk.

  1. Windows. Grab the installer.exe (CHIRP-next). Run it, go through the wizard — done. When updating you don't need to remove the old version; the new one installs over it.
  2. macOS. There is a ready-made "unified" app build for Intel and Apple Silicon. Follow the hints on the MacOS Tips page on the project site — it explains the first-launch quirks (Gatekeeper) and port access.
  3. Linux. Two official paths: flatpak (the simplest, self-updating) or installing the .whl file (wheel) via pipx. CHIRP-next needs a relatively recent distribution (roughly Ubuntu 22.04 and newer) — Python 3.10+ is required.
# Linux: installing CHIRP-next from the official .whl via pipx
# first the system dependencies (Ubuntu/Debian):
sudo apt install pipx python3-wxgtk4.0 python3-serial python3-requests
# then CHIRP itself — the --system-site-packages flag is mandatory,
# so that pipx sees the system wxPython:
pipx install --system-site-packages ./chirp-*.whl
pipx ensurepath              # add ~/.local/bin to PATH
chirp                        # launch

Cable, drivers and choosing the COM port

CHIRP doesn't talk to the radio "over the air" — you need a programming cable (a USB-UART adapter with a connector for your radio). And here CHIRP is powerless to help: the port is created by the cable chip's driver, not the program itself. So the order is as follows:

  1. Install the cable driver before you plug it in. The chip inside is usually CH340, CP2102, FTDI or (alas) a fake Prolific PL2303. It determines which driver is needed and whether "Code 10" pops up.
  2. Find the COM port number. On Windows open "Device Manager" → "Ports (COM & LPT)" and note the number (for example, COM5). On Linux it's /dev/ttyUSB0.
  3. Specify the port in CHIRP. When reading the radio the program will ask for the port — pick that one. If the port drop-down list is empty, the driver didn't install.
Everything about cables — separatelyChips, drivers, "the PC doesn't see the port", the fake Prolific and the "Code 10" error, as well as Linux/ttyUSB, are covered in detail in the article about programming cables and drivers. If CHIRP "doesn't see the radio" — it's almost always exactly there.

Reading and writing: the working cycle

The logic is the same in all versions and follows the principle "read → edit → write". Never write to the radio without reading it first.

  1. Read the radio. Menu Radio → Download From Radio. CHIRP will ask for the port, manufacturer and model — choose yours. A progress bar runs, and at the end the channel table opens.
  2. Save a backup right away. File → Save As to a .img file. This is your rollback point if something goes wrong.
  3. Edit the channels. Add frequencies, names, sub-tones right in the table. You can import CSV or copy channels from another open CHIRP file.
  4. Write to the radio. Menu Radio → Upload To Radio. Wait for the success message.
Don't yank the cable during the writeWhile Upload To Radio is running, don't disconnect the cable, don't remove the battery and don't turn the radio off. An interrupted write leaves the memory half-empty — the radio may stop powering on and require emergency recovery. Flash from the wall, not "on the last few percent" of a laptop battery.
What you put in the channels is on youWriting the codeplug itself is legal, but the frequencies and power in the channels are your responsibility. Transmission (TX) is allowed only in the bands allocated to you and within the permitted power. Don't enter someone else's/service frequencies in CHIRP "just in case" — going on air outside the permitted band is illegal. See the article about frequencies and the law for details.

CHIRP or native CPS: what to program with what

A short cheat sheet so you don't second-guess:

TaskWhat to use
Analog FM channels, repeaters, sub-tones on any supported radioCHIRP — fast and free
Transferring a channel "grid" between different radiosCHIRP (within the limits of the model's capabilities)
Digital DMR contacts, talkgroups, zones, RX groups, DMR ID, Color Code, time slotThe manufacturer's native CPS (TYT, AnyTone, Baofeng, Retevis…)
Flashing the radio itself (firmware), not the channelsThe proprietary updater or alternative firmware (OpenGD77, MD380tools)

In practice a DMR radio owner's scenario is usually hybrid: analog channels and "everyday" frequencies are convenient to push through CHIRP, while the whole digital codeplug for DMRhub — contacts, talkgroups, zones — is built with the proprietary CPS. We already have ready-made contact lists and codeplugs for popular models — no need to type in hundreds of talkgroups by hand.

Alternative firmware is a different thingDon't confuse CHIRP with OpenGD77 and MD380tools. CHIRP writes channels into the stock firmware. OpenGD77/MD380tools are a replacement for the radio's firmware itself, with their own codeplug editor and their own DMR capabilities. They are different tools for different jobs.

Channels written — get on the air

You've built the analog in CHIRP and the digital in the native CPS. Now register with DMRhub: private calls by DMR ID, SMS and groups already work. Take our ready-made codeplug and contact list for your model, and if you want your own coverage — build a hotspot.

Sources

  1. CHIRP — the official project site (Home, supported models) — chirpmyradio.com
  2. CHIRP Download — the official download page (Windows installer, macOS .app, Linux .whl/flatpak via pipx) — chirpmyradio.com/Download
  3. What Is CHIRP? — an overview of the capabilities and limits (analog vs DMR/CPS) — radioranked.com
  4. Radio Programming with CHIRP (RMHAM University, K0SWE) — the Download/Upload working cycle, choosing the port — rmham.org (PDF)
  5. ChirpOnLinux — the official guide (pipx + --system-site-packages, .whl, distribution requirements) — chirpmyradio.com/ChirpOnLinux