Linux XFree-to-Xinside mini-HOWTO by Marco Melgazzi, marco@techie.com v1.3, September 1997 JF Project, JF@linux.or.jp v1.3j, September 1997 XFree86 のモードラインを XInside/XiGraphics のモードラインに変換する方 法。 ______________________________________________________________________ 目次 1. はじめに 2. モード変換がなぜ必要か? 3. やってみよう! 4. Fixing up things 5. 最後に... 6. 手順の自動化 7. 謝辞 8. 著作権について 8.1 日本語訳について ______________________________________________________________________ 1. はじめに 1996年の春、ニュースグループ comp.os.linux.x には XFree86 と X の商用 版である XInside との間でビデオモードをどのように変換すればいいかとい う質問が数多く投稿されていました (XInside は現在 XiGraphics という名称 に変更されています。ただ、この文書では古い商品名の方を使っています。私 が解説しているのは主に XInside の方だからです)。 XInside が製品として発表される前に私はモニターをやっていたので、その評 価版がまだ私のハードディスク上に残っていました。問題を解決するのが好き な私は、この問題に取り組んでみようと思い、2, 3 時間いろいろいじって計 算をし、ある程度の成果が出たことから、それをすぐにニュースグループに投 稿しました。 モードライン変換についての議論自体は間もなく消えてしましましたが、それ でも私は自分の投稿に対する一通の感謝のメールを受取りました。それゆえ、 おそらくこの先、また他の誰かがこの情報を必要とするかもしれないと思い、 その時の投稿を mini-HOWTO にまとめようと決意しました。それが、いまあな たの読んでいるこの文書です。 まず最初にいくつか述べさせてください。私は、XInside の関係者ではありま せん。私が使ったのは XInside の Linux 用評価版 v1.2 だけですが、最近で は (1997年5月現在)、AccelX のバージョンは 3.1 になっています。ただ、こ の文書に記載した情報は、たとえ最新版にそのまま当てはまるわけではなくて も、今も有効だと思っています。 この HOWTO は非常に古い XInside のバージョンに基づいて解説しているの で、記載した情報の一部は現在では必ずしも正確でないかもしれません。後述 するように、XFree 3.2 が出たおかげで、私は商用の X サーバを購入しませ んでした。商用サーバを購入された方で、本書に不正確な情報があることに気 づかれた方は、是非私にメールで教えてください。 注意すべきなのは、モニタのタイミングをいじるというのは思わぬ事故や故障 につながるということです。それゆえ、私としては一切の保証はできません。 上手くいけば問題ないですが、コンピュータが火を噴いたとしても私はその責 任を負いません。 私の名前から推測がつくかと思いますが、私の母国語は英語ではありません。 おそらく英語の誤りがあちことにあるはずです。それについてはお詫びすると 同時に、英語に関する叱責で私のメールボックスが溢れてしまうことがないよ う大目に見ていただければと思います。 2. モード変換がなぜ必要か? 評価版 (および商用版 AFAIK) において、ビデオモードを自動で検出する (xvidtune のような) ユーティリティや、既存の XFree サーバのビデオモー ドをインポートするユーティリティを提供しない Xinside の方針は、理解に 苦しみます。その作業を(手動で)行うのに、私は 3 時間掛りました (作業の ヒント: VESA 1024x768@70Hz のエントリに関する両者のフォーマットを比較 します (電子工学のエンジニアみたい ;-) )。3 時間もあれば、Xinside のプ ログラマがきちんとした文書を書けるはずなのですが.... 私はバージョン 1.3 以降の評価版をダウンロードしていませんが、Xinside の関係者には是非こうした文書の不備を改善してほしいと考えています。とは いえ、そうした文書が出来たならばこの mini-HOWTO は無用になるとも思えま すが、それでも動作の仕組みに関して多少の理解を促進するものにはなるかと 思われます。 3. やってみよう! 既にあれこれいじり回した XFree86 モードがあり、それを Xinside にそのま ま移したいという状況であるとします。その場合、以下の手順を踏めば、それ を実現することが出来ます。ここでは私のデフォルトのビデオモードを実例と して、そのモードの変換方法を解説します。 XFree86 のエントリは次のようになっています。 Modeline "blahblah" DOTCLK A B C D a b c d A から D および a から d にはそれぞれ個別の意味があります。詳しくは、 「The Hitchhiker's Guide to X386/XFree86 Video Timinig」 (/usr/lib/X11/doc/VideoModes.doc) を見て欲しいのですが、基礎理論を知ら なくても変換自体は問題なく行うことが出来ます。 私の /usr/lib/X11/XF86Config のモードラインは次のようなものです。 Modeline "1168x876" 105 1168 1256 1544 1640 876 877 891 900 | | | | | | | | | DOT_CLK A B C D a b c d Xinside では、エントリを Xtimings ファイルに追加して、そのファイルを etc/ に置く必要があります (ここからは、/usr/X11/lib/X11/AcceleratedX といった Xaccel のトップディレクトリを起点にして話を進めます)。 ! Somewhere in the file, put here the name you want [PREADJUSTED_TIMING] PreadjustedTimingName = "1168x876 @ 72Hz"; ! ! These four are obvious ! HorPixel = 1168; // pixels VerPixel = 876; // lines PixelWidthRatio = 4; PixelHeightRatio = 3; ! ! hsync: DOT_CLK / D * 1000 [KHz] ! ! hsync = 105 / 1640 * 1000 = 64.024 KHz ! ! vsync: ( 1 / (( D / DOT_CLK ) * d) ) * 1,000,000 [Hz] ! ! vsync: ( 1 / (( 1640 / 105 ) * 900) ) * 1,000,000 ! ( 1 / 14057.1428571 ) * 1,000,000 = 71.138 Hz ! HorFrequency = 64.180; // kHz VerFrequency = 71.138; // Hz ! Obvious ScanType = NONINTERLACED; ! ! Put here the +/-hsync +/-vsync XFree86 options ! HorSyncPolarity = POSITIVE; VerSyncPolarity = POSITIVE; ! Shouldn't change CharacterWidth = 8; // pixels ! DOT_CLK here PixelClock = 105.000; // MHz ! ! ! horizontal timings section: [usec] ! HorTotalTime = D / DOT_CLK = 15.619; HorAddrTime = A / DOT_CLK = 11.124; HorBlankStart = A / DOT_CLK = 11.124; HorBlankTime = HorTotalTime - HorBlankStart = 4.495; HorSyncStart = B / DOT_CLK = 11.962; HorSyncTime = C / DOT_CLK - HorSyncStart = 2.743; ! ! vertical timings section: [msec] ! VerTotalTime = ( HorTotalTime * d ) / 1000 = 14.057; VerAddrTime = ( HorTotalTime * a ) / 1000 = 13.682; VerBlankStart = ( HorTotalTime * a ) / 1000 = 13.682; VerBlankTime = VerTotalTime - VerBlankStart = 0.375; VerSyncStart = ( HorTotalTime * b ) / 1000 = 13.698; VerSyncTime = ( HorTotalTime * ( c - b ) ) / 1000 = 0.219 ! Finished ! 。。。。 4. Fixing up things 以下の記述の -> 記号は変更を施した個所を示しています。ファイルには書き 込まないでください。 Monitor エントリ (私の場合、monitors/mfreq/mfreq64.vda です) [ESTABLISHED_TIMINGS] "640x480 @ 60Hz", "640x480 @ 72Hz", "640x480 @ 75Hz", "800x600 @ 56Hz", "800x600 @ 60Hz", "800x600 @ 72Hz", "800x600 @ 75Hz", "1024x768 Interlaced", "1024x768 @ 60Hz", "1024x768 @ 70Hz", "1024x768 @ 75Hz", "1152x900 Interlaced", "1152x900 @ 60Hz", "1152x900 @ 67Hz", -> "1168x876 @ 72Hz", "1280x1024 Interlaced", "1280x1024 @ 60Hz", "1600x1200 Interlaced"; ビデオカード情報ファイル (私の場合は boards/s3/764-2.xqa ですが、 Hercules カードはほとんど全部を対応しているのに、どうして私の Terminator 64/Dram だけが抜けているのか不思議です) [VISUAL] BitsPerPixel = 8; MemoryModel = Packed; ColorModel = Indexed; BitsRGB = 6; NumberOfColors = 256; [RESOLUTIONS] 640x480, 800x600, 1024x768, -> 1168x876, 1152x900, 1280x1024 [DESKTOPS] 640x480, 800x600, 1024x768, 1152x900, -> 1168x876, 1280x1024, 1600x1200 もしドットクロックが充分低いなら (私のビデオカードはそれほど低くないの ですが)、エントリーを 16bpp と 32bpp sections に置くこともできます。 /etc/Xaccel.ini は以下のようになっているでしょう。 -------------------------------------------------------------- Board = "s3/764-2.xqa"; Monitor = "mfreq/mfreq64.vda"; Depth = 8; -> Desktop = 1168x876; [RESOLUTIONS] -> 1168x876, 1024x768; etc/Xtimings にある実際の Xinside モードエントリは次のようなものです。 -------------------------------------------------------------- [PREADJUSTED_TIMING] PreadjustedTimingName = "1168x876 @ 72Hz"; HorPixel = 1168; // pixels VerPixel = 876; // lines PixelWidthRatio = 4; PixelHeightRatio = 3; HorFrequency = 64.024; // kHz VerFrequency = 71.138; // Hz ScanType = NONINTERLACED; HorSyncPolarity = POSITIVE; VerSyncPolarity = POSITIVE; CharacterWidth = 8; // pixels PixelClock = 105.000; // MHz HorTotalTime = 15.619; // (usec) = 205 chars HorAddrTime = 11.124; // (usec) = 146 chars HorBlankStart = 11.124; // (usec) = 146 chars HorBlankTime = 4.495; // (usec) = 59 chars HorSyncStart = 11.962; // (usec) = 157 chars HorSyncTime = 2.743; // (usec) = 36 chars VerTotalTime = 14.057; // (msec) = 900 lines VerAddrTime = 13.682; // (msec) = 876 lines VerBlankStart = 13.682; // (msec) = 876 lines VerBlankTime = 0.375; // (msec) = 24 lines VerSyncStart = 13.698; // (msec) = 877 lines VerSyncTime = 0.219; // (msec) = 14 lines Xinside サーバが走っている間、パラメータ無しで vgaset プログラムを走ら せて、あなたの変換をチェックすることができます:これで、XFree の時のよ うなラインを出力してくれるでしょうし、もし全てうまく行っていれば、この ラインはあなたの最初のラインと等しいでしょう(ただし、もし b と c が等 しければ、私は Xinside でこの状況を確認することができませんでした:最 も良い場合は c=b+1 の時でした) 5. 最後に... これで全部です。この文書があなたの役に立つことを期待しています。近い将 来、私が XiGraphics サーバを買うことはないでしょう。というのも、 XFree86 3.2 がリリースされたことで、私が使っている Trio 64 ビデオカー ドでも充分なテキスト表示速度が出るようになったからです。 とはいえ、XiGraphics サーバがサポートするチップセットとビデオカードは XFree86 よりもずっと幅広いので、商用サーバを使うしか手がない場合もある でしょう。そうした場合、XiGraphics サーバを購入したなら、この文書の情 報が役に立ったか、難しすぎたか等の感想を知らせていただけたらと思いま す。 6. 手順の自動化 以下のスクリプトを使うと、手順の大半を自動化出来ます。ScanType と 2 つ の Polarity line には充分注意してください。このスクリプトはそれらの設 定は行わないので、適切な訂正をしないとモニタが火を噴く可能性が高まりま す。 私は Xinside において "Doublescan" フラグが意味を持っているかどうか知 りません。それゆえ、もし低解像度の doublescan モードに変換しようとする 場合は、注意してください。リフレッシュレートが二倍になってしまうので、 モニタがすぐに壊れてしまいます (実際、私の場合 400x300@72Hz が 400x300@144Hz になってしまいました!)。 #!/bin/sh ########################################################################## # XF2XInside # # このスクリプトは、XF86Config フォーマットの modeline を XInside の # フォーマットに変換するものです。これは etc/Xtiminig ファイルで必要 # とされるものです。 # # やっつけ仕事なので、エラーチェックはほとんどしません # (ユーザフレンドリでないなどと言わないでください)。 # # 引数なしで実行すると、使い方を表示します。 # # ( July 1996, hcz@tazlwurm.bb.bawue.de) # # Btw: この HOWTO の記載どおりに作成された新しいモードは、問題なく # 機能するのですが、Xsetup のメニューが表示されません。 # なぜだか知ってる人います? # ########################################################################## #----------------------------------------------- ここから: # 以下をあなたの modeline ファイルの置場所に応じて編集してください XF=/usr/X11/lib/X11/XF86Config if [ $# -ne 1 ] ; then echo "usage: ${0##*/} " echo " example: ${0##*/} 1024x764" echo -e " function: converts $XF modeline entry into\n Xinside Format (stdout)" exit 1 fi egrep -i "^[\t ]*modeline.+\"$1\"" /usr/X11/lib/X11/XF86Config | gawk ' NF < 11 { print "! invalid Modeline:\n! " $0 "\n!"; next } { print "//", $0 ":" name = $2 DOT_CLK = $3; A = $4; B = $5; C = $6; D = $7; a = $8; b = $9; c = $10; d = $11; VerFrequency = 1000000 / ((D / DOT_CLK) * d) print "[PREADJUSTED_TIMING]" printf " PreadjustedTimingName = \"%dx%d @ %.0dHz\";\n", A, a, VerFrequency print " HorPixel\t\t= " A ";" print " VerPixel\t\t= " a ";" print " PixelWidthRatio\t= 4;\n PixelHeightRatio\t= 3;" print " HorFrequency\t\t= " DOT_CLK / D * 1000 ";\t// kHz" print " VerFrequency\t\t= " VerFrequency ";\t// Hz" print " ScanType\t\t= NONINTERLACED;\t\t// *CHECK*" print " HorSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*" print " VerSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*" print " CharacterWidth\t= 8;" print " PixelClock\t\t= " DOT_CLK ";" HorTotalTime = D / DOT_CLK print " HorTotalTime\t\t= " HorTotalTime ";" print " HorAddrTime \t\t= " A / DOT_CLK ";" print " HorBlankStart\t\t= " A / DOT_CLK ";" print " HorBlankTime\t\t= " D / DOT_CLK - A / DOT_CLK ";" print " HorSyncStart\t\t= " B / DOT_CLK ";" print " HorSyncTime\t\t= " C / DOT_CLK - B / DOT_CLK ";" VerTotalTime = ( HorTotalTime * d ) / 1000 print " VerTotalTime\t\t= " VerTotalTime ";" print " VerAddrTime\t\t= " ( HorTotalTime * a ) / 1000 ";" VerBlankStart = ( HorTotalTime * a ) / 1000 print " VerBlankStart\t\t= " VerBlankStart ";" print " VerBlankTime\t\t= " VerTotalTime - VerBlankStart ";" print " VerSyncStart\t\t= " ( HorTotalTime * b ) / 1000 ";" print " VerSyncTime\t\t= " ( HorTotalTime * ( c - b ) ) / 1000 print "" }' 7. 謝辞 o Heike Claudia Zimmerer, は、記述の矛盾を 指摘すると同時に、作業の大半を自動化するスクリプトを送ってくれまし た。 o Bartosz Maruszewski, は、この文書を ポーランド語に翻訳するとともに、typo の指摘をしてくれました。 8. 著作権について (c)opyright 1996-7 by Marco Melgazzi (marco@techie.com) - この文書には、GPL (GNU Public License) が適用されます。GPL のコピーを 入手するには、Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA に手紙を書いてください。 各商標は、その所有者が権利を有しています。この文書に記載した情報につい ては、その正確さ・有用性について如何なる保証もありません。 8.1. 日本語訳について 日本語訳:はら (1997/01/27) 校正 :千旦裕司 (2001/10/06)