25.12.2012-20.1.2013

Display-Controller für ein 15" Apple Powerbook LCD

1. Motivation

Aus einem defekten Apple Powerbook-Laptop (G4 A1138), den ich zufällig (als ich noch in Tokyo wohnte) in die Hände bekam, habe ich das 15.2" LCD ausgebaut und aufgehoben. Da es noch intakt aussah, habe ich es als Bastelprojekt ins Auge gefasst. Für die Ansteuerung bot sich aufgrund der digitalen Ansteuersignale (ERXC, ORXC) und der hohen (Pixel-)Clockrate von ca. 114.5Mhz ein Xilinx-FPGA an.

2. Display Infos

Hier ein paar Daten zum Display:
  • Samsung LTN152W6-L01
  • Auflösung: WXGA+ 1440x960
  • LCD Chip: WiseView LR04312X1A
  • Bittiefe: 6-Bit, 262K Colors
  • Typ: a-Si TFT-LCD
  • Ratio: 15:10
Ein pdf-Datasheet habe ich auf Google leider nicht gefunden. Aber es gab genügend Infos aus anderen LTN-Display-Datasheets und an dem LCD-Connector CN1 waren alle Signallabels aufgedruckt, was eine große Hilfe war.

3. Inverter

Infos folgen noch.

4. LCD-Kabel

Da das originale Display-Kabel sich nach etlichen Versuchen als zu filigran zum Abisolieren und Löten herausstellte, habe ich schlußendlich den originalen Connector CN1 abgelötet und ein Flachbandkabel direkt an das Display anstelle des alten CN1 angelötet. Allerdings hatte ich zu Anfang Bedenken, daß bei den hohen Clockraten der differenziellen LCD-Signale nicht etwa ein Übersprechen der Signale wegen fehlender Schirmung der einzelnen Leitungen am Flachbandkabel die Display-Ansteuerung überhaupt funktioniert...

4.1 CN1 Connector

Hier ein paar Photos von dem Umbau am LCD-Connector CN1:

Bild 1: Originaler Connector CN1

Bild 2: Abgelöteter CN1

Bild 3: CN1 mit Flachbandkabel

Bild 4: Gesamtbild LCD-Kabel

Bild 5: Adapter-Platine für LCD-Signale mit Stiftleiste

4.2 Pinbelegung CN1

Hier die Pinbelegung vom CN1-Konnektor:

PinSignal
30ERXC+
29ERXC
28GND
27ERX2+
26ERX2
25GND
24ERX1+
23ERX1
22GND
21ERX0+
20ERX0
19GND
PinSignal
18ORXC+
17ORXC
16GND
15ORX2+
14ORX2
13GND
12ORX1+
11ORX1
10GND
9ORX0+
8ORX0
PinSignal
7DATA_EDID
6CLK_EDID
5N.C.
4V_EDID
3VCC
2VCC
1GND

4.3 Legende zu den Display-Signalen

ERXC
Minus signal of even clock channel
ERX0...ERX2
Minus signal of even channel 0...2
ERXC+
Plus signal of even clock channel
ERX0+...ERX2+
Plus signal of even channel 0...2
ORXC
Minus signal of odd clock channel
ORX0...ORX2
Minus signal of odd channel 0...2
ORXC+
Plus signal of odd clock channel
ORX0+...ORX2+
Plus signal of odd channel 0...2
V_EDID
DDC power 3.3V
CLK_EDID
DDC clock
DATA_EDID
DDC data
GND
Ground
VCC
LCD logic and driver power 3.3V

4.4 Pinbelegung Flachbandkabel

PinSignal
25ERXC+
24ERXC
23GND
22ERX2+
21ERX2
20GND
19ERX1+
18ERX1
17ERX0+
16ERX0
PinSignal
15ORXC+
14ORXC
13ORX2+
12ORX2
11ORX1+
10ORX1
9ORX0+
8ORX0
PinSignal
7DATA_EDID
6CLK_EDID
5N.C.
4V_EDID
3VCC
2VCC
1 (rot)GND

4.5 Pinbelegung Stiftleisten-Adapter

Bild 6: Pinbelegung Stiftleisten

Tabelle 1: Pinbelegung Adapter-Stiftleiste
Pin2624222018161412108642
SignalGNDERXC+ERX2+ERX1+ERX0+ORXC+ORX2+ORX1+ORX0+DATA_EDIDN.C.VCCGND
Pin252321191715131197531
SignalGNDERXCERX2ERX1ERX0ORXCORX2ORX1ORX0CLK_EDIDV_EDIDVCCGND

5 EDID-Daten

Um die Display-Timings wie HSync, VSync, Back-/Front-Porch etc. für die Ansteuerung mit einem FPGA zu erhalten, hatte ich vor, die EDID-Daten vom Display auszulesen (Extended Display Identification Data, siehe Wikipedia).

5.1 EDID und DDC

Das Display hat einen VESA-DDC-Kanal (Data Display Channel, genauer DDC2B, siehe Wikipedia), der Infos/Daten zum Display aus einem EEPROM liefert. Der DDC-Kanal ist ein ganz normaler I2C-Bus, der bei diesen LCD allerdings mit 3.3V arbeitet (vermutet aufgrund Angaben in verwandten LTN-Datasheets), statt mit 5V-Pegel wie bei VGA-Connector.
Die Pins CLK_EDID und DATA_EDID entsprechen SCL und SDA an einem I2C-Bus. V_EDID muss mit 3.3V versorgt werden (wenn 3.3V Pegel richtig sind). Damit ich die EDID-Daten mit einem Logic-Analyzer (Zeroplus Logic Cube LAP-C) auslesen konnte, habe ich die EDID-Signale vom Display (DATA_EDID, CLK_EDID) an einem VGA-Connector (VGA-Terminator, siehe unten) bereitgestellt, und der Graphikkarte einen Monitor vorgegaukelt. Die Graphikkarte liest dann (mit einem I2C-Read) die EDID-Daten automatisch aus, wenn der VGA-Terminator mit dem PC VGA-Port verbunden wird.

5.2 I2C EDID IC's

Schaut man genauer auf Bild 1 dann sieht man über dem Connector CN1 die IC's für den I2C-Bus mit den EDID-Daten. Hier ein vergrößerter Ausschnitt von Bild 1 mit den IC2, IC3 und IC9:

Bild 8: I2C IC's

IC9 ist ein CAT24C16WP (Digikey oder Datasheet pdf) d.h. ein 16-Kb I2C CMOS Serial EEPROM. Pin 1 ist rechts oben mit einem weißen Dreieck markiert. SDA liegt auf Pin 5 (links unten), SCL auf Pin 6 (rechts davon), Pin 7 mit Write-Protection (WP) ist auf GND und damit nicht schreibgeschützt. Die beschriebenen Pins haben jeweils eigene Meßpunkte auf der Platine.

Zu IC2 (Aufdruck: MERA LFKB) und IC3 (Aufdruck: N529 A20RC) habe ich keine Infos und Datasheets gefunden. IC2 ist offenbar dem I2C EEPROM IC9 vorgeschaltet und dient dem Auslesen der EDID-Daten.

5.3 VGA-Terminator

Damit eine PC-Graphikkarte das Display als (Fake-) Monitor am VGA-Port erkennt (Monitor-Detection) habe ich einen "VGA-Terminator" angefertigt. Es werden dann VSync/HSync-Signale generiert, und über den DDC-Kanal EDID-Daten gelesen. Das Pinout vom VGA-Connector ist auf Wikipedia beschrieben.

Problem: wird lediglich der DDC-Port am VGA-Port bereitgestellt, erkennt der PC keinen Monitor und liest kein EDID aus. Die Graphikkarte macht nämlich ein Load-Sensing/Probe, ob an den RGB/HSync/VSync-Pins tatsächlich eine Last messbar ist. Daher musste ich die RGB-Pins und die HSync/Vsync-Signale mit Widerständen terminieren. Die Werte der Abschlußwiderstände habe ich einfach ermittelt, indem ich die Pins (R/G/B/Hsync/Vsync, Pins 1-6/2-7/3-8/13-5/14-5) gegen GND (Pin 5, 10) an einem Monitor durchgemessen habe. Für RGB (RED vs. RED_RTN, etc.) habe ich 70 Ohm, an Vsync/Hsync 2.2k gemessen. Sind HSync/VSync nicht terminiert, werden dort auch keine Signale generiert.

Hinweis: Die Verwendung der ID0...ID2-Pins (siehe ID-System auf Wikipedia) hatte übrigens keinen Einfluß auf die Monitor-Erkennung durch die Graphikkarte.

Recommended ist 75 Ohm Double-Termination für RGB-Signalpfade (siehe Datasheet NXP PTN3392), d.h. 75 Ohm Terminierung am RGB-DAC und 75 Ohm auf Monitorseite. Da hier beim VGA-Terminator aber keine genauen R-Werte für die Unterdrückung von Signalreflexionen an RGB-Signalen notwendig sind, habe ich näherungsweise R>75 Ohm genommen, die rumlagen, z.B. 2x46 Ohm=92 Ohm. Für HSync/VSync habe ich 1.8K verwendet.

Bild 7: VGA-Terminator, Eagle schematic
Bild 8,9: VGA-Terminator, Quick-and-dirty

5.2 Levelshifter I2C 3.3V/5V

In verwandten LTN-Datasheets, die ich gefunden habe, ist der EDID-Channel (I2C-Bus) der Displays immer mit 3.3V spezifiziert. Auf Seite der Graphikkarte am VGA-Connector allerdings ist für die EDID-Signale 5V TTL-Level vorgesehen. Da ich aufgrund des fehlenden Datasheets nicht sichergehen kann, daß der EDID-Channel von diesem Display auch 5V-tolerant ist, und ich den EDID-Channel durch direkte Verbindung mit VGA-EDID und 5V nicht gleich zerschießen möchte, brauche ich einen I2C-Levelshifter, der die I2C-Signale SCL und SDA in beide Richtungen zwischen Vdd=3.3V und 5V shiftet. Das ist ein bekanntes Problem und wird z.B. auf mikrocontroller.net beschrieben: I2C 3.3V und 5V oder Galvanische Trennung I2C-Bus oder Bidirektionaler Levelshifter für I2C mit MOSFET (Note: Problem bei Abschaltung der 5V-Seite während des Betriebes).

Logikpegel zur Erinnerung (siehe Wikipedia.de oder www.elektronik-kompendium.de):

LogicEingangAusgang
LOW (VIL)HIGH (VIH)LOW (VOL)HIGH (VOH)
TTL 5V≤0.8V≥2.0V≤0.4V≥2.4V
CMOS 5V≤1.5V≥3.5V≤0.5V≥4.44V
LVTTL 3.3V≤0.8V≥2.0V≤0.4V≥2.4V
CMOS(?) 3.3V≤0.99V
(0.3*Vcc)
≥2.31V
(0.7*Vcc)
≤0.99V≥2.31V

Ich habe mich für eine einfache Schaltung mit npn-Transistoren entschieden. Der Levelshifter mit npn-Transistoren funktionierte zwar in der LTspice Simulation (Schematic), aber nicht in Real-Live. Screenshot der LTspice-Simulation, wie es aussehen sollte (Rampe am Anfang offenbar vom Aufladen der Kapazitäten von Q1, Q2):

Bild 10: LTspice-Simulation npn-Levelshifter

Die beiden Spannungsquellen V3 und V4 erzeugen über MySwitch in der LTspice-Simulation Testpulse mit 100kHz jeweils hintereinander auf 3.3V- und dann TTL-Seite (bidirektionale Signalgenerierung). C1 glättet die Pulsspitzen an den steigenden Flanken auf LCD-Seite. Die Pullups am I2C mit R1=4.7k auf LCD-Seite und R3=2.2k auf VGA-Seite wurden mit dem Multimeter an SDA und SCL ausgemessen. Die Simulation sieht gut aus, aber in Real-Life wird der I2C-Write vom VGA-Port nicht auf LCD-Seite beantwortet. Das Oszi zeigt stark gefilterte Signalflanken (I2C-Takt SCL mit 5V-TTL-Signal [Ch1] auf VGA-Seite und 3.3V-Signal [Ch2] auf LCD-Seite):

Bild 11: I2C-SCL TTL- und 3.3V-Signal

Ein Ausmessen der Leitungskapazität an SDA und SCL am LCD-Kabel ergab ca. 570nF. Mit dieser Leitungskapazität C1 simuliert in LTspice kommt auf LCD-Seite allerdings kein vernünftiges Signal bei 100kHz mehr an. Es gab nun 2 Möglichkeiten:

  1. entweder SDA und SCL mit geschirmten Kabel neu testen, also C1 dann wieder ausmessen & LTspice-Simulation
  2. oder den I2C-Write auf VGA-Seite niedriger takten, z.B. mit 10kHz, dann muss der I2C-Write aber von manuell z.B. mit einem Evaluation-Board generiert werden

5.3 LAP-C EDID-Daten

Für die Aufzeichnung der I2C-Busdaten habe ich den preiswerten Logic-Analyzer LAP-C 16032 von Zeroplus verwendet. SCL ist getaktet mit 100kHz, das entspricht 100kbit/s. Das wurde mit dem Oszi gemessen, siehe Screenshot in Bild 11. Mit dem LAP-C (der Zeroplus Logic-Analyzer) wurde im Folgenden der I2C-Write vom Master (PC) an das Display (Adr. 0x50h) aufgezeichnet. Gesampled wurde mit 8-fachen der SCL-Rate, also mit 800kHz. Getriggert wurde auf die fallende Flanke von SCL:

Bild 12: LAP-C Logging I2C-Write

6 Testaufbau

zurück zur Übersicht