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