本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リフアレンス: セクション 7 : デバイス特殊ファイル、セクション 9 : 一般情報 > f

framebuf(7)

HP-UX 11i v2: 2007 年 12 月
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

framebuf ― ラスターフレームバッファー デバイスのための情報

構文

#include <sys/framebuf.h>

説明

フレームバッファー デバイスは、ラスターベースのディスプレイです。 これらのデバイスはメモリーマップ I/O を使い、tty ベースのグラフィックターミナルで可能なものより高いパフォーマンスを 得ています。 フレームバッファー デバイスはこのインタフェースを用いて直接アクセス できますが、STARBASE ライブラリを通してのアクセスをお勧めします (starbase(3G) 参照)。 フレームバッファー デバイスを直接アクセスするには、 使われるフレームバッファーのアーキテクチャについての正確な知識を 必要とします。 フレームバッファー デバイスはシリアルデバイスではないので、 入力をフレームバッファー デバイスにパイプしたり リダイレクトすることはできません。

各フレームバッファー デバイスはキャラクタ型スペシャルファイルと 関連付けられています。 フレームバッファーのメジャー番号およびマイナー番号は インプリメンテーションに依存しています。 これらのデバイスのマイナー番号は、違うフレームバッファーを示します。 それぞれのインプリメンテーション特有の詳細は、 システム管理マニュアルを参照してください。

フレームバッファー デバイスを用いた通信はシステムコール open() により始められます。 複数のプロセスがフレームバッファー デバイスを並列してオープンすることが できます。

close() はフレームバッファー デバイスと関連するファイル記述子を無効にします。 システムコール close() の後は、フレームバッファーのデバイスアドレスへのどんなアクセスも メモリーフォルトになり、シグナル SIGSEGV がプロセスに送られます (signal(2) 参照)。 フレームバッファーのスペシャルファイルがクローズされた後は、 プロセスはフレームバッファーのアドレス空間から フレームバッファーをアンマップすることはできません。 フレームバッファーをアンマップするには GCUNMAP ioctl() コールを用いてください (以下参照)。

一度プロセスがフレームバッファー デバイスのロックを得ると、close() をコールする前に明示的にアンロックしなければなりません。GCUNLOCK を参照してください。

read() および write() システムコールは未定義で、いつもエラーを返します。 この場合 errnoENODEV にセットされます。

フレームバッファー デバイスを制御するためにはシステムコール ioctl() を使います。 例外状態でフレームバッファー デバイスをテストするためには、 システムコール select() を使います。 グラフィックハードウェアからの割込みは例外状態とみなされます。 フレームバッファー デバイスをオープンしたプロセスが select() コールにより例外を知らされると、例外状態は自動的に解かれます。 フレームバッファー デバイスと関連した ファイル記述子上の読み込みまたは書き込みのための select() コールは、読み込みおよび書き込みのビットマスクがしてあると失敗します (select(2) 参照)。

フレームバッファー デバイスは、複数のプロセスにより同時に アクセスすることができます。 しかし、ここで書かれたロックのメカニズムまたは他の動機のメカニズムが 使われない限り、各プロセスは他の出力にオーバーライトします。 ここで書いたロックメカニズムはプロセスの協調にのみ向いています。

すべてのフレームバッファーに対し、 データバイトは左から右に、上から下に向かって スキャンします。 ピクセルは、スクリーン上で表示可能なドットで、フレームバッファー内の ロケーションと関連しています。 各デバイスはスクリーン上のピクセルに対応する 1 つまたはそれ以上のメモリー内のビットにマップしますが、 フレームバッファー内のビットは連続的なものではありません。 フレームバッファーの構造体および属性を書いた情報は、データ構造体 crt_frame_buffer_t に書かれています。 データ構造体 crt_frame_buffer_t には次のフィールドが含まれています。

int crt_id; /*display identifier*/
unsigned int crt_attributes; /*flags denoting attributes*/
char *crt_frame_base; /*first byte in frame-buffer memory*/
char *crt_control_base; /*first byte of the control*/
/*registers*/

char *crt_region [ CRT_MAX_REGIONS ];
/*other regions associated with the*/
/*frame-buffer device*/

次のリクエストが ioctl() で有効です。

GCDESCRIBE

サイズ、特徴、フレームバッファーのマップされた範囲を記述します。 情報はデータ構造体 crt_frame_buffer_t に納められて呼び出しプロセスに返され、パラメータは crt_frame_buffer_t *arg; として定義されます。 1 つまたはそれ以上のフレームバッファー デバイスの範囲を持つ 構造体フィールドがありますが、これらのフィールドの値は いつも定義されているわけではありません。 正常に終了した後にのみ、使われた GCMAP コマンド (以下参照) は正しいアドレスを返し、返されたアドレスを 用いて直接フレームバッファーの範囲をアクセスできるようになります。

GCID

デバイスの識別番号を返します。 パラメータは int *arg; として定義されています。 このコマンドを用いたときに返された情報は、GCDESCRIBE によって返される情報のサブセットで、旧製品との互換性のためだけに 提供されています。

GCON, GCOFF

グラフィックをオンまたはオフします。 この操作は、GCDESCRIBE コマンドが返したデータ構造体 crt_frame_buffer_t のフィールド crt_attributes 内で、CRT_GRAPHICS_ON_OFF ビットがセットされているデバイスに有効です。 他の場合は、これらのコマンドの影響はありません。

GCAON, GCAOFF

alpha をオンまたはオフします。 これらの操作は、GCDESCRIBE コマンドが返したデータ構造体 crt_frame_buffer_t のフィールド crt_attributes 内で、CRT_ALPHA_ON_OFF ビットがセットされているデバイスに有効です。 他の場合は、これらのコマンドの影響はありません。

GCMAP

フレームバッファー メモリー、グラフィックコントロール、および コールを行なうユーザープロセスのアクセス可能なその他のデバイス範囲を 作成します。 これをリクエストしたプロセスのみが、直接フレームバッファー メモリー をアクセスでき、レジスタをコントロールできます。GCMAP コールに正常に終了した後に、 (GCDESCRIBE ioctl() コールによって返される) データ構造体 crt_frame_buffer_t 内のフィールド crt_frame_base および crt_control_base は、フレームバッファーの 2 つの範囲の有効なアドレスを持ちます。 指定したデバイスで、ユーザーのアドレス空間に 2 つ以上の範囲をマップするような場合は、 特別なデバイスの範囲 CRT_MAX_REGIONS までのベースアドレスが順次配列 crt_region に置かれます。 指定したフレームバッファーに関連した範囲のみがマップされます。 データ構造体 crt_frame_buffer_t 内の不適切なフィールドは 0. にセットされます。 パラメータ arg の使用はインプリメンテーションに依存しています (『制約』 参照)。 フレームバッファーの範囲のベースアドレスはいつもページに合わされます。

GCUNMAP

フレームバッファー メモリーへのアクセス、グラフィック制御、 および他のデバイスの範囲のリクエストプロセスからの削除を行います。 パラメータ arg は無視して 0 にセットしてください。GCUNMAP コールが正常に終了した後は、 これらのメモリーの範囲へのアクセスはメモリーフォルトになり、 シグナル SIGSEGV がプロセスに送られます。

GCLOCK

協調プロセスによるフレームバッファー デバイスの排他的な使用を 行ないます。 呼び出しプロセスはデバイスのロックおよび継続を行うか、 またはブロックされます。 この場合ブロックは、フレームバッファーが 使用可能な場合またはコールがシグナルにより割り込まれた場合にのみ、 コールから返ってきます。 コールが割り込まれた場合はエラーを返し、errnoEINTR にセットされます。 他のプロセスが GCLOCK コマンドを使ってすでにこのフレームバッファー ロックしていて、GCUNLOCK がまだ実行されていないときには待ち状態がおこります。GCLOCK コマンドは他の非協調プロセスのフレームバッファーへの書き込みを 妨げないので、 パラメータ arg は無視して 0 にセットしてください。

このコールは内蔵ターミナルエミュレータ (ITE) がグラフィックハードウェア (termio(7) 参照) の状態を改悪することを避けます。 いくつかのシステムでは、GCLOCK コマンドによってフレームバッファーがロックされている限りは、ITE はテキストを出力しません (『制約』 参照)。 同じプロセスによる 1 回以上のデバイスのロックは失敗し、errnoEBUSY にセットされます。

GCLOCK_NOWAIT

協調プロセスによるフレームバッファー デバイスの排他的な使用を行います。 このリクエストは GCLOCK リクエストと同じ影響をフレームバッファー デバイスに与えます。 しかし、 このコールは他のプロセスによってフレームバッファーがリリースされるのを 待ちません。 フレームバッファー デバイスがロックされている場合は、 プロセスはブロックせず、代わりにシステムコールがエラーを返し、errnoEAGAIN にセットされます。パラメータ arg は無視して 0 にセットされます。

GCLOCK_BLOCKSIG

別の方法で送られた呼び出しプロセスへのすべての入力シグナルが ブロックしている間、 協調プロセスによるフレームバッファー デバイスの排他的な使用を 提供します。 このコールは GCLOCK コールのスーパーセットです。パラメータ arg は無視され 0 にセットされます。 排他的な使用でディスプレイを取得した場合、GCLOCK コールのときにプロセスが受け取ったすべてのシグナルを、GCUNLOCK を取得するまで保留 (ブロック) します。GCUNLOCK リクエストの前のプロセスのシグナルのマスクの変更 (sigsetmask(2) 参照) は、これらのブロックしたシグナルでは影響を持ちません。 ロックが行われるまでシグナルはブロックされず、ロックを待っている間も シグナルは受け取られます。

シグナル SIGTSTP はそれが受け取られても受け取られなくても、 ブロックされます。SIGTTIN および SIGTTOU もデバイスがロックしている間、ITE がデバイスに出力を 行なわないフレームバッファー デバイス上でブロックされます。『制約』 を参照してください。

上で述べた 3 つのシグナルを除いて、 このコールはプロセスが受け取ることを予期しないシグナルをブロックせず、 受け取れないまたは無視できないシグナルをブロックしません。 このコマンドは他の非協調プロセスのフレームバッファーへの 書き込みを妨げません。

GCLOCK_BLOCKSIG_NOWAIT

別の方法で送られた呼び出しプロセスへのすべての入力シグナルが ブロックしている間、 協調プロセスによるフレームバッファー デバイスの排他的な使用を 提供します。 このリクエストは GCLOCK_BLOCKSIG リクエストと同じ影響をフレームバッファー デバイスに与えます。 しかし、 このコールは他のプロセスによってフレームバッファーがリリースされるのを 待ちません。 フレームバッファー デバイスがロックされている場合は、 プロセスはブロックせず、代わりにシステムコールがエラーを返し、errnoEAGAIN にセットされます。パラメータ arg は無視され 0 にセットされます。

GCUNLOCK

フレームバッファー デバイスの排他的使用を止めます。 デバイスが GCLOCK_BLOCKSIG または GCLOCK_BLOCKSIG_NOWAIT ioctl() リクエストによりロックされている場合は、 呼び出しプロセスのシグナルマスクが ロックリクエストに優先してその元の状態に戻されます。

GCRESET

フレームバッファー デバイスに対応するグラフィックハードウェアが、 定義された初期状態にリセットされます。 このコールによりフレームバッファー デバイスがここで定義した ioctl に応えられるようになります。

GCDMA_OUTPUT

DMA の出力をフレームバッファー デバイスに送ります。 このシステムコールはユーザーの配列から グラフィック フレームバッファーの長方形の部分、 またはデバイスのグラフィック制御空間へデータを転送するために使われます。

DMA のパラメータはデータ構造体 crt_dma_ctrl_t でわたされ、次のフィールドが含まれています。

char *mem_addr; /* Starting address of data
being transferred */
char *fb_addr; /* Address of framebuffer
destination */
int length; /* Number of bytes to transfer,
including those "skipped" */
int linelength; /* Number of bytes written
on each framebuffer row */
int skipcount; /* Number of source bytes to
ignore after each "linelength" */
unsigned int flags; /* Specified options to the
driver */

グラフィック フレームバッファーへ書くためには、 描く長方形の左上のアドレスに fb_addr をセットします。DMA は各フレームバッファーの列上に linelength バイト書き、メモリーデータの次の skipcount バイトを無視し、成功したフレームバッファーの列と同じスタート位置に 再び書き始めます。 このことを、length バイト書き終えるかまたは無視されるまで続けます。

グラフィック制御空間に書くためには、fb_addr を最初のグラフィック制御レジスタのアドレスにセットします。 この時、linelength および skipcount は無視されます。

パラメータ flags は DMA のオプションを指定します。 現在サポートしているフラグはないので、 このパラメータは 0 にセットしてください。 他の場合、システムコールは失敗し、errnoEINVAL にセットされます。

DMA はデータを書く命令をストアするのと同じ効果を フレームバッファー デバイスに与えます。 このように、 様々なグラフィック制御レジスタが DMA の結果に影響を与えます。DMA が望んだ結果をもたらすよう、 必要なフレームバッファー デバイスの設定を行うのは、 ユーザープログラムの責任です。

パラメータ イメージの一部を再描画する必要がある場合に、skipcount によりユーザーはメモリーにストアしたウィンドウイメージの一部を 再描画することができます。 ウィンドウイメージはアップデートされた長方形のスーパーセットで、 大きさが異なります。skipcount は長方形から除かれる大きい方のウィンドウイメージ内の列の 1 部を 指定します。linelength + skipcount は大きい方のウィンドウイメージの配列の各列のバイト数です。

特別なフレームバッファー デバイスがこのシステムコールを サポートしている場合、 構造体 crt_frame_buffer_t のフィールド crt_attributes 内のフラグ CRT_DMA_OUTPUT はセットされます。DMA を サポートするフレームバッファー デバイスに よってはいくつかのパラメータの境界を 制限します。『制約』 を参照してください。カーネルはこれらの制限条項が守られることを 保証し、制限がシステムコールでない場合はそれは失敗し、errnoEINVAL がセットされます。

システムの物理メモリーが、プロセッサのデータキャッシュのフラッシュにより アップデートされることを保証するのはアプリケーションの責任です。 データが DMA 転送を初期化する前に矛盾していないことを保証するには、GCDMA_DATAFLUSH ioctl を使用してください。

GCDMA_DATAFLUSH

指定したデータを プロセッサのデータキャッシュからシステムの主メモリーへフラッシュします。 このシステムコールは DMA の前に使われ、 新しいデータを フレームバッファーまたは制御空間へ転送したことを保証します。

吐き出すためのパラメータはデータ構造体 crt_flush_t へ渡され、それには次のフィールドが含まれています。

char *flush_addr; /* Starting address of data
to be flushed */
int flush_len; /* Number of bytes to flush */

カーネルは flush_addr で始まる flush_len バイトがキャッシュと主メモリーとで一貫していることを保証します。

GCSLOT

システム全体のグラフィック ロックメカニズムに 関連した呼び出しプロセスについての情報を 提供します (GCLOCK 参照)。GCSLOT リクエストは実際のロック機能を行いません。 ロックの情報が呼び出しプロセスにデータ構造体 crt_gcslot_t で返されます。 パラメータは crt_gcslot_t *arg; として定義されています。 データ構造体 crt_gcslot_t<sys/framebuf.h> で定義されています。

GCSTATIC_MAP

内蔵ターミナルエミュレータ (ITE) のデバイスのカラーマップの変更を 禁止します。

GCVARIABLE_MAP

内蔵ターミナルエミュレータ (ITE) のデバイスのカラーマップの変更を 許可します。

制約

シリーズ 700/800

GCMAP をリクエストしているとき、パラメータ arg は無視して 0 にセットしてください。

出力時サポートしたすべての ITE はフレームバッファーを無視します。

シリーズ 700

GCID コールおよび GCDESCRIBE コールで、データ構造体 crt_frame_buffer_t のフィールド crt_id に返されるデバイス識別定数は次のようになっています。

S9000_ID_98705
S9000_ID_98736
S9000_ID_A1659A
S9000_ID_A1439A

メモリーマップ グラフィック協調プロセッサが使用可能な場合、それは GCMAP の結果として他のグラフィックとともにマップされ、そのアドレスは GCDESCRIBE コールにより、crt の範囲の配列に最後のエントリーとして記録されます。

シリーズ 800

次のデバイス識別定数が、GCID コールおよび GCDESCRIBE コールによりデータ構造体 crt_frame_buffer_t のフィールド crt_id に返されます。

S9000_ID_98720
S9000_ID_98730
S9000_ID_98550

HPA1047A インタフェースカードの場合、構造体 crt_dma_info のフィールドには次の制限条項があります。

mem_addr 32 バイトごと
fb_addr 16 バイトごと
length ゼロでない 32 の倍数
skipcount 0

エラー

EAGAIN

操作が呼び出しプロセスの停止を引き起こしましたが、リクエストは GCLOCK_NOWAIT または GCLOCK_BLOCKSIG_NOWAIT です。

EBUSY

デバイスをロックしようとしましたが、すでに同じプロセスにより ロックされていました。

EINTR

ioctl() コールがシグナルにより停止させられました。

EINVAL

無効な ioctl() コマンドを行いました。

ENODEV

デバイス上で read() または write() のシステムコールを行おうとしました。

ENOMEM

十分なメモリーを取得できませんでした。

ENOSPC

要求したリソースを取得できませんでした。

ENXIO

デバイスファイルのマイナー番号が存在しないデバイスを参照しています。

EPERM

GCUNLOCK ioctl() コマンドを要求したが、デバイスは違うプロセスにロックされていました。

著者

framebuf は HP で開発されました。

参照

mknod(1M), close(2), ioctl(2), lockf(2), open(2), select(2), signal(2), sigsetmask(2), starbase(3G), termio(7)

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2007 Hewlett-Packard Development Company, L.P.