Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

---

## [Unreleased]

### Fixed
- **GC573 green/white speckles and audio crackle on HDMI 2.0 sources (4K60, 1440p120):**
- The IT6664 input receiver was left at its fixed power-on equaliser (RS `0x1f`, forced), so >340 MHz TMDS links decoded a steady stream of wrong characters. The errors were re-encoded by the IT6664, so they showed up on the HDMI OUT passthrough too and were invisible to the IT6805. Windows was clean on the same hardware and cable.
- New `gc573_user_rx_eq.[ch]` drives both receivers (IT6664 input and IT6805 capture share the same ITE receiver core). On HDMI 2.0 lock it measures per-lane TMDS character errors (CED), leaves error-free links alone, and otherwise runs hardware auto-EQ with DFE taps, falling back to a per-lane RS sweep and skew retraining scored by measured errors.
- Hardware result (RetroTINK 4K, 4K60 RGB, ~593 MHz): input errors went from ~25,500 per 100 ms to 0 on every lane. Tuning adds ~0.75 s at signal lock.

### Added
- `[HDMI] TMDS errors B/G/R` line in `streamer.log` with per-lane error counts for the card input and the internal capture hop: every second while errors occur, otherwise every 10 s.
- `EVERLIVE_NO_AUTO_EQ=1` disables link equalisation; `EVERLIVE_EQ_INPUT_DFE=0` keeps the input on RS-only EQ (for comparison and troubleshooting).

## [1.4.0] - 2026-11-06

### Added
Expand Down
4 changes: 2 additions & 2 deletions tools/opengc573-userd/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ PW_LIBS = $(shell pkg-config --libs libpipewire-0.3)
# Frame generation is delegated to the system lsfg-vk Vulkan implicit layer,
# which the SDL2 "vulkan" renderer feeds directly. No GL, no Vulkan headers.

COMMON_OBJS = gc573_vfio.o gc573_user_i2c.o gc573_user_hw.o gc573_user_edid.o gc573_user_it6805.o gc573_user_it6664.o third_party/jsmn.o
COMMON_OBJS = gc573_vfio.o gc573_user_i2c.o gc573_user_hw.o gc573_user_edid.o gc573_user_it6805.o gc573_user_rx_eq.o gc573_user_it6664.o third_party/jsmn.o
STREAM_OBJS = gc573_user_fpga.o gc573_user_video.o gc573_user_audio.o gc573_user_bitstream.o gc573_user_nosignal.o gc573_user_ipc.o gc573_user_audio_tap.o gc573_user_hdr.o gc573_user_framegen.o
TARGETS = gc573_user_probe gc573_user_streamer everlive_userd gc573_user_diag
HEADERS = gc573-user-compat.h gc573_vfio.h gc573_user_i2c.h gc573_user_hw.h gc573_user_edid.h gc573_user_it6805.h gc573_user_it6664.h gc573_user_fpga.h gc573_user_video.h gc573_user_audio.h gc573_user_bitstream.h gc573_user_nosignal.h gc573_user_ipc.h gc573_user_audio_tap.h gc573_user_hdr.h gc573_user_framegen.h
HEADERS = gc573-user-compat.h gc573_vfio.h gc573_user_i2c.h gc573_user_hw.h gc573_user_edid.h gc573_user_it6805.h gc573_user_rx_eq.h gc573_user_it6664.h gc573_user_fpga.h gc573_user_video.h gc573_user_audio.h gc573_user_bitstream.h gc573_user_nosignal.h gc573_user_ipc.h gc573_user_audio_tap.h gc573_user_hdr.h gc573_user_framegen.h

all: $(TARGETS)

Expand Down
15 changes: 15 additions & 0 deletions tools/opengc573-userd/gc573_user_it6664.c
Original file line number Diff line number Diff line change
Expand Up @@ -2597,6 +2597,21 @@ static int it6664_handle_rx_lock(void *bar0)
return 0;
}

int gc573_user_it6664_relink_outputs(void *bar0)
{
if (!bar0)
return -EINVAL;
if (!g_rx_locked)
return 0;
/* Same state reset as an RX sync loss, then the normal lock path. */
g_tx2_powered = false;
g_tx2_output_enabled = false;
g_tx2_error_reported = false;
g_tx1_powered = false;
g_tx1_pclk_khz = 0;
return it6664_handle_rx_lock(bar0);
}

int gc573_user_it6664_poll(void *bar0, struct gc573_user_it6664_status *status)
{
struct gc573_user_it6664_status local = { 0 };
Expand Down
8 changes: 8 additions & 0 deletions tools/opengc573-userd/gc573_user_it6664.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ int gc573_user_it6664_enable_source(void *bar0);
int gc573_user_it6664_poll(void *bar0,
struct gc573_user_it6664_status *status);

/**
* gc573_user_it6664_relink_outputs - Re-arm TX1 (capture) and TX2 (HDMI
* OUT) as after a fresh RX lock. For when the RX input was disturbed (e.g.
* by equaliser changes) without the poll loop seeing sync drop, leaving the
* outputs on a stale clock. No-op unless the RX is locked.
*/
int gc573_user_it6664_relink_outputs(void *bar0);

/**
* gc573_user_it6664_pulse_hpd - Pulse upstream HDMI RX HPD to trigger source re-sync
* @bar0: Pointer to mapped BAR0 memory
Expand Down
Loading
Loading