xref: /freebsd/sys/dev/videomode/modelines2c.awk (revision 2a58b312b62f908ec92311d1bd8536dbaeb8e55b)
1#! /usr/bin/awk -f
2#	$NetBSD: modelines2c.awk,v 1.4 2006/10/26 23:19:50 bjh21 Exp $
3#	$FreeBSD$
4#
5# Copyright (c) 2006 Itronix Inc.
6# All rights reserved.
7#
8# Written by Garrett D'Amore for Itronix Inc.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18# 3. The name of Itronix Inc. may not be used to endorse
19#    or promote products derived from this software without specific
20#    prior written permission.
21#
22# THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
23# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
26# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29# ON ANY THEORY OF LIABILITY, WHETHER IN
30# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32# POSSIBILITY OF SUCH DAMAGE.
33#
34
35BEGIN {
36	nmodes = 0;
37}
38
39NR == 1 {
40	split($0,v,"$");
41
42	VERSION=v[2];
43
44	printf("/*\t$NetBSD" "$\t*/\n\n");
45	printf("/*\n") ;
46	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n");
47	printf(" *\n");
48	printf(" * generated from:\n");
49	printf(" *\t%s\n", VERSION);
50	printf(" */\n\n");
51
52	printf("#include <sys/cdefs.h>\n");
53	printf("__KERNEL_RCSID(0, \"$NetBSD" "$\");\n\n");
54
55	printf("#include <dev/videomode/videomode.h>\n\n");
56
57	printf("/*\n");
58	printf(" * These macros help the modelines below fit on one line.\n");
59	printf(" */\n");
60	printf("#define HP VID_PHSYNC\n");
61	printf("#define HN VID_NHSYNC\n");
62	printf("#define VP VID_PVSYNC\n");
63	printf("#define VN VID_NVSYNC\n");
64	printf("#define I VID_INTERLACE\n");
65	printf("#define DS VID_DBLSCAN\n");
66	printf("\n");
67
68	printf("#define M(nm,hr,vr,clk,hs,he,ht,vs,ve,vt,f) \\\n");
69	printf("\t{ clk, hr, hs, he, ht, vr, vs, ve, vt, f, nm } \n\n");
70
71	printf("const struct videomode videomode_list[] = {\n");
72
73	next
74}
75
76(/^ModeLine/) {
77	dotclock =   $3;
78
79	hdisplay =   $4;
80	hsyncstart = $5;
81	hsyncend =   $6;
82	htotal =     $7;
83
84	vdisplay =   $8;
85	vsyncstart = $9;
86	vsyncend =   $10;
87	vtotal =     $11;
88
89	macro =      "MODE";
90	iflag =      "";
91	iflags =     "";
92	hflags =     "HP";
93	vflags =     "VP";
94
95	if ($12 ~ "^-")
96		hflags = "HN";
97
98	if ($13 ~ "^-")
99		vflags = "VN";
100
101	ifactor=1.0;
102	if ($14 ~ "[Ii][Nn][Tt][Ee][Rr][Ll][Aa][Cc][Ee]") {
103		iflag = "i";
104		iflags = "|I";
105		ifactor = 2.0;
106	}
107
108	# We truncate the vrefresh figure, but some mode descriptions rely
109	# on rounding, so we can't win here.  Adding an additional .1
110	# compensates to some extent.
111
112	hrefresh= (dotclock * 1000000) / htotal;
113	vrefresh= int(((hrefresh * ifactor) / vtotal) + .1);
114
115	modestr = sprintf("%dx%dx%d%s", hdisplay, vdisplay, vrefresh, iflag);
116
117#	printf("/* %dx%d%s refresh %d Hz, hsync %d kHz */\n",
118#	    hdisplay, vdisplay, iflag, vrefresh, hrefresh/1000);
119	printf("M(\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%d,%s),\n",
120	    modestr,
121	    hdisplay, vdisplay, dotclock * 1000,
122	    hsyncstart, hsyncend, htotal,
123	    vsyncstart, vsyncend, vtotal, hflags "|" vflags iflags);
124
125	modestr = sprintf("%dx%dx%d%s",
126	    hdisplay/2 , vdisplay/2, vrefresh, iflag);
127
128	dmodes[nmodes]=sprintf("M(\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%d,%s),",
129	    modestr,
130	    hdisplay/2, vdisplay/2, dotclock * 1000 / 2,
131	    hsyncstart/2, hsyncend/2, htotal/2,
132	    vsyncstart/2, vsyncend/2, vtotal/2,
133	    hflags "|" vflags "|DS" iflags);
134
135	nmodes = nmodes + 1
136
137}
138
139END {
140
141	printf("\n/* Derived Double Scan Modes */\n\n");
142
143	for ( i = 0; i < nmodes; i++ )
144	{
145		print dmodes[i];
146	}
147
148	printf("};\n\n");
149	printf("const int videomode_count = %d;\n", nmodes);
150}
151