31.2 PCMCIAの詳細

ここでは、PCMCIAデバイスをマシンに接続したときのLinuxシステムの動作について説明します。各コンポーネントは連携動作し、また、PCMCIAデバイスをサポートするには多くの要件が満たされる必要があります。

以下は、LinuxでのPCMCIAの初期化プロセスの概略です。

  1. 31.2.1項 「ブリッジの初期化」で説明しているように、PCMCIAブリッジ(ソケット)が適切にセットアップされている必要があります。前提条件は以下のとおりです。

    • ブリッジに適切なドライバ

    • PCカード用の空きI/Oとメモリ範囲

  2. 31.2.2項 「カードの初期化」で説明しているように、ブリッジが適切にセットアップされた後は、ブリッジドライバがカードを検出し、初期化を開始します。

    1. カードタイプを指定します。

    2. 適切な電圧を供給します。

    3. I/O、メモリ範囲およびIRQラインをカードに割り当てます。

    4. 適切なカードドライバをバインドして、カード(デバイス)の初期化を開始します。

    5. 一部のカードには、CIS (カード情報構造)をアップロードする必要があります。

  3. 最後に、インタフェースがセットアップされ、すぐに使用できるようになります。詳細については、31.2.3項 「インタフェースのセットアップ」を参照してください。

31.2.1 ブリッジの初期化

PCMCIAブリッジの多くはPCIデバイスなため、そのように扱われます。ブリッジの初期化プロセスについて、以下にまとめました。

  1. HotplugがPCIイベントを作成します。

  2. udevが/sbin/hwupを呼び出し、ドライバをロードします。/sbin/hwupが、/etc/sysconfig/hardwareに既存のデバイス設定があるかどうかを確認します。適切な設定が見つかった場合、その設定が使用されます。見つからなかった場合は、/sbin/hwupは、カーネルによって指定されるmodalias文字列を使用してmodprobeを呼び出し、ドライバモジュールをロードします。

  3. 新規のhotplugイベントが送信されます(PCMCIAソケットごとに1つ)。

  4. CardBusカードが使用されている場合のみ、以下のステップを省略します。

    1. pcmcia_socketイベントにより、udevは/sbin/hwupを呼び出し、pcmciaカーネルモジュールをロードします。

    2. /etc/pcmcia/config.optsで指定されているすべてのI/Oおよびメモリ範囲が、ソケットに追加されます。

    3. カーネルのカードサービスがこれらの範囲をチェックします。/etc/pcmcia/config.opts内のメモリ範囲が誤っているとき、このステップでマシンのクラッシュが発生する場合があります。この問題のデバッグおよび修正方法については、31.3.1項 「PCMCIAによるマシンのクラッシュ」を参照してください。

これらのステップを完了すると、ブリッジが完全に初期化されます。この後、以下で説明しているように、カード自体が初期化されます。

31.2.2 カードの初期化

PCMCIAカードの挿入により発生する一連のイベントについて、以下にまとめました。

  1. hotplugイベントが発生します。PCカードの場合、これは、pcmciaイベントです。CardBusカードの場合、これは、pciイベントです。

  2. いずれのイベントの場合も、udevが/sbin/hwupを呼び出し、ドライバモジュールをロードします。モジュール名は、/etc/sysconfig/hardwarehwcfg*ファイルか、modprobe modaliasを介して指定されます。

  3. 必要に応じて、デバイスの初期化により、ファームウェアhotplugイベントがトリガされます。このイベントは、ファームウェアを検索し、ロードします。

  4. デバイスドライバが、このインタフェースを登録します。

次に説明するように、これらのステップの完了後、システムはインタフェースのセットアップを開始します。

PCカードの場合、完全にサポートされ問題なく機能するようにするには、/etc/sysconfig/pcmcia内の以下のパラメータのうち、いくつかを設定する必要がある場合があります。

PCMCIA_LOAD_CIS

PCカードのファームウェアはCIS (カード情報構造)と呼ばれます。CISには、カードの実装に関する詳細が含まれています。hwupは、カードに組み込まれているCISの整合性をチェックし、カードのCISに問題がある場合は、ディスクから別のCISをロードします。デフォルト値は、yesです。ディスクからのCISのロードを無効にするには、この変数をnoに設定します。

PCMCIA_ALLOW_FUNC_MATCH

Linuxデバイスドライバには、処理対象のデバイスをドライバに伝えるデバイスIDテーブルが含まれています。つまり、カーネルによって認識されているIDを持つデバイスのみがサポートされます。テーブルに含まれていないIDを持つカードがサポートされるようにするには、機能が一致するかどうか確認します。ドライバをIDではなく、カードの機能(ネットワークカードなど)によって選択し、その機能(ネットワークカードなど)とともに挿入されているPCカードを処理します。デフォルト値は、yesです。機能の一致を無効にするには、この変数をnoに設定します。

PCMCIA_COLDPLUG_REINSERT

ブート前に挿入されていたカードは、検出されない場合があります。この問題を防ぐには、PCMCIA_COLDPLUG_REINSERTyesに設定して、カードがソフトイジェクトされるようにします。デフォルト値は、noです。

31.2.3 インタフェースのセットアップ

初期化が完了した後、カードタイプに応じた各インタフェースが登録されます。インタフェースの登録は、udevのhotplugによって処理されます。udevおよびhotplugの詳細については、第12章 udevを使用した動的カーネルデバイス管理を参照してください。