diff options
-rwxr-xr-x | scripts/dmt.py | 107 |
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) |