Hackers play Doom on an Ikea lightbulb

Hackers play Doom on an Ikea lightbulb

When everything is a computer you can assume that everything can play Doom. The latest gadget to play Doom on modified hardware? An Ikea RF-controlled lamp with an onboard microprocessor.

It is, to be clear, really crazy.

The RGB GU10 IKEA TRÅDFRI LED1923R5 lamps contain a MGM210L RF module and an EFR32MG21 microcontroller. They also contain 1MB of flash, just enough space for a simpler version of Doom. To get the game to play, however, they couldn’t very well just port doom to a lightbulb. Instead, they connected the processor to a small screen and control buttons, leading to the most Frankensteined Doom machine I’ve seen in a while.

How does it run? Not well, but that’s to be expected since they’re using a damn lightbulb.

From a 80MHz Cortex M33 one would expect a constant 35 fps (max frame cap) on a display as small as 160×128 (actually rendered screen is 160×96, as 32 pixels are used for the status bar). In fact, such computing power is enough for a 320×200 display (assuming unlimited SPI bandwidth). The game is definitely playable, reaching more than 30 fps in many cases, and almost always is above 20 fps, even on complex areas. The major issue here is slow is external flash access. In fact, even if we can reach a peak 10MB/s, we need to take into account that random access is much slower, and flash access it is done by software and not by hardware.

In particular, the game performance does not depend too much on the level of complexity, but on the amount of graphics data that need to be drawn but it is not present in the internal flash. This means sprites and uncached textures. For instance, when there are many sprites on screen, we experienced frame rates as low as 16 fps.

You can read about the build on Next-Hack but it’s pretty complex and I doubt it’s for the faint of heart. But, then again, if they can get Doom to (sort of) run on a pregnancy test then an RGB Ikea light bulb should be a piece of cake.

%d bloggers like this: