From: Hans Verkuil <hans.verk...@cisco.com>

Support display descriptor tag 0xFA which reports more standard timings.

Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
---
 edid-decode.c | 88 +++++++++++++++++++++++++++++++----------------------------
 1 file changed, 46 insertions(+), 42 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 5a162b14..3ea3cb78 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -227,6 +227,47 @@ detailed_cvt_descriptor(unsigned char *x, int first)
     return valid;
 }
 
+static void print_standard_timing(uint8_t b1, uint8_t b2)
+{
+    const char *ratio;
+    unsigned int x, y, refresh;
+
+    if (b1 == 0x01 && b2 == 0x01)
+      return;
+
+    if (b1 == 0) {
+      printf("non-conformant standard timing (0 horiz)\n");
+      return;
+    }
+    x = (b1 + 31) * 8;
+    switch ((b2 >> 6) & 0x3) {
+    case 0x00:
+      if (claims_one_point_three) {
+        y = x * 10 / 16;
+        ratio = "16:10";
+      } else {
+        y = x;
+        ratio = "1:1";
+      }
+      break;
+    case 0x01:
+      y = x * 3 / 4;
+      ratio = "4:3";
+      break;
+    case 0x02:
+      y = x * 4 / 5;
+      ratio = "5:4";
+      break;
+    case 0x03:
+      y = x * 9 / 16;
+      ratio = "16:9";
+      break;
+    }
+    refresh = 60 + (b2 & 0x3f);
+
+    printf("  %dx%d@%dHz %s\n", x, y, refresh, ratio);
+}
+
 /* extract a string from a detailed subblock, checking for termination */
 static char *
 extract_string(unsigned char *x, int *valid_termination, int len)
@@ -329,8 +370,9 @@ detailed_block(unsigned char *x, int in_extension)
            printf("Color management data\n");
            return 1;
        case 0xFA:
-           /* TODO */
-           printf("More standard timings\n");
+           printf("More standard timings:\n");
+           for (i = 0; i < 6; i++)
+               print_standard_timing(x[5 + i * 2], x[5 + i * 2 + 1]);
            return 1;
        case 0xFB:
            /* TODO */
@@ -2100,46 +2142,8 @@ int main(int argc, char **argv)
     has_640x480p60_est_timing = edid[0x23] & 0x20;
 
     printf("Standard timings supported:\n");
-    for (i = 0; i < 8; i++) {
-      const char *ratio;
-      uint8_t b1 = edid[0x26 + i * 2], b2 = edid[0x26 + i * 2 + 1];
-      unsigned int x, y, refresh;
-
-      if (b1 == 0x01 && b2 == 0x01)
-       continue;
-
-      if (b1 == 0) {
-       printf("non-conformant standard timing (0 horiz)\n");
-       continue;
-      }
-      x = (b1 + 31) * 8;
-      switch ((b2 >> 6) & 0x3) {
-      case 0x00:
-       if (claims_one_point_three) {
-         y = x * 10 / 16;
-         ratio = "16:10";
-       } else {
-         y = x;
-         ratio = "1:1";
-       }
-       break;
-      case 0x01:
-       y = x * 3 / 4;
-       ratio = "4:3";
-       break;
-      case 0x02:
-       y = x * 4 / 5;
-       ratio = "5:4";
-       break;
-      case 0x03:
-       y = x * 9 / 16;
-       ratio = "16:9";
-       break;
-      }
-      refresh = 60 + (b2 & 0x3f);
-
-      printf("  %dx%d@%dHz %s\n", x, y, refresh, ratio);
-    }
+    for (i = 0; i < 8; i++)
+      print_standard_timing(edid[0x26 + i * 2], edid[0x26 + i * 2 + 1]);
 
     /* detailed timings */
     has_valid_detailed_blocks = detailed_block(edid + 0x36, 0);
-- 
2.14.1

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to