まず 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_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_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
引数 access_mode は,VME にアクセスする際のアドレス幅とデータ幅を指定するもので,以下のいずれかの値をとります.
VME_A16D16 アドレス16bit, データ16bit VME_A16D32 アドレス16bit, データ32bit VME_A24D16 アドレス24bit, データ16bit VME_A24D32 アドレス24bit, データ32bit VME_A32D16 アドレス32bit, データ16bit VME_A32D32 アドレス32bit, データ32bit
引数 transfer_mode は,read() または write() でデータを転送する際の転送方法を指定するもので,以下のいずれかの値をとります.
VME_NORMAL 標準モード (Programmed I/O) VME_DMA DMAモード VME_NBDMA Non-Blocking DMAモード
vme_open() は,成功するとハンドルのポインタを返します.失敗の場合は NULL を返して大域変数 errno を設定します.
vme_close() は,成功すると 0 を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_read() は,成功すると読み出したデータのサイズを返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_write() は,成功すると書き込んだデータのサイズを返します.失敗の場合は -1 を返して大域変数 errno を設定します.
引数 access_mode は,VME にアクセスする際のアドレス幅とデータ幅を指定するもので,以下のいずれかの値をとります.
VME_A16D16 アドレス16bit, データ16bit VME_A16D32 アドレス16bit, データ32bit VME_A24D16 アドレス24bit, データ16bit VME_A24D32 アドレス24bit, データ32bit VME_A32D16 アドレス32bit, データ16bit VME_A32D32 アドレス32bit, データ32bit
vme_mapopen() は,成功するとハンドルのポインタを返します.失敗の場合は NULL を返して大域変数 errno を設定します.
vme_mapclose() は,成功すると 0 を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vector 引数の値も,下位のシステムに直接渡されます.vmedrv のように,VME の割り込みベクタ値をそのまま指定するシステムの場合,vme_intsetvectormask() 関数によりベクタの有効ビットを指定してください.
vme_intopen() は,成功するとハンドラのポインタを返します.失敗の場合は NULL を返して大域変数 errno を設定します.
vme_intclose() は,成功すると0を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_intsetvectormask() は,成功すると0を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_intsetautodisable() は,成功すると0を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_intenable() は,成功すると0を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_intdisable() は,成功すると0を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
引数 timeout_sec に 0 を渡すと,タイムアウトの設定値は無限となります.
vme_intwait() は,割り込みを取得すると,正の整数を返します.これは割り込み要求の数に対応することもありますが,保証されていません.タイムアウトでは 0 を返します.失敗の場合(VME割り込み待ち中にシグナル割り込みを受けた等)は -1 を返して大域変数 errno を設定します.ちなみに,シグナル割り込みを受けた場合の errno の値は EINTR です.
vme_intnowait() は,割り込みを取得すると,正の整数を返します.これは割り込み要求の数に対応することもありますが,保証されていません.vme_intnowait()呼び出しまでに割り込みが発生していなければ 0 を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_intcheck() は,未処理の割り込み要求があれば,正の整数を返します.これは割り込み要求の数に対応することもありますが,保証されていません.未処理の割り込み要求がなければ 0 を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_intclear() は,成功の場合 0 を返します.失敗の場合は -1 を返して大域変数 errno を設定します.
vme_tryget() は,この中でオープン,読み出し,クローズの全てを行うのでハンドルは必要ありません.ただし,この関数の中で行う処理が多いので,頻繁な呼び出しには向きません.最初のチェックに使うことを想定しています.
vme_tryget() は,読み込みに成功すれば 0 を返します.失敗の場合は -1 を返して大域変数 errno を設定します.