New MD9600/RT90 firmware

Post Reply
OE3JTB
Posts: 4
Joined: Sun Feb 01, 2026 5:00 am

New MD9600/RT90 firmware

Post by OE3JTB »

PD1FR
Site Admin
Posts: 53
Joined: Tue Jan 27, 2026 3:33 pm

Re: New MD9600/RT90 firmware

Post by PD1FR »

Thanks!
F4EGM
Posts: 5
Joined: Tue Feb 03, 2026 11:18 am

Re: New MD9600/RT90 firmware

Post by F4EGM »

Hello,

I've quickly analysed sources files between 2024 and 2026 version as I don't have 2025 sources!

# Changelog

All notable changes to the OpenGD77 MD9600 firmware between release **20240908** (2024-09-08) and **20260131** (2026-01-31) are documented here. This file is derived from source code comparison; the project did not ship an official changelog.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

---

## [2026.01.31] - 2026-01-31

### Fixed

- **Latitude/longitude fixed-point conversion (24- and 32-bit).** The previous `latLongDoubleToFixed24` and `latLongDoubleToFixed32` implementations used incorrect bit layout (e.g. `intPart << 23` for 24-bit format, which should use 15 fractional bits). This could cause wrong GPS position, APRS data, Maidenhead display, and distance-based sorting. Correct formulas now use `modf()` and dedicated constants; functions were renamed to `latLon*` (typo fix: Long → Lon). Affects: `application/source/user_interface/uiUtilities.c` and all callers (APRS, satellite, display, etc.).

- **APRS codeplug format and version.** `APRS_MAGIC_VERSION` updated from `0x4152` to `0x4153`. APRS buffer version field (`APRS_Buf->magicVer`) is now set explicitly at initialisation to avoid undefined behaviour. Type renamed to `CodeplugCustomDataType_t` for consistency. Affects: `application/source/functions/codeplug.c` and related headers.

### Added

- **Centralised location API.** New accessors for stored position:
- `settingsLocationGetLatitude()` and `settingsLocationGetLongitude()`
- `settingsLocationIsValid()` to detect uninitialised location
- Position is now stored in `nonVolatileSettings.location.lat` and `nonVolatileSettings.location.lon`. All code paths (APRS, satellite, channel, GPS, USB, etc.) use this API. Affects: `application/source/functions/settings.c`, `application/include/functions/settings.h`, and all modules that use location.

- **Reusable distance helper.** New function `distanceBetweenTwoCoords(lat1, lon1, lat2, lon2, inKm)` in `uiUtilities.c`. `distanceToLocation()` now uses this and the new location API.

- **Maidenhead string builder.** New helper `buildMaidenHead()` in `uiUtilities.c` with correct fixed-point-to-double conversion (`LOCATION_DECIMAL_PART_MULIPLIER_FIXED_32_DOUBLE`) and use of `nonVolatileSettings.location`.

- **Hotspot UI: optional double-height display.** Support for double-height text via `GET_Y_POS_WHEN_DOUBLE_HEIGHT_ENABLED` and `displayPrintCenteredDoubleHeight` in `application/source/user_interface/uiHotspot.c`.

### Changed

- **Hotspot display state.** `displayFWVersion` moved from a static variable into a dedicated structure (`hotspotData`) in `uiHotspot.c` for clearer state handling.

- **Codeplug type naming.** Types renamed from `struct_codeplug*` to `Codeplug*` (e.g. `CodeplugDeviceInfo_t`, `CodeplugSignallingDTMFDurations_t`, `CodeplugCustomDataType_t`) for consistency across the codebase.

- **FreeRTOS, STM32 HAL, USB, CMSIS.** Updated third-party and middleware code:
- FreeRTOS (CMSIS-RTOS v2, tasks, timers, heap, ARM CM4F port)
- STM32F4xx HAL (DMA, Flash, GPIO, I2S, PWR, etc.)
- USB device and CDC stack
- CMSIS (including TrustZone `tz_context.h`).
Affects: `Core/Src/freertos.c`, `Middlewares/Third_Party/FreeRTOS/`, `Drivers/STM32F4xx_HAL_Driver/`, `USB_DEVICE/`, `Drivers/CMSIS/Include/tz_context.h`, and related files.

---

## [2024.09.08] - 2024-09-08

Baseline release used for comparison (OpenGD77 MD9600 20240908). No changelog content for this date; see above for changes introduced in 20260131.
F4EGM
Posts: 5
Joined: Tue Feb 03, 2026 11:18 am

Re: New MD9600/RT90 firmware

Post by F4EGM »

- **New options and menu entries (2026):**
- **APRS options:** New **APRS Power** menu item (`OPTIONS_MENU_APRS_POWER`). Choose “From Master” (use master power) or a specific power level for APRS beaconing.
- **General options:** New **Channels are read only** menu item (`GENERAL_CHANNELS_ARE_READ_ONLY`). When enabled, channel list is read-only (no edit from radio). Option bit: `BIT_CHANNELS_ARE_READ_ONLY`.
- **Display options (MD9600):** New **Time in header** (`DISPLAY_TIME_IN_HEADER` / `BIT_DISPLAY_TIME_IN_HEADER`) to show time in the header. New **DMR Last talker on screen** (`DISPLAY_DMR_LAST_TALKER_ON_SCREEN`) with timer 0–30 seconds (`lastTalkerOnScreenTimer`).
- **TX Inhibit:** New global option **TX Inhibit** (`BIT_TX_INHIBIT`). New notification type/ID: `NOTIFICATION_TYPE_BEARING`, `NOTIFICATION_ID_BEARING`, `NOTIFICATION_ID_TX_INHIBIT` in `menuSystem.h`.
- **UI double height:** New option **UI uses double height** (`BIT_UI_USES_DOUBLE_HEIGHT`) for larger text.
- **GPS:** GPS mode and baudrate stored in a single byte `gpsModeAndBaudsIndex` (4 low bits: mode, 4 high bits: baudrate index). Macros: `SETTINGS_GPS_MODE_GET/SET`, `SETTINGS_GPS_BAUDRATE_GET/SET`.
- **Roaming:** New `roaming_t` enum (Off, Manual, 5 km, 10 km, 20 km) and `roaming` field in settings for roaming behaviour.

- **New / extended functions (API):**
- `settingsLocationGetLatitude()`, `settingsLocationGetLongitude()`, `settingsLocationIsValid()` (see above).
- `distanceBetweenTwoCoords(lat1, lon1, lat2, lon2, inKm)`.
- `buildMaidenHead()` for Maidenhead string from fixed-point location.
- Settings bitfield extended to a banked array `bitfieldOptions[SETTINGS_BITS_NUMBER_OF_BANKS]` for future expansion (currently one bank). New bits: `BIT_TX_INHIBIT`, `BIT_DISPLAY_TIME_IN_HEADER`, `BIT_CHANNELS_ARE_READ_ONLY`, `BIT_UI_USES_DOUBLE_HEIGHT`.

- **Language / UI strings (2026):** Language struct version bumped (e.g. `LANGUAGE_TAG_VERSION` 0x03 → 0x05). New strings in language files: `tx_inhibit`, `roaming`, and strings used for the new options above (e.g. “Ch Power”, “From Master” for APRS Power; “TX Inhibit”; etc.).
PD1FR
Site Admin
Posts: 53
Joined: Tue Jan 27, 2026 3:33 pm

Re: New MD9600/RT90 firmware

Post by PD1FR »

F4EGM wrote: Tue Feb 03, 2026 11:03 pm - **New options and menu entries (2026):**
- **APRS options:** New **APRS Power** menu item (`OPTIONS_MENU_APRS_POWER`). Choose “From Master” (use master power) or a specific power level for APRS beaconing.
- **General options:** New **Channels are read only** menu item (`GENERAL_CHANNELS_ARE_READ_ONLY`). When enabled, channel list is read-only (no edit from radio). Option bit: `BIT_CHANNELS_ARE_READ_ONLY`.
- **Display options (MD9600):** New **Time in header** (`DISPLAY_TIME_IN_HEADER` / `BIT_DISPLAY_TIME_IN_HEADER`) to show time in the header. New **DMR Last talker on screen** (`DISPLAY_DMR_LAST_TALKER_ON_SCREEN`) with timer 0–30 seconds (`lastTalkerOnScreenTimer`).
- **TX Inhibit:** New global option **TX Inhibit** (`BIT_TX_INHIBIT`). New notification type/ID: `NOTIFICATION_TYPE_BEARING`, `NOTIFICATION_ID_BEARING`, `NOTIFICATION_ID_TX_INHIBIT` in `menuSystem.h`.
- **UI double height:** New option **UI uses double height** (`BIT_UI_USES_DOUBLE_HEIGHT`) for larger text.
- **GPS:** GPS mode and baudrate stored in a single byte `gpsModeAndBaudsIndex` (4 low bits: mode, 4 high bits: baudrate index). Macros: `SETTINGS_GPS_MODE_GET/SET`, `SETTINGS_GPS_BAUDRATE_GET/SET`.
- **Roaming:** New `roaming_t` enum (Off, Manual, 5 km, 10 km, 20 km) and `roaming` field in settings for roaming behaviour.

- **New / extended functions (API):**
- `settingsLocationGetLatitude()`, `settingsLocationGetLongitude()`, `settingsLocationIsValid()` (see above).
- `distanceBetweenTwoCoords(lat1, lon1, lat2, lon2, inKm)`.
- `buildMaidenHead()` for Maidenhead string from fixed-point location.
- Settings bitfield extended to a banked array `bitfieldOptions[SETTINGS_BITS_NUMBER_OF_BANKS]` for future expansion (currently one bank). New bits: `BIT_TX_INHIBIT`, `BIT_DISPLAY_TIME_IN_HEADER`, `BIT_CHANNELS_ARE_READ_ONLY`, `BIT_UI_USES_DOUBLE_HEIGHT`.

- **Language / UI strings (2026):** Language struct version bumped (e.g. `LANGUAGE_TAG_VERSION` 0x03 → 0x05). New strings in language files: `tx_inhibit`, `roaming`, and strings used for the new options above (e.g. “Ch Power”, “From Master” for APRS Power; “TX Inhibit”; etc.).
PD1FR
Site Admin
Posts: 53
Joined: Tue Jan 27, 2026 3:33 pm

Re: New MD9600/RT90 firmware

Post by PD1FR »

F4EGM wrote: Tue Feb 03, 2026 11:03 pm - **New options and menu entries (2026):**
- **APRS options:** New **APRS Power** menu item (`OPTIONS_MENU_APRS_POWER`). Choose “From Master” (use master power) or a specific power level for APRS beaconing.
- **General options:** New **Channels are read only** menu item (`GENERAL_CHANNELS_ARE_READ_ONLY`). When enabled, channel list is read-only (no ed...
Thank you for this! So do you think these changes also apply for the 380/390 radios etc.?
F4EGM
Posts: 5
Joined: Tue Feb 03, 2026 11:18 am

Re: New MD9600/RT90 firmware

Post by F4EGM »

Yes, I guess it's the same software but I need to spend more time to analyse files.
I own a UV390 GPS too with my MD9600 (gps added)
F4EGM
Posts: 5
Joined: Tue Feb 03, 2026 11:18 am

Re: New MD9600/RT90 firmware

Post by F4EGM »

I've tried with my UV390 GPS and at least I've seen the possibility to double the size on the display! So Yes they apply to other radios
PD1FR
Site Admin
Posts: 53
Joined: Tue Jan 27, 2026 3:33 pm

Re: New MD9600/RT90 firmware

Post by PD1FR »

F4EGM wrote: Thu Feb 05, 2026 8:46 pm I've tried with my UV390 GPS and at least I've seen the possibility to double the size on the display! So Yes they apply to other radios
Good to know. I also own a UV390 w/ gps, it's a great radio!
F4EGM
Posts: 5
Joined: Tue Feb 03, 2026 11:18 am

Re: New MD9600/RT90 firmware

Post by F4EGM »

And it's still possible to save channels settings using SK2 + green button
Post Reply