#!/usr/bin/perl

# Written by Michal Januszewski <spock@gentoo.org>
# Based on octave script from http://www.linuxdocs.org/HOWTOs/Framebuffer-HOWTO-14.html.
#
# Usage:
# xvidtune -show | ./modeline2fb.pl >> /etc/fb.modes

$modeline = <STDIN>;
$modeline =~ /".*"\s+([\d\.]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/;

$dcf = $1;
$hr = $2;
$sh1 = $3;
$sh2 = $4;
$hfl = $5;
$vr = $6;
$sv1 = $7;
$sv2 = $8;
$vfl = $9;

$pixclock = 1000000 / $dcf;
$left_margin = $hfl - $sh2;
$right_margin = $sh1 - $hr;
$hsync_len = $sh2 - $sh1;

# 3) vertical timings:
$upper_margin = $vfl - $sv2;
$lower_margin = $sv1 - $vr;
$vsync_len = $sv2 - $sv1;

$rr = $dcf / ($hfl * $vfl) *1e6;
$hsf = $dcf / $hfl * 1e3;

printf("mode \"%dx%d\"\n",$hr,$vr);
printf("   # D: %3.2f MHz, H: %3.2f kHz, V: %2.2f Hz\n", $dcf, $hsf, $rr);
printf("   geometry %d %d %d %d %d\n", $hr, $vr, $hr, $vr, 32);
printf("   timings %d %d %d %d %d %d %d\n",
                                 $pixclock, $left_margin, $right_margin,
                                 $upper_margin, $lower_margin,
                                 $hsync_len, $vsync_len);
printf("endmode\n");

