PCMCIA をインストールするためには以下の環境が必要です。
PCMCIA カードサービスの最新バージョンは、1.2.8 以降か 1.3.30 以降のカー ネルに対応しています。1.3.30 以降のうち、1.3.38 は全くダメで、1.3.31 から 1.3.36 のバージョンではテストしていません。また、新しいモジュール ユーティリティも必要となります。PCMCIA を使うためにカーネルへパッチを あてる必要はありません。
PCMCIA のプログラムの中にはカーネルのソースを参照している部分があるの で、コンパイルする際にはコンパイル済のカーネルだけでなく、カーネルのソー スコードそのものが必要です。不要なドライバを除いた新しいカーネルをコン パイルしたくなるかも知れませんが、PCMCIA カードサービスをインストール するためにカーネルを再構築する必要はありません。
最新の「安定版」のカーネルのソースとパッチは、sunsite.unc.edu
の
/pub/Linux/kernel/v1.2
か tsx-11.mit.edu
の
/pub/linux/sources/system/v1.2
にあります。最新のモジュールユー
ティリテイも同じところにあり、modules-1.2.8.tgz
というファイル名
になっています。開発中のカーネルは v1.3 のサブディレクトリに入っていま
す。最新のカーネルとコンパイラを組み合わせると、古いバージョンのモジュー
ルユティリテイが使えない場合があります。最新版のモジュールユーティリティ
は
http://www.pi.se/blox/modules にあります。
カーネルを設定する際、PCMCIA のイーサネットカードを使うつもりなら、
``networking support'' を [Y]
にして、``pocket and
portable adapters'' を含む一般の Linux 用のネットワークカード用のドラ
イバは全て使わないように設定します。PCMCIA ネットワークカード用のドラ
イバは必要なときにロードされるモジュールとして提供されていますので、カー
ネルにドライバを組みこむのはメモリのムダでしかありません。
SLIP や PPP, PLIP を使う場合、カーネルの設定時にこれらを使うように指定 するか、これらのドライバの実行時ロードモジュールを使う必要があります。 残念ながら 1.2.X ではカーネルの設定プロセスに問題があり、実行時ロード モジュール用の細かな設定(例えば SLIP の圧縮の有無)ができません。そのた め、必要ならばこれらのドライバを(モジュールではなく)カーネルに組みこん でしまった方がいいでしょう。
PCMCIA トークンリングアダプタを使う場合、``Token Ring driver
support''(CONFIG_TR)
を設定して、CONFIG_IBMTR
は使わないよ
うにします。
もし PCMCIA SCSI アダプタを使うなら、カーネルの設定時に
CONFIG_SCSI
を設定します。使うメディアごとの SCSI ドライバ(ディス
ク、テープ、CD-ROM、 generic)も使うようにに設定します。ホストアダプタ
ごとのハードウェアレベルのドライバ(AHA152x, futuredomain 等)は使わない
ように設定します。それらを組みこんでもメモリのムダです。
PCMCIA デバイスが必要とするドライバをモジュール化する場合、
/etc/pcmcia/config
を修正して、カードの種類に合ったモジュール
をロードするように設定します。例えば、シリアルドライバがモジュール化さ
れている場合、/etc/pcmcia/config
のシリアルデバイスの設定を
device "serial_cs" class "serial" module "serial", "serial_cs"
のようにします。
もし、CONFIG_MODVERSIONS
を設定してカーネルをコンパイルしていれば、
カーネルに組みこまれている各種シンボルバージョンの記録ファイル、
/usr/include/linux/modversions.h
の有無を、設定用のスクリプト
がチェックします。/usr/include/linux/modversions.h
はカーネル
の ``make dep'' 時に自動的に生成されます。
このパッケージには cardinfo
という X 上でカードの状態を表示するた
めのユーティリティプログラムが入っています。cardinfo
を使うために
は、Forms Library と呼ばれるパブリックドメインのユーザーインターフェー
ス用ツールキットが必要です。Forms Library はhyper.stanford.edu
の
/pub/pcmcia/extras
に a.out 版と ELF 版の両方を用意しています。
以下が簡単なインストールの手順です。:
/usr/src
で pcmcia-cs-2.8.?.tgz
ファイルを展開する。pcmcia-cs-2.8.?
ディレクトリで ``make config
'' する。make all
'' して ``make install
'' する/etc/rc.d/rc.pcmcia
と/あるいは
/etc/pcmcia
下にあるオプション指定用ファイルを設定する。``make config
'' とすると、プログラムがいくつか設定のためのオプショ
ンを尋ね、PCMCIA カードサービスをインストールする環境が整っているかど
うかをチェックします。多くの場合、デフォルトの設定オプションのままで大
丈夫なはずですが、もし何か問題が起これば、このコマンドの出力を注意深く
チェックしてみてください。
PCMCIA を別のマシンにインストールするためにコンパイルする場合、設定用
のスクリプトが尋ねる ``alternate target directory'' を指定してください。
このディレクトリ名は絶対パスで指定する必要があります。PCMCIA 用のツー
ル類は全てこのディレクトリに元にした相対的なディレクトリにインストール
されますので、そのディレクトリ以下を tar
でまとめて、目的とするマ
シンにコピーし、適切な場所に展開してください。
別のマシン用にクロスコンパイルする場合、コンパイラとリンカの別名を指定 した方がいいかも知れません。a.out と ELF が混在したような環境にもこの ような設定が必要でしょう。設定用スクリプトではデバッグ用に追加するフラ グの指定も可能です。
PCMCIA の各種ツールに関係するカーネルの設定オプションもいくつかありま す。たいていの場合、設定用のスクリプトはこれらのオプションを稼働中のカー ネルから検出します。別のマシン用にコンパイルする場合など、カーネルのソー スコードから設定オプションを読みこむこともできますし、それぞれのオプショ ンを対話的に設定することも可能です。
``make all
'' して ``make install
'' すると、プログラムをコン
パイルし、カーネル用モジュールとユーティリティプログラムを適切な場所に
インストールします。カーネル用のモジュールは
/lib/modules/<version>/pcmcia
ディレクトリにインストー
ルされます。[訳注:version の部分は使っているカーネルのバージョン
番号(1.2.13, 1.3.67 等)が入ります ]cardmgr
と cardctl
用のプログラムは /sbin
に、インストールしたなら cardinfo
は /usr/bin/X11
に、それぞれインストールされます。
設定用のファイルは /etc/pcmcia
ディレクトリにインストールされ
ます。もし古いバージョンに上書きしてインストールすると、古い設定ファイ
ルは、拡張子を *.~1~
、 *.~2~
、のように変えて保存した上で、新
しいファイルをインストールします。
もしどのような PCMCIA コントローラ・チップが使われているかわからなけれ
ば、 cardmgr/
サブディレクトリにある probe
コマンドで調
べることができます。コントローラには大きく分けて Databook TCIC-2 と
Intel i82365SL 互換チップの 2 つの種類があります。
cardmgr
というデーモンがカードの着脱を管理しています。このプログ
ラムは、初期の PCMCIA 用プログラムに入っていた Barry Jaspan 作の
pcmciad
と機能的にはよく似ています。cardmgr
は
/etc/pcmcia/config
から、既知のPCMCIA カードの設定について読
みこみます。このファイルには PCMCIAデバイスを使うために割りあてるコン
ピュータの各種リソース(IRQ や I/O ポート)についても記述するので、お使
いのシステムにあわせて変更する必要があるかも知れません。このファイルに
ついての詳細は pcmcia
の man
ページをご覧ください。
/etc/rc.d
ディレクトリにインストールされる rc.pcmcia
と
いうスクリプトは PCMCIA システムの起動と終了を管理します。``make
install
'' を実行すれば、probe
コマンドを使ってあなたのコンピュー
タが使っているコントローラの種類を識別し、rc.pcmcia
を適切に修正
します。/etc/rc.d/rc.pcmcia
を起動するために、システムのスター
トアップファイルである /etc/rc.d/rc.M
に以下の 1 行を加えて下さい:
/etc/rc.d/rc.pcmcia start
ごくまれに probe
コマンドで自動的にコントローラを設定できない
ことがあります。Tadpole P1000 を始めとするいくつかの PCI バスを使った
ラップトップ機では、 Cirrus の特殊な PCI-PCMCIA ブリッジチップを使って
いるため、probe コマンドで PCMCIA コントローラを検出できません。もし、
この種のシステムを利用されているならば、 i82365
モジュールをロー
ドするように rc.pcmcia
を修正する必要があります。Halikan NBD 486
システムでは TCIC-2 コントローラが変ったアドレスに位置しているので、
PCIC_OPTS
のパラメータに``tcic_base=0x02c0''
を指定する
必要があります。
カードサービス・システムは他の標準的なデバイスが既に使っている IO ポー
トや IRQ は自動的に回避しようとします。非標準的なデバイスとぶつかって
いることを検知しても自動的に別のリソースを使おうとしますが、この機能は
まだ完璧ではないため、/etc/pcmcia/config.opts
で使わないリソー
スを明示的に指定する必要があるかも知れません。
以下は、特定のラップトップ機で必要なリソースの設定です。
いくつかの PCMCIA コントローラは、特定のシステムでしか使えない、あるい は特定のシステムでは使えないような、特殊な機能を持っている場合がありま す。ソケットドライバにはこの種の機能が使えるか否かを検知することはでき ません。使っているドライバの man ページをチェックして、どのようなオプ ション機能が利用できるか調べてみてください。
ハードウェアレベルのソケットドライバ、tcic
と i82365
はバス
タイミングを制御するためのパラメータを多数持っており、特に高速なプロセッ
サを使ったシステムではそれらを調整する必要があるかも知れません。バスタ
イミングに起因する問題としては、カードが認識されない、負荷が高いとハン
グアップする、エラーがよく起きる、性能がでない、などがあります。詳細に
ついては関連のマニュアルを見てもらうこととして、ここでは簡単な説明にと
どめます。
freq_bypass
フラ
グで、このフラグを設定すれば、PCMCIA のバスクロックを全てのオペレーショ
ンについて何分の一かに減速します。
fast_pci
というフラグがあり
ます。もし PCI バスのスピードが 25MHz 以上の場合、このフラグをセットす
る必要があります。
async_clock
フラグがあり、PCMCIA のバスクロックとホストのバスクロッ
クの相対的なタイミングを変更します。このフラグをセットすれば、いくつか
のオペレーションについて余分のウエイトサイクルが入るようになります。
pcmcia_core
モジュールには cis_speed
というパラメータがあり、
PCMCIA カードのカード情報領域(CIS:Card Information Structure)にアクセ
スするスピードを変化させます。バスクロックの速いシステムではこのパラメー
タを大きくする(すなわち、カードへのアクセス速度を遅くする)必要があるか
も知れません。
extra_sockets
パラメータ
を 1 にしてロードしなければいけません。
これら全てのオプションは /etc/rc.d/rc.pcmcia
ファイルを修正することで
設定できます。例えば、
# Should be either i82365 or tcic
PCIC=i82365
# Put socket driver timing parameters here
PCIC_OPTS="async_clock=1"
# Put pcmcia_core options here
CORE_OPTS="cis_speed=500"
いくつかタイミングの設定を行なわなければならないシステムを紹介します。
``freq_bypass=1 cmd_time=8''
と設定します。
``cmd_time=12''
を指定
します。
``cmd_time=16''
を試してみてください。
NEC Versa M など、Cirrus 製のコントローラを使っているいくつかのシステ
ムでは、起動時に BIOS が PCMCIA コントローラを特別のサスペンドモードに
設定してしまい、probe
コマンドが PCMCIA コントローラを検出できな
くなります。このような場合、/etc/rc.d/rc.pcmcia
を以下のよう
に修正します。
# Should be either i82365 or tcic
PCIC=i82365
# Put socket driver timing parameters here
PCIC_OPTS="wakeup=1"
configure スクリプトを使えばカーネルに対応した PCMCIA 用のモジュールが
適切にインストールされるはずなので、モジュールをロードする際にトラブル
が起きるのは、ユーザーが通常のインストールプロセスを中断した場合くらい
でしょう。モジュールをロードする際に生じたエラーのいくつかは直接 Linux
のコンソール画面へ出力されます。その他のエラーは
/usr/adm/messages
か /var/log/messages
というシステム
のログファイルに記録されます。どのモジュールが問題を起しているかを見極
めるには両方のファイルを注意深くチェックしてください。
いくつかの PCMCIA モジュールはカーネルの設定によって存在したりしなかっ
たりするカーネルサービスを必要とします。例えば、SCSI カードドライバを
使うためにはカーネルの SCSI 機能を必要としますし、ネットワークカードを
使う場合にはネットワーク機能を使うようにカーネルを設定しておかねばなり
ません。もし必要な機能が存在しないカーネルを使っている場合、
insmod
が「シンボルが未定義(undefined symbols)」というエラーを出
してモジュールをロードしないことがあります。
もし insmod
が ``wrong version'' というエラーを出した場合、そのモ
ジュールは現在動いているシステムとは違うバージョンのカーネル用にコンパ
イルされていることを意味します。このトラブルは各モジュールがコンパイル
されたマシンから別の設定のマシンにコピーされたような場合やカードサービ
スがインストールされてからカーネルが再構築されたような場合に起ります。
モジュールをロードする際のトラブルのもう一つの原因は、モジュールとカー
ネルが異なる設定の CONFIG_MODVERSIONS
の元でコンパイルされている
場合です。もしバージョンチェックするようにコンパイルされたモジュールが
バージョンチェックの無いカーネルにロードされた場合、insmod
は「シ
ンボルが未定義」のエラーを出します。
比較的新しいバイナリ用コマンド(binutils)は古いバージョンのモジュール用 コマンド(module utilities)と完全には互換性が無いので、モジュールバージョ ンが非互換である旨のエラーが報告される可能性があります。よく起きる症状 は ``gcc_compiled'' が定義されていない(undefined)というエラーです。こ の種のエラーになった場合、モジュール用のコマンドも http://www.pi.se/blox/modules から入手できる最新のバージョンに してください。
ほとんどの場合、ソケット・ドライバ(i82365
か tcic
)はカードの
抜き差しを感知する IRQ を自動的に検出・設定します。この IRQ 自動検出機
能は Cirrus のチップやいくつかの IBM ThinkPad で使われている i82365 互
換のコントローラではうまく機能しないことがあります。もし IRQ のチェッ
ク時に、あるデバイスが使われていないと判断されると、そのデバイスが使う
予定の IRQ も利用可能と誤判断してしまいます。このような場合、ソケット
ドライバは既に別のデバイスが使っている IRQ を選んでしまうこともありま
す。
i82365
と tcic
ドライバの場合、検出対象とする IRQ を
irq_mask
オプションで制限することが可能です。このオプションを指定
すれば、PCMCIA カードが利用する IRQ やカードの抜き差しをチェックするた
めに監視する IRQ を限定することができます。cs_irq
オプションを使
えば、カードの状態変化のチェックに使う IRQ を明示的に指定することが可
能です。
利用可能な IRQ が見つからない場合、「呼出しモード」で使うことも可能で
す:i82365
でも tcic
でも、poll_interval=100
というオプ
ションが利用でき、このオプションを使えば、カードの抜き差しのチェックを
1 秒に 1 度チェックすることになります。このオプションは利用可能なIRQ
が不足している場合にも使えます。特に複数の PCMCIA コントローラを持つシ
ステムではカードの状態変化を検出するために IRQ を割りあてられないこと
があります。
これらのオプションは全て /etc/rc.d/rc.pcmcia
か
/etc/sysconfig/pcmcia
の OPTS=
行で設定します。どちらの設
定ファイルを使うかは使っているディストリビューションによります。
この種の問題でもっともよく起きるのは PS/2 タイプのポインティングデバイ
スが利用している IRQ 12 との衝突でしょう。この場合、rc.pcmcia
の
OPTS=
行に:
PCIC_OPTS="irq_mask=0xefff"
と設定します。
デフォルトでは PCMCIA ドライバはメモリアドレスの 0xd0000-0xdffff の領
域を使って PCMCIA デバイスにアクセスします。この領域は
/etc/pcmcia/config.opts
で設定します。お使いのシステムで別の
デバイスがこの領域を使っている場合、カードは正しく認識されないことがあ
ります。また、memory shadowing が可能なチップセットを使っていてこの領
域を shadowing の対象にしている場合も、うまく認識できない可能性があり
ます。全てのカードがメモリカードであると誤認される場合、ハードウェアの
設定を再確認して、この領域を shadowing していないか確認してください。
メモリ・ウィンドウの衝突を自動的に検出する確実な方法はないので、どのメ
モリ・ウィンドウが使えるかは実際に試してみるしかないでしょう。変更可能
なウィンドウ領域は 0xd8000-0xdffff, 0xc0000-0xcffff, 0xc8000-0xcffff
です。
DOS 用の PCMCIA ドライバを使えば、それらのドライバが使っているメモリ領
域を調べることも可能です。気を付けなければならないことは、DOS のメモリ
アドレスは ``セグメント'' の形で記述してあることです。``セグメント''形
式だと、16 進の最後の数字が省略されます(すなわち、0xd0000 は 0xd000 に
なります)。/etc/pcmcia/config.opts
に記述する際に最後の数字を
付けわすれないようにしてください。
Red Hat とそれを元にした Caldera のディストリビューションでは、システ
ムの起動用ファイルをSystem V 風の配置にしています。PCMCIA のインストー
ルスクリプトはこの配置を自動的に検知して正しく設定します。これらのディ
ストリビューションでは rc.pcmcia
スクリプトは
/etc/rc.d/init.d/pcmcia
にインストールされます。自動的に起動
されるので、PCMCIA 用に Caldera のスタートアップスクリプトを修正する必
要はありません:PCMCIA カードサービスは自動的に起動されます。
起動時のオプション指定用に /etc/sysconfig/pcmcia
という設定ファ
イルがあります。モジュール用のオプションを変更したい場合(PCIC=
や
OPTS=
の設定をするなど)には、実際の PCMCIA 起動用のスクリプトでは
なく、このファイルで修正してください。このファイルはシステムをバージョ
ンアップしでも上書きされません。
古いバージョンでは Red Hat や Caldera 用には /etc/pcmcia
の
代りに/etc/sysconfig/pcmcia-scripts
というディレクトリを使っ
ていました。新しいバージョンでは (Red Hat や Caldera を含めた)全てのシ
ステムで /etc/pcmcia
を使うようにしたので、バージョンアップ
された方は /etc/sysconfig/pcmcia-scripts
のファイルを
/etc/pcmcia
に移してください。
私にとって、PCMCIA のバイナリを配布するにはかなりな労力を必要とする仕 事です。コンパイル時にしか設定できない機能もありますし、PCMCIA のモジュー ル類は ``正しい'' カーネルの設定に依存しています。そのため、もしコンパ イル済のモジュールを配布しようとすれば、対応するカーネルを添付する必要 があるでしょう。コンパイル済の PCMCIA モジュールが必要とされるのは新し いマシンに Linux をインストールする際なので、Slackware や Red Hat といっ た特定の Linux のディストリビューションに合わせたような設定も必要とな ります。それぞれの Linux のディストリビューションには独自のインストー ル法があり、一般的なドライバとディストリビューションを組みあわせた boot/root ディスクを用意することは私には不可能です。
PCMCIA は Red Hat, Caldera, Slackware, Yggdrasil, Craftworks, Nascent Technology と言った Linux の主要なディストリビューションに含まれるよう になりました。
最初に弁解しておきますが、実際のところそんなに大きいわけではないですよ。
全てのドライバモジュールをあわせてもディスクを 200k ほど食うだけです。
各種のユーティリティ類がもう 70k 、/etc/pcmcia
が 30 k ほどで
す。動いている時は PCMCIA モジュールの core の部分がシステムメモリを
48k ほど取ります。通常、cardmgr デーモンはカードが抜き挿しされた時以外
はスワップアウトされているはずです。パッケージ全体の規模としては DOS
のカードサービスとそれほど変りません。
PCMCIA に特徴的な機能、すなわち省電力や活線挿抜、を必要としない人々か ら見ると、DOS の ``point enabler'' に比べて、まだかなりのオーバーヘッ ドがあるように思えるかも知れません。``point enabler'' は確かに小さいプ ログラムですが、ごく限られたカードしかサポートしませんし、使える PCMCIA コントローラも限られています。もし誰か ``一般的'' なモデムの enabler を書いてみれば、多くのベンダーからリリースされているカードをサ ポートし、PCMCIA コントローラの違いにも対応するためには、結局カードサー ビスの機能のほとんどをサポートしなければならないことが分るでしょう。