Home » Digital Modes » One ID-51, one SD card and no Windows box: how an old D-STAR handheld was brought up to date

7 min read

One ID-51, one SD card and no Windows box: how an old D-STAR handheld was brought up to date

A few weeks ago I got an email from an OM in our circle. 83 turns on the coil, as he puts it himself, still a bit of CW, now and then VHF via repeaters. His Icom ID-51, the very first model from 2012, had a D-STAR repeater list on it that was older than some of our club members. The Zug repeater had changed its callsign in the meantime, so he could hear the other station, but the other station could not hear him. And he wrote that he knew nothing about programming. Could I perhaps set the radio up for him?

Of course I could. The only question was how. With Icom that normally means: a Windows computer, the CS-51 software, an OPC cable, and then clicking your way through 500 memory channels. I had no appetite for the Windows box, nor for all that clicking. What I did have: a cloning file from his SD card, a Mac and an evening to spare.

The ID-51 after loading: channel «HB9HD Braunau» on 145.5875 MHz, DV, bank E
The ID-51 after loading: channel «HB9HD Braunau» on 145.5875 MHz, DV, bank E

The ICF is just a memory image

Anyone who has ever looked inside an .icf file knows: it is hex text, line by line, 130 kilobytes of radio memory. Channels, banks, callsigns, settings, the repeater list, it is all in there. And the nice part: the radio writes this file to the SD card itself and reads it back from there too. MENU, SD Card, Load Setting. No cable needed.

For the memory channels there is CHIRP, the free programming tool that knows the ID-51. With that, the first part was essentially solved. I gathered the repeater data from three sources, the USKA list (USKA is the Swiss amateur radio association), RepeaterBook and the Icom lists from my ID-52, and wrote a small Python script that generates the finished ICF from a CSV table. Channel name, frequency, offset, CTCSS, and for D-STAR the RPT1 and RPT2 callsigns. If you like, you can maintain the table in Google Sheets and run the script.

That is where the first snag showed up straight away. CHIRP encodes a channel’s bank assignment differently from the way the radio itself does. On the ID-51, banks A to Z are stored in a 5-bit field, and the two channels the OM already had in there were sitting invisibly in bank A. I reproduced this in the script, exactly the way the radio writes it, and checked it in a first test with three channels: names there, bank there, DV channel with repeater there. Only then did the full list go in.

178 channels in five banks

The wish list was clear: the usual simplex frequencies, as many Swiss FM repeaters as possible, the German ones near the border such as DB0XR and Hochblauen, and D-STAR. That turned into five banks you can step through with a single key: Simplex, FM German-speaking Switzerland, FM Romandy and Ticino, FM German border, D-STAR Switzerland. 178 channels, each with a name on the display. For someone who does not want to program, that is the whole trick. Choose the bank, turn to the channel, press PTT.

Bank B: «HB9EAS FM» with offset and CTCSS, all on the display
Bank B: «HB9EAS FM» with offset and CTCSS, all on the display

A word about the USKA list, because I want to be honest: the data dates from August 2024(?), isn’t the USKA the association that is supposed to supply us with the data in Switzerland(?) and when cross-checking against RepeaterBook, 15 repeaters were missing that are active there. I added them. If you rely on a single source, you end up with gaps in your list.

And then the repeater list

Now comes the part that really got me hooked. For DR mode, i.e. repeater selection with «Near Repeater» via GPS, the ID-51 needs its own repeater list stored in the radio. 725 factory entries from 2012, 25 of them for Switzerland, with HB9HD still in Sirnach instead of Braunau and the old Zug callsign HB9RF. Exactly what had tripped the OM up.

On the ID-51 Plus you load a list like this as a CSV via the menu. On the original ID-51 that menu does not exist. I had misread the manual and only noticed on the radio itself: Load Setting, Save Setting, SD Card Info, Format, Unmount. No import, no export, not even a firmware update. The list has to go into the ICF, and Icom documents nowhere how it is stored there.

The SD card menu of the original ID-51: Load, Save, Info, Format, Unmount. No import, no export.
The SD card menu of the original ID-51: Load, Save, Info, Format, Unmount. No import, no export.

So, reverse engineering. I had three files to compare: the factory ICF with 725 known entries, an older ICF from the same radio model with its own Germany list from CS-51, and the ICF from my ID-52 together with its CSV export, where I knew for every entry what DUP+, DUP− or «Exact» meant. From these, the structure could be read out byte by byte. 49 bytes per repeater: frequency, offset, a reference to the location, a flag byte for offset direction and position accuracy, the packed callsign, name, abbreviation, coordinates in degrees and thousandths of a minute with N/S and E/W, UTC offset in minutes. On top of that, a table with the group names, one with the start indices for each group and a gateway callsign list that is only filled for the first entry of a location.

At this point Claude (AI) deserves a mention, otherwise this report would not be complete. The byte analysis, the hypotheses about the flag bits and the comparison across three files took place in a Cowork session in which I sent photos of the display and Claude worked out the structure. I decided what went in and checked on the radio what came out. The script reproduces the 267 entries of the CS-51 file and all factory entries with callsigns byte for byte. Only then did I trust it enough to load it into the radio.

From the repeater directory to the radio: three sources, one CSV, two scripts, one ICF on the SD card
From the repeater directory to the radio: three sources, one CSV, two scripts, one ICF on the SD card

The result: 418 D-STAR repeaters in four groups, Switzerland, Germany, Austria, Italy, taken straight from the current ID-52 data. I corrected the Swiss group by hand, because the Icom list also had four typos, HB9EAS on 43.5375 MHz, for example.

Two pitfalls for Mac users

The first loading attempt came back with «Data error». Not because of the file. On FAT cards, the Finder creates an invisible shadow file «._name.icf» for every file, and the ID-51 dutifully lists it as an entry of its own. Select that one and you get the error. A dot_clean -m /Volumes/KARTE in Terminal cleans things up. And the file name may be no longer than 14 characters, otherwise the radio does not even display it. Set20260922_04.icf works, anything longer does not.

What works now and what does not

I tested the radio via HB9HD Braunau, and the transmission came through cleanly on the IC-9700 in the shack. On my hotspot on REF098, however, it did not, even though Braunau was connected there. That is no longer a programming question: the OM’s callsign has most likely never been registered in the D-STAR gateway system. Locally via the repeater everything works, but as soon as it is supposed to go out onto the network, nobody hears him. Exactly his experience in Zug. Registration is a form on the website of a Swiss gateway, and we will do that together over the phone.

What stays with me: a 13-year-old radio that officially no longer gets a new repeater list now has one, and the process can be repeated on any other ID-51 in ten minutes. Swap in the original ICF, run the script, insert the SD card. The scripts and the description of the memory layout are now freely available on GitHub: icom-icf-tools. And if anyone knows why Icom made the repeater list non-importable on the original ID-51 of all radios: I am all ears.

73 de Chris, HB9HJI

Leave a Reply

Your email address will not be published. Required fields are marked *