Making Your Own Technically-HDMI OLED Monitor

An 128x64 OLED display with a weird image on it, showing a mouse cursor, date and time in the bottom right corner, and a whole lot of presumably dithered dots

One day, [mitxela] got bored and decided to build his own HDMI monitor – the unconventional way. HDMI has a few high-speed differential pairs, but it also has an I2C interface used for detecting the monitor’s resolution and issuing commands like brightness control. In fact, I2C is the backbone for a lot of side channels like these – it’s also one of our preferred interfaces for connecting to cool sensors, and in this case, an OLED display!

[mitxela] describes his journey from start to end, with all the pitfalls and detours. Going through the pinout with a broken hence sacrificial HDMI cable in hand, he figured out how to probe the I2C lines with Linux command-line tools and used those to verify that the display was recognized on the HDMI-exposed I2C bus. Then, he turned to Python and wrote a short library for the display using the smbus bindings – and, after stumbling upon an FPS limitation caused by SMBus standard restrictions, rewrote his code to directly talk to the I2C device node, raising FPS from 2 to 5-10.

From there, question arose – what’s the best software route to take? He tried making a custom X modeline on the HDMI port the display was technically attached to, but that didn’t work out. In the end, he successfully employed the Linux capability called “virtual monitors”, and found out about an interesting peculiarity – there was no mouse cursor to be seen. Turns out, they’re typically hardware-accelerated and overlaid by our GPUs, but in [mitxela]’s case, the GPU was not involved, so he added cursor support to the picture forwarding code, too.

With partial refresh, the display could be redrawn even faster, but that’s where [mitxela] decided he’s reached a satisfactory conclusion to this journey. The write-up is a great read, and if videos are more your forte, he also made a video about it all – embedded below.

We first covered the ability to get I2C from display ports 14 years ago, and every now and then, this fun under-explored opportunity has been popping up in hackers’ projects. We’ve even seen ready-to-go breakouts for getting I2C out of VGA ports quickly. And if you go a bit further, with your I2C hacking skills, you can even strip HDCP!

We thank [sellicott] and [leo60228] for sharing this with us!

17 thoughts on “Making Your Own Technically-HDMI OLED Monitor

  1. That’s a pretty dope unconventional way to kill some time with a cheap, small lil OLED display I’m sure many (including myself) just have chilling in their hoarded spare parts collection. 👌 Great job with the detailed video too 🤓

    1. Last time I run over an ATtiny85 I had 8 puncture wounds. That’s not actually so bad for someone who came from the days of 40 PIN DIP or even 64 PIN.

      Pro tip, for anything over 16 Pin DIP, cut all the legs off and pull them out one at a time otherwise the pins rotate and slice their way out.

      If your pulling the whole chip out at once then use long nose pliers with one (nose?) under the chip and one over the top to keep it parallel.

        1. When I first read RöB’s response, I had a very clear recollection of using exactly that tool to remove a Z-80 from my foot at 2am one morning . (second attempt posting this, sorry if we end up with two posts)

  2. I have a project similar to this I2C hack. I tapped into I2C bus of the Laptop Panel and add the ADC chip connected to the 3 axis Accel sensor. Wrote some C code to read the ADC value and use it to Auto rotate the screen (xrandr) of Samsung N510 running Debian.

  3. Quote [Arsenijs Picugins] : “HDMI has a few high-speed differential pairs”

    Well that’s an improvement in the terminology often miss-used. So often I read that HDMI signalling is LVDS – low voltage differential signalling as though LVDS IS the protocol that is used by HDMI.

    If your sending signals at these data rates then your using Coaxial cable, Optical Fibre, Wave guides or LVDS (of some form usually over twisted pair like Gigabit Ethernet). In other-words the LVDS is a hardware specification and not a data protocol.

    The protocol used by HDMI (and DVI) is Transition-minimized Differential Signalling (TMDS). The “Transition Minimised” is a protocol to help data rates at the hardware level “differential signalling”.

    1. FYI: The actual signal level is closer to PECL than LVDS. PECL reference from the Vcc while LVDS is reference from GND.

      >HDMI leverages on the successful transition minimized differential signaling (TMDS) technology. The differential
      signals are +3.3 Volts, terminated in 50 Ω with nominal amplitude transitions of 500 mV (+2.8 V to +3.3 V).
      The voltage swing can vary from 150 mV to 800 mV. The signals have rise times of the order of 100 ps.

      For LVDS (from wiki)
      VOL 1.0 V
      VOH 1.4 V

  4. So… could you use this with a microcontroller that outputs IIC and have it switch inputs, so that the monitor could display an HDMI source OR the MCU output based on the selected source (HDMI 1 or HDMI 2)? That would make my year.

Leave a Reply

Please be kind and respectful to help make the comments section excellent. (Comment Policy)

This site uses Akismet to reduce spam. Learn how your comment data is processed.