OpenSolaris

Printable Version Enter a New Search
Bug ID 6536008
Synopsis DDC/I2C bus timings set incorrectly when probing monitors
State 10-Fix Delivered (Fix available in build)
Category:Subcategory xserver:xorg-server
Keywords
Responsible Engineer Alan Coopersmith
Reported Against
Duplicate Of
Introduced In
Commit to Fix snv_62
Fixed In snv_62
Release Fixed solaris_nevada(snv_62) , solaris_10u4(s10u4_06) (Bug ID:2148325)
Related Bugs
Submit Date 19-March-2007
Last Update Date 20-March-2007
Description
These fixes from Xorg community head should be imported to the Solaris Xorg tree.

Henry tested them and reported:

    I just tried this fix for libddc.so on my old CRT monitor
    ViewSonic P815, and i2c probing succeeded !

    With previous version of libddc (without the fix) i2c probing
    was unreliable (mostly failure) and I had to use VBE probing
    as fallback.

diff-tree 720f302d241e88e6e9f2962207da1aa9a79728b7 (from b5a8a71e64c76b8dd42962cbd7984215c6ce4aa8)
Author: Keith Packard < xxxxx@xxxxx.com>
Date:   Sat Mar 17 20:14:05 2007 -0700

    Slow down DDC I2C bus using a RiseFallTime of 20us for old monitors.

    This time value makes the bus run slowly enough for even the least reliable
    of monitors. Thanks to Pavel Troller for finding the necessary change.

diff --git a/hw/xfree86/ddc/xf86DDC.c b/hw/xfree86/ddc/xf86DDC.c
index 0f24c52..8080c8d 100644
--- a/hw/xfree86/ddc/xf86DDC.c
+++ b/hw/xfree86/ddc/xf86DDC.c
@@ -337,6 +337,12 @@ DDCRead_DDC2(int scrnIndex, I2CBusPtr pB
     unsigned char *R_Buffer;
     int i;

+    /*
+     * Slow down the bus so that older monitors don't
+     * miss things.
+     */
+    pBus->RiseFallTime = 20;
+
     if (!(dev = xf86I2CFindDev(pBus, 0x00A0))) {
     dev = xf86CreateI2CDevRec();
     dev->DevName = "ddc2";
diff-tree b5a8a71e64c76b8dd42962cbd7984215c6ce4aa8 (from 2489dae9f7def788910eee5733931392df83a0d6)
Author: Keith Packard < xxxxx@xxxxx.com>
Date:   Sat Mar 17 17:26:11 2007 -0700

    Remove extra (and wrong) I2C ByteTimeout setting in DDC code.

    The DDC code sets the I2C timeouts to VESA standards, except that it had an
    extra setting of the ByteTimeout value which was wrong (off by a factor of
    50). Removing this should help DDC work on many more monitors. Note that the
    Intel driver duplicated these settings, along with the error. Yay for cult
    and paste coding.

diff --git a/hw/xfree86/ddc/xf86DDC.c b/hw/xfree86/ddc/xf86DDC.c
index 4ce585c..0f24c52 100644
--- a/hw/xfree86/ddc/xf86DDC.c
+++ b/hw/xfree86/ddc/xf86DDC.c
@@ -344,7 +344,6 @@ DDCRead_DDC2(int scrnIndex, I2CBusPtr pB
     dev->ByteTimeout = 2200; /* VESA DDC spec 3 p. 43 (+10 %) */
     dev->StartTimeout = 550;
     dev->BitTimeout = 40;
-    dev->ByteTimeout = 40;
     dev->AcknTimeout = 40;

     dev->pI2CBus = pBus;
Work Around
N/A
Comments
N/A