camdrv

- CAMAC device driver for Linux 2.x & 3.x -

English

camdrv は,Linux 上で東陽テクニカ製 CAMAC コントローラ CC-7700 / CC-7000 (PCI/ISA) および豊伸電子製 CAMAC コントローラ CCP (USB/PCI/ISA) を使用するためのデバイスドライバです.完全なカーネルモードで動作するローダブルモジュールで,割り込み待ちなどの高度な機能も実装しています.さらに,広く使われている幾つかの CAMAC ライブラリと互換のライブラリも用意しましたので,既存のプログラムにほとんど手を加えずに Linux 環境に移行することができます.

作成には充分注意していますが,間違い等が含まれている可能性があります.動作の保証はできませんので,御了承下さい.なお,ライセンスは "LGPL Version 2.1" とします.LGPL2.1 の詳細については,配布パッケージに含まれている COPYING-LGPL2.1 ファイル を参照してください.

camdrv は,分散型汎用オンライン環境の構築を目指す KiNOKO プロジェクトの一部として作成されました. KiNOKO プロジェクトの詳細については,KiNOKO ホームページ を御覧下さい.


動作環境

現在利用可能なモデルと Linux のバージョンは以下のとおりです.

OS CC/7700-PCI CC/7700-ISA CC/7000-ISA CCP-USB CCP (PCI/ISA) CCP (PCI-2703A)
Linux 2.0.x × × ×
Linux 2.2.x × ×
Linux 2.4.x ×
Linux 2.6.x / 3.x


動作を確認した Linux ディストリビューションは,以下のとおりです.

kernel 3.x

Ubuntu 11.10 / 12.04 LTS (32bit / 64bit)
そのままコンパイルできます.Linux 2.6.x 用の camdrv をそのまま使用してください.

Fedora 16 (32bit / 64bit)
Linux 2.6.x 用の camdrv をそのまま使用してください.
使用しているカーネルに対応する kernel-devel パッケージが必要です. 以下の例を参照してください。
% sudo yum install kernel-devel-`uname -r` (クオートはバッククオート)

kernel 2.6

Fedora 15
使用しているカーネルに対応する kernel-devel パッケージが必要です. 以下の例を参照してください。
Fedora 8 / 10 / 12
そのままコンパイルできます.
Ubuntu 10.04 LTS
そのままコンパイルできます.

Fedora Core 5 / 6
ドライバをコンパイルする前に,使用しているカーネルに対応する kernel-devel パッケージをインストールしてください.
Fedora Core 2 / 3 / 4
そのままコンパイルできます.

kernel 2.4

Fedora Core 1
ドライバをコンパイルする前に,kernel-source パッケージをインストールしてください.
ドライバの Makefile 中の KERNEL_INCLUDE_DIR/usr/src/linux-2.4/include に設定してください.
Red Had Linux 8.0
ドライバをコンパイルする前に,kernel-source パッケージをインストールしてください.
ドライバの Makefile 中の KERNEL_INCLUDE_DIR/usr/src/linux-2.4/include に設定してください.
Vine Linux 2.5
ドライバの Makefile 中の KERNEL_INCLUDE_DIR/usr/include に設定してください.
Red Had Linux 7.1J / 7.3
ドライバをコンパイルする前に,kernel-source パッケージをインストールしてください.
ドライバの Makefile 中の KERNEL_INCLUDE_DIR/usr/src/linux-2.4/include に設定してください.

kernel 2.2

Red Had Linux 7.0J
ドライバをコンパイルする前に,kernel-source パッケージをインストールしてください.
ドライバの Makefile 中の KERNEL_INCLUDE_DIR/usr/src/linux/include に設定してください.
Red Had Linux 6.2 / 6.2J
そのままコンパイルできます.
Red Had Linux 6.1 / 6.1J
そのままコンパイルできます.
Kondara MNU/Linux 2000
そのままコンパイルできます.
Vine Linux 2.1.5
そのままコンパイルできます.
Vine Linux 2.0
そのままコンパイルできます.
Debian GNU/Linux (woody)
そのままコンパイルできます.
もしかしたら,kernel-headers パッケージをインストールする必要があるかもしれません.
Debian GNU/Linux (potato)
そのままコンパイルできます.
もしかしたら,kernel-headers パッケージをインストールする必要があるかもしれません.

ダウンロードとフィードバック

質問などは,なるべく掲示板のほうにおねがいします(匿名でかまいません). 同じ内容の質問が多くなっていますので,御協力をおねがいします.

また,トラブルに関する質問の際は,使用している Linux ディストリビューションの種類・バージョンやデバイス構成・型番,エラーメッセージや dmesg コマンドの出力など,なるべく詳細な情報を記述してください.

インストール

  1. パッケージを展開し,ドライバソースのあるディレクトリに移動します.
    % gunzip camdrv-?.?.?.tar.gz
    % tar xvf camdrv-?.?.?.tar
    % cd camdrv/Linux2.6_CC77pci
    
    ドライバソースのディレクトリ名は,使用している Linux のバージョンや CAMAC コントローラのモデルにより適当に読みかえて下さい.

  2. 2.4.x 以前のバージョンの Linux カーネルを使用している場合は,環境に合わせて,Makefile を編集する必要があります.Makefile の先頭付近にある以下の変数を設定してください.開発者がテストした環境での設定が上記の動作環境のリストに書いてありますので,参考にしてください.

    KERNEL_INCLUDE_DIR
    「カーネルヘッダファイル」のあるディレクトリです.動作中のカーネルがコンパイルされたときに使用されたヘッダファイルと厳密に同じものでなければなりません.

    一部のディストリビューションでは,kernel-headers パッケージに入っているカーネルヘッダが実際にカーネルのコンパイルに使用されたものと違う場合があります.このような場合は kernel-source パッケージをインストールし,その中のヘッダファイルを指定してください(カーネルソースのコンパイルは必要ありません).

    自分でカーネルを再構築した場合は,その際に使用したソースのヘッダファイルのディレクトリを指定してください.

    USE_MODVERSIONS
    動作中のカーネルが MODVERSIONS を有効にしてコンパイルされたものなら 1 を,そうでない場合は 0 を指定してください.最近のほとんどのディストリビューションでは,MODVERSIONS が使われているようです("1" を指定する).

    自分でカーネルの再構築を行なった場合は,そのときの設定に従ってください.

    現在のカーネルが MODVERSIONS を使っているかは,/proc/ksyms を cat してみて,表示されたカーネル関数にバージョン情報が付加されているかを見れば分かります.
    % cat /proc/ksyms | grep kmalloc
    c012e880 kmalloc_R93d4cfe6            <-- MODVERSION が使われている
    
    % cat /proc/ksyms | grep kmalloc
    c012e880 kmalloc                      <-- MODVERSION が使われていない
    

  3. CC-7x00/ISA または CCP を使用している場合, I/O ポートおよび IRQ 番号の手動設定が必要になります (CCP では IRQ の設定は必要ありません). 空いている I/O ポートおよび IRQ 番号を調べ,モジュールのジャンパを設定して,Makefile を修正してください.Makefile の先頭に次のような記述があるので,この部分を書き換えます.
    IOPORT = 0x0c00
    IRQ = 10
    
    PCI デバイスが使用している I/O ポートや IRQ 番号などは,以下のいずれかのコマンドによって調べることができます.
    % /sbin/lspci -v
    % cat /proc/pci
    
    そのほか,完全ではありませんが,以下のコマンドは I/O ポートや IRQ の使用状況を調べるのに役立ちます.
    % cat /proc/ioports
    % cat /proc/irq
    % cat /proc/interrupts
    % cat /proc/stats
    
    情况によっては,BIOS による I/O ポートや IRQ の設定が有用(または必要)な場合もあります.

  4. ドライバをコンパイルします.
    % make
    

  5. CCP-USB の場合,ドライバのインストール前に USB ケーブルを接続しておいてください.

  6. root になって,ドライバをシステムに登録します.dmesg で成功したかを確認できます.
    % su
    # make install
    # dmesg
           いろいろなメッセージ
    camdrv: at 0x0c00 on irq 10 (major = 126).
    #
    

  7. Linuxをリブートしたときは,もう一度ドライバを登録しなければなりません.
    # make install
    
    リブート時に,自動でドライバを組み込む方法については,KiNOKO-DAQ Technical Tips を参照してください.

  8. システムからドライバを取り除きたい場合,以下のようにします.
    # make uninstall
    # dmesg
           いろいろなメッセージ
    camdrv: removed.
    #
    

開発者が動作確認をしたバージョンよりも新しいバージョンの Linux を使用した場合,コンパイルやインストールに失敗するかもしれません. その場合は,可能な限り対処しますので,上記のフィードバックのリンクより開発者に連絡をください.

ハードウェア設定

CC-7000 を使用している場合,LAM の割り込み待ちを行なうために,コントローラ本体のジャンパスイッチを「割り込み ON」に設定する必要があります. また,動作モードが 16bit に設定されている必要があります(これは工場出荷時の設定値ですが,一応確認してください).
CC7000 Jumper Setting

なお,フロントパネルの REQ と G-IN を LEMO ケーブルで接続し,トグルスイッチを ON LINE 側にすることも忘れないように注意してください.

動作テスト

camdrv には,いくつかのテストプログラムが用意されています.これをコンパイルして,動作テストをおこないます. camdrv を展開したディレクトリで,make をしてください.
% cd ..
% make
デフォルトでは,クレート番号 0 を使用するようになっています.使用するクレートのクレート番号を 0 にするか,テストプログラムを編集してクレート番号を正しく設定するようにしてください(テストプログラム中にコメントアウトして書かれています).

ドライバ設定のテスト
コントローラに inhibit を送って,フロントパネルの I の LED が点灯するかをチェックします.
% ./inhibit_test 
press ENTER to set inhibit...
press ENTER to release inhibit...
%
ENTER を押して,クレートコントローラの LED が点灯するかを確認してください. もし点灯しなかった場合,I/O ポートが正しく設定されていないことが考えられます. ジャンパの設定とドライバのパラメータが一致しているか,I/O ポートの割り当て範囲が他のボードと衝突していないかなどを確認してください (PCI 版の camdrv は I/O ポートの割当てを自動でおこないます).

割り込み設定のテスト
LAM を発生させるモジュールをクレートに差し,割り込みを発生させます. 1Hz程度で LAM を発生させ,正しくLAMを待っていることと,正しく LAM を拾っていることを確認してください. このテストプログラムは,3秒以上LAMが立たないと,timed out を返します.これも確認してください.

(LAM を発生させるために F26 が必要なモジュールを使う場合は,F26 の CAMAC アクションを初期化の直後で一回行うようにプログラムを編集する必要があります.)

% ./lam_test 
Waiting LAM ...OK.
Waiting LAM ...OK.
Waiting LAM ...timed out.   <- データ入力を止めた
Waiting LAM ...timed out.
Waiting LAM ...OK.          <- ふたたび接続
(16回繰り返す)
%
もし LAM が立っているにもかかわらず timed out する場合は,割り込み回線が正しく設定されていないことが考えられます. ジャンパの設定とドライバのパラメータが一致しているか,IRQ の設定値が他のモジュールと衝突していないかなどを確認してください (PCI版の camdrv は IRQ の割当てを自動でおこないます).

ISA のコントローラを使用している場合,他のデバイスの影響で,割り込みがうまく処理されない場合があるようです. このようなときは,IRQ を別の値にして試してみて下さい.

もし,LAM が立っていないのに OK と表示されれば,それは camdrv のバグ(かモジュールの故障)です. その場合は,可能な限り対処しますので,上記のフィードバックのリンクより開発者に連絡をください.

CAMAC アクションのテスト
LAM を発生させるモジュールを用いて,LAMを立てたモジュールからの読みだしを行ないます. LAM は,コントローラの LAM フラグを見ます(従って,割り込み処理は必要ありません). データの読みだしは,ファンクション F0 によって行ないます.アドレスは 0 から始め,Qレスポンスがある間インクリメントしていきます.

このテストプログラムは割り込みを使用しないので,割り込みの取得に失敗していても実行することができます. ただし,LAM を発生させるために F26 が必要なモジュールを使う場合は,F26 の CAMAC アクションを初期化の直後で一回行うようにプログラムを編集する必要があります.

    % ./camaction_test
    [00:04:00] 110
    [00:04:01] 104
    [00:04:02] 110
    [00:04:03] 108
    (しばらくつづく)
    % 
出力フォーマットは,"[イベント番号:モジュールアドレス(N):内部アドレス(A)] データ" です. ここでも,1Hz 程度の LAM でタイミングを確認してください.また,適当な信号を入力し,正しい値が読み込まれているかも確認してください. 上の2つのテストに成功していて,ここで失敗したら,それはおそらく camdrv のバグ(かモジュールの故障)です. その場合は,可能な限り対処しますので,上記のフィードバックのリンクより開発者に連絡をください.

使用方法

camdrv は,汎用データ収集システム KiNOKO から利用すると便利です. 詳細は,KiNOKO ホームページ を参照してください.

camdrv は,KiNOKO から利用すると便利ですが,広く使われている CAMAC ライブラリと互換のライブラリも用意しました.

KEK 標準 CAMAC ライブラリ (camlib) 互換ライブラリ
KEK が定めた CAMAC ライブラリの標準仕様に従ったものです.
使用するには.
ヘッダファイル "camlib.h" をインクルードし,
オブジェクトファイル "camlib.o" をリンクしてください.
ソースは "camlib.c" です.

相違点は,
ブロック処理はサポートしていません.
リスト処理はサポートしていません.
CWLAM(int mask) の mask はダミー引数で,LAM のマスキングはサポートしていません.

ライブラリの詳細は,
KEKオンライン部のCAMACのページを参照してください.

東陽テクニカ製 DOS/WIN 用 CAMAC ライブラリ 互換ライブラリ
製品に付属する東陽テクニカ製のライブラリと同じ関数を実装したものです.
使用するには.
ヘッダファイル "toyocamac.h" をインクルードし,
オブジェクトファイル "toyocamac.o" をリンクしてください.
ソースは "toyocamac.c" です.

相違点は,
ヘッダファイル名が違います:-).
SetIOP()/GetIOP() は必要ないので,ありません.
SetWait()/GetWait() はたぶん必要ないので,ありません.
SetLIN()/GetLIN() はサポートしていません.
RStat() はサポートしていません.
ブロック処理はサポートしていません.

ライブラリの詳細は,
製品付属のマニュアルを参照してください.
動作テストで用いたプログラム "camaction_test.c" がサンプルとして役立ちます.

既知の不具合

更新履歴

8 April 2016
古いカーネル (2.6.36 以前)でコンパイルしたときに起こるエラーを修正
Version 1.1.1 リリース.
29 January 2014
CCP-USB サポート
Version 1.1.0 リリース.
4 August 2010
割り込み形式の変更に対応(Fedora 8 あたり)
デバイスが検出されない状態で2回以上インストールを試みたときに発生する不具合を修正
Version 1.0.3 リリース.
5 August 2008
Linux 2.6 でインストール時にクラッシュする不具合を修正
Version 1.0.2 リリース.
4 July 2008
新しいカーネル対応 (Fedora 8/9 くらい)
Version 1.0.1 リリース.
27 July 2007
CCP-2703A を試験的にサポート
Fedora Core 5/6 対応
安定してきたので正式リリースへ
Version 1.0.0 リリース.
20 August 2005
IRQ が競合した場合に発生する問題を修正 (特に Linux 2.6 の PCI 版)
Version 0.7.3 リリース.
23 April 2005
Linux 2.6.x に対応
Version 0.7.2 リリース.
7 October 2002
マルチクレート処理をサポート(Linux 2.4 版のみ)
Version 0.6.1 リリース.
21 June 2001
Linux 2.4 カーネルに対応.
Version 0.5.0 リリース.
7 May 2001
豊伸電子製 CCP をサポート
(林栄精器様の協力による開発です.ありがとうございました)
Version 0.4.0 リリース.
11 Nov 2000
カーネルヘッダのパスを指定できるようにした.
MODVERSION の使用を指定できるようにした.
Version 0.3.6 リリース.
9 June 2000
モジュールバージョン管理をサポート (Vine 2.0 対応のため).
(松田さん(ICEPP)の指摘による修正です.ありがとうございました)
Version 0.3.5 リリース.
8 May 2000
ISA 版での Write Action の不具合(というか動かなかったはず)を修正.
camlib 互換ライブラリの Write Action の不具合(というか話にならなかったはず)を修正.
(小曾根さん(ICEPP)の指摘による修正です.いつもありがとうございます)
Version 0.3.4 リリース.
6 May 2000
最近の insmod で生じる不具合を修正.
ドライバのメジャー番号を設定できるようにした.
Linux 起動時にドライバを自動で組み込む方法の記述を追加.
Version 0.3.3 リリース.
21 April 2000
Debian でコンパイルする際に生じる Makefile の不具合を修正.
(小曾根さん(ICEPP)の指摘による修正です.ありがとうございました)
Version 0.3.2 リリース.
12 April 2000
CC/7700-PCI の PCI設定を読み込む部分の不具合を修正.
(榊直人さん(東大宇宙線研)による修正です.ありがとうございました)
Version 0.3.1 リリース.
23 July 1999
KEK CAMAC Library (camlib) と互換のライブラリを用意.
製品付属の東陽テクニカ製CAMACライブラリ(DOS/WIN版)と互換のライブラリを用意.
テストプログラムおよびサンプルプログラムを作成.
Version 0.3.0 リリース.
21 July 1999
CC/7000-ISA (Linux 2.0) と CC/7700-ISA のドライバを追加.
Camac Action でタイムアウトの判断を変更(常に1秒まで待つ).
Version 0.2.0 リリース.
15 June 1999
CC/7700-PCI (Linux 2.0/2.2) と CC/7000-ISA (Linux 2.2)のドライバを公開.
Version 0.1.0 リリース.

Edited by: Enomoto Sanshiro