Home | History | Annotate | Download | only in scripts
      1 #!/usr/bin/python3
      2 
      3 import sys
      4 import re
      5 
      6 # Convert DMT pdf to txt:
      7 # pdftotext -layout -f 18 -l 105  DMTr1\ v13.pdf DMT.txt
      8 
      9 # Path to the text file
     10 filepath = sys.argv[1]
     11 
     12 m = {}
     13 line = ""
     14 
     15 def parsei(key, regex, base=10):
     16 	global m
     17 	global line
     18 
     19 	match = re.search(regex, line)
     20 	if match != None:
     21 		m[key] = int(match.group(1), base)
     22 
     23 def parsef(key, regex, base=10):
     24 	global m
     25 	global line
     26 
     27 	match = re.search(regex, line)
     28 	if match != None:
     29 		m[key] = float(match.group(1))
     30 
     31 for line in open(filepath, 'r'):
     32 	# each page starts with this
     33 	if "VESA MONITOR TIMING STANDARD" in line:
     34 		m = { }
     35 
     36 	# each page ends with this
     37 	if "VESA Display Monitor Timing Standard" in line:
     38 		print("// {:#x} - {}".format(m["dmt_id"], m["name"]))
     39 
     40 		flags = []
     41 		if m["ilace"]:
     42 			flags += [ "DRM_MODE_FLAG_INTERLACE" ]
     43 
     44 		if m["hsp"]:
     45 			flags += [ "DRM_MODE_FLAG_PHSYNC" ]
     46 		else:
     47 			flags += [ "DRM_MODE_FLAG_NHSYNC" ]
     48 
     49 		if m["vsp"]:
     50 			flags += [ "DRM_MODE_FLAG_PVSYNC" ]
     51 		else:
     52 			flags += [ "DRM_MODE_FLAG_NVSYNC" ]
     53 
     54 		print("DRM_MODE(\"{}\", {}, {}, {}, {}, {}, {}, {}, {}, {}, {}),".format(
     55 			m["name"],
     56 			int(m["pclk"] * 1000),
     57 			m["hact"], m["hfp"], m["hsw"], m["hbp"],
     58 			m["vact"], m["vfp"], m["vsw"], m["vbp"],
     59 			" | ".join(flags)
     60 			))
     61 
     62 	match = re.search("Timing Name\s+=\s+([^;]+)", line)
     63 	if match != None:
     64 		m["name"] = str.strip(match.group(1))
     65 
     66 	parsei("dmt_id", "EDID ID:\s+DMT ID: ([0-9A-Fa-f]+)h", 16)
     67 	parsef("pclk", "Pixel Clock\s+=\s+(\d+\.\d+)")
     68 
     69 	parsei("hact", "Hor Pixels\s+=\s+(\d+)")
     70 	parsei("hfp", "H Front Porch.*\s(\d+) Pixels")
     71 	parsei("hsw", "Hor Sync Time.*\s(\d+) Pixels")
     72 	parsei("hbp", "H Back Porch.*\s(\d+) Pixels")
     73 
     74 	parsei("vact", "Ver Pixels\s+=\s+(\d+)")
     75 	parsei("vfp", "V Front Porch.*\s(\d+)\s+lines")
     76 	parsei("vsw", "Ver Sync Time.*\s(\d+)\s+lines")
     77 	parsei("vbp", "V Back Porch.*\s(\d+)\s+lines")
     78 
     79 	match = re.search("Scan Type\s+=\s+(\w+);", line)
     80 	if match != None:
     81 		if match.group(1) == "NONINTERLACED":
     82 			m["ilace"] = False
     83 		elif match.group(1) == "INTERLACED":
     84 			m["ilace"] = True
     85 		else:
     86 			print("Bad scan type")
     87 			exit(-1)
     88 
     89 	match = re.search("Hor Sync Polarity\s+=\s+(\w+)", line)
     90 	if match != None:
     91 		if match.group(1) == "POSITIVE":
     92 			m["hsp"] = True
     93 		elif match.group(1) == "NEGATIVE":
     94 			m["hsp"] = False
     95 		else:
     96 			print("Bad hsync polarity")
     97 			exit(-1)
     98 
     99 	match = re.search("Ver Sync Polarity\s+=\s+(\w+)", line)
    100 	if match != None:
    101 		if match.group(1) == "POSITIVE":
    102 			m["vsp"] = True
    103 		elif match.group(1) == "NEGATIVE":
    104 			m["vsp"] = False
    105 		else:
    106 			print("Bad vsync polarity")
    107 			exit(-1)
    108