Hello everyone, and first of all many thanks to
Koshak (RA4FHE, Alexey) for OpenDM32, for all the hardware work in this thread, and for making the source free to share and modify.
I'm BG8AM / VA3BPF. Building on OpenDM32, I've written
OpenDMR, an open firmware for the Baofeng DM-32 / DM-32UV, and released the first version, 0.1.0. This thread is where the DM-32 firmware work started, so I'd like to introduce it here.
What it is- Rewritten on FreeRTOS. The features and the hardware knowledge come from OpenDM32 (and OpenGD77 before it).
- A new user interface at the native 240x320 resolution, in English and Chinese.
- DMR uses our own AMBE+2 compatible vocoder, so the firmware contains no stock firmware code at all. It works with other DMR radios, repeaters and hotspots.
- Analog receive audio goes from the FD6818 straight to the speaker, as in the stock firmware, not through the HR_C7000 codec. So the CPU, flash, display and GPS activity is not heard in the speaker.
Screenshots (taken from the radio's frame buffer)


The first one is DMR receive (in the Chinese UI): the caller's callsign, name, DMR ID, talkgroup and S-meter.
Features- DMR / FM, channels and VFO A / B, direct frequency entry
- Scan, dual watch (any two channels or VFOs)
- Contacts, TG / private call entry, last heard, caller names from the DMR ID database written by the CPS
- FM broadcast radio with RDS
- GPS (GPS + BeiDou sky plot), APRS beacons, amateur satellite passes with Doppler correction
- DMR hotspot (MMDVM / BlueDV over the programming cable)
- VOX, 1750 Hz, DTMF, MDC1200, tail elimination
- User-defined keys, SK2 + digit quick keys
- Codeplug with the OpenGD77 CPS (Radio type DM32/UV008)
The vocoderThe AMBE+2 half-rate (3600x2450) encoder and decoder are our own implementation. There are three versions: Python, C in doubles, and fixed-point C for the CK803S (no FPU), which takes about 2.4 ms per frame to decode and 13 ms to encode. It was checked against the DVSI test vectors and md380-emu, and on the air with commercial radios. It is in its own repository, dmr-vocoder.
Tools- dm32_dump.py: backs up and writes the flash through the HR_C7000's bootloader (the same power-on handshake as OpenUV008_Flash and Roger VK3KYY's scripts). It runs at 250000 baud in 4 KB blocks, each with a CRC, and shows the progress on the radio's screen. About 2.5 times faster.
- fw_update.py: once OpenDMR runs, updates it over the cable without the upgrade mode. It writes only the changed sectors (about 35 s), then the radio restarts by itself.
InstallingFlashing can brick the radio; you do it at your own risk. Back up both flash chips first: the data flash holds the radio's own calibration, which can't be recovered from another radio.- Download OpenDMR-0.1.0.zip from the release page and unzip it. You need Python 3 with pyserial on the PC; the stock CH340 cable works.
- Backup: with the radio off, run dm32_dump.py, then switch the radio on within 30 s. Read each chip twice and compare.
- Write the firmware and the Chinese font the same way (dm32_dump.py --write).
- Write the codeplug with the OpenGD77 CPS.
- For later updates, run fw_update.py with the radio on.
The installation guide has every step. Writing the backup back restores the stock firmware completely.
LinksCurrent limits- No voice prompts; the calibration is read only; no themes.
- Not fully tested on the air yet: APRS decoding, the hotspot's CW ID, satellite passes, talkaround, distance sort.
- No Russian UI yet. All UI strings are in one table (src/ui/text/), and the fonts would need Cyrillic glyphs (tools/fonts/mkfont.py). Help with a translation is very welcome.
- Non-commercial use only, as with OpenGD77.
Feedback welcomeIssues and suggestions are welcome on GitHub or here. The most useful reports are: whether backup and flashing work on your batch of radios (which flash chips), how the DMR voice sounds, and how it works with your repeaters.
Thanks again to Koshak / RA4FHE, to Roger Clark VK3KYY, Kai Ludwig DG4KLU and the OpenGD77 authors, and to andynvkz for OpenUV008 and the flash tools.
73! BG8AM / VA3BPF