summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/dmt.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/scripts/dmt.py b/scripts/dmt.py
new file mode 100755
index 0000000..82defb6
--- /dev/null
+++ b/scripts/dmt.py
@@ -0,0 +1,107 @@
+#!/usr/bin/python3
+
+import sys
+import re
+
+# Convert DMT pdf to txt:
+# pdftotext -layout -f 18 -l 105 DMTr1\ v13.pdf DMT.txt
+
+# Path to the text file
+filepath = sys.argv[1]
+
+m = {}
+line = ""
+
+def parsei(key, regex, base=10):
+ global m
+ global line
+
+ match = re.search(regex, line)
+ if match != None:
+ m[key] = int(match.group(1), base)
+
+def parsef(key, regex, base=10):
+ global m
+ global line
+
+ match = re.search(regex, line)
+ if match != None:
+ m[key] = float(match.group(1))
+
+for line in open(filepath, 'r'):
+ # each page starts with this
+ if "VESA MONITOR TIMING STANDARD" in line:
+ m = { }
+
+ # each page ends with this
+ if "VESA Display Monitor Timing Standard" in line:
+ print("// {:#x} - {}".format(m["dmt_id"], m["name"]))
+
+ flags = []
+ if m["ilace"]:
+ flags += [ "DRM_MODE_FLAG_INTERLACE" ]
+
+ if m["hsp"]:
+ flags += [ "DRM_MODE_FLAG_PHSYNC" ]
+ else:
+ flags += [ "DRM_MODE_FLAG_NHSYNC" ]
+
+ if m["vsp"]:
+ flags += [ "DRM_MODE_FLAG_PVSYNC" ]
+ else:
+ flags += [ "DRM_MODE_FLAG_NVSYNC" ]
+
+ print("DRM_MODE(\"{}\", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}),".format(
+ m["name"],
+ int(m["pclk"] * 1000),
+ m["hact"], m["hfp"], m["hsw"], m["hbp"],
+ m["vact"], m["vfp"], m["vsw"], m["vbp"],
+ " | ".join(flags)
+ ))
+
+ match = re.search("Timing Name\s+=\s+([^;]+)", line)
+ if match != None:
+ m["name"] = str.strip(match.group(1))
+
+ parsei("dmt_id", "EDID ID:\s+DMT ID: ([0-9A-Fa-f]+)h", 16)
+ parsef("pclk", "Pixel Clock\s+=\s+(\d+\.\d+)")
+
+ parsei("hact", "Hor Pixels\s+=\s+(\d+)")
+ parsei("hfp", "H Front Porch.*\s(\d+) Pixels")
+ parsei("hsw", "Hor Sync Time.*\s(\d+) Pixels")
+ parsei("hbp", "H Back Porch.*\s(\d+) Pixels")
+
+ parsei("vact", "Ver Pixels\s+=\s+(\d+)")
+ parsei("vfp", "V Front Porch.*\s(\d+)\s+lines")
+ parsei("vsw", "Ver Sync Time.*\s(\d+)\s+lines")
+ parsei("vbp", "V Back Porch.*\s(\d+)\s+lines")
+
+ match = re.search("Scan Type\s+=\s+(\w+);", line)
+ if match != None:
+ if match.group(1) == "NONINTERLACED":
+ m["ilace"] = False
+ elif match.group(1) == "INTERLACED":
+ m["ilace"] = True
+ else:
+ print("Bad scan type")
+ exit(-1)
+
+ match = re.search("Hor Sync Polarity\s+=\s+(\w+)", line)
+ if match != None:
+ if match.group(1) == "POSITIVE":
+ m["hsp"] = True
+ elif match.group(1) == "NEGATIVE":
+ m["hsp"] = False
+ else:
+ print("Bad hsync polarity")
+ exit(-1)
+
+ match = re.search("Ver Sync Polarity\s+=\s+(\w+)", line)
+ if match != None:
+ if match.group(1) == "POSITIVE":
+ m["vsp"] = True
+ elif match.group(1) == "NEGATIVE":
+ m["vsp"] = False
+ else:
+ print("Bad vsync polarity")
+ exit(-1)