配付パッケージには以下のファイルが含まれています。 現在の配布元は こちらです。
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
% /sbin/rmmod module
% mknod /dev/name c major minor
% cat /proc/devices
% cat /proc/modules
/sbin/lsmod
と同じです。
% cat /proc/ioports
% cat /proc/interrupts
modprobe
、depmod
という高度なコマンドが有り、
モジュールの組み込み・切り離しをカーネルが自動的に行うのを支援しています。
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 バスには割り込み信号線が 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 の実装は、 デバイスドライバでなく特権を持ったユーザープログラムですから、 割り込みを使い(え)ません。