aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen2016-10-11 06:11:34 -0500
committerTomi Valkeinen2016-10-11 07:06:35 -0500
commit98bbceec4f501ab3cf26d57b0a99218220059f0a (patch)
treec1fcee99808470bdaf7a3fcf7898e33a1adfb620 /scripts
parent5d85e5db06a40d74c8e62bff0f82c8ce40abb230 (diff)
downloadexternal-libkmsxx-98bbceec4f501ab3cf26d57b0a99218220059f0a.tar.gz
external-libkmsxx-98bbceec4f501ab3cf26d57b0a99218220059f0a.tar.xz
external-libkmsxx-98bbceec4f501ab3cf26d57b0a99218220059f0a.zip
Add DMT script
Add script to auto-generate DMT tables. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/dmt.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/scripts/dmt.py b/scripts/dmt.py
new file mode 100755
index 0000000..82defb6
--- /dev/null
+++ b/scripts/dmt.py
@@ -0,0 +1,107 @@
1#!/usr/bin/python3
2
3import sys
4import 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
10filepath = sys.argv[1]
11
12m = {}
13line = ""
14
15def 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
23def 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
31for 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)