[KEK Online Group] → [Nakayoshi's Page] → [TOYO CAMAC-USB Device Driver] → [User's Guide of TOYO CAMAC-USB Library]
[Draft]User's Guide of TOYO USB-CAMAC Driver and Library for Linux
PC/Linux で TOYO CC/7700 と TOYO CC/USB アダプタを使用して USB 接続で
CAMAC の操作を行なうための方法について説明します.
テストベンチ等のデータ収集(DAQ)システムでは,デスクトップ PC
とバスアダプタ・カードを使用して CAMAC や VME とデータ転送を行なうスタイルが
一般的です.
従って DAQ で使用可能な PC はおのずと限定(専用カードをインストール済み
か, 新たにインストールする必要があるという意味で)されていました.
しかし, PC とその周辺機器との接続バスとしてほぼデファクトスタンダードと
なりつつある USB を利用することで
上述のような専用カードを必要とせず USB ポートを持つ PC から DAQ が可能
となります. より具体的なイメージとしては, 本システムのソフトウエア(USB-CAMAC
ドライバおよび CAMAC ライブラリ)をインストールすれば NOTE PC や専用カード
がインストールされていない, いわゆる普通の PC を使って CAMAC DAQ システム
の構築が可能となるのです.
- Hardware Preparation
上記のような USB 経由 CAMAC にアクセスするためには以下のハードウエアが
必要です.
- USB インターフェイス付の IBM PC/AT互換機
- 東陽テクニカ CAMAC Crate Controller CC/7700
- 東陽テクニカ CC/7700用USBアダプタ CC/USB
- Software Preparation
- Linux カーネル 2.4.0 以上
- TOYO CC/USB 用ドライバ(ccusb.o)
- TOYO CC/USB 用 CAMAC ライブラリ(camlib)
- Hardware Installation
- CAMAC クレートの電源を OFF にする.
- CAMAC クレートの右端に CC/7700 をセットする.
- USB アダプタにある "CC address" 設定用のスイッチを CC/7700
と同じにする.同様に"Adapter ID" も同じ番号にする.
- CC/7700 のコネクタに USB アダプタを取り付ける
- CAMAC クレートの電源を ON にする.
- USB アダプタに市販のUSBケーブルを取り付けPCと接続する.
- Software Installation
- http://www-online.kek.jp/~nakayosi/USB/toyo-usb.html から TOYO CC/USB パッケージ ccusb-x.y.z.src.tgz(x,y,z には数字が入ります)をダウンロードする.
- パッケージを展開する.
$ tar xvfz ccusb-x.y.z.src.tgz
- TOYO CC/USB ドライバーをCAMAC ライブラリ等を make する.
$ cd ccusb-x.y.z.src
$ make
- su になり,ドライバーを load する.
$ su
# /sbin/insmod ccusb/ccusb.o
- デバイスファイルをつくる。
# ccusb/ccusb_mknod.sh
- デバイスファイルができたか確認する.
# ls -al /dev/usb/ccusb*
crw-rw-rw- 1 root root 180, 200 8月 24 15:46 /dev/usb/ccusb00
crw-rw-rw- 1 root root 180, 201 8月 24 15:46 /dev/usb/ccusb01
crw-rw-rw- 1 root root 180, 202 8月 24 15:46 /dev/usb/ccusb02
crw-rw-rw- 1 root root 180, 203 8月 24 15:46 /dev/usb/ccusb03
crw-rw-rw- 1 root root 180, 204 8月 24 15:46 /dev/usb/ccusb04
crw-rw-rw- 1 root root 180, 205 8月 24 15:46 /dev/usb/ccusb05
crw-rw-rw- 1 root root 180, 206 8月 24 15:46 /dev/usb/ccusb06
crw-rw-rw- 1 root root 180, 207 8月 24 15:46 /dev/usb/ccusb07
以下のような手順で CAMAC モジュールからデータを読んでみる. できれば Switch Register
を使うことをお勧めします.(以下では Switch Register の
データを読むことを想定している)
- 必要なら USB ホストドライバ(usb-uhci.o, usbcore.o)をカーネルに組み込む.
$ su
# insmod usb-uhci.o
- TOYO USB-CAMAC ドライバ(ccusb.o)をカーネルに組み込む.
# insmod ccusb.o
- 以下のように必要なドライバがロードされているか確認する. 以下のように usb-uhci, ccusb
が表示されれば OK.
[nakayosi@nakapc2 CCUSB]$ /sbin/lsmod
...
Module Size Used by Not tainted
ccusb 16960 0
usb-uhci 24420 0 (unused)
usbcore 77120 1 [ccusb usb-uhci]
...
ccusb パッケージを展開したディレクトリへ移る.
その下の examples へ移る.
シンプルなシングルアクションのプログラム(naf.c)を実行する.
$ naf
camlib の詳細は以下の「ユーザインターフェースの詳細」を御覧ください.
クレート番号0, ステーション#2 にあるCAMAC Switch Register のスイッチを
読むためのプログラムです.
- 次のようなプログラムを書いて,camtest1.c という名前で CCUSB/ に保存する.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ccusb.h"
#define CRATE 0
#define SWREG 2
int main()
{
int ret;
int a=1, f=0, dat, q, x;
ret = camopen(CRATE);
if(ret != 0) {
printf("ERROR: camopen ret = %d\n", ret);
exit(-1);
}
ret = camac(CRATE, SWREG, a, f, &dat, &q, &x);
if(ret != 0) {
printf("ERROR: camac ret = %d\n", ret);
exit(-1);
}
printf("data = 0x%x(%d)\n", dat, dat);
printf("q = %x\n", q);
printf("x = %x\n", x);
camcls(CRATE);
}
$ cd CCUSB
コンパイルする.
$ gcc -I ccusb -o camtest1 camtest1.c camlib/camlib.o
実行する.
$ camtest1
Switch Register のスイッチを変化させてデータが読めるか確認する.
USB1.x はフレームという 1ms 単位で転送を行うためシングル転送のように少量のデータ転送ではパフォーマンスは極めて悪い.ブロック転送のように連続して多量にデータを転送する場合は USB の高速転送の恩恵を受けることができる.USB2.0のマイクロフレームでは 125us と改善されたが,それでも USB1.x の 1/8 にすぎない.
ユーザインターフェースの詳細(Linux 用 TOYO USB-CAMAC Library)
- Introduction
Linux で TOYO CC/7700とその USB アダプタを使用して USB 接続で CAMAC
操作を行なうためのライブラリの説明を行なう. このライブラリの関数は
大きく次の4つに分けられる. CAMAC デバイスの open や close 等を行なう
ためのセットアップ関数, データを転送をしない CAMAC 操作のための関数,
データ転送を行なうCAMAC 操作の関数および CAMAC ブロック転送のための
関数である.
これらのライブラリの関数は C で書かれたユーザのプログラムから呼ばれる
ことを想定している.
- CAMAC Setup Functions
- camopen
- Syntax: int camopen(int crate)
- Description: CAMAC をオープンする.CAMAC にアクセスする前に
クレートを指定して 1 度呼ばなければならない.
- Arguments: crate: クレート番号
- Return value: success = 0, error = negative value
- camcls
- Syntax: int camcls(int crate)
- Description: CAMACをクローズする.プログラム終了時に
クレートを指定して 1 度呼ばなければならない.
- Arguments: crate: クレート番号
- Return value: success = 0, error = negative value
- CAMAC Functions(without data)
- cgenz
- Syntax: int cgenz(int crate)
- Description: 指定したクレートを初期化する.
- Arguments: crate: クレート番号
- Return value: Return value: success = 0, error = negative value
- cgenc
- Syntax: int cgenc(int crate)
- Description: 指定したクレートをクリアする.
- Arguments: crate: クレート番号
- Return value: success = 0, error = negative value
- cseti
- Syntax: int cseti(int crate)
- Description: 指定したクレートに inhibit をセットする.
- Arguments: crate: クレート番号
- Return value: success = 0, error = negative value
- cremi
- Syntax: int cremi(int crate)
- Description: 指定したクレートの inhibit をクリアする.
- Arguments: crate: クレート番号
- Return value: success = 0, error = negative value
- clamstat
- Syntax: int clamstat(int crate)
- Description: 指定したクレートの LAM pattern を読出す.
- Arguments: crate: クレート番号
- Return value: success = 24bit で各ステーションのLAM の状態を表す,
error = negative value
- CAMAC Functions(with data)
- camac
- Syntax: int camac(int c, int n, int a, int f, int *dat, int *q, int *x)
- Description: c,n,a,f で指定された CAMAC 24bit single action を
実行し,24bit データの転送を行なう.データは dat で
指定されるメモリ領域に read/write される.
- Arguments:
- c: クレート番号
- n: ステーション番号
- a: サブアドレス
- f: ファンクション
- dat: データ
- q: CAMAC Q Response
- x: CAMAC X Response
- Return value: success = 0, error = negative value
- camacw
- Syntax: int camacw(int c, int n, int a, int f, int *dat, int *q, int *x)
- Description: c,n,a,f で指定された CAMAC 16bit single action を
実行し,16bit データの転送を行なう.データは dat で
指定されるメモリ領域に read/write される.
- Arguments:
- c: クレート番号
- n: ステーション番号
- a: サブアドレス
- f: ファンクション
- dat: データ
- q: CAMAC Q Response
- x: CAMAC X Response
- Return value: success = 0, error = negative value
- CAMAC Block Transfer Functions
- cdma
- Syntax: int cdma(int c, int n, int a, int f, int mode, int *buf, int ch)
- Description: c,n,a,f,mode で指定された CAMAC 24bit ブロック転送を行なう.
データは buf で指定されるメモリ領域に read/write される.
- Arguments:
- c: クレート番号
- n: ステーション番号
- a: サブアドレス
- f: ファンクション
- mode: 次のモードの中から一つを指定する.QSTOP,QIGNORE,QREPEATE,QSCAN
それぞれ CAMAC Q-Stop, Q-Ignore, Q-Repeat, Q-Scan モードに対応している.
- buf: data buffer
- ch: number of words(channels)
- Return value: success = return data length, error = negative value
- cdmaw
- Syntax: int cdmaw(int c, int n, int a, int f, int mode, short *buf, int ch)
- Description: c,n,a,f,mode で指定された CAMAC 16bit ブロック転送を行なう.
データは buf で指定されるメモリ領域に read/write される.
- Arguments:
- c: クレート番号
- n: ステーション番号
- a: サブアドレス
- f: ファンクション
- mode: 次のモードの中から一つを指定する.QSTOP,QIGNORE,QREPEATE,QSCAN
それぞれ CAMAC Q-Stop, Q-Ignore, Q-Repeat, Q-Scan モードに対応している.
- buf: data buffer
- ch: number of words(channels)
- Return value: success = return data length, error = negative value
- Linux デバイスドライバ, オライリージャパン, ISBN4-900900-73-7
- USB Hardware &Software 日本語版, インフォクリエイツ, ISBN4-900741-95-7
- Programming Guide for Linux USB Device Drivers
- 特集「入出力インターフェイス技法の研究」, インターフェイス 1992年 5月号, CQ 出版
- 特集「USB 対応機器&デバイスドライバの作成法」, インターフェイス 1998年 11月号, CQ 出版
- 特集「USB ターゲット機器の設計法」, インターフェイス 2000年 3月号, CQ 出版