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_mapopen() の第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() を呼んでリソースを開放します.

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

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

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

関数リファレンス

KEK vmelib との相違

更新履歴

2005年10月27日
Version 1.0

Last Modified: