スポンサーリンク

PNP(4) FreeBSD/i386 カーネルインタフェースマニュアル 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 に初めて登場しました。

FreeBSD September 7, 1997 FreeBSD

スポンサーリンク