You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.5 KiB
108 lines
2.5 KiB
#!/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)
|