isapnptools は Linux で比較的古くから、サポートされている ISAPnP 設定ツール です。isapnptools はコンフィグレーションレジスタを読み出して、標準出力する pnpdumpコマンドと ISAPnP カードを設定する isapnp コマンド のふたつのコマンドから、構成されています。 pnpdump の標準出力をファイルにしたものを編集して、isapnp の設定に使います。 下記では、この設定ファイルを isapnp.conf と呼びます。
たぶん、isapnptools は 既にご使用中の Linux にインストールされている でしょう。ここでは、念のためインストールから説明します。
isapnptools の最新版は isapnptoolsのウェブサイトから入手できます。 2002 年 10 月現在の最新版は (09-May-201 にリリースされた) isapnptools-1.26.tgzです。 適当なディレクトリ(ここでは~/Src)に isapnptools-1.26.tgz を ダウンロードしたら、展開し、コンパイル、インストールします。
下記の文で、##はコメントです。
$ tar tvzf isapnptools-1.26.tgz ##中身を確認します。 $ tar xzf isapnptools-1.26.tgz ##展開します。 $ cd isapnptools-1.26 $ less README ##README は必ず読みましょう $ less doc/* ##文書に 一通り目を通しましょう。 $ ./configure --help ##どんなオプションがあるか確認します。 $ ./configure ##オプションなしで、良いみたいです。 $ make ## コンパイルエラーが出たら、下記を参照。 $ su # make install ##インストールします。 # exit $ 尚、標準では、オブジェクトや man ページは /usr/local/ にインストールされます (configure のオプションで変更できます)。 ディストリビュータの isapnptools で は、/sbin/isapnp, /sbin/pnpdump, /usr/share/man/man5/isapnp.conf.5.gz と インストールされることが多いようです。
古い isapnptools-1.23 には、残念なこと バグがありますので、isapnptools-1.23/src/pnpdump_main.c の 87 行目を 下記のように変更します。
static FILE* o_file = NULL;
isapnptools では、pnpdump で ISAPnP カードの設定を読み出し、それを 編集し、 isapnp コマンドで設定する方法を取ります。例えば下記のように します。
$ su # /usr/local/sbin/pnpdump >isapnp.conf # vi isapnp.conf # /usr/local/sbin/isapnp -c isapnp.conf # exit
pnpdump は下記のような項目を出力します。kernel 2.4 の /proc/isapnp よりも、 解りやすいのでしょう。これを適切に編集し、isapnp コマンドの 設定ファイルにします。
下記の例では SoundBlaster16 と 33k アナログモデムと 3Com 3C509B の 3 枚 の ISAPnP カードがあります。 これは ISAPnP のコンフィグレーションレジスタを読み出したものですから、 kernel 2.4 の /proc/isapnp と同一の内容を表しています。 ここでは、下記の出力 isapnp.conf の例を簡単に説明します。 #以降はコメントで、isapnp コマンドは無視します。
# $Id: ISAPnP-HOWTO.sgml,v 1.3 2002/11/30 11:14:44 mdk Exp $ # Release isapnptools-1.24 # # This is free software, see the sources for details. # This software has NO WARRANTY, use at your OWN RISK # # For details of the output file format, see isapnp.conf(5) # # For latest information and FAQ on isapnp and pnpdump see: # http://www.roestock.demon.co.uk/isapnptools/ # isapnptools そのものの説明です。 # Compiler flags: -DREALTIME -DHAVE_PROC -DENABLE_PCI -DHAVE_SCHED_SETSCHEDULER -DHAVE_NANOSLEEP -DWANT_TO_VALIDATE isapnptools をコンパイルしたときのフラグです。 # # Trying port address 0273 # Board 1 has serial identifier 9a ff ff ff ff 80 00 8c 0e # Board 2 has serial identifier 50 30 80 03 e5 02 02 aa 1a # Board 3 has serial identifier 08 97 19 38 e6 98 50 6d 50 # (DEBUG) (READPORT 0x0273) (ISOLATE PRESERVE) (IDENTIFY *) (VERBOSITY 2) (CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING これらは、isapnp コマンドへの指示です。 # Card 1: (serial identifier 9a ff ff ff ff 80 00 8c 0e) # Vendor Id CTL0080, No Serial Number (-1), checksum 0x9A. # Version 1.0, Vendor version 1.1 # ANSI string -->Creative ViBRA16CL PnP<-- # # Logical device id CTL0041 # Device supports vendor reserved register @ 0x39 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f 1 枚目のカードの説明です。 # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy (CONFIGURE CTL0080/-1 (LD 0 # ANSI string -->Audio<-- 1つめの論理デバイスの設定です。 # Multiple choice time, choose one only ! 選択候補はたくさんあるけれど、ひとつだけ選んでね。 # Start dependent functions: priority preferred 選択候補その 1 です。 # IRQ 5. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 5 (MODE +E))) IRQ 5 を使います。 # First DMA channel 1. # 8 bit DMA only # Logical device is a bus master # DMA may execute in count by byte mode # DMA may not execute in count by word mode # DMA channel speed in compatible mode # (DMA 0 (CHANNEL 1)) 1 番目の DMA の設定です。DMA 1 を使います。 # Next DMA channel 5. # 16 bit DMA only # Logical device is a bus master # DMA may not execute in count by byte mode # DMA may execute in count by word mode # DMA channel speed in compatible mode # (DMA 1 (CHANNEL 5)) 2 番目の DMA の設定です。DMA 5 を使います。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0220 # Maximum IO base address 0x0220 # IO base alignment 1 bytes # Number of IO addresses required: 16 # (IO 0 (SIZE 16) (BASE 0x0220)) 1 番目の I/O ポートアドレスの設定で、16 バイト分、0x220 から使います。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0330 # Maximum IO base address 0x0330 # IO base alignment 1 bytes # Number of IO addresses required: 2 # (IO 1 (SIZE 2) (BASE 0x0330)) 2 番目の I/O ポートアドレスの設定で、2 バイト分、0x330 から使います。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0388 # Maximum IO base address 0x0388 # IO base alignment 1 bytes # Number of IO addresses required: 4 # (IO 2 (SIZE 4) (BASE 0x0388)) 3 番目の I/O ポートアドレスの設定で、4 バイト分、0x388 から使います。 # Start dependent functions: priority acceptable 代替えとなるリソースの設定です。 # IRQ 5, 7, 9 or 10. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 5 (MODE +E))) IRQ は 5,7,9,10 の四つの内、一つが使えます。 # First DMA channel 1 or 3. # 8 bit DMA only # Logical device is a bus master # DMA may execute in count by byte mode # DMA may not execute in count by word mode # DMA channel speed in compatible mode # (DMA 0 (CHANNEL 1)) 1 番目の DMA は 1 か 3 が使えます。 # Next DMA channel 5 or 7. # 16 bit DMA only # Logical device is a bus master # DMA may not execute in count by byte mode # DMA may execute in count by word mode # DMA channel speed in compatible mode # (DMA 1 (CHANNEL 5)) 2 番目の DMA は 5 か 7 が使えます。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0220 # Maximum IO base address 0x0280 # IO base alignment 32 bytes # Number of IO addresses required: 16 # (IO 0 (SIZE 16) (BASE 0x0220)) 1 番目の I/O ポートアドレスは 0x220,0x240,0x260,0x280 のうち一つが使えます。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0300 # Maximum IO base address 0x0330 # IO base alignment 48 bytes # Number of IO addresses required: 2 # (IO 1 (SIZE 2) (BASE 0x0300)) 2 番目の I/O ポートアドレスは 0x300,0x330 のどちらかが使えます # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0388 # Maximum IO base address 0x0388 # IO base alignment 1 bytes # Number of IO addresses required: 4 # (IO 2 (SIZE 4) (BASE 0x0388)) 3 番目の I/O ポートアドレスは 0x338 から 4 バイト置きに 0x3f8 までの内、一つ が使えます。 中略 # End dependent functions (NAME "CTL0080/-1[0]{Audio }") # (ACT Y) 設定を有効にするときに、# をはずします。 )) 1 番目の論理デバイスの設定の終わりです。 # Logical device id CTL7002 # Device supports vendor reserved register @ 0x38 # Device supports vendor reserved register @ 0x39 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy (CONFIGURE CTL0080/-1 (LD 1 # ANSI string -->Game<-- 2 番目の論理デバイスの設定です。 # Multiple choice time, choose one only ! # Start dependent functions: priority preferred # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0200 # Maximum IO base address 0x0200 # IO base alignment 1 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x0200)) I/O ポートアドレスは 0x200 を使います。 # Start dependent functions: priority acceptable # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0200 # Maximum IO base address 0x0208 # IO base alignment 8 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x0200)) 代替えとなるリソースです。I/O ポートアドレスは 0x200 と 0x208 のどちらかが 使えます。 # End dependent functions (NAME "CTL0080/-1[1]{Game }") # (ACT Y) 設定を有効にするときに、# をはずします。 )) 2 番目の論理デバイスの設定の終わりです。 # End tag... Checksum 0x00 (OK) # Card 2: (serial identifier 50 30 80 03 e5 02 02 aa 1a) # Vendor Id FUJ0202, Serial Number 813695973, checksum 0x50. # Version 1.0, Vendor version 0.5 # ANSI string -->FUJITSU Modem 33600 PNP/I2<-- # # Logical device id FUJ0000 # Device supports I/O range check register # Device supports vendor reserved register @ 0x38 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy 2 枚目の カードの説明です。 (CONFIGURE FUJ0202/813695973 (LD 0 一つ目の論理デバイスの設定です。 # Multiple choice time, choose one only ! # Start dependent functions: priority acceptable # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x02f8 # Maximum IO base address 0x02f8 # IO base alignment 8 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x02f8) (CHECK)) I/O ポートアドレスは 0x2f8 を使います。 # IRQ 3. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 3 (MODE +E))) IRQ は 3 を使います。 # Start dependent functions: priority acceptable 代替えとなるリソースです。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x03f8 # Maximum IO base address 0x03f8 # IO base alignment 8 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x03f8) (CHECK)) I/O ポートアドレスは 0x3f8 を使います。 # IRQ 4. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 4 (MODE +E))) IRQ は 4 を使います。 中略 # End dependent functions (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") # (ACT Y) 設定を有効にするときに、# をはずします。 )) # End tag... Checksum 0x00 (OK) 2 番目のカードの設定の終わりです。 # Card 3: (serial identifier 08 97 19 38 e6 98 50 6d 50) # Vendor Id TCM5098, Serial Number 2535012582, checksum 0x08. # Version 1.0, Vendor version 1.0 # ANSI string -->3Com 3C509B EtherLink III<-- # # Logical device id TCM5098 # Device supports I/O range check register # Device supports vendor reserved register @ 0x38 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy 3 枚目のカードの説明です。 (CONFIGURE TCM5098/2535012582 (LD 0 # Compatible device id PNP80f7 # IRQ 3, 5, 7, 9, 10, 11, 12 or 15. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 3 (MODE +E))) IRQ は 3,5,7,9,19,11,12,15 の内 一つが使えます。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0210 # Maximum IO base address 0x03e0 # IO base alignment 16 bytes # Number of IO addresses required: 16 # (IO 0 (SIZE 16) (BASE 0x0210) (CHECK)) I/O ポートアドレスは 16 バイト分を 0x210 から 16 バイト置きに 0x3e0 までの内、 一つが使えます。 (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") # (ACT Y) 設定を有効にするときに、# をはずします。 )) # End tag... Checksum 0x00 (OK) 3 枚目のカードの設定の終わりです。 # Returns all cards to the "Wait for Key" state (WAITFORKEY) すべてのカードの設定の終わりです。
isapnptools の設定は、pnpdump の標準出力をファイルにしたものを編集して、 isapnp の設定に使います。この設定ファイルを isapnp.conf と呼びます。 isapnp.conf の設定は かっこの中に書きます。
isapnp.conf には、ISAPnP カードが使用できるリソースが列記されていますので、 必要なリソースに対応した行の先頭にある#を取り去り、 リソースを有効にします。または、リソースの行を適切に編集します。 具体的には下記のようにします。尚、行番号を説明のために付加しています。
1: (CONFIGURE FUJ0202/813695973 (LD 0 2: 3: # Multiple choice time, choose one only ! 4: 5: # Start dependent functions: priority acceptable 6: # Logical device decodes 16 bit IO address lines 7: # Minimum IO base address 0x02f8 8: # Maximum IO base address 0x02f8 9: # IO base alignment 8 bytes 10: # Number of IO addresses required: 8 2 行目から 10 行目までは、削除してかまいません。 11: # (IO 0 (SIZE 8) (BASE 0x02f8) (CHECK)) (IO 0 (SIZE 8) (BASE 0x02f8)) "#"を取り有効にします。(CHECK) をはずしました。 12: # IRQ 3. 13: # High true, edge sensitive interrupt (by default) 14: # (INT 0 (IRQ 3 (MODE +E))) (INT 0 (IRQ 3 (MODE +E))) "#"を取り有効にします。 15: 16: # Start dependent functions: priority acceptable 17: # End dependent functions 18: (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") 19: # (ACT Y) (ACT Y) "#"を取り有効にします。これを忘れると、設定が反映されません。 20: )) 21: (CONFIGURE TCM5098/2535012582 (LD 0 22: # Compatible device id PNP80f7 23: # IRQ 3, 5, 7, 9, 10, 11, 12 or 15. IRQ は 3,5,7,9,10,11,12,15のどれかを選択します。 24: # High true, edge sensitive interrupt (by default) 25: # (INT 0 (IRQ 3 (MODE +E))) (INT 0 (IRQ 10 (MODE +E))) "#"を取り有効にします。IRQ は 10 にしました。 26: # Logical device decodes 16 bit IO address lines 27: # Minimum IO base address 0x0210 28: # Maximum IO base address 0x03e0 29: # IO base alignment 16 bytes 30: # Number of IO addresses required: 16 I/O ポートアドレスは 0x210 から 16 バイト置きに 0x3e0 の範囲から選択します。 31: # (IO 0 (SIZE 16) (BASE 0x0210) (CHECK)) (IO 0 (SIZE 16) (BASE 0x0300) (CHECK)) "#"を取り有効にします。 I/O ポートアドレスは 0x300 にしました。 32: (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") 33: # (ACT Y) (ACT Y) "#"を取り有効にします。これを忘れると、設定が反映されません。 34: )) 25: (WAITFORKEY)これを整理すると、下記のようになります。
(CONFIGURE FUJ0202/813695973 (LD 0 (IO 0 (SIZE 8) (BASE 0x02f8) ) (INT 0 (IRQ 3 (MODE +E))) (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") (ACT Y) )) (CONFIGURE TCM5098/2535012582 (LD 0 (INT 0 (IRQ 10 (MODE +E))) (IO 0 (SIZE 16) (BASE 0x0300) (CHECK) ) (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") (ACT Y) )) (WAITFORKEY)
isapnptolls はリソースの衝突に敏感です。 isapnptools の設定の中で、33k アナログ モデムの設定で、(CHECK) をはずした行があります(下記に転記します)。
(IO 0 (SIZE 8) (BASE 0x02f8) )この I/O ポートアドレス 0x2f8 はマザーボード上の標準シリアルポートです。 この 33k アナログモデムでは、標準のシリアルポートと同じ I/O ポートアドレス を使います。BIOS でマザーボード上の標準シリアルポートは無効にしていますが、 kernel によって、自動的にリソースが登録されてしまいます。そのため、 リソースが衝突しているように、見えます。isapnp は (CHECK) が 指定してあると、リソースの衝突を発見したとき、その時点で、中断(abort)して しまいますが、(CHECK) を外すと、エラーは報告しますが、 リソースの設定も実行し、処理も続行します。
isapnp の設定(pnpdump の出力)でリソースの衝突に関係する部分について、 説明します。
isapnptools コンパイル時に "--enable-onreserr" を付けると、 -DABORT_ONRESERR が出力されます。このオプションフラグを付けて、 isapnptools をコンパイルすると、isapnp コマンドは設定とリソースが衝突した 場合、処理を中断するようになります。
リソースが衝突したときの動作を指定します。FATALの場合、 致命的(fatal)なエラーとして、isapnp コマンドは処理を中断します。 WARNINGの 場合、警告(warning)を出力し、処理を続行します。
I/O ポートアドレスの設定に (CHECK)が指定されていた場合、 isapnp コマンドはリソースの衝突を検査(check)します。衝突が発見された場合、 isapnp コマンドは処理を中断します。
また、isapnp コマンドに、使用禁止のリソースを知らせるファイル /etc/isapnp.gone があります。/etc/isapnp.gone の書式を 下記に示します。
使用禁止にする I/O ポートアドレスのベースアドレスとその大きさを指定します。 大きさを省略すると、大きさは 8 バイトになります。
使用禁止にする IRQ 番号を指定します。
使用禁止にする DMA 番号を指定します。
使用禁止にするメモリのベースアドレスと大きさを指定します。
/etc/isapnp.goneの例を下記に示します。
IO 0x3f8,8 IRQ 4 DMA 1 DMA 5 IO 0x378,2 IRQ 7
上記のように、isapnp コマンドはリソースの衝突に敏感です。これは動作としては、 正しいのですが、使い勝手が悪くなります。その理由は下記の通りです。
ISAPnP を一度設定すると、設定したリソースは当然、使用中になります。 二つある I/O ポートアドレスの内、一つ目は変更せず、二つ目の I/O ポートアドレス を変更しようとした場合、一つ目のI/O ポートアドレスが使用中のリソースと衝突 してしまいます。 ISAPnP カードの設定は、電源投入時にのみ、初期化されます。Linux や Windows 系 の OS の再起動では、設定は初期化されません。
これを回避するには、isapnp コマンドの設定(pnpdump の出力)を下記のようにします。
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL))を (CONFLICT (IO WARNING)(IRQ FATAL)(DMA FATAL)(MEM FATAL))と FATAL を WARNING に変更する。 (IO x (SIZE y) (BASE z) (CHECK))を (IO x (SIZE y) (BASE z) )と、(CHECK)を削除する。しかし isapnptools のコンパイル時に --enable-onreserr を指定した場合、 isapnp コマンドの設定(pnpdump の出力)で変更することはできません。 --enable-onreserrを付けずに、isapnptoolsを再コンパイルする必要が あります。
下記に設定例を示します。この設定を/etc/isapnp.confというファイル名 で作成します。
(READPORT 0x0273) (ISOLATE PRESERVE) (IDENTIFY *) (VERBOSITY 2) (CONFLICT (IO WARNING)(IRQ WARNING)(DMA WARNING)(MEM WARNING)) (CONFIGURE CTL0080/-1 (LD 0 (INT 0 (IRQ 5 (MODE +E))) (DMA 0 (CHANNEL 1)) (DMA 1 (CHANNEL 5)) (IO 0 (SIZE 16) (BASE 0x0220)) (IO 1 (SIZE 2) (BASE 0x0330)) (IO 2 (SIZE 4) (BASE 0x0388)) (NAME "CTL0080/-1[0]{Audio }") (ACT Y) )) (CONFIGURE CTL0080/-1 (LD 1 # (IO 0 (SIZE 8) (BASE 0x0200)) (NAME "CTL0080/-1[1]{Game }") # (ACT Y) )) (CONFIGURE FUJ0202/813695973 (LD 0 (IO 0 (SIZE 8) (BASE 0x02f8) ) (INT 0 (IRQ 3 (MODE +E))) (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") (ACT Y) )) (CONFIGURE TCM5098/2535012582 (LD 0 (INT 0 (IRQ 10 (MODE +E))) (IO 0 (SIZE 16) (BASE 0x0300) ) (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") (ACT Y) )) (WAITFORKEY)何故、33k アナログモデムの設定が kernel 2.4 の設定例には無くて、 isapnptoolsの設定にはあるのかといいますと、kernel 2.4 の標準シリアルポート デバイスドライバは、ISAPnP に対応しており自動設定で済みますが、 kernel 2.2 の標準シリアルポートデバイスドライバは、ISAPnP に対応していない ので、設定する必要があるためです。
現在、ご使用の Linux に isapnptools がインストール済みであれば、 起動時の設定もされているはずです。 ディストリビューションによっても違いますが、ここでは、RedHat 系の /etc/rc.d/rc.sysinitスクリプトを使う場合を説明します。 /etc/rc.d/rc.sysinit の /proc のマウント直後に下記のように追加します。
mount -t proc /proc /proc if [ -x /usr/local/sbin/isapnp -a -f /etc/isapnp.conf ]; then /usr/local/sbin/isapnp /etc/isapnp.conf fi