Reverse Engineering the GID Display on an Opel Astra H

A detailed reverse engineering project that intercepts signals from an Opel Astra H's GID display, decodes its protocol using a logic analyzer, and outputs the display content as composite video via an FPGA.

Introduction

Building a car PC (CarPC) has been my passion project for over a decade. It started years ago when I built a CarPC for a Moskvich 214145 using parts from an Opel Vectra A. Now, with more experience under my belt, I returned to this hobby — this time with an Opel Astra H. The core challenge: the factory monochrome graphical display (GID) sits in a prime dashboard location, but it serves as a gateway between different CAN bus systems, making simple replacement impossible without losing climate control functionality.

Opel Astra H dashboard with GID

The Problem

The GID display has an excellent dashboard location, but removing it creates several issues:

  • The climate system stops working without the GID connected
  • Having two displays in one car seems excessive and inelegant
  • The display shows valuable vehicle information that you don't want to lose

I purchased an LCD matrix and an RTD2662 controller board back in 2020, but the project sat on the shelf until recently when I decided to tackle it properly.

GID display unit

The Approach: Intercepting Display Signals

Rather than tapping into the CAN bus data (which the "Astra H CAN hackers" community has already thoroughly decoded), I chose a different approach: intercepting the signals going directly to the display matrix itself. This way, I could capture exactly what the display shows and output it to any external screen.

Display matrix removed

Display Specifications

The display uses an 80509CN matrix with two connectors:

  • Resolution: 218 x 138 pixels
  • Monochrome graphical display
  • Two identical internal controllers (confirmed by testing with the display rotated 180 degrees — both halves displayed correctly)
80509CN matrix closeup

Hardware Analysis: Discovering the Pinout

Using a multimeter, I traced connections between the two connectors, color-coding my findings:

  • Red — parallel connections (same signal going to both connectors)
  • Yellow — unique pins for each connector
Pinout mapping

Signal Analysis with an Oscilloscope

Connecting an oscilloscope to the data lines revealed:

  • An 8-bit data bus
  • Separate upper/lower controller selection signals
  • Stable voltage levels at 5V logic
  • Clean digital signals with well-defined edges
Oscilloscope readingsSignal analysis

Logic Analyzer Deep Dive

Using a DSLogic analyzer with 10ns sampling rate, I captured the complete communication protocol.

Logic analyzer capture

The protocol revealed eight commands for the upper display half:

[0xB0, 0x10, 0x05] [0xB1, 0x10, 0x05] [0xB2, 0x10, 0x05] [0xB3, 0x10, 0x05]
[0xB4, 0x10, 0x05] [0xB5, 0x10, 0x05] [0xB6, 0x10, 0x05] [0xB7, 0x10, 0x05]

And eight commands for the lower display half:

[0xB0, 0x12, 0x05] [0xB1, 0x12, 0x05] [0xB2, 0x12, 0x05] [0xB3, 0x12, 0x05]
[0xB4, 0x12, 0x05] [0xB5, 0x12, 0x05] [0xB6, 0x12, 0x05] [0xB7, 0x12, 0x05]
Protocol commands

Data Structure

Each transmission consists of:

  • 3 command bytes followed by 208 data bytes
  • Display width: 218 pixels (with 5-pixel margins on each side)
  • Refresh rate: approximately 1 Hz
  • Controller identified as similar to ST7565 (but with larger resolution)

Key signal lines:

  • nWE signal (negative polarity) — write enable, data latches on falling edge
  • DC signal — data/command selector (distinguishes between command and pixel data)
  • CS signals — chip select for upper/lower controller
Signal timing diagram

The first command byte, masked with 0xB0-0xB7, indicates the row sector. The third byte (0x05) indicates the starting column address. After 16 main transmissions (8 upper + 8 lower), padding fills the remaining pixels including off-screen areas.

Data structure analysis

Software Decoder in C#

I wrote the first decoder in C# to verify my understanding of the protocol before moving to hardware.

C# decoder output

The algorithm works as follows:

  • PictureBox sized at 872 x 512 pixels (4x magnification for visibility)
  • Framebuffer: 218 x 16 bytes
  • Main loop scans CSV lines exported from the logic analyzer, detecting nWE falling edges
  • Global variables track row and column counters plus a data validity flag
  • Filter first command by mask 0xF8: if result is 0xB0, extract row number using mask 0x07
  • For upper display: use row number as-is; for lower display: add 8
  • Extract column address bits from the second and third command bytes
  • Set validity flag for subsequent data writes; increment column counter for each write
Decoder algorithm visualization

Result: the display content was successfully decoded into a bitmap format, confirming the protocol analysis was correct.

Decoded bitmap result

FPGA Hardware Decoder

With the protocol understood, I moved to a hardware implementation using an Altera Cyclone IV EP4CE10 FPGA.

FPGA board

Key implementation details:

  • Built-in dual-port SRAM blocks for framebuffer storage
  • 5V to 3.3V level conversion using bidirectional buffers
  • OE (Output Enable) signal tied to constant logic 1

The decoder module, written in Verilog, ports the C# logic using three command-position states:

  • State 0: Check for 0xB0 command pattern, extract row address
  • State 1: Extract upper column address bits
  • State 2: Extract lower column address bits, enable data writes
Verilog state machine

The memory interface generates address, data, write-enable, and clock signals for the SRAM. Simulation was performed using iverilog with a testbench fed by converted CSV data from the logic analyzer.

Simulation waveforms

PAL/Composite Video Output

For maximum compatibility with aftermarket car head units, I chose CVBS (Composite Video Blank and Sync) output — virtually every car display supports this standard.

PAL output circuit

Implementation details:

  • 8-bit R2R DAC per signal (using 2 GPIO ports per output for sufficient current driving)
  • 16 total GPIO pins consumed for the video output
  • PAL standard timing with proper horizontal and vertical sync
R2R DAC schematic

One interesting challenge: alternating single white/black pixel rows caused visible flickering on the composite output. The solution was to double each row (white-white-black-black pattern), which eliminated the flicker artifacts but halved the effective vertical resolution to 64 lines. This was an acceptable tradeoff for this application.

Flicker fix comparison

The PAL timing generator uses a state machine implementing:

  • Broad sync sections
  • Short sync sections
  • Empty (blanking) lines
  • Full data lines with pixel content
  • Proper horizontal and vertical sync timing
PAL timing diagram

Address calculation synchronizes memory access with the visible frame region: horizontal pixels span clock cycles 573-2971 per line, vertical lines 16-271 are visible, with 10 output pixels per source pixel horizontally and 4 source lines per destination line vertically.

Top-Level Module Architecture

The complete system consists of three main components:

  • Decoder — captures GID signals, writes to SRAM port A
  • SRAM — dual-port memory (8-bit write on port A, 1-bit read on port B)
  • PAL — reads SRAM port B, generates composite video output
System architecture diagram

Debugging Challenges

The development process was far from smooth. I encountered numerous issues during simulation:

  • Incorrect address mapping between the write port and read port
  • Off-by-one errors in row calculations
  • Timing misalignment between the decoder and PAL output modules

Extended modeling with iverilog proved invaluable for identifying and resolving these issues before deploying to actual hardware.

Debug sessionWorking prototype

Results

The working system successfully:

  • Decodes the GID display protocol in real-time
  • Captures framebuffer data in FPGA SRAM
  • Generates CVBS output compatible with aftermarket head units
  • Preserves original GID functionality — the display continues to work normally in the vehicle
Final result on car displaySystem installed in carComposite video outputSide by side comparisonClose-up of outputComplete setupAnimated demo

Conclusion

The project isn't perfectly optimized — it was built hastily over 3-4 evenings — but I'm very satisfied with the results and learned an immense amount in the process. The approach of intercepting display signals rather than decoding CAN bus messages proved to be an elegant solution that captures exactly what the driver sees on the original GID, regardless of what system is generating the content.

Project complete

FAQ

What is this article about in one sentence?

This article explains the core idea in practical terms and focuses on what you can apply in real work.

Who is this article for?

It is written for engineers, technical leaders, and curious readers who want a clear, implementation-focused explanation.

What should I read next?

Use the related articles below to continue with closely connected topics and concrete examples.