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