スポンサーリンク

GSC(4) FreeBSD/i386 カーネルインタフェースマニュアル GSC(4)

名称

gsc − ハンディスキャナ用デバイスドライバ

書式

#include <machine/gsc.h>

マイナ番号ビット: uu d g p ...

             uu

ユニット gsc0 .. gsc3
d

デバッグメッセージの記録を選択
g

ビットマップまたは グレーマップ出力を選択
p
raw
または portable pnm 出力を選択

解説

gsc キャラクタデバイスドライバは、今のところ Genius GS-4500 ハンディス キャナのみを扱っています。このドライバはハードウェアが irq を使用して動作 可能であっても、完全に dma 方式で制御を行ないます。私には割り込み駆動型の デバイスドライバを書くのに十分なドキュメントも経験もありません。

デバイスは、次の 4 つの異なった 解像度で動作可能です: 100, 200, 300, 400dpi。デバイスは最上位のビットが左にくるシンプルなビットマップを生成し ます。ドライバは Jef Poskanzer による、よく知られていて適度にシンプルな ポータブルビットマップファイル形式 pbm(5) で出力することもできます。した がってスキャンの結果はその辺にあるどのようなグラフィックパッケージ (一部 の名前を挙げるなら xpaint(1), xv(1), xli(1) など) で簡単に処理することが できます。 raw モードでは、スキャナは白い紙の上の黒い点を検出するため、 セットされたビットは黒いピクセルを意味します。逆に、pnm フォーマットはビ デオ画面の電子ビームの光度を記述するため、 pbm モードにおいては、セットさ れたビットは白いピクセルを意味します。

出力されたビットマップの 幅は与えられた解像度値によって固定されます。しか しながら pnm モードでは、ドライバはいつ ’ファイルの終わり’ が検出されたか を知っているはずなので、ビットマップの 高さは自動で設定されます。この機能 により、 cat を用いてスキャナ出力を pbm ファイルに直接コピーすることがで きます。もちろんドライバを raw モードで使用し dd(1) を用いて似た効果を得 ることはできます。

グレーマップ出力モードはまだドライバに実装されていません。外部プログラム がこの作業をよりうまくできるかどうかは怪しいですが、その結果カーネルの大 きさが減るかどうかは疑問に思っています。ただたとえそうであったとしても、 中間調ビットマップからグレーマップを生成するツールを私は知りません。

gsc が処理する ioctl リクエストは以下に列挙されています。 sgsc(1) と呼ば れるユーティリティを使うと、シェルからこれらのリクエストにアクセスできま す。

       GSC_SRES int

解像度の値を設定します。デバイスへの最初の読み込みアクセスの後 に、この呼び出しを行なった場合は、デバイスをクローズして再びオー プンしない限り効果を持ちません。

GSC_GRES int
現在の解像度を 1 インチあたりのドット数 (dpi) で取得します。

GSC_SRESSSW void
解像度の値をセレクタスイッチで設定します。ドライバはオープンされ ているが触れられていない状態である必要があります。そうでない場合 はリクエストは失敗し、 errno(2) には EBUSY が入ります。

GSC_SWIDTH int
ビットマップの 幅を設定します。どのような設定可能な解像度もまさし く一つの幅に対応するので、実際はこのリクエストは解像度を設定する 代わりの手段となります。設定可能な値は下の表に列挙されています。
解像度

100 dpi
424 ピクセル
200 dpi
840 ピクセル
300 dpi
1264 ピクセル
400 dpi
1648 ピクセル
?
1696 ピクセル
?
2544 ピクセル
?
3648 ピクセル

上の表に書かれていない値は ioctl 呼び出しに失敗し、 errno(2) には EINVAL が入ります。

見たとおり、1696 よりも大きな幅の値があります。しかし、このことは スキャナの幅よりも長いラインをスキャンできたり、もっと高い解像度 でスキャンできたりすることを意味するわけではありません。実際、解 像度はハードウェアスイッチのみによって選択されます。実際の解像度 で定義されている以上の長さのラインで、標準のラインの長さを越えた 右部分は定義されていません (通常は白になります)。

GSC_GWIDTH int
現在のビットマップの幅をピクセル数で取得します。

GSC_SHEIGHT int
pnm
モードでのビットマップの 高さを設定します。実際にはこのリクエ ストは最初の読み込み操作の後、スキャンできるライン数の合計を制限 します。制限値に達した時、読み込みは 0 を返します。しかし、(呼び 出しプロセスの終了時に、明示的あるいは暗黙的に) デバイスがクロー ズされた時にのみ、電源は切断されます。

GSC_GHEIGHT int
現在のビットマップの高さを取得します。

GSC_SBLEN int
DMA 転送に内部で使用するバッファの長さを設定します。バッファの長 さはビットマップのライン数で与えられます。バッファのサイズは (現 在) 0x3000 バイトに制限されているので、許されるラインの最大数は各 ラインの幅によって変化します。この上限は、現在の値を上書きし errno(2) 変数に ENOMEM を入れてしまう前にチェックされます。しか し、バッファライン数を選択した後もビットマップの幅を変更すること はできるので、バッファライン数が大きすぎることがわかった時は読み 込みリクエストは ENOMEM で失敗するかもしれません。一般的にはより 良い出力を得るためには、節約するよりも長いバッファを選択する方が 賢いです。

GSC_GBLEN int
現在のバッファの長さをライン数で取得します。

GSC_SBTIME int
1 つのバッファを読み込み終わるまでのタイムアウト時間を設定しま す。ハンディスキャナはフラットスキャナよりも、人間 / コンピュータ インタフェースのタイムアウト時間が長いので、デフォルトでは 15 秒 になっています。タイムアウト時間後は、読み込み操作は EBUSY で失敗 します。タイムアウトタイマはそれぞれのバッファが読み込まれる度に 新たに開始されるので、長いイメージを早くスキャンできるようになる わけではないことに注意してください。BLEN/BTIME は termios(4) の MIN/TIME と似ています。

GSC_GBTIME int
現在のバッファのタイムアウト時間を取得します。

パラメータを変更する GSC_SBTIME 以外のすべての ioctl リクエストは、現在進 行中のスキャンプロセスには影響しません。すなわち最初の読み込みリクエスト 時の設定がデバイスのオープン中は続きます。影響を及ぼすにはデバイスをク ローズしてオープンし直す必要があります。したがって、設定はデバイスをク ローズするかオープンするまでリセットされません。

同様に、設定値を読むリクエストは現在進行中のスキャンプロセスで使われてい る値を報告しません。スキャンプロセスが必要とする値は開始時に保存されてい るので、ioctl リクエストではアクセスできません。

しかし BTIME 値は現在進行中のスキャンにすぐに反映されます。したがってタイ ムアウト時間は、例えばユーザがスキャンを開始するまでの長い時間に設定する ことができます。またユーザが停止したら (ほぼ) すぐに反応できるような短い 時間に設定することもできます。ユーザが慌てることなく一つのバッファを埋め られるだけの時間は、最低でも残す必要があることに注意してください。

pbmraw のモード選択は、ioctl リクエストではなく、マイナ番号によって行 なわれることに注意してください。 raw モードでは、選択されたビットマップの 高さはなんの効果も持ちません。

関連ファイル

       /dev/gsc0

raw 出力のためのデバイスノードで、マイナ番号は 0 です。

/dev/gsc0d
raw
出力のためのデバイスノードで、コンパイル時に GSCDEBUG オ プションが設定されていたら、 デバックメッセージを出力しま す。マイナ番号は 32 です。

/dev/gsc0p
pbm
ファイルフォーマット出力のためのデバイスノードで、マイナ 番号は 8 です。

/dev/gsc0pd
pbm
debug モードのためのデバイスノードで、マイナ番号は 40 です。

使用例

      dd if=/dev/gsc0 of=rawfile bs=(width/8) count=(height)
      cat /dev/gsc0p > pbmfile

診断

       GSCDEBUG

カーネル設定でこの名称を ‘option’ として定義すると、デバッ グビット (すなわち 7 ビット中のビット 5) がセットされたマイ ナ番号でドライバにアクセスした場合デバッグ出力を得ることが できます。

関連項目

cat(1), dd(1), pbmtopgm(1), pnm(1), sgsc(1), close(2), intro(2), ioctl(2), open(2), read(2), termios(4), pbm(5)

作者

Gunther Schadow ⟨gusw@fub46.zedat.fu-berlin.de⟩

バグ

たとえスキャナデバイスに、4 つの解像度のうち 1 つを選択できるようになって いる小さなスイッチがあったとしても、私にはまだその状態を知る方法がわかっ ていません。この問題が解決されない限り、ハードウェアで選択した解像度と一 致する保証のない ioctl(2) で渡した値にドライバは依存します。

FreeBSD January 9, 1995 FreeBSD

スポンサーリンク