1#! /usr/bin/awk -f 2# $NetBSD: modelines2c.awk,v 1.4 2006/10/26 23:19:50 bjh21 Exp $ 3# $OpenBSD: modelines2c.awk,v 1.2 2012/12/05 23:20:22 deraadt Exp $ 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$OpenBSD" "$\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/types.h>\n"); 53 54 printf("#include <dev/videomode/videomode.h>\n\n"); 55 56 printf("/*\n"); 57 printf(" * These macros help the modelines below fit on one line.\n"); 58 printf(" */\n"); 59 printf("#define HP VID_PHSYNC\n"); 60 printf("#define HN VID_NHSYNC\n"); 61 printf("#define VP VID_PVSYNC\n"); 62 printf("#define VN VID_NVSYNC\n"); 63 printf("#define I VID_INTERLACE\n"); 64 printf("#define DS VID_DBLSCAN\n"); 65 printf("\n"); 66 67 printf("#define M(nm,hr,vr,clk,hs,he,ht,vs,ve,vt,f) \\\n"); 68 printf("\t{ clk, hr, hs, he, ht, vr, vs, ve, vt, f, nm } \n\n"); 69 70 printf("const struct videomode videomode_list[] = {\n"); 71 72 next 73} 74 75(/^ModeLine/) { 76 dotclock = $3; 77 78 hdisplay = $4; 79 hsyncstart = $5; 80 hsyncend = $6; 81 htotal = $7; 82 83 vdisplay = $8; 84 vsyncstart = $9; 85 vsyncend = $10; 86 vtotal = $11; 87 88 macro = "MODE"; 89 iflag = ""; 90 iflags = ""; 91 hflags = "HP"; 92 vflags = "VP"; 93 94 if ($12 ~ "^-") 95 hflags = "HN"; 96 97 if ($13 ~ "^-") 98 vflags = "VN"; 99 100 ifactor=1.0; 101 if ($14 ~ "[Ii][Nn][Tt][Ee][Rr][Ll][Aa][Cc][Ee]") { 102 iflag = "i"; 103 iflags = "|I"; 104 ifactor = 2.0; 105 } 106 107 # why the additional .1 to vrefresh? well it seems that awk likes to 108 # make some "rounding errors", and this will compensate 109 110 hrefresh= (dotclock * 1000000) / htotal; 111 vrefresh= int(((hrefresh * ifactor) / vtotal) + .1); 112 113 modestr = sprintf("%dx%dx%d%s", hdisplay, vdisplay, vrefresh, iflag); 114 115# printf("/* %dx%d%s refresh %d Hz, hsync %d kHz */\n", 116# hdisplay, vdisplay, iflag, vrefresh, hrefresh/1000); 117 printf("M(\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%d,%s),\n", 118 modestr, 119 hdisplay, vdisplay, dotclock * 1000, 120 hsyncstart, hsyncend, htotal, 121 vsyncstart, vsyncend, vtotal, hflags "|" vflags iflags); 122 123 modestr = sprintf("%dx%dx%d%s", 124 hdisplay/2 , vdisplay/2, vrefresh, iflag); 125 126 dmodes[nmodes]=sprintf("M(\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%d,%s),", 127 modestr, 128 hdisplay/2, vdisplay/2, dotclock * 1000 / 2, 129 hsyncstart/2, hsyncend/2, htotal/2, 130 vsyncstart/2, vsyncend/2, vtotal/2, 131 hflags "|" vflags "|DS" iflags); 132 133 nmodes = nmodes + 1 134 135} 136 137END { 138 139 printf("\n/* Derived Double Scan Modes */\n\n"); 140 141 for ( i = 0; i < nmodes; i++ ) 142 { 143 print dmodes[i]; 144 } 145 146 printf("};\n\n"); 147 printf("const int videomode_count = %d;\n", nmodes); 148} 149