[KEKB Bunch Feedback Group]

林栄精器株式会社製Interrupt and I/O Register用EPICS Device Support(Japanese)


by とびやま まこと(Makoto Tobiyama)/KEKB ビームモニターグループ

警告
以下の記述に関しては、意図する、しないに関わらず多くの誤り、誤解が含まれていると思われますので、決して信用してはいけません。また、以下の説明には製造会社殿の見解と明らかに異なる部分があります。これを信じて起きた損害に関しては、当方は一切責任を持ちません。


If you need contact with the author, please E-mail makoto.tobiyama@kek.jp.
目次

1.はじめに

RPV-130は8ビットのインプットレジスター及びアウトプットレジスターです。また、2チャンネル割り込みのインタラプトレジスター機能も持っています。VME1幅のモジュールです。
林栄精器殿の製品情報

2.VMEバスレジスタ

RPV-130ボードのI/Oマップは以下の通りです。
AddressR/W0x0F0x0E0x0D0x0C0x0B0x0A0x090x080x070x060x050x040x030x020x010x00
0x***0RN/ALATCH1 データ
0x***2RN/ALATCH2 データ
0x***4RN/AR/S FF データ
0x***6RN/ATHROUGH データ
0x***8WN/APulse出力データ
0x***AWN/ALevel出力データ
0x***CR/WN/ACSR1レジスタ
0x***ER/WN/ACSR2レジスタ
なお、R/S FF、Through、Latch1、Latch2各レジスタは完全に独立ですので、同じ入力に対してもタイミングによって一般に別々の結果が入ります。

3.EPICS環境

本デバイスサポートは、EPICS R313改訂版で開発したものです。EPICSそのものに対する説明、入門出家入道遁世については専門家に帰依するなり、コントロールグループのページをご参照なさるなり勝手になさってください。動作はPPC750で確認しています。

4.コードの概要

コードを以下に示します。

初期化ルーチン

このデバイスサポートはショート特権用なのでバスrequestは
if (sysBusToLocalAdrs(VME_AM_SUP_SHORT_IO,(char *)Base_IO,(char **)&p) == ERROR)
	{
		logMsg("VME RPV130: cannot find A16 address space\n");
		return(ERROR);
	}
とします。立ち上がったときには割り込みを不許可にしたいのでinit_allでは
         p->csr1 = 0x01;  /* clear all and dissable interrupt */ 
         int_level = INT_LEVEL;
	
         cards[cardNum].card = p;  /* Remember address of the board */
	 scanIoInit(&cards[cardNum].ioscanpvt);
	 logMsg("rpv130 ioInit. 0x%X\n",cards[cardNum].ioscanpvt);

	 FASTLOCKINIT(&(cards[cardNum].lock));
	 FASTUNLOCK(&(cards[cardNum].lock)); /* Init the board lock */
としておきます。

割り込みサービスルーチン

割り込みがかかったとき読みに行くのはmbbiDirectなので、mbbiDirect用に割り込みサービスルーチンを用意します。
static void rpv130_isr(pmbbi)
struct mbbiDirectRecord	*pmbbi;
{
  unsigned char mode;
  short cardN;

  cardN = pmbbi->inp.value.vmeio.card;
  scanIoRequest(cards[cardN].ioscanpvt);

  return;
}

mbbiDirectの初期化function

static long init_mi_record(pmbbi)
struct mbbiDirectRecord	*pmbbi;
{
  short cardNum;
  cardNum = pmbbi->inp.value.vmeio.card;

  if (intConnect(INUM_TO_IVEC(INT_VEC_BASE + cardNum),
		 (VOIDFUNCPTR)rpv130_isr, 
		 (int)pmbbi) != OK)
     logMsg("devRPV130: Interrupt connect failed for card %d\n",pmbbi->inp.value.vmeio.card);
  logMsg("intConnect 0x%X\n",pmbbi);
	 
  sysIntEnable(int_level);
  
  logMsg("rpv130 int set for int 0x%x\n",int_level);
  return(0);
}

mbbiDirect読み込みfunction

R/S FFのときは、読んだ後レジスタをクリアし、次の入力に備えます。また、割り込みに悪影響を与えないため、Latch1割り込みは許可しておきます(当然クリアはしない)。
 switch(pmbbi->inp.value.vmeio.signal){
         case 0: /* set_reset_ff */
	        pmbbi->rval = (cards[cardN].card->ff) & 0xff;
		cards[cardN].card->csr1 = 0x01; /* clr 3 */ 
		cards[cardN].card->csr1 = 0x18; /* enable 1 mask 1 */ 
		break;
割り込みの時は、csr1、2を見て自分のレジスタかを判断し、動作を行います。
  reg1 = (cards[cardN].card-> csr1);
  reg2 = (cards[cardN].card-> csr2);

         case 2: /* latch1 */
	   if ((reg1 & 0x20) == 0x20){
                pmbbi->rval = (cards[cardN].card->latch1) & 0xff;
		cards[cardN].card->csr1 = 0x02; /* clr 1 */
	   }
		cards[cardN].card->csr1 = 0x18; /* enable 1 mask 1 */
		break;

デバイスタイプ定義

dbdファイルの中で次のように定義します。
device(bo,VME_IO,devBoRPV130,"RPV130")
device(mbbiDirect,VME_IO,devMbbiRPV130,"RPV130")
device(mbboDirect,VME_IO,devMbboRPV130,"RPV130")
初期化ファイルはdevRPV130nfigで、ベースアドレスが0x8FF0、割り込みレベル0x07、ベクター0xf3で1枚使うとすると、

devRPV130Config(1,0x8FF0,0x07,0xf3)

の様に指定します。

5.EPICSデータベースサンプル

このデバイスサポートで直接使うデータベースをまとめると、以下の様になります。
DTYPRecordSignalNameFunctionRemarks
RPV130bo0RPV:RESET_FFR/S FFをリセットする使わない
RPV130bo1RPV:RESET_L1Latch1をリセットする使わない
RPV130bo2RPV:RESET_L2Latch2をリセットする使わない
RPV130bo3RPV:RESET_LAR/S FF、L1、L2をリセットする使わない
RPV130bo4RPV:DISABLE_L2Latch2をdisableする使わない
RPV130mbboDirect0RPV:PULSEパルス出力
RPV130mbboDirect1RPV:LEVELレベル出力
RPV130mbboDirect2RPV:CSR1CSR1出力通常使わない
RPV130mbboDirect3RPV:CSR2CSR2出力通常使わない
RPV130mbbiDirect0RPV:FFR/S FF入力使うときは例えば1秒でスキャンする
RPV130mbbiDirect1RPV:THROUGHスルー入力
RPV130mbbiDirect2RPV:LATCH1LATCH1入力スキャンはI/O Intr
RPV130mbbiDirect3RPV:LATCH2LATCH2入力 スキャンはI/O Intr
RPV130mbbiDirect4RPV:CSR1_RCSR1入力
RPV130mbbiDirect5RPV:LATCH2CSR2入力

6.スタートアップファイルサンプル

1枚のRPV-130ボードを使用する時のスタートアップファイル(の関係部分)は次のようになります。
dbLoadRecords("fbppcApp/Db/FB_RPV.db","USER=FBH:TMP , CHAN=C0")

devRPV130Config(1,0x8ff0,0x07,0xf3)

iocInit

7.おわりに

VME Interrupt & I/O REGISTER RPV-130のEPICSデバイスサポートおよびデータベースについて紹介しました。
Makoto Tobiyama
13/Mar/2001

Return to FB Home Page...