As a hackerspace we regularly host user-groups and irregularly host talks and workshops and all of them need to use our beamer. Quite a downer then, that our beamer’s HDMI and DVI Input stopped working with newer laptop graphic cards. Especially since VGA started having it’s own issues: Dark slides transmitted over our long VGA cable cause the beamer to decide input has disappeared and switch the input off.
A look at the kernel messages with
dmesg made the source of the problem immediately apparent. The CRC of the EDID the beamer sends over the HDMI/DVI cable is wrong. (Interestingly enough, the beamer EDID sent over VGA is fine). As a result, newer laptops decide that no HDMI/DVI cable has actually been attached. Nothing you can do. Certainly not with any user tools like
xrandr or any Xorg driver or kernel module options. Believe us, we tried it all. (Even if a software solution would have been possible, it would certainly not have been convenient to hack each new speaker’s laptop and OS of choice on the spot.)
This needed fixing!
Rather than risking our beamer in a hunt for its EDID flash, which we might be able to re-flash, we decided to man-in-the-middle the cable and spoof the EDID sent by the beamer. A couple of ready-made solutions can be had on Amazon for anything from 30€ to 150€ but only one supports our beamers native resolution of 1280×800 and costs a whooping 75€.
We’re hackers however, and so built our own solution for <10€ from materials already lying around.
First we cut open a HDMI extension cable extracted the DDC wires as well as HDMI 5V and GND. DDC just uses I2C so in theory we can use any µC, connect the DDC wires leading to the host device (laptop) it’s SDA/SCL pins, make it answer requests for EDID information and be done.
There is even a ready made firmware project for an AVR ATtiny on GitHub which allowed us to get started right away and save a lot of time. (Beware the code is a bit crappy, can only send a single EDID and has problems with high-byte EDIDs, aka almost every modern EDID)
We used an ArduinoNanoV3 as a programmer for the ATtiny and after fighting the firmware a bit (high-bytes), managed to find an EDID setting that would both compile and result int a laptop-hdmi-signal that was accepted by our beamer. It’s a weird 71.9 Hz signal, but it works reliably at native 1280×800. The lack of additional EDID modes might even be a boon, since it prevents laptops with different aspect ratios to autoselect a resolution that would yield crappy results.
Finally we soldered the cable’s wires onto a 8pin socket and put whole thing in the casing of a dead H801. That way we still have the option of flashing better settings and firmware onto the ATtiny in the future. Add a few zip-ties for mechanical stability and voilà: Working HDMI port.
Note the zip-tie securing our hack to the fat HDMI extension.