Enter RPN

Flashing the ARMv2 Voyagers
Login

Flashing the ARMv2 Voyagers

Motivation

This information is out there, but scattered and often outdated. Here is the procedure that worked for me in late 2025.

Requirements

We are going to assume you are running Linux. This guide’s process also works on macOS and Windows, but we do not wish to repeat our instructions three different ways. You might find that setting up a Linux VM and mapping the USB serial port into that VM is simpler than fighting with niggly OS differences.

You will need a fairly high level of privilege on that Linux box: install software, change user groups, etc.

You will also need one of the TCS USB pogo programming cables.

Finally, grab the calculator you wish to flash.

Hardware and Firmware Compatibility

This guide works with a specific subset of HP Voyager-style designs.

The simplest case is the HP-15C Collector’s Edition, as there are no variants to complicate matters. The primary point of confusion is the old Limited Edition, which used a different ARM CPU type, making it incompatible with BOSSA and the firmware we reference here.

Where things get wild is with the HP-12C. My article Recognizing HP-12C Variants may be of use here. Briefly, what you’re looking for is that it is not a Platinum — all of which are incompatible with this guide — and that it was made in 2015 or later. The easiest first check is that it has a 2×CR2032 cell battery compartment. If you have to remove a screw to get inside, and it isn’t a Platinum, you’re done; it’s compatible. Otherwise, check the signs referenced in my Variants guide to verify that it is an ARM v2 design, made from 2015 onward.

The main thing to exclude is the possibility that it is an ARM v1 HP-12C design,1 made from 2008 until sometime in 2015, because those also run on 2×CR2032 and have a 2×3 pogo pin programming connector, yet are incompatible with this guide’s process.

(Yes, this means there is an overlap in 2015 where a given unit could go either way.)

The Importance of Having the Right Tools

There is a tool often referenced in relation to this task called SAM-BA, originally developed by Atmel, which was bought by Microchip in 2016. Atmel designed the ARM processor used since the 2015 redesign of the HP-12C, but if you download the current version of SAM-BA, you will find that support for the ATSAM4L-EK has since been removed.

Some choose to seek out the old SAM-BA v2.18, the last version known to work,2 but we will take a different path: the third-party open-source alternative called BOSSA. Speaking as a fan of FOSS, this would be an ideal situation for me except that the BOSSA maintainers have also removed support for the SAM4L platform from their current release! We will therefore use an intentional 2014 fork of BOSSA to effectively rewind to a version that supports the chip type inside the 2015 redesign of the HP-12C.

This brings up a new stumbling block: modern C++ compilers will carp vehemently about this old code. The single simplest fix I could come up with is to edit the Makefile and change the -Werror flag on line 145 to -std=c++11. This accomplishes two things:

  1. Let warnings be warnings; promoting them to errors only works when you build with the same compiler that code was originally written for, which is more trouble to arrange than it is worth.

  2. C++11 was the prevalent standard at the time of this fork. C++14 had just come out, but the BOSSA code had not been updated to address all the changes yet.

The following is a representative set of commands to build bossac, the CLI version of this tool:

sudo dnf install clang git make
mkdir -p ~/src
cd ~/src
git clone https://sourceforge.net/p/bossa-fork/code/ci/master/tree
cd bossa-fork-code
nano Makefile            # apply the change to line 145 given above 
make
mkdir -p ~/.local/bin/
cp bin/bossac ~/.local/bin/

That works for Fedora type OSes. Other Linux flavors may require adjustment. If you don’t want to mess with that, setting up a Fedora Distrobox might be worthwhile.

That last part is necessary because sudo make install presumes you also built the GUI version, which we will not be using here. My alternative assumes your OS is set up to automatically add ~/.local/bin to your PATH when it is present on login, which might require logging out and back in to accomplish. Otherwise, install bossac in some other directory in your PATH.

Putting the Calculator into Programming Mode

Plug the pogo end of the cable into the port in the battery compartment first. The cable’s proper orientation is keyed by having one clip bigger than the other. It should click in easily, requiring little force.

Now plug the USB end in. There are USB-A and USB-C variants of this cable. If you have the USB-A version and need USB-C, any adapter should work; this process does not require anything special in that regard.

A serial port will not automatically show up! You must first put the calculator into programming mode by holding down the ERASE button, then long-pressing the RESET button, and only then releasing the ERASE button. A quick tap of RESET won’t work. You know you have it right when pressing the calculator’s ON button is ignored.

Only at this point will your OS inform you of the new serial port, if it will do it at all.

Do not worry about the fact that the programming cable’s buttons are labeled ERASE and RESET. Yes, this is scary, even potentially destructive, but you have not actually changed anything yet. You can back out at this point without losing anything.

Pre-Flight Test

Test that BOSSA can see the calculator:

bossac -i

If that complains “Auto scan for device failed,” try this:

ls -l /dev/ttyACM*

If that returns nothing, the OS does not see the calculator yet. It should not be a driver problem.3 A more likely cause of failure here is that you did not get into programming mode. If pressing the calculator’s ON button is not ignored, retry the sequence above.

If you do see the dev node but bossac cannot communicate with the calculator’s CPU, make sure your user is in the proper security group. The id command should give something like this:

uid=1000(tangent) gid=1000(tangent) groups=1000(tangent),10(wheel),18(dialout)

On the OS where I ran that, the necessary group is dialout, but this varies across Linuxes. Adding your user to the necessary group is OS-specific, so I will not try to repeat all that here.

Reading out the Existing Firmware

Before we overwrite the stock firmware, let’s save a copy of it in case we wish to go back:

bossac -r hp-12c-d1d1.bin

That scheme assumes we’re starting with a 2022-era HP-12C, which ship a firmware having checksum D1D1.4 You should end up with:

$ ls -lh *.bin
-rw-r--r--. 1 tangent tangent 112K Nov 30 17:22 hp-12c-d1d1.bin

This is an important step because you will not likely find this firmware out on the web somewhere. Technically it is a copyright violation to distribute it, even though no one is likely to squawk about it. You are advised to keep your own archive.

Writing New Firmware to the Calculator

If you do not already have the firmware you wish to try, get this one from Moravia Consulting. It is what they are currently shipping on the HP-15C Collector’s Edition, with all known bugs fixed.

The firmware writing command is very similar to the reading one above:5

bossac -w 'HP_IAR_USB 120ms.bin'

Press the RESET button on the cable once to return to normal mode, then turn the calculator ON. It should report Pr Error because it has been fully reset now. Press ON again to get past that.

If you go into the self test menu and run the CPU test, you should get checksum 0A0A.6

Behold the Mongrel

2025 new-production HP-12C running HP-15C CE firmware 0A0A, in HP-16C mode

Credits

I relied heavily on an HP Museum Forum post by ldnarn. Some of the responses to it were also helpful. A good part of the motivation for writing this is to collect that information in a single place that is more visible than an old forum post.

License

This work is © 2025 by Warren Young and is licensed under CC BY-NC-SA 4.0


  1. ^ Which also includes the HP-15C Limited Edition, by the way. Those use the hardware from 2011’s HP-12C 30th Anniversary Edition.
  2. ^ The current version of SAM-BA is 3.9.2 as I write this.
  3. ^ Modern Linuxes typically include the driver necessary for this: modprobe cdc-acm
  4. ^ Two matching values means it is not corrupt. Probably. The false kosher rate is 1:256 with this primitive checksum scheme. Sigh.
  5. ^ This is one of the reasons I like this method over the SAM-BA v2.18 method.
  6. ^ Oh-ay oh-oh-ah!