Part 1: Intro – HDMI/DVI Auto Switch
This project is in progress. Check back for updates!
I engineer HDMI products full time and often find myself switching my monitor between two signals. I also like to switch my monitors between two computers at home. I wanted an HDMI switcher, but I didn’t want to keep switching it manually. KVM switches are expensive and there usually aren’t many HDMI/DVI types anyway. So I set out to build something to make my life easier. This would also be useful, say, for attaching to a podium and switching between the podium PC and laptop. Plus I like making things, and learning about high-speed signals would be a good thing for me to do.
The idea is to have two HDMI inputs and one HDMI output. The device always routes port A to the output until a device is detected on port B. When detected, it switches the signal and maintains the switch until video is lost, then it reverts to port A. Detecting valid video is very complicated, looking at the 5V pin is not. I will use that to determine if video is present. This works most of the time, but not if the source is free-running or blanking. Good enough for me. Because this doesn’t re-encode the video into a single stream, it will cause a hot plug detect and likely a video blip. Still, simplicity is what I’m after here and I’m not overly concerned with how smooth the transition is.
I will add a button to manually switch (if both are present) and some status LED’s. I’d also like a serial port to control remotely if needed.
Timing Diagram – Detect B, trigger Switch
Selecting an IC that will switch HDMI signals is the first thing to do. Texas Instruments chips are by far my favorite to work with. The datasheets are really well laid out, their engineer support group is great, and they have a pretty large selection of stuff to pick from. I won’t limit myself to them, but I certainly will start there. HDMI is 4 pairs of differential signals, one of which is a clock. Ethernet is similar, so I started by looking for a ethernet mux.
Here are my requirements: cost isn’t too important since this is a very low-volume project. But lower cost is always better if possible. I am not setup to handle BGA packages, so I need something that has all (or most) pins exposed on the edge of the package. HDMI parts are going to be surface mount, as anything through hole would be ridiculous for high speed signals.
Specs: $3.48, TMDS+HPD+I2C switcher, 300 MHz maximum pixel clock, maximum 1080p with deep color (12-bit), GPIO or I2C control, TQFP package.
Notes: This is the most complex chip, considering its more advanced features like clock detection, sleep mode, TMDS voltage adjustment, etc. But I can use it in GPIO mode if I want too which is nice. It has the TQFP package and no ground or heatsink pads underneath, meaning I can solder easily with my equipment. It’s fine pitch (0.5mm) but that’s not too difficult to handle.
Specs: $2.74, TMDS switcher, 165 MHz maximum pixel clock, 3.3v supply, maximum 1080p, GPIO control, tssop package.
Notes: Simple switching chip, just drive the GPIO pin high or low. It doesn’t have a way to drive both to a high-impedance state. One must be switched. Package is awkward to route, both TMDS traces come out next to each other on the package. That would mean I would need to cross each trace at least once to route to different connectors.
Specs: $4.78, TMDS switcher, 225 MHz maximum pixel clock, 3.3v supply, maximum 1080p with deep color (12-bit), GPIO control, VFQFN package.
Notes: Simple switching chip, again a single GPIO pin controls which input is routed. Similar in many ways to the T3DV416, including the requirement one of the sources must be switched. Routing would be much easier, since traces are grouped by the source. This package has an exposed pad underneath. I could probably handle that with exposed copper on both layers and vias connecting them.
Specs: $2.17, TMDS+HPD+DDC switcher, 3.3v supply, GPIO control, output enable pin, VQFN package.
Notes: Simple to control switch. This one has HPD and DDC/AUX routing too, which is nice. But it looks like no I2C switch. Package is also more difficult to solder, though it is very small which would save on board space.
I am going with an Atmel chip for control, since they’re easy to work with. I will try to flash the bootloader using an Arduino, and flash the program using a FTDI USB-Serial bridge. I will use I2C communication to the chip since that gives me the most options. There will be a tactile button for manual control of switching, a dip switch for some runtime configuration, a programming header, and an expansion header for mating to other boards in the future.
TI has a reference design for this part. I will stick pretty close to that, because it’s a good reference. Other than the control of the part, the high speed traces will be almost the same. Though I ended up picking different ESD suppression IC’s for cost. They likely won’t be populated anyway, since they are DNI on the eval board.
After a lot of planning, I finished the schematic. You can download it as a PDF if you are interested. You can use this design for a non-commercial purpose as long as credit is given to me; but use this at your own risk.