News feed

  • The Next Version of the M17 Specification

    Over a year ago discussions about possible improvements to the M17 Specifications started in the M17 Discord and moved to several Github issues. The goals were to:

    • Allow for expansion: The existing V2 specification has no room for new payload definitions or additional kinds of META content.
    • Make the spec easier to implement and understand.
    • Remove features that haven’t been adopted.

    The changes include:

    • A redesign of the TYPE field, putting the various subfields into byte-aligned nibbles. The Payload Contents becomes a 4-bit selector allowing for existing modes (Data, 3200 bps Codec2 Voice and Packet), a reserved version detection pattern, so V3-aware software can properly decode V2 traffic and a bunch of values available for future expansion, e.g. new codec or streaming data modes.
    • Decoupling the META contents into its own 4-bit field, separating it from encryption subtype and allowing room for new kinds of META content.
    • Improve the META Text Data by changing to a different control byte which increases the length of a message from 52 to 195 bytes.
    • Dropping 1600 bps Codec2 Voice+Data mode. This mode has never seen any significant uptake, so removing it simplifies the spec.

    So the proposed V3 meets the goals set out for it, but are there any downsides? There is one big one: Compatibility. V2 to V3 is forward-compatible, that is, V3 radios, hotspots, repeaters and reflectors will be able to receive transmissions from V2 devices and software. But it’s not backward-compatible, so V2 devices won’t recognize V3 transmissions, in fact they’ll misparse them. What happens then depends on the contents of the V3 data and the parsing code, but it’s likely to vary depending on the details of both. So the behavior of a V2 radio when receiving V3 is effectively undefined. (There may even be a case where it works!) Indeed, that’s why it’s called V3 – the major version change indicates that it’s not compatible. A lot of thought has gone into mitigating this problem. If we could update hotspots, repeaters and reflectors before radios are updated it’s possible to reduce many of the interoperability problems. But fundamentally, a radio running V2 firmware won’t be able to receive a V3 transmission. Even if the network infrastructure can translate between formats, there’s no way for RF infrastructure (repeaters, hotspots) to do the same. Devices running V3 will still receive V2 transmissions, but if they transmit using V3, any un-upgraded devices won’t hear them. So there needs to be a “flag day” when all the devices in an area switch from V2 to V3. That’s not too bad if it’s just a radio or two and a hotspot, but it would be harder to coordinate in areas with M17 repeaters.

    I’ve been concerned that a breaking change might cause problems for the M17 community. So, working with an AI, I came up with a proposal for a backward-compatible change to V2 that accomplishes many (but not all) of the goals of V3. It keeps the layout of the TYPE field in the current spec, but repurposes reserved bits as escapes to allow for expansion.

    The idea behind this approach is that the existing spec has some reserved values and bits that can be repurposed to allow for new functionality. Specifically, Data Type (bits 1-2 in the TYPE field, see Table 3.4 in the spec) has the 002 value reserved and Encryption Subtype (bits 5-6 in TYPE, see Table 3.8 in the spec) has the 112 value reserved. So those reserved values can be used as escapes, telling software that is aware of the new spec to look for a new payload (in the case of Data Type) or META type (in the case of Encryption Subtype). On the other hand, software that isn’t aware sees a Reserved value and should ignore it – we plan to audit existing implementations to confirm this.

    BitsFieldRule
    0Packet/StreamUnchanged
    1-2Data Type01 = Data, 10 = Voice (Codec2 3200); 00 = escape: payload type in bits 12-15; 11 = Voice+Data (deprecated)
    3-4Encryption TypeUnchanged
    5-6Encryption SubtypeUnchanged when encrypted. Unencrypted: 00/01/10 = Text/GNSS/ECD (unchanged); 11 = escape: META is self-typed (first META byte = type ID)
    7-10CANUnchanged
    11SignedUnchanged
    12-15Extended Payload TypePayload type ID when Data Type = 00; otherwise 0000

    The new Extended Payload Type is stored in bits 12-15 of TYPE, which had been Reserved. So we now have 15 values available for identifying new payloads, with value 00002 reserved. As in the proposed V3, the new payloads can be used for new codecs, data modes or whatever we can come up with.

    The existing spec defines three uses of the 14 byte META field: Text Data (002), GNSS Data (012), and Extended Callsign Data (102). (These are only available when encryption is not being used because META contains encryption-related data in that case.) In order to provide for additional uses of the META field, we use the previously-reserved 112 value as an escape. In this case, it indicates that the META area is self-typed: the first byte of the 14 byte META area defines its type, allowing for up to 255 new types (with value 002 reserved as a sentinel).

    The V3 spec changes META Text Data to allow for up to 195 byte messages. With this approach, the old Text Data would be unchanged for compatibility, but we can define a new Long Text Data type with similar functionality.

    So what are the benefits of doing it this way? We get the same capabilities that V3 offers (new payloads/codecs, META types) but with backward compatibility. All existing features are identical, so radios and infrastructure will continue to work as they always have. New features should fail safe on old radios, i.e. the radio should just stay mute when it sees additional features.

    This new proposal is still Version 2 of the M17 protocol. There’s no need for any version signaling because all existing cases are bit-for-bit the same – only new functionality uses previously-reserved values and fields, which older software already knows to ignore.

    How about downsides?

    • We lose the benefits of V3’s cleanup of TYPE. Fields continue to be non-nibble-aligned, with conditional fields, escapes and dual-meaning subtype bits.
    • New extended META payloads lose one byte from 14 down to 13, because the extended META type is stored in META itself.
    • Legacy formats (Voice+Data, the three original META types) live alongside new ones, so there are two code paths to maintain. We can deprecate things like Voice+Data, but code still needs to be able to deal with them.
    • We’re assuming old code will ignore transmissions that repurpose the reserved values and fields. We need to audit the existing code to verify that’s the case and fix it if it isn’t.

    So I see the trade-off as backward compatibility (old infrastructure continues to work, no “flag day” for switching to V3) versus a cleaner spec and simpler code for the future. I think either choice is reasonable, but overall I’d choose compatibility. But it’s not up to me! Interested members of the M17 community are encouraged to comment on the Github issue and let us know what you think, so we can make a choice that works for all of us.

  • M17/OpenRTX at DEFCON 34

    We have finally secured our presence at DEFCON. Well, kind of. The CSI CS7000-M17-Plus running OpenRTX is currently being showcased at the venue by Arthur N4TRQ. Here’s a few photos:

    Thank you very much for spreading the word at such a significant event! Photos courtesy of hacker.house.

  • Retevis C62 OpenRTX port and the cskburn update

    Our work on OpenRTX port for the Retevis C62 progresses. Don’t worry about the LinHT – our efforts are allocated there as well!

    This hardware platform is getting a special treatment, as it can be used both as one of a valid OpenRTX targets and a carrier for the LinHT board. Porting OpenRTX will bring M17 mode to C62 users without the need to modify anything. Just flash the radio and go. Very simple stuff.

    LinHT, on the other hand, still remains dedicated to skilled hams. The bar is set high, but not intentionally – LinHT is still being developed. When the time comes, the bar should lower considerably. The replacement boards would become available along with the Yocto Linux image incorporating basic analog FM/M17 support (“batteries included”). In the future, LinHT could be treated as a standalone OpenRTX target as well.

    LISTENAI’s cskburn is the tool used to flash the C62. It also flashes the DSP firmware, as it uses a separate binary. Recently, we have spotted a bug in the tool’s version 1.31.0. The bug affects the internal argument parser and makes it impossible to set start and stop addresses using the –read argument’s parameters.

    A pull request has been offered. For now, it is best to use our fork for flashing (or an older version, probably the 1.25.0 – right after Andreas’ OE3ANC fix was merged).

    A great write-up covering C62 flashing process details curated by Vlastimil OK5VAS is available here.

  • LinHT – an interview with the development team

    LabCat (Tobias DL3MHT) uploaded his interview with the LinHT development team: Wojciech SP5WWP, Vlastimil OK5VAS, and Andreas OE3ANC. Check it out 🙂

  • Friedrichshafen ham radio fair 2026

    Our team spent three amazing days at the HAM Radio Friedrichshafen event. We had a real lot of traffic. Thank you for stopping by and for all the questions that you had! Big shout out to DARC guys, especially Jann Traschewski DG8NGN, for providing space for our booth.

    M17 Foundation attendees:

    • President of the Board – Olha (no callsign yet)
    • Wojciech SP5WWP
    • Jacek SQ5BPF
    • Andreas OE3ANC
    • Vlastimil OK5VAS

    OpenRTX booth:

    • Silvano IU2KWO
    • Marco DM4RCO
    • Morgan ON4MOD
    Our friends – OpenRTX!

  • LinHT Rev B status: what works, what broke, and why Rev C is next

    LinHT Rev B status: what works, what broke, and why Rev C is next

    Before Friedrichshafen, we want to put the current LinHT development status in one place. We have published many short updates over the last months, and the project moved through several phases: Rev A proof-of-concept testing, Rev B design, manufacturing, first boot, RF tests, audio bring-up, GNSS debugging, and now Rev C planning.

    This post summarizes that progress. It starts with what Rev A proved, then goes through what we changed in Rev B, how we built the first boards, what worked during testing, what failed, and what we need to fix before Rev C.

    If you want the longer background, start with my older text about the first LinHT prototype: LinHT – Open SDR Handheld for Radio Amateurs. That article describes the Rev A board, the Retevis C62 donor-radio approach, and the basic idea behind LinHT: a Linux-based SDR handheld transceiver, open enough that the radio can be changed in software, not only programmed from a vendor tool.

    Rev A was our proof of concept. It showed that the architecture made sense and that the device could work the way we imagined. An i.MX93 system-on-module could boot Linux inside a handheld radio body, run a Yocto image, expose USB networking, talk to the display, run GNU Radio flowgraphs, and use the SX1255 IQ RF front end. We decoded M17, tested TETRA receive, displayed spectrum data on the small screen, and ran enough hardware and software tests to be sure that the concept was valid.

    Rev B is the revision where we tried to turn that proof of concept into a much more complete handheld.

    (more…)
  • LinHT Rev B – GNSS antenna issues

    Vlastimil OK5VAS recently tested the GNSS module. Unfortunately, the module used (Quectel LG77L) does not obtain a fix, even when enabled for 30 minutes, outdoors.

    The most suspicious part, and likely culprit, is the path between the antenna and the module:

    When measured, S11 (from the GNSS module’s perspective) looks like this:

    Many thanks to Martin OK1WPM, who helped measure the antenna path both with the cover removed and with the chassis held in place.

    A quick ad hoc fix before Friedrichshafen ham fair is to place an additional capacitor along the coplanar waveguide:

    Some more experimentation is required. Keep your fingers crossed! See you in Germany!

  • mvoice 1.4.2 now available

    News from Tom, N7TAE:

    Version 1.4.2 of mvoice is now available. It pulls the https://m17-project.github.io/hostfiles/M17Hosts.json file to initialize the reflector selection drop-down menu. A GIANT Thank You to Jim N1ADJ for setting this up!

    More details: https://github.com/n7tae/mvoice

  • LinHT Rev B – hardware testing status

    It took us some time, but here’s a quick update on where we’re at with the LinHT Rev B hardware tests:

    Whats working?

    • Variable RF input attenuators
    • RF switch – switching between TX/RX paths
    • RF PA (Power Amplifier) – functional, delivering about 4.5 watts (CW)
    • GNSS connection – UART interface (NMEA)

    Still requires testing

    • GNSS receiver’s antenna path
    • PMU (Power Management Unit) – battery voltage measurements

    Known problems

    • Audio codec IC – reset and I²C communication issues needing a bit of investigation
    • The button below PTT not triggering USB boot sequence correctly
    (more…)