名前 | 形式 | 機能説明 | 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 が返されます。
Solaris x86 のみ (以前の lp(7D) デバイスとの下位互換性のため)。
32 ビット ELF カーネルモジュール
64 ビット SPARC ELF カーネルモジュール
64 ビット x86 ELF カーネルモジュール
ドライバ構成ファイル
64 ビット SPARC 用ドライバ構成ファイル
64 ビット x86 用ドライバ構成ファイル
書き込み専用で開いたデバイスに対して、読み取りが行われようとしました。または、読み取り専用で開いたデバイスに対して、書き込みが行われようとしました。
すでに開かれているデバイスが開かれようとしました。デバイスの 1 つが開いているときに、ドライバを読み込み解除しようとしました。
ecpp_transfer_params 構造体の中で ECPPIOC_SETPARMS ioctl() が範囲外の値で呼び出されました。ecpp_regs 構造体の中で ECPPIOC_SETREGS ioctl() が無効な値で呼び出されました。modload(1M) または modunload(1M) の実行中に、無効なコマンド引数を 受け取りました。
アクセス時にドライバがバスエラーを検出しました。読み取り処理または書き込み処理が、周辺デバイスのエラーまたは転送の時間切れのために、正常に終了しませんでした。
ドライバが、接続ができないデバイスを開く要求を受け付けました。ドライバが、障害のある周辺デバイスに対する書き込み処理を受け取りました。
以下の属性については、attributes(5) を参照してください。
属性タイプ | 属性値 |
---|---|
アーキテクチャ | PCI ベースのシステムに限定 |
ISA ベースのシステムに限定 (x86) | |
使用条件 | SUNWpd (Sparc) |
SUNWpsdcr (x86) | |
インタフェースの安定性 | 開発中 |
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 | デバイスの特殊ファイル | ファイル | エラー | 属性 | 関連項目 | 診断