インストール (主にデバイスドライバ)

配付パッケージには以下のファイルが含まれています。 現在の配布元は こちらです。

      Makefile     ... デバイスドライバ作成/組み込み、および
                       サンプルシステム作成用 make ファイル
      doc/         ... 文書ファイル群のディレクトリ

  デバイスドライバ関連
      dc.c         ... デバイスドライバ本体
      dc.h         ... 関連ソースのヘッダファイル
      dc_aux.h     ... ハードの違いを吸収するマクロ群、および
                       割り込み処理支援インライン関数群の定義ヘッダ
      dc_int.c     ... 割り込み処理ルーチン
                       (dc_test.c へのシンボリックリンク)
      dc_test.c    ... 割り込み処理ルーチンのサンプル
      dc_noint.c   ... 割り込みを使わない時のダミー
      test_led.c   ... LED を光らせるテストプログラム
      cnaf.c       ... シングルアクション実行プログラム
      tclcam.c     ... Tcl/Tk ローダブルモジュールのソース

  データ収集システムのサンプル
      crashm.h     ... 共通ヘッダファイル
      commander.c  ... コマンド解釈メインプログラム
      recorder.c   ... データ記録プロセス
      analyzer.c   ... オンライン解析プロセス
      event1.f     ... analyzer から呼ばれる 1 イベント解析ルーチン
      player.c     ... データ読み出しプロセス
      rei          ... Tcl/Tk による GUI 制御スクリプト
インストールは以下の手順で行ないます。

先ず、Makefile 先頭部分の

       HARDWARE = CC7700ISA
         DEVICE = dc
          MAJOR = 61
          DELIM = 0x8001
         IOPORT = 0x310
            IRQ = 5
という辺りを適当に編集してください。

メジャー番号 MAJOR というのは デバイスの識別に用いられる番号で、 デバイスファイルに一意に割り当てられます。 通常どんな番号が使われているかは、 例えば以下のコマンドを実行して見てください。

      % ls -l /dev/mem

      crw-r-----   1 root     kmem       1,   1 Jul 18  1994 /dev/mem
mem というデバイスファイルには 1 番という メジャー番号が割り当てられている事がわかります。 Linux カーネルの標準的なデバイスが使用するメジャー番号は、 カーネルソースツリーの Documentation/devices.txt にリストされています。 その中で 60-63 はローカルおよび実験的な用途に予約されていると書いて ありますから、この 4 つのどれかを使うのが適当でしょう。

次に、 ISA カードを使う場合には、 こちらを参考にしてハードウェアを設定し、 それと上記の IOPORT と IRQ が一致している事をよく確認してください。 現在 (および将来の予定においても)、 Linux の多くのデバイスドライバが行なうような 自動検出の機能はサポートしていません。 PCI カードの場合にはリソースが自動設定されるので、 上記のIOPORT と IRQ は無視されます。

DELIM (デリミタ) は イベントの区切り子に使いますが、 データ収集システム全体の整合性のために Makefile の中で指定しています。

以上が済んだら、root になって

      % make devices
を実行すると、(デフォルトの設定では) /dev/dc および /dev/dc1という デバイスファイルが作成されます。 恒久的な設定はこれで終りです。

以下は測定毎の手順です。 先ず読み込みたいデータを記述した割り込みルーチンを "dc_int.c" として用意します (詳しくは割り込みルーチンの記述を参照してください)。 次に

      % make [all]
によってデバイスドライバをコンパイルします。 生成されるオブジェクトファイル "dc.o" がローダブルモジュールです。 dc.o をカーネルに組み込むには
      % make install
を実行します。 古いバージョンが組み込まれている場合には入れ換えを行ないます。

make install (および uninstall) は 本来 root になって行なうべきものですが、

      % chmod +s /sbin/insmod
によってコマンドを setuid しておくと、 平ユーザーでもデバイスの組み込み/切り離しができるようになります。 しかし、これはセキュリティ上お薦めでないので、 sudo が使える環境ならば /etc/sudoers を設定しておいて
      % sudo make install
とする方が良いでしょう。

正常にドライバが組み込まれれば、

    dc: CC7700ISA CAMAC crate controller.
    dc: IRQ = 5,  I/O BASE = 0x310
    dc: buffer size is 131072 bytes
    dc: driver installed.
といったメッセージが出力されるはずです。 これは
      % dmesg
というコマンドで表示される出力の末尾部分です (時刻を付加した同様の情報が、 syslogd というデーモンによって /var/log/messages あるいは /var/log/syslog といったログファイルに書き込まれています。 ただし、ログファイルはセキュリティ上の理由によって、 通常は root しか見る事ができないようになっています)。

デバイスがうまく組み込まれなかった場合には、 失敗となった原因のヒント (およびダンプ情報) が ログファイルに書き込まれますから、参照してください。 最も有り勝ちなのは、 デバイスファイルのメジャー番号、および IRQ や I/O ポート と言ったリソースの衝突です。

ドライバが組み込まれたら、簡単なテストをしてみましょう。 プログラム "test_led.c" は Dataway Indicator (LED) を点滅表示させるものです。 これをコンパイルし、

      % make test_led
      % test_led 4
のように、LED のステーションナンバーを引数に与えて 起動してみてください。

以上で CAMAC 制御の準備は完了です。 dc.o をカーネルから切り離すには

      % make uninstall
を実行してください。 dmesg コマンドの出力の末尾には
      dc: driver removed.
の一行が加えられるはずです。

参考のために、 ローダブルモジュールおよびデバイスドライバに関連する コマンドの基本的なものを以下にリストします。

% /sbin/lsmod
現在組み込まれているローダブルモジュール一覧を表示します。
% /sbin/insmod module
moduleをカーネルに組み込みます。
% /sbin/rmmod module
moduleをカーネルから切り離します。
% mknod /dev/name c major minor
name という名の char 型デバイスを メジャー番号majorおよびマイナー番号minorに 関連付けて定義します。
% cat /proc/devices
デバイスドライバ一覧を表示します。
% cat /proc/modules
ローダブルモジュール一覧を表示します。 実は /sbin/lsmod と同じです。
% cat /proc/ioports
各デバイスドライバの使用する I/O ポート一覧を表示します。
% cat /proc/interrupts
各デバイスドライバの使用する IRQ と割り込み発生回数一覧を表示します。
この他に、 modprobedepmod という高度なコマンドが有り、 モジュールの組み込み・切り離しをカーネルが自動的に行うのを支援しています。 RedHat 系ディストリビューションを使用しており、 割り込みルーチンを書き換える予定が無ければ、
      % make sys.install
を実行して、 ドライバをシステムに組み込んでしまうと良いかも知れません。 デバイスファイルをアクセスすると、 ドライバが組み込まれていなくても カーネルが自動的に組み込んでくれるようになります。

戻る


カードの装着とリソース設定について

CC/7000 および CC/7700-ISA のカードを使用する場合、 適当な IRQ と I/O ベースアドレスをディップスイッチで設定してから スロットに刺します。 この時、他のデバイスが使用する IRQ や I/O ポートと 競合しないように注意してください。 とは言っても、 PCI カード等の Plug & Play デバイスにはリソースが自動的に 割り当てられてしまうので、CC/7x00 が使うリソースをあらかじめ BIOS に予約しておかなければなりません。 Award 等のマニアな BIOS を搭載したマザーボードならば、 BIOS 設定にそのようなメニューが有りますし、 他社の BIOS にも該当するユーティリティが有ると思います (昔は Intel 供給の ICU というのが有りました) ので、 これらを適当に使ってください。 最近は少ないですが、Plug & Play な ISA カードと 競合しないようにするには…、 私は良く知らないので適当に調べてください。

CC/7700-PCI の方は何も考えずに刺すだけでオッケーです。 本デバイスドライバでは IRQ の共有もサポートしているので、 何を割り当てられても大丈夫なはずです。 が、私としては充分テストしたとも言い切れないので、 非常に心配性な方は 以下の説明を参考にして、 IRQ を共有させないようなセットアップを模索してみてください (リソースが余っているはずなのに何故か共有されてしまう事に 疑問を感じている人にも読む価値が有るかも知れません)。 PCI デバイス (カードばかりでなくマザーボード上の ものも含む) に実際に割り当てられたリソースは、 Linux が起動した後に

      % cat /proc/pci
によって調べる事ができます。 BIOS によっては起動時に(一瞬だけ)表示してくれたりもします。

# それにしても、 なみいる有名企業をさしおいて 東陽テクニカの PCI_VENDOR_ID が 1 になっているのは…?

戻る


PCI のスロットと割り込み信号線に関して

PCI バスには割り込み信号線が 4 本しか有りません。 ISA バスでも 11 本有るのに…、です。

PCI を含む新し目のバス規格では、 電流を流し続けて電力を無駄に消費する ターミネータを排除する傾向に有り、 最初から多数のスロットを並べる事が想定されていないのです。 PCI では更にデータとアドレスの信号線を共有する等、 かなり徹底して無駄を省いています (どうせ速度を要求される転送はバスマスタだから、 アドレシングが頻繁に行われる事は無いとの考察によります)。 スロットを沢山並べたい時は PCI ブリッヂ回路を 介する事になっており、 極端に多くのカードが割り込み信号線をワイヤード OR で 共有する事は有りません。 マザーボードによっては PCI ブリッヂを使って 多数のスロットを確保しているものもあります。

しかし、 現在主流の多くのマザーボードは、 ブリッヂ回路を持たずに PCI スロットを 4-5 本 持っており、更に AGP バスも有る訳ですから、 いずれかの組は IRQ を共有するようにハード的に決め打ちされています。 経験的には AGP スロットと隣の PCI スロット、 または、AGP と反対側の 2 本の PCI スロットが、 IRQ を共有するペアになっている事が多いようです (当然と言えば当然ですが)。 これらのスロットを避け、 BIOS 設定で余分なデバイスを disable しておけば、 大抵は IRQ の共有を避ける事が出来ると思います。

しかし、ど〜してもうまく設定できないという場合…、 AGP スロットの隣に刺す等して 意識的にビデオカードと IRQ を共有させるという手もあります。 実は Linux の (と言うか多くの PC-UNIX の) X window system の実装は、 デバイスドライバでなく特権を持ったユーザープログラムですから、 割り込みを使い(え)ません。

戻る