PPBUS(4)

名称
ppbus - パラレルポートバスシステム

書式
controller ppbus0

controller vpo0 at ppbus?

device nlpt0 at ppbus? device plip0 at ppbus? device ppi0 at ppbus? device pps0 at ppbus? device lpbb0 at ppbus?

解説
ppbus システムは、様々なパラレルデバイスを制御したり、 異なったパラレルポートチップセットを使うためのドライバを実装するための、 単一形態でモジュール化された、アーキテクチャに依存しないシステムを提供します。

デバイスドライバ
新しいドライバを書いたり、すでにあるドライバを移植するために、 ppbus システムは以下の機能を提供しています。

•   パラレルポートをアクセスするための、アーキテクチャに依存しないマクロや関数

•   いろいろなデバイスが同じパラレルポートを共有できるようにするための機構

•   カーネル内のデバイスと競合することなく、 カーネルの外部からパラレルポートをアクセスすることができる ppi(4) と呼ばれるユーザインタフェース

  新しいドライバを開発する

ppbus システムは標準および非標準のソフトウェアの開発をサポートするために設計されてきました。

ドライバ | 説明
vpo | VPI0 パラレル - Adaptec AIC-7110 SCSI コントローラドライバ 。
これは標準および非標準のパラレルポートアクセスを使用しています。
ppi | 一般の I/O のためのパラレルポートインタフェース
pps | 秒単位パルス (pulse per second) タイミングインタフェース
lpbb | Philips 社公式のパラレルポート I2C ビット操作インタフェース

  現在あるドライバを移植する

ppbus のもう 1 つのアプローチは現在あるドライバを移植するためのものです。 いろいろなドライバが既に移植されています。

ドライバ | 説明
nlpt | lpt プリンタドライバ
plip | lp パラレルネットワークインタフェースドライバ

ppbus を用いることで、同様なサービスを提供する他の オペレーティングシステムからでも、 ソフトウェアを移植することが可能となります。

パラレルポートチップセット
パラレルポートチップセットは ppc(4) によってサポートされます。

ppbus システムは、新しいパラレルポートバスを割り当てるための 関数とマクロを提供し、 それと上位の周辺デバイスドライバを初期化します。

ppc はチップセットの検出と初期化を行った後、 ppbus システムを初期化するために ppbus 付属関数をコールします。

パラレルポートモデル
ppbus システムで採用された論理パラレルポートモデルは、 PC のパラレルポートモデルです。 さらに i386 での ppbus の実装では、 ppc によって提供されているほとんどのサービスは inb() および outb() を 行うマクロです。 しかし、他のアーキテクチャでは、ppbus の論理レジスタ (データ、ステータス、制御...) へのアクセスは、 複数の I/O アクセスが必要となるかもしれません。

  解説
パラレルポートは以下のモードで操作することができます。

•   コンパチブルモード、セントロニクスモードとも呼ばれる

•   双方向 8/4 ビットモード、ニブルモードとも呼ばれる

•   バイトモード、PS/2 モードとも呼ばれる

•   ECP モード (Extended Capability Port mode)

•   EPP モード (Enhanced Parallel Port mode)

•   ECP と EPP の混合モード、もしくは ECP と PS/2 の混合モード

  コンパチブルモード
このモードは、ほとんどの PC で用いられている、 プリンタにデータを転送するためのプロトコルを定義するものです。 このモードでは、データはポートのデータ線にセットされ、 プリンタのステータスがエラーがなくビジーでないことがチェックされた後、 プリンタへのデータ送信のタイミングとして データストローブがソフトウェアによって生成されます。

コンパチブルモードプロトコルでデータを転送する際に、FIFO バッファを使う モードが実装されている I/O コントローラが多数あります。 このモードは "高速セントロニクス" もしくは "パラレルポート FIFO モード" と呼ばれています。

  双方向モード
ニブルモードは、プリンタや周辺機器からの逆方向チャネルデータを 取り込むための最も一般的な方法です。 ホストからプリンタへの転送を行なう標準モードと組み合わせることで、 完全な双方向チャネルが提供されます。

このモードでは出力は 8 ビット長です。 入力は、ステータスレジスタの 8 ビットのうち 4 ビットを 読むことにより実現されています。

  バイトモード
このモードではデータレジスタは出力用にも入力用にも使われます。 この場合、全ての転送は 8 ビット長です。

  ECP モード
ECP プロトコルは、プリンタやスキャナタイプの周辺機器との通信のために、 さらに進んだモードとして提案されたものです。 EPP プロトコルと同様に、ECP モードはホストアダプタと周辺機器との間での 高性能な双方向通信を行なうための経路を提供しています。

ECP プロトコルには以下の機能が含まれています。

ホストアダプタ用のランレングスエンコーディング (RLE) データ圧縮

順方向および逆方向チャネル用の FIFO

ホストレジスタインタフェースのためのプログラム I/O に加え DMA

  EPP モード
EPPプロトコルはもともと標準のパラレルポートと互換性を保ちながら、 高性能なパラレルポートリンクを提供する手段として開発されました。

  混合モード
SMC のように、混合モードをサポートするチップセットを供給している 製造業者がいくつかあります。 そのようなチップセットでは、拡張制御レジスタをアクセスすることによって、 いつでもモードを変更することができます。

IEEE1284-1994 標準

  背景
この標準は "IEEE Standard Signaling Method for a Bidirectional Parallel Peripheral Interface for Personal Computers" (「パーソナルコンピュータのための双方向パラレル周辺機器 インタフェースのIEEE 標準信号化方式」) とも呼ばれています。 これはホストとプリンタその他の周辺機器との間の、 非同期で完全に連動して動作する双方向のパラレル通信の 信号化方法を規定したものです。 この方式は、周辺機器識別用の文字列のフォーマットと、 双方向データストリーム外を通じてその文字列をホストに返す方法も 規定しています。

この標準はアーキテクチャに依存せず、 信号レベルでのハンドシェークのやりとりのみを規定しています。 マシン依存のレジスタ、マッピングされたメモリ、その他 これらの信号を制御するものすべてを操作するためには、 アーキテクチャに特化したドキュメントを参照する必要があるでしょう。

IEEE1284 プロトコルは、サポートしている全てのパラレルポートモードに 対して完全に適合します。 コンピュータはマスタとして、周辺機器はスレーブとして動作します。

全ての転送は有限状態オートマトンとして定義されます。 これにより、ソフトウェアは、完全に連動して動作する信号化方式の体系を うまく管理することができるようになります。 コンパチブルモードはそれが「コンパチブル」なため、 一切のネゴシエーションなしでそのままサポートされます。 この他の全てのモードでは、周辺機器がそのモードをサポートしているかどうかを チェックし、その後、フォワードアイドル状態の一つに入るために、 ホストは最初にネゴシエーションが行なわれなければなりません。

どのような時にでも、スレーブからホストにデータを送る必要が生じることが あるでしょう。 スレーブからのデータ送信はフォワードアイドル状態 (ニブル、バイト、ECP...) からのみ可能です。 そのため、周辺機器がデータ転送要求を行うことを許可するために、 ホストは前もってネゴシエーションを行っておく必要があります。 時間を浪費するポーリング方式を避けるために、 割り込みラインをデータ要求信号用として使うこともできます。

しかし、マスタホストにとっては、周辺からの要求は単なるヒントで しかありません。 ホストが転送を受け付けると、まず逆方向モードのネゴシエーションを行って、 それから転送を開始します。 逆方向の転送中も、ホストはいつでも転送を止めることができますし、 スレーブももうデータがないことを信号によって知らせることができます。

  実装
IEEE1284 標準のサポートは、ppbus システムの上に実装されています。 どのモードにおいても標準が規定する低レベルの特性に煩わされることなく、 ネゴシエーション、ターミネーション、転送のような高レベルの機能を実行する 手続きのセットとして実装されています。

IEEE1284 は、ppbus システムとはできるだけ相互作用を おこなわないようになっています。 これは、現在のところ、ppbus をアクセスしたいときには ppbus に要求をしなければならないことを意味します。 ネゴシエーション機能では、ppbus へのアクセスは勝手には行われないと いうことです。 これをあとで解放しなければならないのは当然でしょう。

アーキテクチャ

  アダプタ層, ppbus 層, デバイス層
まず、ppbus システムの最下位に アダプタ 層があります。 これは、論理モデルをその下位にあるハードウエアにマップする、 低レベルの関数の集合によって抽象化されたチップセットです。

その次には ppbus 層があり、以下の機能を提供しています。

1.  デイジーチェーンのように接続されたデバイス間でのパラレルポートバスの共有

2.  ppbus に結合されたデバイスの管理

3.  ハードウェア層をアクセスするためのアーキテクチャ独立のインタフェースの提供

最後は デバイス 層で、パラレル周辺デバイスドライバを集めたものとなっています。

各階層は、それぞれが専用の C 構造体を一つ、それぞれ ppb_adapter, ppb_data, ppb_device を持ちます。 ppb_link 構造体は他の構造体へのポインタと、 異なった層の間で共有する情報をまとめたものです。

これらの構造体については ppbconf(9) の説明を参照してください。

  パラレルモード管理
いろいろな ppbus システム層において、 動作モードを区別しなければなりません。 実際には、ppbus とアダプタの動作モード、 それぞれに対して、現在のモードと使用可能なモードは分離されています。

このレベルの抽象化によって、特定のチップセットでは、 上位層を煩わせることなく、ネイティブモードから、拡張モードによって エミュレートされる他のどのようなモードへでも切り替えることが できるようになるかもしれません。 例えば、ほとんどのチップセットはニブルモードをネイティブモードとして サポートしており、それで、ECP や EPP モードをエミュレートしています。

このアーキテクチャによって IEEE1284-1994 のモードをサポートでき るはずです。

特徴的な機能

  ブートプロセス
ブートプロセスは ISA バス (PC アーキテクチャ) の初期化中に、 ppc(4) ドライバのプローブから始まります。 ppc ドライバの attach 中に、ppbus 構造体が新しく割り当てられ 初期化 (アダプタ構造体とリンクされる) されて、関数 ppb_attachdevs(struct ppb_data *ppb) に渡されます。

ppb_attachdevs() は PnP パラレル周辺機器 ( ドラフト(c)1993-4 Microsoft Corporation による) の検出を試みた後、プローブ処理と 既知のデバイスドライバの割り付け (attach) を行います。

プローブ中には、デバイスドライバは ppbus に要求を出して、 自分の動作モードの設定を試みることになっています。 設定された動作モードはコンテキスト構造体にセーブされ、 ドライバが ppbus に要求したときに戻されます。

  バスの割り当てと割り込み
ppbus の割り当ては他のデバイスの I/O を破壊しては ならないことが必須です。ppbus の割り当てのその他の使い方は、 ポートを予約して割り込みの入力を受けることです。

割り込みは、 ppcintr() 関数に接続されています。この関数は、 ppb_intr(struct ppb_link *pl) の呼び出しを用いて、割り込みを ppbus に直接届けます。 バスのオーナのハンドラが定義されていれば、 ppbus は割り込みをそのハンドラにリダイレクトします。 したがって、デバイスが割り込みを届けてもらいたければ、 ppbus のオーナとならなければなりません。

  マイクロシーケンス
マイクロシーケンス はパラレルポートの高速な低レベルの操作を可能とするための、 汎用のメカニズムです。 マイクロシーケンスは (IEEE1284 モードにおける) 標準な転送にも、 非標準な転送にも使うことができるでしょう。 マイクロシーケンスの考えかたは、ppbus 層のオーバーヘッドを回避し、 ほとんどの仕事をアダプタレベルで行おうとするものです。

マイクロシーケンスはオペコードとパラメータの配列です。 各オペコードはオペレーションをコード化したものです。 (オペコードは microseq(9) で解説されています。) 標準の I/O 操作は ppbus レベルで実装されていますが、 基本的な I/O 操作とマイクロセック言語は、効率化のために アダプタレベルでコード化されています。

例えば、 vpo(4) ドライバの実装では、

•   ニブル転送モードの変更バージョン

•   周辺機器の初期化と選択と割り当てを行うさまざまな I/O シーケンス

を実装するためにマイクロシーケンスが使われています。

関連項目
ppbconf(9), ppc(4), ppi(4), vpo(4), nlpt(4), plip(4)

歴史
ppbus マニュアルページは FreeBSD 3.0 で最初に登場しました。

作者
このマニュアルページは Nicolas Souchu によって書かれました。