A Cisco CP-9951 was supposed to be an office phone.
Mine now runs DOOM.
Not a video of DOOM. Not a remote desktop window pretending to be DOOM.
The game actually runs on the phone's own ARM CPU and Linux system, renders directly to the built-in display, produces real game audio and can be controlled with the Cisco keypad.
The hardware
The phone is a Cisco Unified IP Phone CP-9951-CL-K9.
It is an old enterprise VoIP phone with roughly:
- ARMv6 CPU around 500 MHz
- about 244 MB of RAM
- Linux 2.6.18
- a 640×480 framebuffer
- a physical numeric keypad
- Ethernet
- enough internal flash storage to make things interesting
The phone cost me about €35.
Naturally, the first reasonable question was:
Can it run DOOM?
Getting graphics on the screen
The useful discovery was /dev/fb1.
The phone exposes its LCD as a framebuffer, so instead of trying to build some strange Cisco UI application, I could render pixels directly.
The display is 640×480×32-bit.
DOOM itself renders at 640×400, so I center the game vertically with a small offset.
That gave me the first important milestone:
native DOOM graphics on the Cisco display.
Using the real Cisco buttons
The phone also exposes its keypad through:
/dev/cisco_keypad
That meant I could read the actual hardware keys instead of attaching a USB keyboard.
I added a small input layer to the DOOM backend and mapped the Cisco keys to useful game controls.
The result is wonderfully ridiculous: the keypad of a business phone is now a DOOM controller.
Sound was harder
Video was relatively straightforward.
Audio was not.
Cisco's software stack has its own media services, audio devices and assumptions about how sound is supposed to reach the speaker.
Several approaches failed before I found a working path.
Eventually the game audio was routed through the phone's own audio system, and later the whole setup was made independent of my workstation.
So the final version no longer needs another computer to provide the game or audio during normal use.
Making it survive a reboot
Running DOOM once over SSH was fun, but I wanted something much better:
- boot the Cisco normally
- open the Applications menu
- select DOOM
- play
The final setup lives on the phone's persistent flash storage and starts a small local service bound to 127.0.0.1.
The Applications menu points to that local service.
That means there is no external web server involved when launching the game.
I can disconnect the network cable, reboot the phone and still launch DOOM from the Cisco UI.
A few days later, after the phone had been completely powered off the entire time, I connected it again. The local setup was still there and DOOM launched normally without any repair or reinstallation.
The final result
The CP-9951 is now simultaneously:
- a SIP phone
- a small ARM Linux computer
- a DOOM machine
- a display
- a speaker
- and a hardware game controller
Was any of this necessary?
Absolutely not.
Was it worth doing?
Absolutely.
I documented the full experiment, including the failed approaches, framebuffer work, audio investigation and hardware details here:
Original field note:
https://www.dennishilk.com/museum/home-computing-lab/field-notes/field-note-7/
GitHub:
https://github.com/dennishilk
Top comments (0)