/etc/pcmcia/config(5) PCMCIA カードの設定データベース

説明

PCMCIA カード設定ファイルは cardmgr(8) が起動時に読み込む。 この設定ファイルは、カードサービスが利用できる IO ポート・メモリ・IRQ といったリソースを定義し、 デバイスドライバのロードや初期化の方法を指定し、 それぞれの PCMCIA カードの詳細について記述する。

リソースの記述

リソースのエントリには 3 つの種類がある。 include, exclude, reserve である。 include したリソースは、 カードサービスがクライアントとなる各種ドライバに割り当てる。 カードサービスの制御下にあるリソースは exclude することもできる。 例えばシステムの特定のデバイスがそのリソースを使うような場合である。 リソースは reserve することもできる。 この場合は、そのリソースを特に使いたいと要求するクライアントが現われるか、 あるいは他に割り当て可能なリソースが無くなるまで、 そのリソースは割り当てない。

リソースのタイプには 3 つの種類がある。 port, memory, irq である。 デフォルトでは、カードサービスは他のデバイスドライバが使っていない irq を自由に使えるものと仮定する。 しかし、カードサービスは I/O ポートとアドレスの範囲に関しては なんの仮定も行わない。 Linux のドライバの中には リソースの利用状況を登録しない物があるからである。 そのため、 IO ポートとメモリの範囲については、 PCMCIA デバイスが使って良い部分を明示的に指定しなければならない。

これらをまとめると、設定ファイルの内容は以下のようになる:

include port 0x300-0x3ff, memory 0xd0000-0xdffff
reserve irq 3
exclude irq 4, port 0x3f8-0x3ff

この例では、カードサービスは I/O ポートの 0x300 から 0x3ff と、メモリの 0xd0000 から 0xdffff までを割り当てて良いことになる。 exclude 指定をした irq 4 と I/O ポートの 0x3f8 から 0x3ff は、 利用可能であっても使わない。 reserve 指定した irq 3 は、 特にその割り込みをクライアントが必要とした場合に限って利用する。

カードサービスは、他のカーネルデバイスドライバに割り当てられている リソースは決して利用しない。 include/exclude/reserve メカニズムは、カードサービスが使おうと試みるリソースを指定するもので、 Linux のリソースマネージャーに登録されないデバイスと うまく共存するための仕組みなのである。

デバイスドライバの記述

カードサービスの全てのクライアントドライバは、 32 文字のタグによって識別される。 設定ファイル中の device エントリがクライアントドライバを記述する。 必須のフィールドは識別用のタグのみで、 その他のフィールドには、 そのデバイスを利用するためにロードすべきカーネルモジュールや デバイスの実体を有効/無効するために実行するスクリプトを指定する。 ドライバの実体がソケットに割り当てられると、 ドライバは cardmgr にシステムから見たそのデバイスの名称 (ネットワークデバイスならば eth0、 モデムならば cua1 など) を通知する。 この名称は設定用スクリプトに渡される。例えば:

device "pcnet_cs"
  class "network"
  module "net/8390" opts "ei_debug=4", "pcnet_cs"

という指定では、 pcnet_cs デバイスは 2 つのローダブルモジュールが必要であることを示している。 1 つめのモジュール (8390) はモジュールディレクトリの net サブディレクトリにあり、指定したパラメータ ei_debug=4 と共にロードされる。 2 つめのモジュール (de650_cs) は pcmcia サブディレクトリにある。 このデバイス (pcnet_cs) は network というクラスに属し、デバイスの起動と終了には、 設定ファイルと同じディレクトリにある network スクリプト (/etc/pcmcia/network) が利用される。

デバイスドライバ宣言の外部で、 特定のカーネルモジュールのデフォルトのオプションを指定することもできる。 これはローカルな設定オプションを メインのカード設定ファイルから分離するのに便利である。

module "pcnet_cs" opts "mem_speed=600"

カードの記述

card 宣言は、PCMCIA カードとそのクライアントドライバとを 結びつけるものである。 card 宣言は、カードの名称・カードが挿入された際の識別方法・ 利用するドライバ、の 3 つの部分からなる。 カードを識別するには 6 つのメソッド (方法) がある。 version メソッドはカード識別に VERSION_1 id 文字列を用いる。 manfid メソッドはカードの MANFID タプルコードを用いる。 pci メソッドは CardBus カードの PCI デバイス ID を用いる。 tuple メソッドはカードの任意の CIS タプルに埋めこまれた文字列を用いる。 function メソッドはカードの function ID を用いる。 anonymous メソッドは CIS を持たないカードにマッチする (これは旧式のタイプ I メモリカードに用いる物である)。 以下にいくつか例を示す。

card "Linksys Ethernet Card"
  tuple 0x40, 0x0009, "E-CARD PC Ethernet Card"
  bind "pcnet_cs"

このカードは 0x40 タプルのオフセット 0x0009 から始まる 文字列 "E-CARD PC Ethernet Card" によって識別され、 pcnet_cs ドライバにバインドされる (ドライバはあらかじめ driver 宣言で定義されていなければならない)。

card "Connectware LANdingGear Adapter"
  manfid 0x0057, 0x1004
  bind "pcnet_cs"

このカードは MANFID タプルの内容によって識別される。 pci メソッドも同じ形式で、 manfid の代わりに pci と書く。

card "D-Link DE-650 Ethernet Card"
  version "D-Link", "DE-650"
  bind "pcnet_cs"

このカードは VERISON_1 タプルによって識別され、 pcnet_cs ドライバにバインドされる。

card "Serial port device"
  function serial_port
  bind "serial_cs"

これは CIS function ID が 0x02 (シリアルポートカードに対応) のあらゆるカードを serial_cs ドライバにバインドする。 function ID は数字でも良いし、定義済みの function である memory_card, serial_port, parallel_port, fixed_disk, video_adapter, network_adapter, aims_card のいずれかでもかまわない。

最後に、カードで見付かった設定情報とは異なるものを カードサービスに用いさせるような指定も設定ファイルでは可能である。 カードの設定情報が特に不完全・不正確である場合にこれを使えることもある。 新しい設定はファイルから読み込む。例を示す:

card "Evil broken card"
  manfid 0x1234, 0x5678
  cis "fixup.cis"
  bind "serial_cs"

メモリ領域定義

メモリ領域定義は、特定の形式のメモリデバイスを Memory Technology Driver (MTD) に関連付けするために用いられる。 MTD はメモリアクセスを、デバイス独立なやり方で提供する。 カードがこの種のメモリデバイスであると識別されると、 カードサービスはそのメモリ領域全てに対して MTD を読み込もうとする。

メモリ領域定義は region キーワードと識別文字列から始まる。 次に識別メソッドである defaultjedec が来る。 default は他に分類されなかったすべての領域で使う MTD を指定し、 jedec はメモリ領域を JEDEC の識別コードによって識別する。 例えば

region "Intel Series 2 Flash"
  jedec 0x89 0xa2
  mtd "iflash2_mtd"

は、 JEDEC がマッチすれば iflash_mtd ドライバがロードされることを示している。

バグ

今のところ reserve キーワードの実装はこのバージョンのカードサービスにはあまり便利でない。

著者

David Hinds - [email protected]