Scanner-logiscan Andreas Beck becka@sunserver1.rz.uni-duesseldorf.de 川岸良治 - 日本語訳 kawagisi@yk.rim.or.jp Revision History Revision v0.0.4j 1997年11月15日 この翻訳のリリース Revision v0.0.4 1995年2月14日 logiscan-0.0.4 パッケージのリリース LOGITECH SCANMAN+ 400dpi ハンドヘルドスキャナ用ドライバ "logiscan v0.0.4" に付属のドキュメント類 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Table of Contents この文書について 1. README 1.1. Copyright 1.2. はじめに 1.3. インストールの方法 1.4. ロード時のパラメータの変更方法 1.5. プログラマのための注意事項 1.6. バグ報告の注意点 1.7. さらなるヘルプと情報 2. README.ioctl 2.1. はじめに 2.2. サポートされている ioctl 機能 2.3. 付録 3. demo/README 3.1. Copyright 3.2. デモプログラムについて 3.3. TODO ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ この文書について LOGITECH SCANMAN+ 400 dpi handheld scanner driver version 0.0.4 このドキュメントは、 LOGITECH SCANMAN+ 400 dpi ハンドヘルドスキャナ用ド ライバ Version 0.0.4 に付属のドキュメントを作者 Andreas Beck の許可を得て翻訳したものです。 第1部 元のファイル名: README ファイルの日付: Feb 14 1995 作者 : Andreas Beck 第2部 元のファイル名: README.ioctl ファイルの日付: Dec 24 1994 作者 : Andreas Beck 第3部 demo ディレクトリの中の README ファイルの日付: Nov 21 1994 作者 : Andreas Beck 作成日 : 1997年11月15日 翻訳者 : 川岸 良治 【訳注1】ファイルの入手と展開 このソフト(logiscan0.0.4) は下記から入手できます。 ・ ftp://tsx-11.mit.edu/pub/linux/ALPHA/scanner/ これをダウンロードしたら次のようにして /usr/src/ ディレクトリに展開しま す。 ┌──────────────────────────────────┐ │ # cd /usr/src │ │ # tar xvfz ~/logiscan-x.x.tar.gz │ └──────────────────────────────────┘ (上記は logiscan-x.x.tar.gz が、~/ ディレクトリにある場合ですが、それ以 外の時はそのディレクトリに合わせて変えて下さい) /usr/src/logiscan-x.x/ ディレクトリが作られ、そこにファイルが展開されます。 logiscan-0.0.4.tar.gz には下記のようなドキュメントファイルが入っていま す。 ┌───────────────────────────────────────┐ │ (1) README │ │ (2) README.ioctl (logi32.o によって提供される ioctl インタフェースを使う │ │ アプリケーション開発者のガイドライン) │ │ (3) CHANGELOG (変更履歴) │ │ (4) CREDITS (このプログラムの作成に協力した人の一覧) │ │ (5) COPYING (GNU GENERAL PUBLIC LICENSE Version 2, June 1991) │ │ (6) demo ディレクトリの中の README │ └───────────────────────────────────────┘ この文書 Scanner-HOWTO-logiscan は、上記のうち (1) (2) (6) を訳したもの です。 (3) (4) (5) は原文をご覧下さい。 【訳注2】最新版とメールアドレス 最新版は、logiscan0.0.5 で下記からダウンロードできます。 ・ http://sunserver1.rz.uni-duesseldorf.de/~becka 作者へのメールはアドレスが変更されていますので注意して下さい。 ┌──────────────────────────────────┐ │ (旧) becka@hp.rz.uni-duesseldorf.de │ │ (新) becka@sunserver1.rz.uni-duesseldorf.de │ └──────────────────────────────────┘ ここで訳した3つドキュメント自体は 0.0.4 と 0.0.5 で変更が無く、全く同 じのようです。作者のメールアドレスは、0.0.5 でも古いままなので要注意で す。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 1. README 1.1. Copyright Copyright (C) 1994 Andreas Beck 【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de このプログラムはフリーソフトウェアです。あなたは、これを Free Software Foundation が発行している GNU General Public License のライセンスのバー ジョン2、または(あなたのオプションで)それ以降の条件に従って再配布した り変更することができます。 このプログラムは、役に立つことを期待して配布しています。しかし、いかな る保証もありません。商品性や特定用途への適合性についての暗黙の保証すら ありません。詳しくは、GNU の General Public License をご覧下さい。 あなたは、このプログラムと一緒に GNU General Public License のコピーを 受け取るべきです。そうでないならば、 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA に手紙を書いて下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2. はじめに Hi folks! これは LOGITECH SCANMAN+ スキャナ用のドライバで、専用のインタフェースボ ードを通してドライブされます。このスキャナにはいくつかのバージョンがあ りますが、このドライバは少なくともそれらのいくつかをサポートします。 1. 古い Logitech Scanman : 200dpi 固定の白黒スキャナ (どなたかこれをお 持ちですか?これはディザ処理ができますか?今のところこれは解像度固 定で Scanman32 として扱われます) 2. 少し新しい Logitech Scanman32 (aka Scanman+) : 白黒の 100〜400 dpi のスキャナで、 6x6 ディザ処理(解像度を 1/6 に下げて 37色にする)が可 能。 3. Logitech Scanman256 : 100〜400 dpi のグレイスケール・スキャナで、ディザ処理無しで 1bit(白 黒2値), 4bit(16階調), 6bit(64階調), 8bit(256階調)の解像度がありま す。このタイプのスキャナには注意して下さい旭既に述べたようにこれに はいくつかのバージョンがあります(異なったハードウェアを使用していま す)。ある人が私にこの Rev-03 ボードの扱い方を教えてくれたので、この 問題は現在ではフィックスされていると思うのですが、もしかして他のも のがあったとしたら... 従ってドライバが "incompatible scanner-interface " と報告してきたらそれは別の互換性の無いボードで あるか、あるいはベース I/O アドレスの設定が間違っています。このよ うな時は、あなたのスキャナ・ソフトウェア・ディスクに入っている HHSCAND.SYS を私に送って下さい。 ドライバは insmod を使ってロードする時にスキャナのタイプを自動検出 します。 ドライバが "Unknown" とレポートするがスキャナは動作するという場合 (これは code-tweaking が必要ですが...)、あなたのハードウェアをどの ようにして検出するかを見つけるよう試して、どのような変更が必要かを 私に教えて下さい。私は、あなたのパッチを今後のリリースに入れるよう にします。全てを変更するようなパッチを私に送らないで下さい。即ち、 私は現在のものから本当に異なるものを扱うようなスキャナはサポートし ません。 このドライバはスキャナに付属の MS-LOSS 用スキャナドライバ [1] を逆 アセンブルして集めた情報を元にしています。これ以外の追加情報、要望 、提案、バグ報告があれば、遠慮無く私に言って下さい。(下記のバグ報告 をご覧下さい) 私は特に、他のスキャナ・デバイスドライバを書く人から のフィードバックを得ることに興味があります。 私たちは Linux の全てのスキャナドライバに使われるインタフェースを一 つにまとめることができるかもしれません。そうなれば多くの人達が書く であろう、カラフルな X ベースのスキャナプログラムが、多くのスキャナ でサポートされ動作するようになるでしょう。 私は既に M105 と A4-tech ドライバの作者とは連絡済みで、私たちはスキ ャナオプション用の ioctl の"万能"セットの設定にトライしています。あ なたがこの作業に参加することに興味があるなら(あなたはこのような API の経験があるかもしれない) README.ioctl を読み、私(または Thomas ま たは Michael 下記参照)に送って下さい。 また、あなたが素敵なスキャナプログラムを書いたら私に送って下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3. インストールの方法 1. ドライバは、カーネル・ローダブル・モジュールなので、明らかに最初に するべきことは `modutils' パッケージを持っていない場合はこれを入手 しインストールすることです。 2. src ディレクトリに移って logi32.h の先頭を見て下さい。必要に応じて 、またハードウェア設定に応じて定義を編集します。 IOBASE だけはディ ップスイッチの設定に合わせなければいけませんが、 IRQ と DMA はソフ トウェアで選択可能です。 IRQ と DMA は他のハードウェアによって使わ れていないものを使って下さい。(SoundBlaster がインストールされてい るなら DMA 1 は使われていると思います) 設定できるものは IRQ が 2(9),3,4,5,7,9(2),11,12 で、DMA が 1 または 3 です。最新のカーネル(スタックドモジュールをサポートしている)と、 対応した modutils では、モジュールのロード時にこれらの値(と、メジャ ーデバイス番号。4)項参照 )を変更することができます。これをどのよう にするのかは、"man insmod" で調べて下さい。関係のある変数は logi32.c の先頭、またはドライバを常駐させた時に ksyms の出力の中で 見つかります。 3. scanner.h をどこか適当な場所( usr/local/include がお勧め)に移して下 さい。scanner.h はあなたのシステム上で "ただ一つのバージョン" で提 供されているのだということをよく覚えておいて下さい。私は、ドライバ がスキャナソフトウェアではない他の scanner.h とコンパイルされた時の トラブルを沢山聞いています。 PINT (UNIX 用の共通スキャナインタフェース。Copyright (C) 1994 Kenneth Stailey ken@spacenet.com)のサポート下でコンパイルしたいなら Makefile で -D に相当することをイネーブルにし、 ファイル を他の適切な場所に移して下さい。(これは他のシステム上の /usr/ [local]/include/sys にあるように見えるという点に注意して下さい。だ から、それをそこに置くというのは良い考えです) ドライバをコンパイルするには、 ┌────────────────────────────┐ │ make │ └────────────────────────────┘ と入力して下さい。モジュールを組み込むには、 ┌────────────────────────────┐ │ insmod logi32.o │ └────────────────────────────┘ と入力して下さい。 シンボルが無いとローダが文句を言ってきた時は、それらを kernel/ ksyms.c に加えて下さい。 (または、もっと良いのは、そのドライバにと っては本当に古くさいカーネルをアップデートすることです...) kernel/ksyms.c を変更するべきだったなら、カーネルを再コンパイルし、 その変更を反映させるためにリブートする必要があります。 4. デバイスのスペシャルファイルを作成します。 ┌────────────────────────────┐ │ mknod -m 444 /dev/logiscan c 26 0 │ └────────────────────────────┘ /dev/scan にシンボルリンクを張ります。 ┌────────────────────────────┐ │ ln -s /dev/logiscan /dev/scan │ └────────────────────────────┘ MAKEDEV の最新バージョンは、適切なデバイスを生成することもできるは ずです。「MAKEDEV を使う前に」 logi32.o がロードされていなければな らないことに注意して下さい。 MAKEDEV は、logitech スキャナドライバ を検出し、そこに存在するメジャーデバイスを見つけるために /proc/ devices の情報を使うからです。さらに詳しいことは、関係するドキュメ ントをご覧下さい。 (注): 上記の `26' はメジャーデバイス番号です。それが既に使われ ている場合(それをロードしようとする際、ドライバは「cannot register major number:メジャー番号が登録できません」と文句を言 う)は、他の使われていない番号を選び `logi32.h' の LOGI32_SCANNER_MAJOR の定義をそれに変更して下さい。 新しいカーネルでは、メジャーを動的に割り付けることができます。 このようにしたい時は、定義を 0 に「セットして下さい。但し、こう すると、ドライバをロードする度にメジャーが変わるので、毎回デバ イスのスペシャルファイルを作成する必要があるということに注意し て下さい。 5. `logi32.o' をカーネルモジュールをキープするためのどこかにコピーして 下さい。 6. 動作確認 (s)vgalib が動作しているなら、 ./demo ディレクトリの gifscan をビル ドして下さい。svgalib が無いなら、このパッケージに入っているスクリ プト scan.sh は不要です。だれか、あなたのために小さなスキャンプログ ラムを作ってくれるいい人を見つけるまでは、cat ファイル のようなやり方で満足する他ありません。(または、GIF ファイルに "blind-scan" できるようにするために gifscan から全ての vga に関する ものを取り除く必要があります) pbm ファイルに直接スキャンしたものを 格納する pbmscan という新しいパッケージがあります。これは svgalib が不要で、GIF に書き込むよりかなり高速です。私は PINT インタフェー ス用に何があるか知りません。これを使った良いアプリケーションを教え て下さい。 (可能なら)私のドライバで動くなら ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4. ロード時のパラメータの変更方法 新しい modutils (とスタックドモジュールサポート)で、ロード時に下記のパ ラメータの値を与えることができます。従って設定を変えたい場合でも、ドラ イバを再コンパイルする必要はありません。 "insmod logi32.o LOGI_FOOBAR=%d" でドライバをロードします。%d がパラメ ータを設定するための値です。この機能に関するより詳しいことは insmod の ドキュメントをご覧下さい。 使用できるパラメータは以下のとおりです。 ┌──────────────────────────────────────────┐ │ LOGI_DEBUG これを 0 以外の値にして、デバッグモードでコンパイルすると、 │ │ ドライバはデバッグ情報を出力します。そうでないときはこの変数は │ │ 現れません。 │ │ │ │ LOGI_MAJOR メジャー番号。0 は「カーネルにフリーなものを選択させる」ことを │ │ 意味します。 │ │ │ │ LOGI_IOBASE スキャナのベースアドレスです。これは正しくなければなりません。 │ │ そうでないとドライバは初期化とボードの検出に失敗します。 │ │ │ │ LOGI_IRQ スキャナが使用する IRQ です。 │ │ │ │ LOGI_DMA DMA チャンネルです。 │ └──────────────────────────────────────────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5. プログラマのための注意事項 ドライバはスキャナとの通信のために DMA 転送とIRQを使用します。いずれの チャネルもソフトウェアで設定できます。(詳しくは logi32.h をご覧下さい) スキャナは1ラインスキャンする度に割り込み要求を発行するので、有効なデ ータを得るために busy-wait 処理をする必要はありません。 ドライバは内部に(ダイナミックアロケートの)バッファをキープします。この バッファのデフォルトのサイズは、50 スキャンライン分 (logi32.h を参照)で すが ioctl コールを通して調整可能です。(下記参照) /dev/scan を使ってい るプロセスが現在実行していてもいなくても、スキャナからのデータ転送はバ ッファがフルになるまで有効であることに注意して下さい。これは、プロセス が停止したりスワップアウトしても、バッファスペースがあるのでデータ抜け は無いということを意味します。 ドライバは、一回の read(2) コールで任意のバイト数を読み込むことができる ようになっていますが、内部バッファは一回の read(2) コールでバッファにフ ィットした以上のバイト数を要求した場合はうまくいかないという点に注意し て下さい。通常、b/w モードでスキャンする場合は一回に1スキャンライン分 を読み込み、ハーフトーンモードの場合はたぶん数スキャンライン分を読み込 むでしょう。 read(2) コールがシグナルによって割り込まれると、read(2) は 読み込んだバイト数を返します。私はこれが EINTR の戻りの `標準的な' 振る 舞いとは異なることを知っていますが、スキャナではこの方法が理にかなって いるのです。(別の方法では内部バッファの既存のデータをいくらか失ってしま う) スキャナデバイス上で select(2) をすると、バッファの中に最低でも1ス キャンラインのデータがあれば、デバイスは `ready' として認識されます。し かしこれも変更できます。(下記参照) サポートされた ioctl 機能のために、 README.ioctl をお読み下さい。しかし 、 ioctl インタフェースはまだ開発中であり、従って変更がありそうです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6. バグ報告の注意点 バグを経験されたら私に教えて下さい。あなたのバグ報告にはそれを再現する 方法、または少なくとも私が分かるように正確な状況を説明したものを添付し て下さい。メッセージの中のバグ結果、例えば ┌──────────────────────────────────┐ │ general protection: xxxx │ │ EIP: 0010:xxxxxxxx │ │ EFLAGS: xxxxxxxx │ │ eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx │ │ esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx │ │ ds: xxxx es: xxxx fs: xxxx gs: xxxx │ │ Pid: xx, process nr: xx │ │ xx xx xx xx xx xx xx xx xx xx │ └──────────────────────────────────┘ が、画面あるいはシステムログにあれば、それを正確にコピーし、スキャナド ライバがロードされているロケーションと比較して、その範囲内かどうかを見 て下さい。これは insmod を実行すると表示されます。 ┌──────────────────────────────────┐ │ module `Logi32' (2 pages @ 0x0080c000) created │ │ ^^^^^^^^^^ 私が知りたいのはこれです... │ └──────────────────────────────────┘ これがその範囲内ではない(カーネルのどこか他の所)場合、zSystem.map で EIP の値 (`0010:'に続いたものではない) を捜し、 zSystem.map の関係ある 部分を含めて下さい。 もしそうならば 'nm -n logi32.o >logi32.map' コマンドを使ってドライバの マップを作り、あなたのレポートにこれを含めて下さい。あなたのバグ報告に 、これら2つの部分のどちらかが欠けているなら、私にとって意味が無いとい うことに注意して下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7. さらなるヘルプと情報 ドライバ用のメーリングリストがあり、そこには最新の情報ファイルがありま す。 ┌──────────────────────────────────┐ │ >>>> info logiscan │ │ [Last updated on: Wed Aug 10 10:41:58 1994] │ │ LOGISCAN MILINGLIST │ │ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ │ └──────────────────────────────────┘ ┌──────────────────────────────────┐ │ !!! 重要な注意 !!! │ ├──────────────────────────────────┤ │このメーリングリストは、LOGITECH の公式なリストではありません !!! │ └──────────────────────────────────┘ ┌────────────────────────────────────────┐ │ .---------------------------------------------------------------------------. │ │ | このメーリングリストは、 Linux 用の Logitech スキャナドライバの開発者 | │ │ | (主に Andreas Beck ) とそのユーザ間の | │ │ | コミュニケーションを容易にするためにセットされています。 | │ │ | これは Andreas の、または その他の Linux 用の Logitech スキャナドライバ | │ │ | の新しいバージョンとパッチを配布するためにも使われています。 | │ │ | | │ │ | Linux ではない他のオペレーティングシステムで Logitech スキャナの問題が | │ │ | あるときはこのリストを購読しないで下さい。ここではヘルプを得られません | │ │ `---------------------------------------------------------------------------' │ └────────────────────────────────────────┘ リストを購読するには、メッセージボディに下記のように書いたメールを majordomo@venture.net に送って下さい。 ┌──────────────────────────────────┐ │ subscribe logiscan [return mail address, optional] │ └──────────────────────────────────┘ 次に意見等は下記に送って下さい。 ┌──────────────────────────────────┐ │ logiscan@venture.net │ └──────────────────────────────────┘ 購読をやめるときは、メッセージボディに下記のように書いたメールを majordomo@venture.net に送って下さい。 ┌──────────────────────────────────┐ │ unsubscribe logiscan │ └──────────────────────────────────┘ この情報のテキストを欲しいときは、下記のように書いたメールを majordomo@venture.net に送って下さい。 ┌──────────────────────────────────┐ │ info logiscan │ └──────────────────────────────────┘ Bye, Andreas. Andreas Beck becka@hp.rz.uni-duesseldorf.de Germany 【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de ┌───────────────────────────────────────┐ │ ************************************************************************** │ │ M105 スキャナドライバを書き、かなりベースとなった │ │ Thomas Faehnle Thomas.Faehnle@student.uni-ulm.de に大変感謝します。 │ │ ************************************************************************** │ │ さらに、同じ ioctl インタフェースを使って A4Tech カラースキャナドライバを │ │ 書いた Michael Beck beck@hp832.informatik.hu-berlin.de にも。 │ │ ************************************************************************** │ │ さらに、同じ ioctl インタフェースを使って GS4500 スキャナドライバを書いた │ │ Jan Willamowius jan@janhh.sh.sub.de にも。 │ │ ************************************************************************** │ └───────────────────────────────────────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 2. README.ioctl 2.1. はじめに Hi folks! これは専用のインタフェースボードを通してドライブされる LOGITECH SCANMAN+ スキャナ用のドライバです。 これは logi32.o によって提供される ioctl インタフェースを使うアプリケー ション開発者のガイドラインです。 どんな提案も歓迎します、そして私は他のスキャナ用デバイスドライバの作者 からのフィードバックを、共通のインタフェースを作成することが出来るよう に、正当に評価します。 私は今までに Kenneth Stailey ken@spacenet.com からフィードバックを受け 取っています。彼は、私が将来オプションとしてサポートする予定の PINT と 呼ばれる UNIX 用のスキャナインタフェースを既に持っています。 このパッケージの pint サブディレクトリにあるドキュメントを参照して下さ い。これはバージョン 0.0.3 なので、ここで述べた定義はドライバの開発に応 じて頻繁に変更されるかもしれないことに注意して下さい。 私はこれまでスキャナ、または同様のデバイスの ioctl インタフェースを設計 したことがないということを白状しなければなりません。そこで私のアプロー チに何か間違っている点が無いか、また、どうすればもっとよくなるかを教え て下さい。 また、あなたがこの ioctl API を使って素晴らしいスキャンニング・プログラ ムを書かれたら、私に送って下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2. サポートされている ioctl 機能 以下に、サポートされている ioctl 機能を書きます。 ┌─────────────────────────────────────┐ │ ********************************************************************** │ │ #define HSIOCGSCC 0x73e8 /* Get Scanner Capabilities */ │ │ ********************************************************************** │ └─────────────────────────────────────┘ (ioctls の MAGIC NUMBERS は、近い将来 ioctl の仕様がより安定になり"メジ ャークリーンアップ"が起きた時に、変更されるだろうと思います) これはスキ ャナのシステム・コールの中で最も重要です。というのは、スキャナにどのよ うにアクセスし、何がサポートされているのかという必要な情報のほとんど全 てを提供するからです。 この関数は下記の構造体を返します。 ┌──────────────────────────────────────┐ │ struct scanner_capabilities { │ │ │ │ int o_scm_mono; /* Options for monochrome mode */ │ │ int o_scm_grey; /* Options for greyscale mode */ │ │ int o_scm_true; /* Options for true-color mode */ │ │ │ │ int o_xdpi; /* Options for x resolution */ │ │ int o_ydpi; /* Options for y resolution */ │ │ │ │ int o_bright; /* Options for brightness */ │ │ struct minmax bright; │ │ int o_contrast; /* Options for contrast */ │ │ struct minmax contrast; │ │ int o_hue; /* Options for hue */ │ │ struct minmax hue; │ │ int o_sat; /* Options for saturation */ │ │ struct minmax sat; │ │ │ │ int phys_width; /* Width in mm */ │ │ int phys_length; /* Length in mm */ │ │ │ │ int av_options; /* Number of available Options (0-32) */ │ │ │ │ }; │ └──────────────────────────────────────┘ 頭に 'o_' が付くフィールドは全て "オプション・フィールド" で下記のフラ グと組み合わせることができます。(つまり、これはビットフィールドです) ┌─────────────────────────────────────────┐ │ #define SCC_SOFTSELECT 0x0001 /* オプションをソフトウェアで選択可能 */ │ │ #define SCC_SOFTDETECT 0x0002 /* オプションをソフトウェアで検出可能 */ │ │ #define SCC_HARDSWITCH 0x0004 /* オプションはハードウェアスイッチ */ │ │ /* (ユーザの関与が必要) */ │ │ #define SCC_EMULATE 0x0008 /* オプションはドライバでエミュレートされる */ │ │ #define SCC_CANDO 0x000f /* 上記の何かがセットされたらドライバが */ │ │ /* サポートするオプション */ │ └─────────────────────────────────────────┘ このオプションをどのように使うかの例を示します。 ハードウェアスイッチを使ってスキャナの dpi を選択できて、その設定をドラ イバが読み込むことができるなら、このように書きます: ┌──────────────────────────────────┐ │ SCC_SOFTDETECT|SCC_HARDSWITCH │ └──────────────────────────────────┘ スキャナが1つの dpi 設定に固定されているなら"ハードウェアスイッチ" は ありませんが、ふつうドライバは固定レートを "検出可能" であるというふり をします。 (しかしレートは固定なので本当に検出する必要はありません): ┌──────────────────────────────────┐ │ SCC_SOFTDETECT │ └──────────────────────────────────┘ スイッチで dpi 設定を選択できるが、ドライバがその設定を読み込む方法が無 い (これは実際にはあるはずがないが、世の中には奇妙なハードウェアがあり ます) という場合は、SCC_HARDSWITCH をセットしなければなりません。 これのアプリケーションにとっての意味は SCC_SOFTDETECT が指定されていない場合、パラメータの値を知らないのでない 限りそれを入力するよう促されるべきです。(私は SCC_SOFTSELECT が SCC_SOFTDETECT を含まないというようなケースを想像できません...) そして 値をドライバに教えるために明示的に SMOD-call によってセットしなければな りません。 SCC_HARDSWITCH は、アプリケーションがユーザにハードウェアを正しく設定す るように促す必要があることを意味するでしょう。(これが既に行われているこ とが分かっている、例えば SOFTDETECT が処理した...場合を除く) SCC_EMULATE オプションは、これが選択されたとき、ハードウェアが他のモー ドであっても、またはこのモードをサポートしていなくてもドライバはこのモ ードをエミュレートするだろうということを意味します。 (例えば、全てのモ ノクロスキャナは通常、モノクロデータを全ての3 RGB 値に拡張することによ りトゥルーカラーモードをエミュレートします) phys_* フィールドは、最大スキャンウィンドウの物理的サイズを mm で表しま す。 minmax-structs は、パラメータの範囲、下記のように定義された構造体です。 ┌──────────────────────────────────┐ │ struct minmax {int min,max;}; │ └──────────────────────────────────┘ av_options フィールドには、この特別なスキャナの使用可能なオプションの番 号が入ります。この値は、 0-32 (inclusive) の範囲で、 HSIOCGOPT コールか らのデータの正確な変換が必要です。 ┌────────────────────────────────────┐ │ ********************************************************************* │ │ #define HSIOCGOPT 0x73e7 /* Get option descriptions */ │ │ ********************************************************************* │ └────────────────────────────────────┘ このコールは、下記フォーマットの32までのオプションデスクリプタ(これは av_options エントリを予約するには十分でしょう)のフィールドを返します。 ┌──────────────────────────────────┐ │ struct scanner_option {int options; /* Option availability */ │ │ char name[20];}; │ └──────────────────────────────────┘ 'オプション'フラグは上記の 'o_'の値の一つとして(すなわち、ハードウェア またはソフトウェアによってオプションが選択されたら、そしてそれがソフト で検出可能、あるいはドライバ機能がエミュレートするようなものならば) 扱 われます。 オプションとして、ユーザがオプションを選択/非選択/表示するためのオプ ション名を示すユーザダイアログを提案します。 これが出来ない、あるいはしたくない(例えば OCR のようなバックグランド処 理)場合、その名前からオプションの意味を引き出すようにするべきです。 互換性を保証するために、デバイスドライバの作成者は、何かの機能の名付け の彼らのアイデアを私に確認することが奨励されます。これは、同じオプショ ンに対して複数の名前を避けるために、そしてこの文書を私が更新することが できるようにするためです。 現在、ドライバによって使われるオプションは1つだけあります。 ┌──────────────────────────────────┐ │ オプション: "Dithering" │ │ 機能F : dithered greyscale モードを on/off する │ │ ドライバ : logi32.o │ │ 作者 : becka@hp.rz.uni-duesseldorf.de │ └──────────────────────────────────┘ ┌──────────────────────────────────┐ │ ************************************************************** │ │ #define HSIOCGSCT 0x73e9 /* Get Scanner Type */ │ │ ************************************************************** │ └──────────────────────────────────┘ このコールは、通常の ioctl インタフェースではアクセスできない特殊なスキ ャナの特別の機能をアプリケーションが使えるようにするために、スキャナハ ードウェアを識別します。下記の構造体を返します。 ┌──────────────────────────────────┐ │ struct scanner_type { │ │ char manufacturer[20],model[20]; │ │ }; │ └──────────────────────────────────┘ ┌──────────────────────────────────┐ │ ********************************************************** │ │ #define HSIOCGMOD 0x73ea /* Get modeinfo */ │ │ ********************************************************** │ └──────────────────────────────────┘ このコールは、スキャナの現在のモード情報を得ます。 ┌────────────────────────────────────┐ │ struct modeinfo_struct { │ │ int xdpi,ydpi; /* resolution */ │ │ int sc_mode; │ │ int depth; /* number of different colors (-1) */ │ │ int bpl; /* bytes per scanline */ │ │ int left,right; /* margins in Pixels */ │ │ int top,bottom; /* margins in Lines */ │ │ int bright; /* brightness */ │ │ int contrast; /* contrast */ │ │ int hue; /* hue */ │ │ int sat; /* saturation */ │ │ int options; /* enabled options */ │ │ }; │ └────────────────────────────────────┘ sc_mode は、下記のいずれか一つの値をとります。 ┌──────────────────────────────────┐ │ #define SCM_UNKNOWN 0 /* Scanner modes : */ │ │ #define SCM_MONO 1 /* 1 BitPerPixel */ │ │ #define SCM_GREY 2 /* 8 BitsPerPixel */ │ │ #define SCM_TRUE 3 /* 24 Bit RGB */ │ └──────────────────────────────────┘ 0の場合、スキャナは未定義の状態です。(起きるべきではない) 新しいモード をセットすることもできますが、むしろアボートするべきです...。 スキャンモードは転送されたデータのフォーマットと異なります: MONO モードはバイナリエンコードされた黒と白の値のビット列を送ります。即 ち、0x83 0x10 を読み込んだ場合、スキャナヘッドの下のパターンは、 ┌──────────────────────────────────┐ │ * . . . . . * * . . . * . . . . ; │ └──────────────────────────────────┘ つまり、1バイトにつき常に8個のピクセル(画素)があり、一行には常に複数 の8ピクセルがあります。(これは左右を通して再現される筈です...) グレーモードは、0〜255 までの範囲で測定された灰色の値のバイト列を送りま す。実際のデプスは、depth フィールドを使うことによって見つけることがで きますが、たとえ depth が 0 (即ち、スキャナが実際に黒白モードである)で も、1 ピクセルにつき常に 0 または 255 を送ります。即ち、1ピクセルにつ き1バイトなのです。 トゥルーモードは、バイトで RGB 値を送ります。従って、1 ピクセルに付き3 バイトあります。実際のデプスの解像度は 0xrrggbb で、rr はスキャナが識別 できる赤色の番号です。即ち、24ビットモデルだと 0xffffff とレポートする べきところを 4096色のスキャナ (4ビットの赤、緑、青)では 0x0f0f0f とレポ ートするわけです。 bpl は、read コールでアプリケーションに送られる bytes per line (1ライン あたりのバイト数) の数です。 Left, right, top, bottom は、マージンをセットします。 Bright, Contrast, Hue, Saturation は、画像のそれぞれの特性値です。 オプションは、選択されたオプションのビットフィールドとしてみなされます 。 ┌──────────────────────────────────┐ │ ********************************************************** │ │ #define HSIOCSMOD 0x73eb /* Set modeinfo */ │ │ ********************************************************** │ └──────────────────────────────────┘ このコールは、スキャナモードをセットするために使います。あなたが与えた 構造体はスキャナまたはドライバが扱うことの出来る本当の値を反映するため に"変更される"という点に注意して下さい。 例えば、400dpi(X方向), 600dpi (y方向), フル・デプスで 24ビットモード、 マージンは 5-1003 (方向x),13-4000 (y方向) という条件でスキャンさせたい 場合下記のようにして SMOD をコールします。 ┌──────────────────────────────────┐ │ { 400,600, │ │ SCM_TRUE, │ │ 0xffffff, │ │ 0,/* bpl doesn't matter */ │ │ 5,1003,13,4000, │ │ ... │ │ } │ └──────────────────────────────────┘ スキャナが両方の軸で 300dpi しかサポートできない場合、ハードウェアスイ ッチを経由して SCM_MONO にセットします。(そしてドライバはデータを変換で きない [!]) 8の倍数で10インチまでのページ長の水平方向の境界のみサポ ートし、構造体は次のように変更されるでしょう。 ┌──────────────────────────────────┐ │ { 300,300, │ │ SCM_MONO, │ │ 0, │ │ 126,/* Bytes per line filled in */ │ │ 0,1008,13,3000 │ │ } │ └──────────────────────────────────┘ ドライバは TRUE-MOD をエミュレートできる必要があるという点に注意して下 さい。怠けもののソフトウェアがそれをあてにするかもしれませんから... ┌──────────────────────────────────────┐ │ ************************************************************************* │ │ #define HSIOCGREG 0x73ec /* play with strange registers */ │ │ #define HSIOCSREG 0x73ef │ │ ************************************************************************* │ └──────────────────────────────────────┘ これはドライバの開発に使用し、通常はユーザレベルのアプリケーションには アクセス出来ません。このコールの機能は、スキャナからスキャナへ、あるい はドライバからドライバへ、とは違います。 ┌──────────────────────────────────────┐ │ ************************************************************************* │ │ #define HSIOCGBUF 0x73f0 /* get/set current buffer size */ │ │ #define HSIOCSBUF 0x73f1 │ │ ************************************************************************* │ └──────────────────────────────────────┘ スキャンするラインの現在のバッファサイズを取得/設定します。 ┌──────────────────────────────────────┐ │ ************************************************************************* │ │ #define HSIOCSSTH 0x73f2 /* get/set select(2) threshold */ │ │ #define HSIOCGSTH 0x73f3 │ │ ************************************************************************* │ └──────────────────────────────────────┘ スレッシュホールドの選択値を取得/設定します。 ┌────────────────────────────────────┐ │ ********************************************************************* │ │ #define HSIOCGSIB 0x73f4 /* get scanlines in buffer */ │ │ ********************************************************************* │ └────────────────────────────────────┘ これはスキャナの内部バッファの fill-gauge の一種として使われるでしょう 。これは典型的にはデータフローの量をユーザが制御するスキャナ(例えばハン ドスキャナ)によって使われ、バッファが満杯になったときにユーザにもっと遅 くスキャンするよう伝えることが出来るようにします。 Bye, Andreas. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3. 付録 この仕様を使ったスキャナドライバの開発者 ┌────────────────────────────────────────┐ │ Andreas Beck becka@hp.rz.uni-duesseldorf.de (logi32) │ │ 【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de │ │ Thomas Faehnle Thomas.Faehnle@student.uni-ulm.de (m105) │ │ Jan Willamowius jan@janhh.sh.sub.de (GS4500) │ │ Michael Beck beck@hp832.informatik.hu-berlin.de (A4Tec) │ │ Willem Dantum willemd@knoware.nl (Genius B105G)│ └────────────────────────────────────────┘ この仕様を利用できるスキャナプログラム ┌───────────────────────────────────────┐ │ gifscan : Thomas Faehnle によってかかれ Andreas Beck によって変更された │ │ オリジナルの svgalib ベースのデモアプリケーション │ │ pbmscan : Andreas Matthias によって書かれた │ │ pbm ファイルにスキャン(結果を格納)するコマンドラインツール │ └───────────────────────────────────────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 3. demo/README LOGITECH SCANMAN 400 dpi ハンドヘルド・スキャナドライバ用の GIFSCAN version 0.0.3 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.1. Copyright Copyright (C) 1994 Andreas Beck 【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de このプログラムはフリーソフトウェアです。あなたは、これを Free Software Foundation が発行している GNU General Public License のライセンスのバー ジョン2、または(あなたのオプションで)それ以降の条件に従って再配布した り変更することができます。 このプログラムは、役に立つことを期待して配布しています。しかし、いかな る保証もありません。商品性や特定用途への適合性についての暗黙の保証すら ありません。詳しくは、GNU の General Public License をご覧下さい。 あなたは、このプログラムと一緒に GNU General Public License のコピーを 受け取るべきです。そうでないならば、 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA に手紙を書いて下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2. デモプログラムについて Hi folks! これは LOGITECH SCANMAN+ スキャナ用ドライバのための小さなデモンストレー ションプログラムです。 このプログラムの一部は、Thomas Faehnle によって書かれたもので、私は彼の努 力に感謝したいと思います。 私はオリジナルの 'scandemo' を LOGI32 ドライバ/スキャナの拡張された能 力(スキャナの識別、SIB-ioctl,ディザ中間調)に合わせ、且つスキャンした画 像を共通のフォーマットに格納するための信頼できる方法を提供するためにか なり変更しました。 scandemo のこのバージョンは gifscan にリネームし、このパッケージの早期 バージョンで提供されていたスクリプトをすっかり置き換えました。 スクリプトは、スキャナが送っているライン幅を正しく決定するための可能性 が無いし、従って異なったスキャナや間違ったパラメータで使った時、間違っ た結果を作るのでスクリプトは捨てました。 私は主に下記の理由から GIF フォーマット(これは (c) by Compuserve だと思 う)を選択しました。 ・ ほとんどのグラフィックスパッケージがこれを扱っている。 ・ 私は既に Gif への格納を扱う C のソース(Mess按OSから)を書いている ・ 圧縮率が極めてよい 【訳注】: Mess按OS というのは MS-DOS のことを茶化しているのです。 GIF 圧縮は遅く PBM フォーマットは記述するのが大変容易であることに気が付 いているので、私はその能力をも追加しました。申し訳ないけど誰がオリジナ ルの PPM (P4)コードを gifscan に追加したか思い出せません。(彼に感謝しま す) 私はそれを Greyscale (P5) 画像に書くための変更をしたところです。 プログラムをビルドするために "make" をします。 #include は 、スキャナドライバをコンパイルするために使われるものと同じであることに 注意して下さい。このファイルは頻繁に変更されるので、常に最新版を /usr/ local/include に入れるようにして下さい。 ioctl インタフェースはまだまだ 工事の最中ですから、古い gifscan のバイナリはこれを新しいドライバと共に 使うと通常はブレークします。 Logitech スキャナには黒白モードとグレースケールモードがあります。これは 不幸にもソフトウェアで検出不可能です。(それともだれかこの方法を知ってま すか?) そこで私は -g x というスイッチ(x はグレースケール・マトリクスのサイズ) を追加しました。(未熟なオプション処理であることは分かっていますが、たっ た一つのスイッチのために getopt をインクルードしたくなかったのです...) ┌───────────────────────────────────────┐ │ ************************************************************************** │ │ 現バージョンでもこのスイッチは使えますが、新しいスタイルのスキャナドライバ │ │ はオプションとしてディザを提供する(Logi32 は)筈なので、今後は使うべきでは │ │ ありません。 │ │ ************************************************************************** │ └───────────────────────────────────────┘ 黒白モードにはこれを1(デフォルト)に、グレースケールモードには6をセッ トしなければなりません。(これはスキャナ内部マトリクスのサイズなので) 1 から16までの範囲の値は、他のスキャナでは有効かもしれませんが、 LOGITECH では強いモアレ効果が出てしまいます。 【訳注】: モアレ効果というのは、原画像には無い模様が発生する現象で す。 今度サポートされた Scanman256 には真のグレースケールモードがあります。 そのモードの全て(黒白、4,6,8 bit)が、今サポートされるべきでした。 スキャン中は下記のキーが使えます。(ビジー待ちや、入力されるスキャンデー タの選択をしたくないのでキーは、スキャナが動くまでは認識されません) ┌──────────────────────────────────────┐ │ ,q,x,Q,X : gifscan を終了します。 │ │ i,I : (I)nverse モードを切替えます。 │ │ w,W : スキャン速度ワーニングモードを切替えます。 │ │ (バッファが満杯に近くなると、画面が赤/紫になります) │ │ f : GIF ファイルへの格納を開始します。 │ │ (何らかのキーを押すと停止します) │ │ p : ppm ファイルへの格納を開始します。 │ │ 0-9 : オプション番号を切替えます。 │ │ b/B,c/C,h/H,s/S : Brightness(輝度)、Contrast(コントラスト)、Hue(色調)、 │ │ Saturation(彩度)を調整します。 │ │ 'm' : 強制的に SCM_MONO (モノクロモード)処理にします。 │ │ 'g' : force SCM_GREY-operation │ │ 強制的に SCM_GREY (グレースケールモード)処理にします。 │ │ 'a' : SCM (スキャナモード)の自動検出を許可します。 │ └──────────────────────────────────────┘ オプションは起動時に表示されます。これらのキーはファイルをスキャン(セー ブモード)中は無効であることに注意して下さい。これは、(読み取り幅や bpp のような) スキャン画像の基本パラメータを変更し、セーブするコードをあい まいにするかもしれないからです。(GIF では異なるライン幅を使うことはでき ません) また、GIF 圧縮は能率的ですが遅く、特に 1ビット GIF でエンコードするとセ ーブモードを使った場合、スキャナをかなり遅く操作する必要があります。 このオプションはすぐに消え去るだろうから、だれも "bit-count-code" (私は 以前のバージョンであるとほのめかした)を書き直す必要はありません。 Bye, Andreas. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3. TODO やるべ より良いユーザインタフェース、ファイルのネーミング、例えばダイ きこと アログボックスとか... : BTW svgalib グラフィックスを持っていない/欲しくない/必要でない人 (?): のために PBMSCAN と呼ばれる新しいコマンドラインのスキャンツール があります。 Andreas Beck becka@hp.rz.uni-duesseldorf.de Germany 【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de ┌───────────────────────────────────────┐ │ ************************************************************************** │ │ Thomas Faehnle Thomas.Faehnle@student.uni-ulm.de │ │ には深く感謝します。 │ │ ************************************************************************** │ └───────────────────────────────────────┘ ┌──────────────────────────────────┐ │===================================================== │ │ Ryoji Kawagishi E-Mail: kawagisi@yk.rim.or.jp │ │ KFA02544@niftyserve.or.jp │ │===================================================== │ └──────────────────────────────────┘ (sgml conversion, y.senda, ysenda@pop01.odn.ne.jp, 2001/09) Notes [1] 【訳注】 MS-LOSS というのは、タイプミスではないと思います。(^_^)