Controlling the XM PCR receiver from Linux

The XM PCR in question, complete with mysterious screw holes.

The XM PCR in question, complete with mysterious screw holes.

The XM PCR was a satellite radio receiver sold to consumers in 2003 that was controllable by a PC running Windows over USB. Other than satellite, audio and USB connectivity, the receiver does not have any form of user interactivity, everything is done over USB. XM Radio discontinued it in 2004 due to software to easily rip songs, which was discussed on The Tech Guy #71.

It’s been nearly 20 years since the device was released, and the SiriusXM satellites are still broadcasting audio in a format this receiver can understand. I was shocked when the activation signal went through and the radio sprang to life. With the radio working, audio compression artifacts and all, I sought to control it from Linux.

The receiver uses an FTDI component to expose a serial port over USB. This is supported by modern Linux, and after attaching the receiver to the computer, a serial device was exposed under /dev. This was off to a promising start.

After a little bit of investigation I found that the protocol had already been reverse engineered and Michael Minn had released a GUI program MMXMPCR in 2003. It was last updated in 2005 which was a long time ago in the realm of Linux desktop software. I wasn’t even sure if modern distributions still shipped the required libraries, and if they did, if the program would even compile. Fortunately, Michael still hosts the source tarballs on their website; I downloaded the latest release to find out.

For the moment, Linux distributions still ship the necessary MOTIF and X Toolkit Intrinsics libraries. As desktop Linux continues the migration to Wayland, I wonder how much longer this will hold true. I modified the makefile to specify the correct header location and the linker flag for the Intrinsics library. I ran make and was greeted with a mmxmpcr binary, and a wall of compiler warnings.

Screenshot of mmxmpcr, showing the first 10 channels in the application window.

Screenshot of mmxmpcr, showing the first 10 channels in the application window.

Upon running mmxmpcr, a window appeared which began populating with channel information from the radio, and I could control the receiver without issue. To remain cool, I tuned into TikTok Radio and attempted to dance.

In order to preserve the project into the future, I’ve used the available release tarballs to create the mmxmpcr repository on GitHub. It would be interesting to refactor the project to use libusb to discover an attached radio, rather than hardcoding a path into the binary.

However, the original Windows software distributed by XM Radio for this receiver seems missing from the Internet Archive. If you have it, please upload it and let me know!