名前 | 形式 | 機能説明 | IOCTLS | IOCTLS | デバイスの特殊ファイル | ファイル | エラー | 属性 | 関連項目 | 診断
#include <sys/types.h>
#include <sys/ecppio.h>
ecpp@unit-address
ecpp ドライバは、IEEE 1284 に準拠したデバイスに対して双方向のインタフェース、セントロニクスデバイスに対して単方向の順方向インタフェースを提供します。ecpp ドライバは、IEEE 1284 互換プロトコル、ニブルプロトコル、ECP プロトコル、およびセントロニクスプロトコルをサポートしています。ECPP_COMPAT_MODE および ECPP_CENTRONICS の動作モードは、論理的に同じであるハンドシェイク方式のプロトコルです。ただし、ECPP_COMPAT_MODE をサポートしているデバイスは、IEEE 1284 に準拠したデバイスです。IEEE 1284 に準拠したデバイスは、少なくとも ECPP_COMPAT_MODE および ECPP_NIBBLE_MODE をサポートしています。セントロニクスデバイスは、ECPP_CENTRONICS モードをサポートします。
デフォルトでは、ECPP_COMPAT_MODE デバイスのハンドシェイク方式のストローブパルス幅は、500 ナノセカンドです。このモードの場合、データの順方向転送は DMA によって行われます。デフォルトでは、ECPP_CENTRONICS デバイスのストローブパルス幅は、2 マイクロセカンドです。これらのデバイスでは、順方向転送は PIO を介して行われます。ECPP_COMPAT_MODE および ECPP_CENTRONICS デバイスのデフォルトの動作は、ecpp.conf で定義された調整可能な変数によって変更可能です。
ecpp ドライバは、「排他的に使用する」デバイスです。すなわち、デバイスがすでに開いている場合は、その後に開こうとしても EBUSY によって失敗します。
ecpp デバイスが開かれるたびに、そのデバイスは EBUSY としてマークされ、設定変数はデフォルト値に設定されます。write_timeout は、90 秒に設定されます。
ecpp ドライバは、次に説明するアルゴリズムに従って、モード変数を設定します。まず、ecpp ドライバは、open(2) が実行されている間に ECPP_ECP_MODE モードへの移行を試みます。これに失敗すると、ドライバは、モードを ECPP_NIBBLE_MODE モードにするようにデバイスとネゴシエーションを行います。このネゴシエーションに失敗すると、ドライバは ECPP_CENTRONICS モードで動作します。デバイスを開くのに成功すると、IEEE 1284 に準拠するデバイスは、ECPP_ECP_MODE または ECPP_NIBBLE_MODE のいずれかで逆方向アイドルフェーズのアイドル状態になります。その後 write(2) 呼び出しにより、ドライバは ECPP_ECP_MODE または ECPP_COMPAT_MODE のいずれかの順方向リンクフェーズに移動させます。この転送が終了するとリンクはアイドル状態に戻ります。
アプリケーションは、ECPPIOC_SETPARMS ioctl(2) の呼び出しによって、デバイスを特定のモードにするようにネゴシエーションを行なったり write_timeout 値を設定したりすることができます。ネゴシエーションが成功するには、要求されたモードにホストワークステーションと周辺デバイスの両方が対応している必要があります。
ecpp ドライバの特徴は、/kernel/drv/ecpp.conf に記述された変数で調整可能です。これらの変数は、システム起動中にドライバによって読み込まれます。変数を調整するには、ecpp.conf ファイルを編集し、update_drv(1M) を起動してカーネルにファイルを再度読み込ませます。
セントロニクス周辺機器および特定の IEEE 1284 に準拠した周辺機器は、高速ハンドシェイキングモードで動作するパラレルポートと共には動作しません。印刷に関する問題が発生した場合は、"fast-centronics" および "fast-1284-compatible" を "false" に設定します。詳細は、/kernel/drv/ecpp.conf を参照してください。
ecpp ドライバは、全二重の STREAMS デバイスドライバです。アプリケーションが IEEE 1284 に準拠するデバイスに書き込んでいる間、別のスレッドはそのデバイスから読み取ることができます。
write(2) 操作は、ストリームヘッドに正常に書き込まれたバイト数を返します。セントロニクスデバイスがデータを転送している間に異常が発生した場合は、状態ビットの内容はエラーが発生した時のものが保存されます。アプリケーションプログラムは、この状態ビットを BPPIOC_GETERR
ioctl(2) 呼び出しを使用して取り出すことができます。取り出された状態情報は、転送の試行または BPPIOC_TESTIO
ioctl(2) が発生するたびに書き換えられます。
以下の ioctl(2) 呼び出しを使用することができます。ecpp がデータを転送する場合、ドライバは、ioctl(2) 呼び出しが処理される前にデータがデバイスに送られるまで待機します。
ecpp ドライバでは、prnio(7I) インタフェースが使用できます。
PRNIOC_RESET コマンドは、nInit
シグナルを 2 ミリ秒間切り替えた後、デフォルトのネゴシエーションを行います。
次の ioctl(2) 呼び出しは、下位互換性を維持するためにのみ残されています。そのため、新たに作成するアプリケーションでは使用しないことをお勧めします。
現在の転送パラメタを獲得します。 引数は、struct ecpp_transfer_parms を指すポインタです。この構造体の要素については、以下を参照してください。デバイスが開かれてから設定されたパラメタがない場合には、この構造体にはデフォルトの値が設定されます。上記の「デフォルトの動作」を参照してください。
転送パラメタを設定します。 引数は、struct ecpp_transfer_parms を指すポインタです。設定されたパラメタが範囲外の場合には、EINVAL が返されます。周辺デバイスまたはホストデバイスが要求されたモードに対応していない場合は、EPROTONOSUPPORT が返されます。ecpp_transfer_parmsとその有効なパラメタについては、以下を参照してください。
転送パラメタ構造体は、<sys/ecppio.h> で定義されています。
struct ecpp_transfer_parms { int write_timeout; int mode; };
mode フィールドは、現在のパラレルポートが設定されている IEEE 1284 モードを反映します。このモードの値は、以下の ECPP_CENTRONICS、ECPP_COMPAT_MODE、ECPP_NIBBLE_MODE、ECPP_ECP_MODE のいずれかに設定することができされます。 他のすべての値は無効です。要求されたモードに対応していない場合には、ECPPIOC_SETPARMS は EPROTONOSUPPORT. を返します。またこのモードは、 ECPP_CENTRONICS モードに設定されたあと、 ECPPIOC_SETPARMS は、アプリケーションを元のモードに戻します。
この ioctl コマンドは、指定されたモードで周辺デバイスから IEEE 1284 デバイスの ID を獲得します。現在、デバイスの ID は、ニブルモードでしか獲得できません。<sys/ecppsys.h> で定義された構造体へのポインタは、引数として渡される必要があります。
1284 デバイスの ID の構造体は以下のようになります。
struct ecpp_device_id { int mode; /* デバイスの ID の読み取りに使用されるモード */ int len; /* バッファーの長さ */ int rlen; /* デバイスの ID の文字列の実際の長さ */ char *addr; /* バッファーのアドレス */ };
モードは IEEE 1284 のモードのことで、このモードでデバイスの ID 情報を取り出すためのネゴシエーションがポートに対して行われます。周辺デバイスまたはホストがこのモードをサポートしていない場合、EPROTONOSUPPORT が返されます。アプリケーションは、モードを ECPP_NIBBLE_MODE に設定します。len は、addr が指すバッファーの長さです。rlen は、周辺デバイスから返されるデバイスの ID 文字列の実際の長さを表します。 返された rlen が len よりも長い場合、アプリケーションは、再度 ECPPIOC_GETDEVID を呼び出すことができます。その際、バッファーの長さは rlen と等しいかそれより長くなります。IEEE 1284 デバイスの ID の 2 バイトの長さは、考慮にはいれていないため、ユーザーのバッファーでは返されないことに注意してください。
ECPPIOC_GETDEVID の実行に成功したら、ドライバは ECPP_COMPAT_MODE にリンクを返します。アプリケーションは、リンクが機能していた以前のモードを判定し、そのモードにリンクを戻します。
セントロニクスまたは互換モードでの周辺デバイスの操作について、順方向転送の準備ができているかをテストします。
TESTIO は、オープンフラグとセントロニクのステータス信号を検査することにより周辺デバイスがデータを受け取る準備ができているかを判定します。デバイスの現在のモードが、ECPP_NIBBLE_MODE の場合、ドライバは ECPP_COMPAT_MODE モードへの移行を試みて、ステータス信号を検査してから、ECPP_NIBBLE_MODE モードに戻します。現在のモードが、ECPP_CENTRONICS または ECPP_COMPAT_MODE の場合、TESTIO は現在のモードでセントロニクスステータス信号を検査します。データを受け取るには、 デバイスは、 nErr
と Select
信号は立っている必要がありますが、PE
と Busy
信号は立っていることは許されません。ecpp がデータを転送する場合、TESTIO は、TESTIO を実行する前にドライバに送られた以前のデータが配信されるまで待機しています。しかし、TESTIO が待機している間にエラーが起こった場合、TESTIO は即座にエラーを返します。TESTIO が、状況が良いと判定した場合は、0 が返されます。しかし、-1 が返された場合は、errno が、EIO に設定され、状態ピンの状況が捕らえられます。この状況は、 BPPIOC_GETERR ioctl(2) 呼び出しにより取り出すことができます。 timeout_occurred と bus_error フィールドは、このioctl(2) により設定されることはありません。BPPIOC_TESTIO と BPPIOC_GETERR は、bpp(7D) に指定されている ioctl と互換性があります。
最後のエラー状態を取り出します。 引数は、<sys/bpp_io.h> ヘッダーファイルに定義されている struct bpp_error_status を指すポインタです。エラーステータスの構造体は以下のようになります。
struct bpp_error_status { char timeout_occurred; /* 1= タイムアウト */ char bus_error; /* 使用されない */ uchar_t pin_status; /* エラーを起こす可能性の /* あるピンの状態 */ };
pin_status フィールドには、起こりうるエラーの条件を示します。pin_status の有効なビットは、BPP_ERR_ERR、BPP_SLCT_ERR、BPP_PE_ERR、BPP_BUSY_ERR です。設定されたビットは、関連するピンが何であるかを示します。
この構造体は、write(2) 呼び出し時の最新のエラー条件のすべての適切な状態ビット、または最新の BPPIOC_TESTIO ioctl(2) 呼び出し時のビットの状態を示します。
pin_status は、ECPP_CENTRONICS またはECPP_COMPAT_MODE で発生する可能性があるエラー条件を示します。これらのモードでは、状態ピンは、デバイスの状態を示します。たとえば、多くのセントロニクスプリンタでは、紙詰まりの発生時に nErr の信号レベルを下げます。状態ピンの動作は、デバイスによって異なります。追加状態情報は、逆方向チャネルを通して返されます。
timeout_occurred の値は、write(2) の呼び出し中に時間切れが発生した時に設定されます。bus_error は、このインタフェースでは使用されません。
以下の ioctl は、パラレルポートのステータスを直接読み込んで書き込み、信号を制御するために使用されます。デバイスの現在のモードが、ECPP_ECP_MODE または ECPP_NIBBLE_MODE の場合、ドライバは ECPP_COMPAT_MODE にリンクするようにネゴシエーションを行い、レジスタの値を取得または設定し、リンクを ECPP_NIBBLE_MODE に戻します。現在のモードが、ECPP_CENTRONICS または ECPP_COMPAT_MODE の場合、これらの ioctl は現在のモードでレジスタの値を獲得または設定します。
レジスタ値を読み取ります。引数は、struct ecpp_regs 構造体へのポインタです。この構造体については、以下の記述を参照してください。
ecpp レジスタ値を設定します。引数は、struct ecpp_regs へのポインタです。この構造体については、以下の記述を参照してください。パラメータが範囲外の場合は、EINVAL が返されます。
ポートレジスタ構造体は、<sys/ecppio.h> に定義されています。
struct ecpp_regs { uchar dsr; /* status reg */ u_char dcr; /* control reg */ };ステータスレジスタは、読み取り専用です。ECPPIOC_SETREGS ioctl は、このレジスタには影響を与えません。dsr の有効なビット値は、ECPP_nER、ECPP_SLCT、ECPP_PE、ECPP_nACK、ECPP_nBUSY です。ほかのすべてのビットは、予約されていて、常に 1 を返します。
制御レジスタは、読み取りと書き取りができます。dcr の有効なビット値は、ECPP_STB、ECPP_AFX、ECPP_nINIT、ECPP_SLCTIN です。ほかのすべてのビットは予約されています。予約されているビットを読み取ると、常に 1 を返します。これらのビットに 0 を書き込もうとすると、EINVAL が返されます。
32 ビット ELF カーネルモジュール
64 ビット ELF カーネルモジュール
ドライバ構成ファイル
書き込み専用で開いたデバイスに対して、読み取りが行われようとしました。または、読み取り専用で開いたデバイスに対して、書き込みが行われようとしました。
すでに開かれているデバイスが開かれようとしました。 デバイスの 1 つが開いているときに、ドライバを読み込み解除しようとしました。
ecpp_transfer_params 構造体の中で ECPPIOC_SETPARMS ioctl() が範囲外の値で呼び出されました。ecpp_regs 構造体の中で ECPPIOC_SETREGS ioctl() が無効な値で呼び出されました。modload(1M) または modunload(1M) の実行中に、無効なコマンド引数を 受け取りました。
アクセス時にドライバがバスエラーを検出しました。読み取り処理または書き込み処理が、周辺デバイスのエラーまたは転送の時間切れのために、正常に終了しませんでした。
ドライバが、接続ができないデバイスを開く要求を受け付けました。ドライバが、障害のある周辺デバイスに対する書き込み処理を受け取りました。
以下の属性については、attributes(5) を参照してください。
属性タイプ | 属性値 |
---|---|
アーキテクチャ |
PCI ベースのシステムに限定 |
使用条件 |
SUNWpd |
インタフェースの安定性 | Evolving |
modload(1M), modunload(1M), update_drv(1M), ioctl(2), open(2), read(2), write(2), attributes(5), bpp(7D), usbprn(7D), prnio(7I), streamio(7I)
IEEE Std 1284–1994
名前 | 形式 | 機能説明 | IOCTLS | IOCTLS | デバイスの特殊ファイル | ファイル | エラー | 属性 | 関連項目 | 診断