#!/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)