vmeslib

vmeslib は,VME デバイスヘの簡便で統一されたアクセスを提供するためのライブラリです.KEK が提供する vmelib と類似のインターフェースを持っており,vmelib からの移行が容易である一方,vmelib が持っていた多重オープンの問題を解決しています.KEK オンライングループと共同で開発されており,今後の VME アクセスライブラリの統一インターフェースを目指しています.

概要

vmeslib は以下の3つの機能を提供しています.
読み書き
VME バスのモジュール上のメモリからのデータブロックの読み出しまたは書き込みを行います.データの転送には、通常の方法(Programmed I/O)に加えて,DMA および Non-Blocking DMA を指定できます.VME 読み書き関連の関数は以下のとおりです.

まず vme_open() でモードを指定してオープンし,ハンドルを取得します. これ以降,VME の読み書きに関する処理はこのハンドルを指定して行います.終了時には,vme_close() を呼んでリソースを開放します.

VME からのデータ読み出しは vme_read() で,データの書き込みは vme_write() で行います.VME のアクセスモード(アドレス幅とデータ幅)は,vme_open() の第1引数(access_mode)に以下のいずれかの値を渡して指定します.

  VME_A16D16  VME_A16D32
  VME_A24D16  VME_A24D32
  VME_A32D16  VME_A32D32
データ転送モードは,vme_open() の第2引数(transfer_mode)に以下のいずれかの値を渡して指定します.
  VME_NORMAL  (標準モード:Programmed I/O)
  VME_DMA     (DMA モード)
  VME_NBDMA   (Non-Blocking DMA モード)
DMA が利用できないデバイスで VME_DMA を指定した場合,または Non-Blocking DMA が利用できないデバイスで VME_NBDMA を指定した場合には,標準モード(VME_NORMAL の指定)となります.

関数の実行に失敗した場合,vme_open()NULL を返し,それ以外の関数は -1 を返します.いずれの場合も,大域変数 errno が設定されます.

プログラム例: dma-test.c

メモリマッピング
VME バスのモジュール上のアドレス領域を,プロセスのアドレス空間にマッピングします.これにより,モジュール上のメモリやレジスタに,通常のポインタを使ってアクセスできるようになります.メモリマッピング関連の関数は以下のとおりです.

まず vme_mapopen() によりメモリマッピングを行い,ハンドルを取得します.これ以降,マッピングに関する処理はこのハンドルを指定して行います. 終了時には,vme_mapclose() を呼んでリソースを開放します.

マッピングされた領域の先頭をアクセスするポインタは,vme_mapbase() で取得できます.また,マッピングされた領域中の任意の 16 bit または 32 bit ワードは,vme_word16() または vme_word32() によりアクセスできます.もちろん,vme_mapbase() が返すアドレスに自分でオフセットを加算してポインタアクセスをしても構いません.VME のアクセスモード(アドレス幅とデータ幅)は,vme_open() の第1引数(access_mode)に以下のいずれかの値を渡して指定します.

  VME_A16D16  VME_A16D32
  VME_A24D16  VME_A24D32
  VME_A32D16  VME_A32D32

関数の実行に失敗した場合,vme_mapopen()NULL を返し,それ以外の関数は -1 を返します.いずれの場合も,大域変数 errno が設定されます.

プログラム例: map-test.c

割り込み処理
VME バスのモジュールが出す割り込み要求を処理します.割り込みの許可・不許可,割り込み待ち,割り込み要求状態の取得などが行えます.割り込み処理関連の関数は以下のとおりです.

まず vme_intopen() により割り込みを登録して,ハンドルを取得します.これ以降,割り込みに関する処理はこのハンドルを指定して行います. 終了時には,vme_intclose() を呼んでリソースを開放します.

使用する割り込みベクタの幅がシステムのデフォルト(vmedrv では 16bit)と異なる場合,vme_intsetvectormask() によりベクタの有効ビットを指定してください.8 bit のベクタを使用する場合,vector_mask は 0x00ff となります.

割り込みの許可・不許可は vme_intenable() および vme_intdisable() で行います.割り込みは,vme_intwait() または vme_intnowait() により取得できます.vme_intwait() は割り込み発生またはタイムアウトまで実行をブロックしますが,vme_intnowait() はブロックしません.vme_intcheck() によりブロックせずに割り込み状態を取得できます.vme_intcheck() により割り込み要求が検出された場合は,vme_intwait() または vme_intnowait() を呼び出してその割り込みを処理するか,int vme_intclear() によりクリアするかのいずれかが必要です.

使用するモジュールが割り込みサイクル終了後に割り込み要求を自動で解除しない場合,繰り返し割り込み処理ルーチンが呼ばれるのを避けるために,vme_intsetautodisable() を使用して割り込みの自動不許可を設定してください.この場合,割り込みを取得するたびに割り込み不許可になるので,次の割り込み待ちをする前に毎回 vme_intenable() を呼び出してください.

関数の実行に失敗した場合,vme_intopen()NULL を返し,それ以外の関数は -1 を返します.いずれの場合も,大域変数 errno が設定されます.

プログラム例 1: intwait-test.c
プログラム例 2: intnowait-test.c

関数リファレンス

KEK vmelib との相違

更新履歴

2010年7月21日
0x80000000 以上のアドレスへアクセスした際にエラーになる不具合を修正
(細見さん(東北大)によるバグフィクスです.ありがとうございました)
2010年2月27日
vme_intsetvectormask() と vme_intsetautodisable() を追加
(細見さん(東北大)の提案・試験・バグフィクスによります.ありがとうございました)
2005年10月27日
Version 1.0


Edited by: Enomoto Sanshiro