Skip to the content
4 layers35 × 29 mmHdmi breakout, the printed circuit board in 3D

Hdmi breakout

flaviut/ceclink

The CECLink is a small device that can be used to allow a Linux computer to control a TV using the CEC protocol over HDMI.

Size
35 × 29 mm
Copper layers
4
Thickness
1.61 mm
Parts
6
Nets
31
Pads
68
Tracks, vias
200, 28
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
25 Sep 2026
Updated
26 Sep 2026

Overview

Hdmi breakout is an open-source printed circuit board by flaviut, from the flaviut/ceclink repository on GitHub. It is a 4-layer board of 35 × 29 mm with 6 parts on 31 nets, routed with 200 tracks and 28 vias.

Its parts include 4 connectors and 2 resistors. It belongs with the interfaces and adapters boards of this library.

README

README.md

CECLink

The CECLink is a small device that can be used to allow a Linux computer to control a TV using the CEC protocol over HDMI. This is particularly helpful for HTPCs, which often do not have the required hardware to do so built-in.

photo of the device

Why?

What's unique about this device is that it supports higher HDMI bandwidths. It is designed to work with and tested on a 4k, 10-bit HDR, 60FPS signal. This is done through following best practices for high-speed data lines.

While others devices look like this, and are made on a standard PCB (thanks karl for the photo):

Wires passing straight through a HDMI connector

This project's design looks a little different, as it follows best practices in the dark arts of RF design:

matched pairs for video lines

To be clear, this is not a secret technique! I would love to see others use this technique, and offer an updated commercial version of this device! All the details on how it works are in this source repo under pcb/, and I would be happy to talk about it.

Making your own

PCB

The hardware is split across two KiCad projects under pcb/. You will need to have both these boards produced:

  • pcb/hdmi-breakout — the HDMI passthrough that breaks out the CEC and DDC signals. It is a 4-layer board; order it with the JLC04161H-7628 stackup. The precise stackup is crucial for it to work.
  • pcb/xiao-rp2350-adaptor — a simple breakout for the XIAO RP2350 that connects to the HDMI breakout. This is an ordinary 2-layer board with no controlled-impedance requirement, so any standard stackup is fine.

The latest release has ready-to-order Gerber and drill archives: adapter.zip for the XIAO RP2350 adapter and hdmi-breakout.zip for the HDMI board.

Gerber and drill archives for each board can be generated with jlcpcb_fab.py.

Additional BOM (parts to source separately on top of the fabricated boards):

CountPart
2HDMI Type-A receptacle (Molex 208658-1001, LCSC C138388)
20603 100kΩ resistor
1XIAO RP2350
21×9 2.54mm male pin header strip
21×9 2.54mm female header / socket strip
2M3 × 16mm socket head cap screw
2M3 nut

Remember that you can easily cut a longer 2.54mm header to size with some snips.

Initial flash

Download firmware.uf2 from the latest release.

Hold the BOOT button while connecting the USB cable. Once powered, you should see a new drive on your computer. Copy-paste the .uf2 file over, and your device should be flashed.

CLI alternative
sh
picotool load -v -x ceclink.uf2

Operating system integration

This project tries to make use of the operating system drivers for the bulk of the integration, but this is unfortunately not fully sufficient. On Linux, inputattach connects the CEC serial interface to the Pulse-Eight kernel driver. A separate helper reads the HDMI physical address from the status interface and applies it to the kernel's CEC device.

Generic Linux installation

These instructions use systemd and udev to start the adapter automatically when it is plugged in, including after reboot.

Install the dependencies for your distribution:

Distribution familyInstall command
Debian / Ubuntusudo apt install curl inputattach python3-serial ddcutil v4l-utils
Fedorasudo dnf install curl linuxconsoletools python3-pyserial ddcutil v4l-utils
Arch Linuxsudo pacman -S curl linuxconsole python-pyserial ddcutil v4l-utils

Download the physical-address helper into /opt/ceclink and configure the kernel modules to load at boot:

sh
sudo install -d -m755 /opt/ceclink
sudo curl --fail --location https://raw.githubusercontent.com/flaviut/ceclink/HEAD/nix/physical-address.py -o /opt/ceclink/physical-address.py
sudo curl --fail --location https://raw.githubusercontent.com/flaviut/ceclink/HEAD/linux/ceclink.conf -o /etc/modules-load.d/ceclink.conf
sudo modprobe pulse8-cec
sudo modprobe i2c-dev

If modprobe pulse8-cec reports that the module is missing, your kernel needs the Pulse-Eight CEC driver (CONFIG_USB_PULSE8_CEC). Install your distribution's additional kernel modules package or use a kernel that includes this driver before continuing.

Install the two systemd service templates. The first attaches the CEC control port to the kernel driver; the second keeps the kernel's HDMI physical address synchronized with the adapter:

sh
sudo curl --fail --location https://raw.githubusercontent.com/flaviut/ceclink/HEAD/linux/pulse8-cec-inputattach@.service -o /etc/systemd/system/pulse8-cec-inputattach@.service

sudo curl --fail --location https://raw.githubusercontent.com/flaviut/ceclink/HEAD/linux/ceclink-physical-address@.service -o /etc/systemd/system/ceclink-physical-address@.service

Install the udev rules that start these services for the correct USB interfaces. Interface 00 carries CEC commands; interface 02 carries physical-address status:

sh
sudo curl --fail --location https://raw.githubusercontent.com/flaviut/ceclink/HEAD/linux/99-ceclink.rules -o /etc/udev/rules.d/99-ceclink.rules
sudo systemctl daemon-reload
sudo udevadm control --reload-rules

Connect the adapter in the HDMI path, then unplug and reconnect its USB cable. udev starts both services automatically; no systemctl enable is needed. Check that they are running and that the CEC device has a physical address:

sh
systemctl status 'pulse8-cec-inputattach@*' 'ceclink-physical-address@*'
sudo cec-ctl -d /dev/cec0

If you have multiple CEC devices, substitute the adapter's /dev/cecN path. To inspect service logs:

sh
journalctl -b -u 'pulse8-cec-inputattach@*' -u 'ceclink-physical-address@*'
NixOS integration

Things are much easier on NixOS. Add this repository to your system flake's inputs:

nix
inputs.ceclink.url = "github:flaviut/ceclink";

Include ceclink in your flake's outputs arguments and add its module to the host's existing nixosSystem module list:

nix
outputs = { nixpkgs, ceclink, ... }: {
  nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
    modules = [
      ./configuration.nix
      ceclink.nixosModules.default
    ];
  };
};

Development

Building

sh
nix develop
cargo build --locked --profile release-with-debug
picotool uf2 convert target/thumbv8m.main-none-eabihf/release-with-debug/ceclink -t elf ceclink.uf2

If direnv is enabled in your shell, run direnv allow once in this directory to enter the flake dev shell automatically.

For a reproducible production artifact:

sh
nix build .#firmware
ls result/ceclink.{uf2,elf}

Format the Nix and Rust sources with nix fmt.

Connections

XIAO pinRP2350 GPIORole
D9GPIO4Bidirectional CEC, open drain
D4GPIO6DDC SDA input only
D5GPIO7DDC SCL input only

D4 and D5 are receive-only GPIO inputs, not I²C master pins. Use a 100kΩ resistor between the HDMI bus and the RP2350.

Parts

6
QtyValueFootprintReferences
2100kResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR1, R2
2Conn_01x09Connector_PinHeader_2.54mm:PinHeader_1x09_P2.54mm_VerticalJ1, J4
2HDMI_A_1.4Connector_Video:HDMI_A_Molex_208658-1001_HorizontalJ2, J3

More from flaviut/ceclink

1
  • 2 layers35 × 29 mmXiao rp2350-adaptor, the printed circuit board in 3D

    Xiao rp2350-adaptor

    flaviut/ceclink

    The CECLink is a small device that can be used to allow a Linux computer to control a TV using the CEC protocol over HDMI.

    3 parts

Similar boards

  • 4 layers37.1 × 61.5 mmMCLZ8 PCB, the printed circuit board in 3D

    MCLZ8 PCB

    MicroCoreLabs/Projects

    Ted Fried's MicroCore Labs Projects - FPGA CPU cores and emulators for the 8088, 8086, 8051, 6502, 68000, Z80, Risc-V, and also Typewriter and EPROM Emulator projects.

    6 parts534
  • 4 layers15.6 × 51.4 mmHyperram 3p3v, the printed circuit board in 3D

    Hyperram 3p3v

    loxodes/vna

    Under development open hardware microwave vector network analyzer

    6 parts205
  • 4 layers37 × 27 mmProbecard pinheader, the printed circuit board in 3D

    Probecard pinheader

    azonenberg/starshipraider

    Open hardware test equipment

    6 parts193BSD-3-Clause
  • 4 layers312 × 111.2 mmPCIexpress x1 full, the printed circuit board in 3D

    PCIexpress x1 full

    lucanastasio/PCIexpress-KiCad

    PCI express libraries and templates for KiCad

    6 parts170
  • 4 layersEsp32s3 Wroom 1, the printed circuit board in 3D

    Esp32s3 Wroom 1

    BerkeleyHCI/PolymorphicBlocks

    A Python-based hardware description language for PCBs for higher-level (block-diagram / system-architecture level) PCB design through libraries of directly reusable subcircuit generators.

    6 parts94BSD-3-Clause
  • 4 layers29.4 × 22.1 mmAssembly power, the printed circuit board in 3D

    Assembly power

    buganini/Kikakuka

    Kikakuka — KiCad Workspace, Panelization, Build Variants, Differ & FreeCAD PCB Bending and Assembly

    6 parts81MIT
  • 4 layers30.2 × 40.6 mmMicrostrip width nightly, the printed circuit board in 3D

    Microstrip width nightly

    matthuszagh/fmcw

    6GHz frequency-modulated continuous-wave radar with real-time range detection

    6 parts66Apache-2.0
  • 4 layers149.9 × 99.1 mmArchimedes bus scope, the printed circuit board in 3D

    Archimedes bus scope

    google/myelin-acorn-electron-hardware

    Phillip Pearson's retro hardware projects for the Acorn Electron

    6 parts59Apache-2.0

Questions

How big is the Hdmi breakout PCB?

It measures 35 × 29 mm and has 4 copper layers, 1.61 mm thick.

What parts does the Hdmi breakout use?

6 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Hdmi breakout KiCad files?

From the flaviut/ceclink repository on GitHub, at the commit this page was made from: the board is pcb/hdmi-breakout/hdmi-breakout.kicad_pcb and its schematic pcb/hdmi-breakout/hdmi-breakout.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Hdmi breakout design in my own project?

Its repository states no licence, so its author keeps all rights: ask flaviut before reusing the design.