[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:16468] Re: Modeline on XF86Config



やまだ@NTTです.

okada>     XF86Config の中に書かれている, Modeline の書き方をごぞん知の方いらっ
okada> しゃいませんでしょうか?  特にモニタの水平,垂直周波数とドットク
okada> ロックから
okada> Modeline行に書かれている数値を計算する式が知りたいのです。
okada> よろしくお願いします.

たぶん他の人からはドキュメントのありかについてご指摘があると思いますの
で違う観点で.

ちょっとご希望と違うかも知れませんが,
水平解像度,垂直解像度,ドットクロック,水平周波数
から適当にModelineをでっちあげるスクリプトを添付します.
水平周波数を省略しても適当に計算してくれます.

使用例
% mkmodeline2 640 480 25.175 31.5
-------------------------------modeline---------------------------------
#V-Freq 56.3Hz, H-Freq 31.5kHz
Modeline "640x480" 25.175   640  672  768  800   480  483  487  559
------------------------------------------------------------------------

---------->8 cut here ---------->8 cut here ---------->8 cut here
#!/usr/bin/perl
# @(#)$Id: mkmodeline2,v 1.1 1998/03/25 13:51:58 tetsu Exp $

&usage() unless ($ARGV[2]);

##### default
$VFLRatio=1046;	# typically, 1050 (1.05), 5% increase.
$HsyncL=3190;	# it is too tight to h-sync (3.19 us)
$HsyncH=4110;	# it is too wide to h-sync (4.11 us)
##### 1280x1024 75Hz 79.9kHz
$VFLRatio=1042;
$HsyncL=2548;
##### 1152x864 80Hz 76.3kHz
$VFLRatio=1105;
$HsyncL=2000;
##### 1024x768 100Hz 79.0kHz
$VFLRatio=1028;
$HsyncL=2763;
##### 800x600 100Hz 62.5kHz
$VFLRatio=1049;
$HsyncL=3081;

# testing

##### 800x600 100Hz 62.5kHz
$VFLRatio=1043;
$HsyncL=3082;
##### 800x600 100Hz 62.5kHz
$VFLRatio=1043;
$HsyncL=3082;
##### 800x600 90Hz 57.0kHz
$VFLRatio=1057;
$HsyncL=2200;

##### 1152x864 75Hz 75.1kHz
$VFLRatio=1160;
$HsyncL=2200;
##### 1152x864 75Hz 75.1kHz
$VFLRatio=1166;
$HsyncL=2181;

$Fix=1000;

$Vsync=150;	# 150ns for V-sync

$HGT=32;	# Guard Clock (>30, required)
$VGT=3;		# Guard for V-sync

$magic = 4;	# 三捨四入(4)か切上げ(7)か切捨て(0)か

$HR=$ARGV[0];
$VR=$ARGV[1];
$DCF=$ARGV[2];

print "-------------------------------modeline---------------------------------\n";
if (defined($ARGV[3])) {
    $HSF=$ARGV[3];
    &calc_loop();
} else {
    $HSF=200;
    &calc_loop();
    $HSF=10;
    &calc_loop();
}
print "------------------------------------------------------------------------\n";
exit(0);

sub calc_loop {
    do {
	$result = &calc();
	if ($result != 0) {
	    $HSF += $result;
	}
    } until ($result == 0);
    printf "#V-Freq %.1fHz, H-Freq %.1fkHz\n", $Vfq, $HSF;
    printf "Modeline \"%sx%s\" %s  %4d %4d %4d %4d  %4d %4d %4d %4d\n", $HR, $VR, $DCF, $HR, $SH1, $SH2, $HFL, $VR, $SV1, $SV2, $VFL;
}

sub calc {
    $SH1=$HR+$HGT;
    $SV1=$VR+$VGT;
    $HFL=int(($DCF*1000/$HSF+$magic)/8)*8;
    $VFL=int($VR*$VFLRatio/$Fix);
    $SH2=$HFL-$HGT;
    $SV2=$SV1+int($Vsync*$DCF/$HFL);

    $Xdl=$DCF*$HsyncL/$Fix;
    $Xdh=$DCF*$HsyncH/$Fix;
    $Xdiff=$SH2-$SH1;
    $Afl=$HFL*$VFL;
    $Vfq=$DCF*1000000/$Afl;

##echo "\n		$Xdl <= $Xdiff <= $Xdh ?"
    if ( $Xdiff <= $Xdl ) {
#  print STDERR "HSF is too high or DCF is too low\n";
	$rHFL=$SH1+$Xdl+$HGT;
	$rHSFH=int($DCF*1000/$rHFL);
	$rHSFL=int($DCF*10000/$rHFL)-$rHSFH*10;
#  print STDERR "Please set HSF  lesser  than $rHSFH.$rHSFL\n";
	$magic = 0;
	return -0.1;
    }
    if ( $Xdiff >= $Xdh ) {
#  print STDERR "HSF is too low or DCF is too high\n";
	$rHFL=$SH1+$Xdh+$HGT+3; # '3' is adhoc.
	$rHSFH=int($DCF*1000/$rHFL);
	$rHSFL=int($DCF*10000/$rHFL)-$rHSFH*10;
#  print STDERR "Please set HSF  greater than $rHSFH.$rHSFL\n";
	$HSF+=0.1;
	$magic = 7;
	return 0.1;
    }
    return 0;
}

sub usage {
    print STDERR "Usage: $0 HR VR DCF [HSF]\n";
    exit(1);
}
---------->8 cut here ---------->8 cut here ---------->8 cut here

--
Tetsuyasu YAMADA (山田 哲靖)
Network Transport Software Project, NTT Network Service Systems Labs.
Email: yamada.tetsuyasu@xxxxxxxxxxxxxxx, Fax: 0422-37-7719