Technical Description of USB-CAMAC Device Driver
目的
「CAMAC と PC/AT機を USB接続し, ユーザビリティの優れた DAQ システムを
構築すること」
概要
本システム開発の目的は「ユーザビリティ」の追求である. 小規模な原子核・素粒子実験の
データ収集(DAQ)システムでは, デスクトップ PC とバスアダプタを使用して CAMAC や VME
と データ転送を行なうスタイルが一般的である. 従って DAQ で使用可能な PC はおのずと
限定(専用カードをインストール済み か, もしくは新たにインストールする必要があるという
意味で)されていた. しかし, PC とその周辺機器との接続バスとしてほぼデファクト・
スタンダードとなりつつある USB を利用するこ
とで 上述のような専用カードを必要とせず USB ポートを持つ PC から DAQ が可能となる.
より具体的なイメージとしては, 本システムの ソフトウエア(USB-CAMAC ドライバおよび
CAMAC ライブラリ)を インストールすれば NOTE PC や専用カードがインストールされて
いない, いわゆる普通の PC を使って CAMAC DAQ システムが可能となる. ユーザは, 専用
カードのインストール作業から開放される.
本開発のキーワードである USB,CAMAC,Linux DAQ について簡単な説明を行なう.
USB は 1994 年に Compaq, Intel, Microsoft, NEC により開発がスタートした.
その仕様(version 1)は 1996 年 1 月に最初にリリースされ, 最新のオフィシャル
version 1.1 は 1998 年 9 月にリリースされた. ドキュメントはまだ作成中であり,
1999 年に version 2.0 がアナウンスされた. USB機器 は、Windows98 や Mac OS 8.1
以降から利用可能である。USB に 対応したキーボード、マウス、スキャナ等
の機器は,電源を入れた状態で接続 ケーブルの抜き差しが可能で取扱が簡単である.
USB1.1 の細大転送速度は,12Mbps であるが USB2.0 では 480Mbps まで引き上げられて
いる. USB の特徴は USB ホストを頂点とした階層構造である. すべてのデバイス
に関する通信はホストにより開始され, デバイス同士は直接通信することはできない.
CAMAC は 1960年代の規格で素粒子原子核実験の標準電子回路である。現在でも
数多く実験に使用されている。
KEK オンライングループは,Linux による DAQ システムの整備を行なってきた。
Linux をインストールした PC/AT 機から CAMAC や VMEbus にアクセスしデータ収集が
可能となり,現在多くのテストベンチや実験用 DAQ に使用されている.
Linux を OS とする高性能/低価格な PC/AT 機によるデータ収集システムは,これからの
DAQ の主流になりつつある.
現段階で は既存のハードウエ
アを極力利用したいので、SCSI インターフェイス付き CAMAC Crate Controller と
USB-SCSI 変換ケーブルを用いて USB-SCSI 経由 で CAMAC へアクセスすることを試
みる。USB2.0 を用いた大規模な DAQ システム の構築が可能かどうかの調査を今回開発す
るシステムを使って行う。
ハードウエア概要
- PC/AT 機(USB インターフェイス付き)
- Kinetic 社 CAMAC Crate Controller(CC) Model 3929
- Logitec 社 USB-SCSI 変換ケーブル LUB-SC
現時点では,USB インターフェイス付の CAMACクレートコントローラが commercial
available でないので既存の機器の組合せにより CAMAC を USB 経由で制御する
方法をとった.Kinetic 社の Model 3929 は SCSI インターフェイス付の CAMAC
クレートコントローラ(CC)であり 10 年前から存在する.ただ CAMAC CC の中では
特殊な存在であり国内では広く普及しているわけではない.10 年前は,SCSI は
ワークステーションや一部の PC では標準の I/O インターフェイスであったので
計算機との connectability は他の CC と比べると優れていたし,現在もそうである.
この CC に USB-SCSI 変換ケーブルをつけるとハードウエアとしては,USB 装置と
なる.
ソフトウエア概要
- GNU/Linux(カーネル 2.4.0)
- USB-SCSI-CAMAC 用デバイスドライバ
前述のようにハードウエアとしては,既存のものの組合せであるがソフトウエア
の開発は必要である.具体的には USB-SCSI 変換を介して CAMAC と対話する
ためのデバイスドライバが必須である.Linux の USB デバイスドライバに
関しては既にそのフレームワークが決められており,それに従いデバイス
ドライバーを作成する必要がある.デバイスドライバのイメージとしては,
USB 転送により CAMAC コマンドを SCSI のデータとして CC へ送る.CAMAC
コマンドがリードの場合は,その後 CC からデータを USB 転送で受け取ると、
いうものである.
Linux の USB デバイスドライバのフレームワークおよびドライバの詳細な説明に
ついては,後述する.
Kinetic Model 3929-Z1A の機能
SCSI クレートコントローラ 3929-Z1A でのCAMAC動作について説明する.
ここでは, SCSI コマンドとCAMAC操作の対応について説明をする.
計算機から SCSI 機器に対する要求は, Command Descriptor Block(CDB) をターゲット
へ送ることにより行なわれる。3929 は SCSI のグループ 0(6 バイトコマンド)と
グループ 1(10 バイトコマンド)をサポートしている。
以下にそのコマンドを示す。
CODE | COMMAND |
0x00 | TEST UNIT READY |
0x03 | REQUEST SENSE |
0x08 | RECIEVE |
0x0A | SEND |
0x12 | INQUIRY |
0x1D | SEND DIAGNOSTIC |
0x06 | READ LAM PATTERN |
0x09 | SINGLE |
0x0C | SETUP |
0x0D | REGISTER ACCESS |
0x0E | RESUME LIST |
0x20 | EXECUTE LIST |
0x22 | BLOCK |
0x23 | LOAD LIST |
CAMAC シングルアクション
CAMAC シングルアクションを実行させるには,以下のような CDB を 3929 へ送る.
BYTE | DATA |
0x00 | 0x09(fix) |
0x01 | 0x00(fix) |
0x02 | MODE CONTROL |
0x03 | NAF HIGH BYTE |
0x04 | NAF LOW BYTE |
0x05 | CONTROL BYTE |
もし NAF がCAMAC制御操作を指定しているなら、データフェイズはなく, CAMACのリード
またはライト操作を指定しているなら、コマンドフェイズの後に続いてデータ転送が
行なわれる。データフェイズ中に転送されるバイト数は、CDB のCDB の Mode Control バイト
で指定されたデータ長に依存する。8 bit 転送は転送は 1 バイトを要求し 16 bit は
2 バイトを 24 bit は 4 バイトを要求する。3929 によりCAMAC操作の実行が終了した後
ステータスバイトが送られる。CAMAC操作がエラーのため中断された場合は CHECK CONDITION
が送られる。このエラーはCAMAC Q応答やX応答等のようなパラメタに依存する。
CAMAC ブロック転送
CAMAC ブロック転送を実行させるには, 以下のような CDB を 3929 へ送る.
BYTE | DATA |
0x00 | 0x22(fix) |
0x01 | 0x00(fix) |
0x02 | MODE CONTROL |
0x03 | NAF HI BYTE |
0x04 | NAF LO BYTE |
0x05 | TRANSFER BYTE COUNT HIGH |
0x06 | TRANSFER BYTE COUNT MIDDLE |
0x07 | TRANSFER BYTE COUNT HIGH |
0x08 | 0x00(fix) |
0x09 | CONTROL BYTE |
このコマンドの opcode は 0x22 である。3929 が CDB を受信後、データフェイズに
なる。データ転送の方向は CAMAC ファンクションコードに依る。一旦データ転送が
始まると転送量に達するかエラー状態が起こるまで続けられる。3929 によるブロック
転送操作が完了後、ステータスビットが送られる。GOOD または CHECK CONDITION
ステータスのいずれかが返される。CHECK CONDITION はCAMAC ブロック転送操作が
エラーにより中断されたときに返される。このエラーはCAMAC Q-Response, X-Respose
などのパラメータに依存する。
USB-CAMAC デバイスドライバ
USB-CAMAC デバイスドライバの構造を理解するためには,LinuxにおけるUSBデバイス
ドライバのフレームワークおよびUSB,SCSI,CAMACについて説明しなければならない。
それぞれについて個別に説明を加えるのではなく,実際のデバイスの動作を通して
ドライバ内部でどのような処理が行われているかを説明する。
はじめにUSB装置を接続したときに行われる処理を説明し,次にUSB装置を切り離した
ときに行われるドライバの処理を説明し,最後にCAMACに対してリードコマンドを
発行した時のドライバの処理を具体的に説明する。
Linux USB デバイスドライバの構造
Linux USB デバイスドライバは次のような構造をもつ。
- USB コアドライバ
- USB ホストコントローラドライバ
- USB デバイスドライバ
USB コアドライバは USBデバイスドライバが使用する関数群を提供する。USB ホスト
コントローラドライバはUSB ホストで使用されているコントローラチップ用の
ドライバである。現在 Intel 系の UHCI と OHCI の2種類が存在し、従って
そのドライバも2つ存在する。USB デバイスドライバは、各種 USB装置に対応する
ドライバであり我々はアプリケーションからそのドライバのファイル操作の
システムコールを発行して装置を制御する。
USB デバイスドライバ
USB デバイスドライバは通常のキャラクタ型デバイスドライバとほぼ同じである。
特徴的な点はUSBのホットスワップに関連する次の2つの関数である。
probe 関数は USB 装置が接続した(USB デバイスドライバが insmod された)ときに USBコアドライバにより呼び出される
関数である。
disconnect 関数はUSBデバイスが取り外されたときにUSBコアドライバから呼び出されて probe 関数で確保されたシステムリソースの解放を行なう。
上記の2つの関数以外にopen(), read(), write(), ioctl(), close() 等の通常のファイル操作関数
を定義して使用できる。
ドライバのロード
Linux のデバイスドライバはモジュール化できる. これは OS を起動した後に
ドライバをカーネルに組み込むことを可能にし, また開発時のデバッグを容易
にする.
- USB ホストドライバのロード
USB ホストコントローラに対応したドライバをカーネルに組み込む. これ以後
USB ホストコントローラの機能が有効となり新しいデバイスの接続の認識が
可能となる.
- usb-camac デバイスドライバのロード
K3929 を制御するためのドライバをカーネルに組み込む. これ以後 K3929 を
USB 経由で制御が可能となる.
K3929 接続時の処理
- USBホストによるエニュマレーション
- usb-camac ドライバの初期化
K3929 切断時の処理
- USBホストによる切断処理
- usb-camac ドライバの切断処理
CAMACシングル動作の処理
- ユーザ空間からCAMAC デバイスファイルをオープンする
- ユーザ空間からCAMAC ライブラリのCAMAC リード命令を発行
- 上のライブラリ CAMAC リード命令は ドライバの ioctl() をコールする
- ioctl() 中で K3929 で定義されている SCSI コマンドデータブロックをUSBの
パケットとして K3929へ転送する
- その後, SCSI コマンドを K3929 がエンコードしてCAMAC のリード
を実行する.
- CAMAC リード操作により得られたデータをUSB 転送で PC に転送する
CAMACブロック転送の処理
- ユーザ空間からCAMAC デバイスファイルをオープンする
- ユーザ空間からCAMAC ライブラリのCAMAC ブロック転送命令を発行
- 上記 CAMAC ブロック転送命令は ドライバの ioctl() をコールする
- ioctl() 中で K3929 で定義されている SCSI コマンドデータブロックをUSBの
パケットとして K3929へ転送する
- その後, SCSI コマンドを K3929 がエンコードしてCAMAC のブロック転送
を実行する.
- CAMAC リード操作により得られたデータ群をUSB 転送で PC に転送する
性能評価
CAMAC シングルアクションとブロック転送の速度を測定した。
CAMAC シングルアクションは Switch Register のデータを読み
その時間を測定して転送速度を求めた。ブロック転送はCAMAC
メモリモジュールからデータ長を変えながらデータを読み込み
それにかかった時間を測定して速度とオーバヘッドを求めた。
- CAMAC Word(16bit) data read:
- CAMAC Word(16bit) BLOCK read:
- CAMAC Long Word(24bit) data read:
- CAMAC Long Word(24bit) BLOCK read:
まとめ
前のページ
次のページ
目次