PNP(4)

名称
pnp - PnP デバイスのサポート

書式
controller pnp0

解説
FreeBSD の PnP デバイスサポートによって、ユーザが PnP カードの設定を 強制設定することが可能になります。また、デバイスドライバが PnP カードの パラメータを取得・変更することが可能になります。

手動で強制設定する機能を用いるためには、カーネルを options USERCONFIG 付きでコンパイルする必要があります。 このときカーネルは、PnP デバイスの設定を記録するための 一定の大きさのテーブル (デフォルトで 20 エントリ) を確保します。 PnP カード 1 つが複数の独立したデバイスから構成されている こともあります (5 つ 6 つもあるということは異常ではありません)。

カーネルを “-c” フラグ付きでブートすることで、 PnP カードの設定変更のコマンドを使用できます。コマンドは
    pnp CSN LDN
というシーケンスから始まります。ここで、CSN ならびに LDN は それぞれ、デバイスに振られているカード選択番号 (Card Select Number) および論理デバイス番号 (Logiacal Device Number) です。 このシーケンスに続けて、以下のコマンドの任意の組み合わせが使えます。

irqN line
    カード上の割り込み 0 または 1 (訳注: N で指定) に使用する IRQ 線を設定します。 line に 0 を指定することは、IRQ 線を使用しないことを意味します。

drqN n
    カード上の DMA 0 または 1 (訳注: N で指定) に使用する DRQ チャネルを設定します。 チャネルに 4 を指定することは、チャネルを使用しないことを意味します。

portN address
    N 番目のポート領域 (port's range) の基底アドレス (base address) を設定します (N=0..7)。 address に 0 を指定することは、ポートを使用しないことを意味します。

memN address
    N 番目のメモリ領域 (memory's range) の基底アドレス (base address) を設定します (N=0..3)。 address に 0 を指定することは、メモリ領域を使用しないことを意味します。

bios
    PnP デバイスの設定として、BIOS が設定したものを使用します。 これはデフォルトであり、 BIOS が PnP をサポートしている場合には通常はこれでよいでしょう。 BIOS 設定を使用する場合には “flags” 以外のパラメータは無視されます。

os  PnP デバイスの設定に、このエントリで指定したものを使用します。

enable
    PnP デバイスを有効にします。

disable
    PnP デバイスを無効にします。

delete
    デバイスに使用されているエントリを開放し、別の CSN/LDN の組を持つ 他のデバイスで使用できるようにします。

flags
    デバイスドライバに渡す 32 ビットの flags エントリの値を設定します。 flags は、特別な動作モードを指定するのに使われることがあります。 (例えば、ある種のサウンドカードで SB と WSS のエミュレーションを 切り替える、など)

現在のテーブル内の設定値は、userconfig の ls コマンドで表示されます。 このテーブルは、ユーザが行なった変更に加え、 PnP デバイスドライバがアクセスしたすべての論理デバイスのエントリを 保持します。

テーブルの変更結果は、 dset(8) コマンドによってファイルシステム上のブートイメージに保存されます。 (訳注: カーネルの ELF 化により dset コマンドは廃止されました)

PnP をサポートするデバイスドライバ
カーネルは PnP デバイスを自動的に認識して設定します。 PnP デバイスは以下のデータ構造で識別します。

    struct pnp_device {
    	char	*pd_name;
    	char	*(*pd_probe ) (u_long csn, u_long vendor_id);
    	void	(*pd_attach ) (u_long csn, u_long vend_id, char * name,
    		    struct isa_device *dev);
    	u_long	*pd_count;
    	u_int	*imask;
    	struct	isa_device dev;
    };

プローブ (probe) ルーチンは、渡される vendor_id が自分が 認識するものであるか、 カード中の必要なデバイスが有効になっているかをチェックし、 チェックに 失敗した場合には NULL 値を、成功した場合には NULL でない値 (一般にデバイス名を指すポインタ) を返します。 プローブルーチン内において、論理デバイスが有効であるかどうかの チェックには、 read_pnp_parms() を使用できます。

アタッチ (attach) ルーチンは、 PnP カードを ISA アクセス可能にする、 設定を取得する、デバイスの ISA ドライバを呼ぶ、 といった必要な初期化をすべて行うことが必要です。

次のルーチンとデータ構造が使用できます。

struct pnp_cinfo
    このデータ構造 ( /usr/i386/isa/pnp.h で定義されている) は、 PnP 論理デバイスに関連するすべての情報を含んでいます。

read_pnp_parms(struct pnp_cinfo *d, int ldn)
    この関数は要求された論理デバイスの設定を返します。 この関数はプローブおよびアタッチの ルーチンから呼ばれることだけを想定しているため、 CSN を指定することはできません。

write_pnp_parms(struct pnp_cinfo *d, int ldn)
    この関数は要求された論理デバイスのパラメータを設定します。 同時に、カーネルの強制設定用テーブルのエントリを更新します。 BIOS や (userconfig を使用する) ユーザの方が、 どうパラメータを設定すべきかをよく知っているはずなので、 デバイスドライバは通常デバイスの設定を変更すべきでは ありません。 特に、 userconfig による強制設定メカニズムを破綻させてしまうため、 無効になっている論理デバイスを 有効にしてはなりません。 デバイスドライバは論理デバイスやポート領域などを無効にしても かまいませんが、これは、 特定のデバイスやパラメータが問題を起こすことがわかっている場合に 限るべきです。

enable_pnp_card(void)
    この関数はアタッチルーチン内部で のみ、 カードの ISA ポート/メモリのアドレス領域にアクセスする前に 呼ばなければなりません。

関連項目
dset(8) (訳注: 廃止されました)

バグ
ビジュアルコンフィギュレーションには、PnP デバイス設定のサポートが ありません。 userconfig のコマンドで PnP デバイスの設定を取得することができれば 素晴らしいことでしょう。

作者
PnP サポートは Sujal Patel が初めに手掛けたものを元に、 Luigi Rizzo が書きました。

歴史
pnp は FreeBSD 2.2.5 に初めて登場しました。