xref: /aosp_15_r20/external/libkmsxx/scripts/dmt.py (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
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