0から作るソフトウェア開発

日々勉強中。。。

0から作るOS開発

環境準備

環境設定

ブートローダ

カーネルローダ

GRUB

カーネル

ドライバーその他
グラフィックドライバー >

ドライバーその他 VGAグラフィックドライバー VGAについて

VGAグラフィックドライバー

ここでは、グラフィック描画を行うVGAグラフィックドライバーについてその

プログラミングを簡単に見ていきたいと思います。

また、本来IBMが規定しているVGAについてはTipsのVGAを参照してください。

  1. (現在のページ) VGAについて

  2. VGAのレジスター

    1. VGAのレジスターその1 一般レジスター


    2. VGAのレジスターその2 シーケンサーレジスター


    3. VGAのレジスターその3 CRTコントローラーレジスター


    4. VGAのレジスターその4 グラフィックコントローラーレジスター


    5. VGAのレジスターその5 アトリビュートコントローラーレジスター


    6. VGAのレジスターその6 ビデオDACレジスター


  3. ビデオモードと描画

VGAについて

1987年にIBMのIBM PS/2のビデオとして採用された、画面表示の規格です

VGAを使用することでディスプレイに画像または文字を描画することができます。

(VGAはVideo Graphics Arrayの省略となります。)

IBMが1987年に開発したEGAの後継規格で、1987年にIBMのパソコンである

IBM PS/2に初めて搭載されました。PS/2ではマザーボード上にありましたが、

その後PC/AT用にVGAカードも発売されました。各社のPC/AT互換機でも

採用されデファクトスタンダードとなった規格となります。

VGA以前にはISA基板のMDA、CGA、EGAがありました。

(MDA、CGA、EGAの簡単な説明については シンプルビデオドライバー

を参照してください)。

現在のグラフィックカードにもVGA規格互換のモードがありますので、

現在のパソコンでVGAを制御することも可能です。

VGAの概要

VGAでは次の解像度・色数で画像や文字を描画することができます。

また、VGAにはテキストモードとグラフィックモードがあります。

そして、VGAにはディスプレイに描画するために次のようなコントローラーがあります。

VGAでは上記のコントローラーを動かすことでディスプレイに表示を行います。

構成についてはTipsのVGAその1 に詳細を載せております。

各コントローラーの役割は次のようになります。

CRTコントローラー

CRTとは CRTコントローラーはビデオ描画に関する様々なタイミングを生成する役割を担って

います。例えば、テキストモードで点滅表示をさせてたいときにはCRTコントローラーの

設定を変えると文字を表示したり、消したりする時間を計ります(正確に言うと

垂直同期クロックを分周します)。また、グラフィックカード関連で水平同期信号、

垂直同期信号という言葉を見たことがあるかと思いますが、この信号を生成するのも

CRTコントローラーとなります。

CRTコントローラー

シーケンサー

VGAのグラフィックカードには64KBのRAMが4つあり合計256KBのビデオメモリーが

載っています。CPUが普段使用しているシステムのメモリーとは別にグラフィック

カードのメモリーとなりますので、CPUからは直接ビデオメモリーに書き込みまたは

読み込みを行うことができません。(回路的に)。そこで、CPUとビデオメモリーの間で

データのやり取りを取り持つ役割をシーケンサーが担当します。


CPUがビデオメモリーに書き込みたい値を対応するシステムのメモリーに書き込むと

シーケンサーがシステムメモリーから値を読み出し対応するビデオメモリーに

書き込みを行います。また、CPUがビデオメモリーの内容を読み出すときには、

シーケンサーがビデオメモリーからデータを読み出し、システムメモリーに書き込みを

行います。


基本的にシステムメモリーの0x000B8000または0x000A0000に対して

リード/ライトをすることでビデオメモリーの読み書きができます。

シーケンサー

グラフィックコントローラー

グラフィックコントローラーは描画処理に関係する演算を主に担当します。

例えば現在使用しているグラフィックカードでは、ポリゴンなどの3D描画の演算を

グラフィックコントローラーが行います。3Dの演算をCPUで処理することももちろん

できますが、専用のハードウェアで処理を行った方が処理速度は速くなります。

(ハードウェアで演算機能を実装すると一般的に値段が高くなりますが、処理速度は

原則的にハードウェアで行う方が速くなります。そして、コントローラーに処理をまかせる

ことでCPUは別の処理を行うことができます。VGA規格内で言えば昔のグラフィックカード

は逆に遅い例があるようです)。VGAでは3D描画専用の回路はありません。

ここでは身近な説明としてとりあげただけとなりますのであしからず。。。


また、テキストモード、グラフィックモードの切り替え設定などもここで行います。

アトリビュートコントローラー

アトリビュートコントローラーは基本的に色の管理を担当するコントローラーとなります。

DACに格納されているパレットの選択や、テキストモード時の文字を点滅設定

などを行います。16色までのモードでは、ビデオDACに格納されている”パレット(色)”の

なかでどの”パレット”を使用するのかを指定する16個のパレットレジスターを持って

います。

ビデオDAC

DACとはDigital to Analog Converterの略で、デジタルデータをアナログ信号に

変換する回路です。VGAでは、CPUが指定した画像データ(色情報)をアナログRGB信号

(R:赤色、G:緑色、B:青色の光の3原色)に変換します。ビデオDACでは、6ビットのDAC

となりますので、Rが6ビット、Gが6ビット、Bが6ビットの合計18ビットの色情報を”パレット”

データとして持っています。18ビットの色情報ですので表現できる色数は262144色と

なりますが、一度にこれだけの色を同時に表示することはできません。ビデオDACは

”パレット”上の色だけを画面に表示することができます。


”パレット”は絵を描くときに使うパレットと概念的には同じで

描きたい絵の色を赤色パレットに赤色絵具、緑色絵具、青色絵具を出して好きな

色を作ります。(但し光の3原色です)。作った色はパレットにありますが、合計256個まで

しかパレットはありませんので注意してください。同時に画面に表示できるのは

パレットの個数で決まりますので、最大で256色まで同時描画できることになります。

VGAコンポーネント

各コントローラーの関係は次のようになります。

VGAコンポーネント

ビデオモード

VGAで使用するビデオモードは次のモードとなります。このモードは基本的にBIOSの

ビデオサービス ビデオモード設定 でモードを設定することができますが、VGAの

レジスターを直接設定することでもモードを切り替えることができます。このサイトでは

BIOSを使わずにVGAを制御します。また、直接VGAを制御することで下記ビデオモード

以外のパラメーターの設定も可能です。

BIOSビデオモード
モード
HEX
Type 色数 文字表示数 VRAM開始アドレス ボックスサイズ 最大ページ 周波数 解像度
0, 1 テキスト 16 40x25 0x000B8000 8 x 8 8 70Hz 320x200
0*, 1* テキスト 16 40x25 0x000B8000 8 x14 8 70Hz 320x350
0+, 1+ テキスト 16 40x25 0x000B8000 9 x16 8 70Hz 360x400
2, 3 テキスト 16 80x25 0x000B8000 8 x 8 8 70Hz 640x200
2*, 3* テキスト 16 80x25 0x000B8000 8 x14 8 70Hz 640x350
2+, 3+ テキスト 16 80x25 0x000B8000 9 x16 8 70Hz 720x400
4, 5 グラフィック 4 40x25 0x000B8000 8 x 8 1 70Hz 320x200
6 グラフィック 2 80x25 0x000B8000 8 x 8 1 70Hz 640x200
7 テキスト - 80x25 0x000B0000 9 x14 8 70Hz 720x350
7+ テキスト - 80x25 0x000B0000 9 x16 8 70Hz 720x400
D グラフィック 16 40x25 0x000A0000 8 x 8 8 70Hz 320x200
E グラフィック 16 80x25 0x000A0000 8 x 8 4 70Hz 640x200
F グラフィック - 80x25 0x000A0000 8 x14 2 70Hz 640x350
10 グラフィック 16 80x25 0x000A0000 8 x14 2 70Hz 640x350
11 グラフィック 2 80x30 0x000A0000 8 x16 1 70Hz 640x480
12 グラフィック 16 80x30 0x000A0000 8 x16 1 70Hz 640x480
13 グラフィック 256 40x25 0x000A0000 8 x 8 1 70Hz 320x200


VGAインターフェース

VGAグラフィックカードとディスプレイはVGA端子でつなげます。VGAから出力される

色の情報がどのようにディスプレイに送られているのでしょうか。まずは端子について

見ていきます。

VGA端子

現在のパソコンではHDMIなどのデジタル信号で液晶ディスプレイにつながっていますが

昔のパソコンはディスプレイはブラウン管で、CRTディスプレイと呼ばれるディスプレイに

アナログ信号でつなげていました。また、プロジェクターなどの多くの映像機器を

VGA端子でつなげていました。このため色々な呼称があり、「ミニD-Sub15ピン」、

「アナログRGB」、「DE-15」のように表記されることがあります。D-Subの”D”は

コネクターの形状がDに似ていることから由来しています。また、VGA端子は

全部でピンが15個あり、5個ずつが3列に並んでいます。それではVGA端子に

ついて見て行きましょう。


VGA端子は次のような端子となります。

VGA端子(雄ピンのコネクター) 雄ピンのコネクター VGA端子(雌ピンのコネクター) 雌ピンのコネクター

上記写真右の雌ピンコネクターがパソコン側についていて左側の雄ピン

コネクターをディスプレイにつなげます。ここではパソコン側のコネクターに

ついてピンアサインを見ていきます。

VGA端子のピンアサイン

VGA端子のピンアサイン
ピン番号 現在の標準(VESA仕様) レガシー仕様(IBM PS/2)
1 赤色ビデオ信号(R) 赤色ビデオ信号(R)
2 緑色ビデオ信号(G) 緑色ビデオ信号(G)
3 青色ビデオ信号(B) 青色ビデオ信号(B)
4 予約(接続無し) モニターIDのビット2
5 GND テストピン(GND)
6 赤色ビデオ信号GND 赤色ビデオ信号GND
7 緑色ビデオ信号GND 緑色ビデオ信号GND
8 青色ビデオ信号GND 青色ビデオ信号GND
9 +5V(将来的には+3.3V) 接続無し
10 同期信号GND 同期信号GND
11 予約(接続なし) モニターIDのビット0
12 I2CのSDA(データ)ライン モニターIDのビット1
13 水平同期信号 水平同期信号
14 垂直同期信号 垂直同期信号
15 I2CのSCL(クロック)ライン モニターIDのビット3

※レガシー仕様のモニターIDはIBMのモニターを識別するために使用されていました。

RGBの各色信号は下記のように水平同期信号間で1行分のピクセル信号を

出力します。GNDから+0.7Vのアナログ出力となります。

VGA色信号

これからVGAのレジスターを設定していってこれらの信号を制御していきます。

inserted by FC2 system