Sun Ultra 1 NVRAM battery replacement

Ultra 1 is the first Sun Microsystems workstation to use the UltraSPARC CPU architecture. Released in 1995, it seems that it was one of the first personal computers that used a 64-bit CPU (IA-64 architecture was introduced in 2001, AMD64, a.k.a x86_64 was introduced in 2003).

What's a CMOS/NVRAM battery for?

The computer needs to keep track of the time, as well as remember its configuration between bootups. This task - like any other - requires power. Sometimes computers sit for a long time with power disconnected. Becuase of that, nearly all of them have a small battery inside that powers the basic circuitry necesary to keep track of the time and preserve the contents of the memory. This battery usually lasts a couple of years if you keep your computer plugged in while its off, thanks to the so-called standpy power your PSU generates when its off. Only in the absence of standby power, the CMOS battery is used as a power source.

The NVRAM chip - in the Ultra 1, ST Electronics M48T59Y - is a socketed DIP RTC. It has a little bit of user writable non-volatile memory (hence the name NVRAM). Usually RTCs keep the time and date value in that memory, and in case of Sun computers, this memory is also used to keep the serial number and the MAC address of the onboard ethernet controller.

The counterpart of that chip in PCs is called the CMOS. (From the name of the process used to manufacture those, and nearly all other modern chips)

Left - CMOS battery in a laptop, Right - on a PC motherboard

Case of the Ultra 1

Top to bottom - VT320 terminal, a Dell (workench PC) and in front of it the terminal keyboard, an oscilloscope, and finally the Ultra 1

Ultra 1, as many computers of that time as well as early PCs, use an RTC chip that contains the battery inside itself. Apart from the afromentioned M48T59Y, another of those chips in common use was the Dallas DS12887 or DS1287 RTC. Similar to the M48T59Y it contains a DIP chip with two external battery terminals, on top of which the battery is spot welded with metal tabs, and then the whole assembly is put into a small plastic shell and filled with polymer to protect and provide mechanical rigidity.

This approach has its downsides, one of which is a lack of any way to replace the battery once it dies. The symptom of that, both back then and nowadays, is that your BIOS (or bootloader in case of the Sun) will report errors and the date will reset, most cases to 1st Jan 1970 - that's the beginning of the time in UNIX.

The battery inside the polymer filling of the M48T95Y RTC/NVRAM. It's the round edge

Before you do this, carefully take off the yellow barcode sticker off the chip, and/or take a photo of it - you will need the serial number later.
To replace the battery I cut out some of the shell (soft-ish plastic) and the polymer filling (hard). Luckily it seems that it decomposes under temperature, so a couple of hot air blows with the butane iron where I cut made it brittle and easy to remove. The battery resides on the opposite end than pin 1 of the chip (marked like any other DIP)

The mainboard of the Ultra 1. Framebuffer card removed

I then used a multimeter to determine the correct polarity (it still had 0.2V charge inside!), cut one of the original tabs to disconnect the battery and wired a CR2032 socket to them. I secured the whole assembly with epoxy and fitted it back into the Sun

Attaching the holder to the chip with epoxy rosin. This was done after the chip was mounted to make sure the framebuffer card fits

Memory contents initialization

After clicking the power switch (Ultra 1 has a 3-way rocker switch on the back of the PSU, click up turns it on and click down cuts the power), I had to initialize the memory contents. OpenBoot prompt allows to do that in a rather simple way.

Left - Failed boot, Right - The bootloader prompt being used to write values to individual bytes of the memory, as well as coumpute and write the checksum

The terminal is connected to serial port A (top DB25 socket), where the bootloader exposes a 9600 8N1 serial console.
The syntax of mkp is as follows: byte address mkp
Byte 1 contains the model, bytes 5-7 the onboard ethernet MAC (last 3 octets) and bytes c-e the serial number (from the yellow barcode sticker).
Before that I also disabled the diag-switch? option to disable the diagnostics on boot
The last line computes and writes the checksum into the last byte of the memory.

Left - Successfull self-test and loading the OpenBSD bootblock. MAC-address is, obviously, made up ;), Right - Back of the unit

You can see the diagnostic messages disappeared and so did the invalid IDPROM content warning.
The Sun automatically booted from hard disk, where I have installed OpenBSD