libdrmconf 0.12.1
A library to program DMR radios.
|
Represents, encodes and decodes the device specific codeplug for a Baofeng/Radioddity RD-5R. More...
#include <rd5r_codeplug.hh>
Classes | |
class | ChannelElement |
Implements the specialization of the Radioddity channel for the RD5R radio. More... | |
class | EncryptionElement |
Implements the encoding/decoding of encryption keys for the RD-5R radio. More... | |
struct | Limit |
Some limits for the codeplug. More... | |
struct | Offset |
Some internal offsets within the codeplug. More... | |
class | TimestampElement |
Implements the timestamp for RD-5R codeplugs. More... | |
Public Member Functions | |
RD5RCodeplug (QObject *parent=0) | |
Empty constructor. | |
void | clear () |
bool | encodeElements (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | decodeElements (Context &ctx, const ErrorStack &err=ErrorStack()) |
virtual void | clearTimestamp () |
Clears the time-stamp in the codeplug. | |
virtual bool | encodeTimestamp (const ErrorStack &err=ErrorStack()) |
Sets the time-stamp. | |
void | clearGeneralSettings () |
bool | encodeGeneralSettings (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | decodeGeneralSettings (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearButtonSettings () |
bool | encodeButtonSettings (Context &ctx, const Flags &flags, const ErrorStack &err=ErrorStack()) |
bool | decodeButtonSettings (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearMessages () |
bool | encodeMessages (Context &ctx, const Flags &flags, const ErrorStack &err=ErrorStack()) |
bool | decodeMessages (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearContacts () |
bool | encodeContacts (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | createContacts (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearDTMFContacts () |
bool | encodeDTMFContacts (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | createDTMFContacts (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearChannels () |
bool | encodeChannels (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | createChannels (Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | linkChannels (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearBootSettings () |
void | clearMenuSettings () |
void | clearBootText () |
bool | encodeBootText (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | decodeBootText (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearVFOSettings () |
void | clearZones () |
bool | encodeZones (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | createZones (Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | linkZones (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearScanLists () |
bool | encodeScanLists (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | createScanLists (Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | linkScanLists (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearGroupLists () |
bool | encodeGroupLists (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | createGroupLists (Context &ctx, const ErrorStack &err=ErrorStack()) |
bool | linkGroupLists (Context &ctx, const ErrorStack &err=ErrorStack()) |
void | clearEncryption () |
bool | encodeEncryption (const Flags &flags, Context &ctx, const ErrorStack &err) |
bool | createEncryption (Context &ctx, const ErrorStack &err) |
bool | linkEncryption (Context &ctx, const ErrorStack &err) |
Represents, encodes and decodes the device specific codeplug for a Baofeng/Radioddity RD-5R.
This codeplug format is quiet funny. It reveals some history of this device. First of all, the channels are organizes in two blocks. The first block contains only a single bank of 128 channels, while the second block contains 7 banks with a total of 896 channels. I would guess there was a previous firmware or even hardware version with only 128 channels.
Moreover, channels, zones, rx group lists and scan lists are organized in tables or banks, with some preceding bitfield indicating which channel is enabled/valid. Contacts, however, are just organized in a list, where each entry has a field, indicating whether that contact is valid.
This difference looks like, as if the firmware code for the contacts stems from a different device or was developed by a different engineer. Moreover, the message list again, uses yet another method. Here a simple counter precedes the messages, indicating how many valid messages there are. All in all, a rather inconsistent way of representing variable length lists in the codeplug. I would guess, that over time, different people/teams worked on different revisions of the firmware. It must have been a real nightmare to Serge Vakulenko reverse-engineering this codeplug.
This implementation targets firmware version 2.1.6.
The memory representation of the codeplug within the radio is divided into two segments. The first segment starts at the address 0x00080 and ends at 0x07c00 while the second section starts at 0x08000 and ends at 0x1e300.
Please note, that the codeplug is not yet fully understood and a full codeplug cannot be build from scratch. That is, it is necessary to update an existing codeplug on the radio.
Start | End | Size | Content |
---|---|---|---|
First segment 0x00080-0x07c00 | |||
0x00080 | 0x00088 | 0x0008 | ??? Unknown ??? |
0x00088 | 0x0008e | 0x0006 | Timestamp, see RadioddityCodeplug::TimestampElement . |
0x0008e | 0x000e0 | 0x0052 | CPS, firmware, DSP version numbers (not touched). |
0x000e0 | 0x00108 | 0x0028 | General settings, see RadioddityCodeplug::GeneralSettingsElement . |
0x00108 | 0x00128 | 0x0020 | Button settings, see RadioddityCodeplug::ButtonSettingsElement . |
0x00128 | 0x01370 | 0x1248 | 32 preset message texts, see RadioddityCodeplug::MessageBankElement . |
0x01370 | 0x01588 | 0x0218 | ??? Unknown ??? |
0x01588 | 0x01788 | 0x0200 | ??? 32 Emergency systems ??? |
0x01788 | 0x02f88 | 0x1800 | 256 contacts, see RadioddityCodeplug::ContactElement . |
0x02f88 | 0x03388 | 0x0400 | 32 DTMF contacts, see RadioddityCodeplug::DTMFContactElement . |
0x03388 | 0x03780 | 0x03f8 | ??? Unknown ??? |
0x03780 | 0x05390 | 0x1c10 | First 128 channels (bank 0), see RadioddityCodeplug::ChannelBankElement and RD5RCodeplug::ChannelElement . |
0x05390 | 0x07518 | 0x2188 | ??? Unknown ??? |
0x07518 | 0x07538 | 0x0020 | Boot settings, see RadioddityCodeplug::BootSettingsElement . |
0x07538 | 0x07540 | 0x0008 | Menu settings, see RadioddityCodeplug::MenuSettingsElement . |
0x07540 | 0x07560 | 0x0020 | 2 intro lines, RadioddityCodeplug::BootTextElement . |
0x07560 | 0x07590 | 0x0030 | ??? Unknown ??? |
0x07590 | 0x075c8 | 0x0038 | VFO A settings RadioddityCodeplug::ChannelElement |
0x075c8 | 0x07600 | 0x0038 | VFO B settings RadioddityCodeplug::ChannelElement |
0x07600 | 0x07c00 | 0x0600 | ??? Unknown ??? |
Second segment 0x08000-0x1e300 | |||
0x08000 | 0x08010 | 0x0010 | ??? Unknown ??? |
0x08010 | 0x0af10 | 0x2f00 | 250 zones, see RadioddityCodeplug::ZoneBankElement . |
0x0af10 | 0x0b1b0 | 0x02a0 | ??? Unknown ??? |
0x0b1b0 | 0x17620 | 0xc470 | Remaining 896 channels (bank 1-7), see RadioddityCodeplug::ChannelBankElement and RD5RCodeplug::ChannelElement . |
0x17620 | 0x1cd10 | 0x56f0 | 250 scan lists, see RadioddityCodeplug::ScanListBankElement |
0x1cd10 | 0x1d620 | 0x0910 | ??? Unknown ??? |
0x1d620 | 0x1e2a0 | 0x0c80 | 64 RX group lists, see RadioddityCodeplug::GroupListBankElement |
0x1e2a0 | 0x1e300 | 0x0060 | ??? Unknown ??? |