<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dennis Hilk</title>
    <description>The latest articles on DEV Community by Dennis Hilk (@dennishilk).</description>
    <link>https://dev.to/dennishilk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4134118%2F3966b1eb-5379-4ebb-aecf-02b9df9b7f72.jpeg</url>
      <title>DEV Community: Dennis Hilk</title>
      <link>https://dev.to/dennishilk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dennishilk"/>
    <language>en</language>
    <item>
      <title>I Made a €35 Cisco Office Phone Run DOOM</title>
      <dc:creator>Dennis Hilk</dc:creator>
      <pubDate>Sun, 20 Sep 2026 13:41:33 +0000</pubDate>
      <link>https://dev.to/dennishilk/i-made-a-eu35-cisco-office-phone-run-doom-2ahm</link>
      <guid>https://dev.to/dennishilk/i-made-a-eu35-cisco-office-phone-run-doom-2ahm</guid>
      <description>&lt;p&gt;A Cisco CP-9951 was supposed to be an office phone.&lt;/p&gt;

&lt;p&gt;Mine now runs DOOM.&lt;/p&gt;

&lt;p&gt;Not a video of DOOM. Not a remote desktop window pretending to be DOOM.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardware
&lt;/h2&gt;

&lt;p&gt;The phone is a Cisco Unified IP Phone CP-9951-CL-K9.&lt;/p&gt;

&lt;p&gt;It is an old enterprise VoIP phone with roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ARMv6 CPU around 500 MHz&lt;/li&gt;
&lt;li&gt;about 244 MB of RAM&lt;/li&gt;
&lt;li&gt;Linux 2.6.18&lt;/li&gt;
&lt;li&gt;a 640×480 framebuffer&lt;/li&gt;
&lt;li&gt;a physical numeric keypad&lt;/li&gt;
&lt;li&gt;Ethernet&lt;/li&gt;
&lt;li&gt;enough internal flash storage to make things interesting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The phone cost me about €35.&lt;/p&gt;

&lt;p&gt;Naturally, the first reasonable question was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can it run DOOM?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting graphics on the screen
&lt;/h2&gt;

&lt;p&gt;The useful discovery was &lt;code&gt;/dev/fb1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The phone exposes its LCD as a framebuffer, so instead of trying to build some strange Cisco UI application, I could render pixels directly.&lt;/p&gt;

&lt;p&gt;The display is 640×480×32-bit.&lt;/p&gt;

&lt;p&gt;DOOM itself renders at 640×400, so I center the game vertically with a small offset.&lt;/p&gt;

&lt;p&gt;That gave me the first important milestone:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;native DOOM graphics on the Cisco display.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the real Cisco buttons
&lt;/h2&gt;

&lt;p&gt;The phone also exposes its keypad through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/dev/cisco_keypad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That meant I could read the actual hardware keys instead of attaching a USB keyboard.&lt;/p&gt;

&lt;p&gt;I added a small input layer to the DOOM backend and mapped the Cisco keys to useful game controls.&lt;/p&gt;

&lt;p&gt;The result is wonderfully ridiculous: the keypad of a business phone is now a DOOM controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sound was harder
&lt;/h2&gt;

&lt;p&gt;Video was relatively straightforward.&lt;/p&gt;

&lt;p&gt;Audio was not.&lt;/p&gt;

&lt;p&gt;Cisco's software stack has its own media services, audio devices and assumptions about how sound is supposed to reach the speaker.&lt;/p&gt;

&lt;p&gt;Several approaches failed before I found a working path.&lt;/p&gt;

&lt;p&gt;Eventually the game audio was routed through the phone's own audio system, and later the whole setup was made independent of my workstation.&lt;/p&gt;

&lt;p&gt;So the final version no longer needs another computer to provide the game or audio during normal use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it survive a reboot
&lt;/h2&gt;

&lt;p&gt;Running DOOM once over SSH was fun, but I wanted something much better:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;boot the Cisco normally&lt;/li&gt;
&lt;li&gt;open the Applications menu&lt;/li&gt;
&lt;li&gt;select DOOM&lt;/li&gt;
&lt;li&gt;play&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The final setup lives on the phone's persistent flash storage and starts a small local service bound to &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The Applications menu points to that local service.&lt;/p&gt;

&lt;p&gt;That means there is no external web server involved when launching the game.&lt;/p&gt;

&lt;p&gt;I can disconnect the network cable, reboot the phone and still launch DOOM from the Cisco UI.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The final result
&lt;/h2&gt;

&lt;p&gt;The CP-9951 is now simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a SIP phone&lt;/li&gt;
&lt;li&gt;a small ARM Linux computer&lt;/li&gt;
&lt;li&gt;a DOOM machine&lt;/li&gt;
&lt;li&gt;a display&lt;/li&gt;
&lt;li&gt;a speaker&lt;/li&gt;
&lt;li&gt;and a hardware game controller&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Was any of this necessary?&lt;/p&gt;

&lt;p&gt;Absolutely not.&lt;/p&gt;

&lt;p&gt;Was it worth doing?&lt;/p&gt;

&lt;p&gt;Absolutely.&lt;/p&gt;




&lt;p&gt;I documented the full experiment, including the failed approaches, framebuffer work, audio investigation and hardware details here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Original field note:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.dennishilk.com/museum/home-computing-lab/field-notes/field-note-7/" rel="noopener noreferrer"&gt;https://www.dennishilk.com/museum/home-computing-lab/field-notes/field-note-7/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/dennishilk" rel="noopener noreferrer"&gt;https://github.com/dennishilk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>retrocomputing</category>
      <category>doom</category>
    </item>
  </channel>
</rss>
