Aug 8, 2000 onl50t: Solaris 2.6 cc ドライバのデバッグ. cc ドライバのデバッグ#04(その7) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/ onl50t-sol2.6/Desktop/debug-list-step07.txt) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). 現状確認 (A). 株式会社ロジックハウスの白田様より SPARC CPU-50T を借用した。 (B). FORCE,CPU-50(UltraSPARC-IIi 300MHz)、に Solaris2.6 のシステムを インストールした。 (C). /etc の下の各設定、および /export/home の作成をやった。 (D). "Solaris2.6 Hardware: 5/98 SMCC Desktop 日本語版 SPARC版"では ディスクレス・クライアントを設定することはできないことを確認した。 (E). CPU-50T に Solaris2.6用の VMEドライバ、FRCvme-2.3.1 をインストール した。 (F). onl50t に ccドライバをインストールした。 (G). サンプル・プログラムを実行した。 (1). cam1、シングル・アクション 24ビット camac read/write の実行 NG. システムはパニックを起こしてリブートしてしまう。 (2). cam3、camac LAM割り込み処理の実行 NG. システムはパニックを起こしてリブートしてしまう。 (3). cam2、ブロック転送 16ビット read/write の実行 ok. 正常に実行できた。 (4). cam2、ブロック転送 24ビット read/write の実行 ok. 正常に実行できた。 (H). クラッシュ時の savecoreファイルを入手してデバッグを始めた。 (I). cam1プログラムのデバッグ、icc_ioctlルーチンを修正した。 ok. cam1プログラムは正常に実行できた。 (J). cam3プログラムのデバッグを始めた。 camac_s()ルーチンの中で "cc->k->dhr = *dat;" を実行したところでエラーになっている。 message構造体をcc_device構造体の中に入れてみたが改善されない。 (K). cam3プログラムは正常に動作できるようになった。 (L). cam3プログラムのデバッグ時に付加したゴミをはずして最終的な動作確認 をやった。 ok. (M). onl50t 上でデバッグしたcamacドライバをfrc7v-cl2 上で動作確認した。 ok. (N). onl50t 上でデバッグしたcamacドライバを onl7v2、スタンドアロン Solaris2.6 上で動作確認した。 ok. (O). onl50t 上でデバッグしたcamacドライバを frc8vt、ディスクレス・サーバ Solaris2.6 上で動作確認した。 ok. (P). onl50t 上でデバッグしたcamacドライバを onl8v1、スタンドアロン Solaris2.6 上で動作確認した。 ok. (Q). onl50t 上でデバッグしたcamacドライバを onl5v4、スタンドアロン Solaris2.6 上で動作確認した。 ok. (R). スタンドアロン Solaris2.6、onl50t 上で、シングルアクションの実行 速度を測定時に、camac_s()コールを連続実行すると不正割り込みが かかってしまった。 (S). camac_s()コールを連続実行しても不正割り込みはかからないように なった。 ok. -------------------- リスト処理 (A). 公開版のcamacドライバ、"FORCE-50T-sol2.6" を使ってリスト処理の テストを始める。 (B). KEKリスト処理で camacシングルアクション read/write、LAM割り込み 処理、DMA camacブロック転送の現状確認をした。 (C). Kineticリスト処理で camacシングルアクション read の現状確認をした。 (D). KEKリスト処理、Kineticリスト処理両方をとおしてソースプログラム上で 明らかに問題と思われる部分を修正した。 (E). KEKリスト処理でシングルアクション read/write が正常に実行できて いることを確認した。 (F). KEKリスト処理で DMA camacブロック転送 read が正常に実行できて いることを確認した。 (G). KEKリスト処理で LAM割り込み処理が が正常に実行できていることを確認 した。 (2). ここでやるべきこと KEKリスト処理全般に関連する関数の動作確認を行う。 (3). 現状確認 KEKリスト処理用の関数としては、次のものが用意されている。 (1). CamReaLIST fname のファイルから、list で指定されるメモリ領域にリストを読み 込む。 読んだリストの長さを retlen に返す。 (2). CamLisLOAD list で指定されるメモリ上のリストを、camacドライバ内に読み込む。 (3). CamLisExeWAIt list で指定されるメモリ上のリスト処理を、camacドライバ内に読み 込み、実行する。 データは buf で指定されるメモリ領域に書かれる。 (4). CamExeWAIt camacドライバ内に読み込まれているリストを実行する。 データは buf で指定されるメモリ領域に書かれる。 (3-1). これまでにテスト済みのKEKリスト処理用の関数 (3-1-1). CamReaLISTについて onl50t[44]% grep CamReaLIST * camlib.h:#define CamReaLIST CRLIST onl50t[45]% grep CRLIST * camlib.c:CRLIST(fname, list, lenlis, retlen, err) camlib.h:#define CamReaLIST CRLIST forlib.c: return CRLIST(fname, list, *lenlis, retlen, err); forlib.c: return CRLIST(fname, list, *lenlis, retlen, err); onl50t[46]% cd camlist /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/caml ist onl50t[47]% grep CamReaLIST * camtest41c.c: if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &E rror)) camtest41c.c: printf("CamReaLIST : OK\n"); camtest4c.c: if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &Er ror)) camtest4c.c: printf("CamReaLIST : OK\n"); camtest5c.c: if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &Er ror)) camtest5c.c: printf("CamReaLIST : OK\n"); camtest5c.c-bak: if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &Error)) camtest5c.c-bak: printf("CamReaLIST : OK\n"); camtest5c.c-org: if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &Error)) camtest5c.c-org: printf("CamReaLIST : OK\n"); camtest5c1.c: if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &E rror)) camtest5c1.c: printf("CamReaLIST : OK\n"); camtest5c2.c: if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &E rror)) camtest5c2.c: printf("CamReaLIST : OK\n"); onl50t[48]% camtest5c、camtest5c1、camtest5c2プログラムでテスト済み。 (3-1-2). CamLisLOADについて onl50t[81]% grep CamLisLOAD * camlib.h:#define CamLisLOAD CLLOAD onl50t[82]% grep CLLOAD * camlib.c:CLLOAD(list, lenlis, err) camlib.h:#define CamLisLOAD CLLOAD forlib.c: return CLLOAD(list, *lenlis, err); forlib.c: return CLLOAD(list, *lenlis, err); onl50t[83]% cd camlist /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/camlist onl50t[84]% grep CamLisLOAD * camtest41c.c: if (status = CamLisLOAD(List, Lenlis, &Error)) error_exit(status); camtest41c.c: printf("CamLisLOAD : OK\n"); camtest4c.c: if (status = CamLisLOAD(List, Lenlis, &Error)) error_exit(status); camtest4c.c: printf("CamLisLOAD : OK\n"); onl50t[85]% まだ、テストしていない。 (3-1-3). CamLisExeWAItについて onl50t[87]% grep CamLisExeWAIt * camlib.h:#define CamLisExeWAIt CLEWAI onl50t[88]% grep CLEWAI * camlib.c:CLEWAI(list, lenlis, buf, lenbuf, iiosb) camlib.h:#define CamLisExeWAIt CLEWAI forlib.c: return CLEWAI(list, *lenlis, buf, *lenbuf, iosb); onl50t[89]% cd camlist /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/camlist onl50t[90]% grep CamLisExeWAIt * camtest5c.c: if (status = CamLisExeWAIt(List, Lenlis, Buffer, MAXLENBUF, &Iosb)) camtest5c.c: printf("CamLisExeWAIt : OK\n"); camtest5c.c-bak: if (status = CamLisExeWAIt(List, Lenlis, Buffer, MAXLENBUF, &Iosb)) camtest5c.c-bak: printf("CamLisExeWAIt : OK\n"); camtest5c.c-org: if (status = CamLisExeWAIt(List, Lenlis, Buffer, MAXLENBUF, &Iosb)) camtest5c.c-org: printf("CamLisExeWAIt : OK\n"); camtest5c1.c: if (status = CamLisExeWAIt(List, Lenlis, Buffer, MAXLENBUF, &Iosb)) camtest5c1.c: printf("CamLisExeWAIt : OK\n"); camtest5c2.c: if (status = CamLisExeWAIt(List, Lenlis, Buffer, MAXLENBUF, &Iosb)) camtest5c2.c: printf("CamLisExeWAIt : OK\n"); onl50t[91]% camtest5c、camtest5c1、camtest5c2プログラムでテスト済み。 (3-1-4). CamExeWAItについて onl50t[94]% grep CamExeWAIt * camlib.h:#define CamExeWAIt CEWAI onl50t[95]% grep CEWAI * camlib.c:CEWAI(buf, lenbuf, iiosb) camlib.h:#define CamExeWAIt CEWAI forlib.c: return CEWAI(buf, *lenbuf, iosb); forlib.c: return CEWAI(buf, *lenbuf, iosb); onl50t[96]% cd camlist /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/camlist onl50t[97]% grep CamExeWAIt * camtest41c.c: if (status = CamExeWAIt(Buffer, MAXLENBUF, &Iosb)) error_exit(status); camtest41c.c: printf("CamExeWAIt : OK\n"); camtest4c.c: if (status = CamExeWAIt(Buffer, MAXLENBUF, &Iosb)) error_exit(status); camtest4c.c: printf("CamExeWAIt : OK\n"); onl50t[98]% まだ、テストしていない。 (4). KEKリスト処理用の関数全般の見直し (4-1). cc_write24()ルーチンのチェック : cc_write24(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ dat = Tolong(2); cmn_err(CE_NOTE," cc_write24: cc->ptr_list[2] = 0x%x", cc->ptr_list[2]); cmn_err(CE_NOTE," cc_write24: dat = 0x%x", dat); /* return camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], (u_short *)&d at); E.Inoue */ return camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&dat); } : onl50t[70]% cat inoue.c /* File name : camtest5c.c * Creation date : July 1992 * Author : Y.Yasu, Online group, Physics department, KEK * Modified : August 1994, Y.Yasu * For HP-RT */ /* System headers */ #include #include /* Local headers */ #include "camlib.h" /* Macros */ #define MAXLENBUF 10000 #define MAXLENLIST 1000 #ifdef HP_RT extern char *sys_errlist[]; #endif /* Functions */ error_exit(status) int status; { #ifdef HP_RT perror(sys_errlist[status]); #else perror((const char *)strerror(status)); #endif exit(status); } /* Main */ main(argc, argv) int argc; char *argv[]; { int status, Error, i; int Lenlis, action; unsigned short List[MAXLENLIST], Buffer[MAXLENBUF], *PtrBuffer; struct cc_iosb Iosb; char Filename[30]; /* strcpy(Filename, "camtest4.obj"); */ /* strcpy(Filename, "camtest4single.obj"); */ strcpy(Filename, "inouesingle.obj"); /* strcpy(Filename, "camtest4dma.obj"); */ if (argc > 1) action = atoi(argv[1]); else action = 0xf; Iosb.s_reg = action; if (status = CAM_Open()) error_exit(status); if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &Error)) error_exit(status); printf("CamReaLIST : OK\n"); printf("lenlist = %d\n", Lenlis); printf("list = %x %x %x %x %x\n", List[0], List[1], List[2], List[3]); if (status = CamLisExeWAIt(List, Lenlis, Buffer, MAXLENBUF, &Iosb)) error_exit(status); printf("CamLisExeWAIt : OK\n"); printf("contents of iosb :\n"); printf("iosb.status = %x iosb.ret_length = %x iosb.s_reg = %x ", Iosb.status, Iosb.ret_length, Iosb.s_reg); printf(" iosb.devinfo = %x\n", Iosb.devinfo); printf("contents of buffer :\n"); for( i = 0; i < 12 ;i++) printf("%6x %6x %6x %6x %6x %6x %6x %6x %6x %6x\n", Buffer[10*i+0], Buffer[10*i+1], Buffer[10*i+2], Buffer[10*i+3], Buffer[10*i+4], Buffer[10*i+5], Buffer[10*i+6], Buffer[10*i+7], Buffer[10*i+8], Buffer[10*i+9]); if (status = CAM_Close()) error_exit(status); } onl50t[71]% onl50t[72]% cat inouesingle.asm ; File name : camtest4single.asm ; Creation date : July 1992 ; Author : Y.Yasu, Online group, Physics department, KEK ; Modified : July 21, 2000 E.Inoue SW equ 3 ; CAMAC SWITCH REGISTER MEM equ 4 ; CAMAC BUFFER MEMORY MOUDLE INT equ 5 ; CAMAC INTERRUPT REGISTER LEN equ 10 ; 10 words ; MOVE #1,A SETCRATE A SETCRATE #0 GENZ GENC SETI REMI ; ; READ (0,SW,1) ; READ.l (0,SW,1) ; READ (0,SW,1),A ; MOVE A,(PTR)+ ; READ.l (0,SW,1),A ; MOVE.l A,(PTR)+ ; WRITE #0x5555,(16,SW,0) ; WRITE #0x80081,(16,SW,0) ; WRITE.l #0x80082,(16,SW,0) ; WRITE A,(16,SW,0) WRITE.l #0x654321,(16,SW,0) ; STOP end onl50t[73]% onl50t[69]% inoue CamReaLIST : OK lenlist = 16 list = 329 1 0 10a ef7a6080 CamLisExeWAIt : OK contents of iosb : iosb.status = fffffff6 iosb.ret_length = 0 iosb.s_reg = f iosb.devinfo = a000a0 contents of buffer : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 onl50t[70]% Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x29 Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xa Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xb Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xc Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xd Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xf Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xe Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x6 Aug 7 14:08:33 onl50t unix: NOTICE: cc_write24: cc->ptr_list[2] = 0x4321 Aug 7 14:08:33 onl50t unix: NOTICE: cc_write24: dat = 0x654321 Aug 7 14:08:33 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x0 cc_write24()ルーチン等で使っているローカル変数 dat の代わりに、 soft state構造体の中の cc->data1 を使うように変更する。 (4-2). cc.cファイルの修正 : /* cc_write24(cc) E.Inoue */ cc_write24(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ /* int dat; E.Inoue */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* dat = Tolong(2); E.Inoue */ cc->data1 = Tolong(2); cmn_err(CE_NOTE," cc_write24: cc->ptr_list[2] = 0x%x", cc->ptr_list[2]); cmn_err(CE_NOTE," cc_write24: cc->data1 = 0x%x", cc->data1); /* return camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], (u_short *)&d at); E.Inoue */ /* return camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&dat); E.inoue */ return camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&cc->data1); } : /* cc_ndt(cc) E.Inoue */ cc_ndt(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ /* u_short dummy; E.Inoue */ int dummy; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* return camac_s(getminor(cc->dev), CC_BIT16, cc->ptr_list[1], &dummy); E.In oue */ return camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&dummy); } : /* cc_genz(cc) E.Inoue */ cc_genz(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* int dat; E.Inoue E.Inoue */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&cc->data1)) return status; cc->data1 |= 1; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&cc->data1); } : /* cc_genc(cc) E.Inoue */ cc_genc(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* int dat; E.Inoue */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&cc->data1)) return status; /* dat |= 2; E.Inoue */ cc->data1 |= 2; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&cc->data1); } : /* cc_remi(cc) E.Inoue */ cc_remi(int unit) /* struct cc_device *cc; E.inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* int dat; E.Inoue */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&cc->data1)) return status; cc->data1 &= ~4; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&cc->data1); } : /* cc_seti(cc) E.Inoue */ cc_seti(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* int dat; E.Inoue */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&cc->data1)) return status; cc->data1 |= 4; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&cc->data1); } : /* cc_dsbint(cc) E.Inoue */ cc_dsbint(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* int dat; E.Inoue */ u_short sdat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* disable LAM */ cc->k->lamc = CC_INT_AUTO_CLEAR | intrpri; /* dat = 0x0; E.Inoue */ /* mask */ cc->data1 = 0x0; /* mask */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 13, 17), (u_shor t *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 13, 17), (u_short *)&cc->data1) ) return status; /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT16, NAF(30, 0, 1), &sdat)) return status; sdat &= ~0x0100; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT16, NAF(30, 0, 17), &sdat); } : /* cc_qwait(cc) E.Inoue */ cc_qwait(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status, i; /* int dat; E.Inoue */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->camac_qx = status = 0; for (i=0; status==0 && (cc->camac_qx & CC_NOQ)!=0 && iptr_list[2];i++) /* status = camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], (u_short *)&dat); E.inoue */ status = camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&cc->data1) ; if (i >= cc->ptr_list[2]) return CC_STA_LIST_TIMEOUT; else return 0; } : onl50t[88]% make ./script/cc_build.sh [Building for sun4u] rm -f cc.o onl50t[89]% su Password: # csh onl50t# source /.cshrc onl50t# make unload ./script/cc_unload.sh [Removing CAMAC device driver] [Removing CAMAC device driver from system] [Deleting CAMAC device files] onl50t# make load ./script/cc_load.sh [Installing CAMAC device driver] [Adding CAMAC device driver to system] [Configuring CAMAC device driver] [Making CAMAC device files] sun4u onl50t# onl50t[93]% inoue CamReaLIST : OK lenlist = 16 list = 329 1 0 10a ef7a6080 CamLisExeWAIt : OK contents of iosb : iosb.status = fffffff6 iosb.ret_length = 0 iosb.s_reg = f iosb.devinfo = a000a0 contents of buffer : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 onl50t[94]% Aug 7 15:43:49 onl50t unix: VME level 4 vector 0xff sparc ipl 7 Aug 7 15:43:49 onl50t unix: cc0 is /pci@1f,0/vme@5/cc@2d,ff00 Aug 7 15:43:57 onl50t unix: pem: no event handler Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x29 Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xa Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xb Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xc Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xd Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xf Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xe Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x6 Aug 7 15:45:01 onl50t unix: NOTICE: cc_write24: cc->ptr_list[2] = 0x4321 Aug 7 15:45:01 onl50t unix: NOTICE: cc_write24: cc->data1 = 0x654321 Aug 7 15:45:01 onl50t unix: NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x0 (5). まだテストしていない KEKリスト処理用の関数について調べる (5-1). CamLisLOADについて 上記、(3-1-2)項で見たように CamLisLOAD関数はまだテストしていない。 onl50t[81]% grep CamLisLOAD * camlib.h:#define CamLisLOAD CLLOAD onl50t[82]% grep CLLOAD * camlib.c:CLLOAD(list, lenlis, err) camlib.h:#define CamLisLOAD CLLOAD forlib.c: return CLLOAD(list, *lenlis, err); forlib.c: return CLLOAD(list, *lenlis, err); onl50t[83]% cd camlist /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/caml ist onl50t[84]% grep CamLisLOAD * camtest41c.c: if (status = CamLisLOAD(List, Lenlis, &Error)) error_exit(statu s); camtest41c.c: printf("CamLisLOAD : OK\n"); camtest4c.c: if (status = CamLisLOAD(List, Lenlis, &Error)) error_exit(status ); camtest4c.c: printf("CamLisLOAD : OK\n"); onl50t[85]% この関数は camtest4cプログラム、あるいは camtest41cプログラムでテスト することができる。 (5-2). CamExeWAItについて 上記、(3-1-4)項で見たように CamExeWAIt関数はまだテストしていない。 onl50t[94]% grep CamExeWAIt * camlib.h:#define CamExeWAIt CEWAI onl50t[95]% grep CEWAI * camlib.c:CEWAI(buf, lenbuf, iiosb) camlib.h:#define CamExeWAIt CEWAI forlib.c: return CEWAI(buf, *lenbuf, iosb); forlib.c: return CEWAI(buf, *lenbuf, iosb); onl50t[96]% cd camlist /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/caml ist onl50t[97]% grep CamExeWAIt * camtest41c.c: if (status = CamExeWAIt(Buffer, MAXLENBUF, &Iosb)) error_exit(s tatus); camtest41c.c: printf("CamExeWAIt : OK\n"); camtest4c.c: if (status = CamExeWAIt(Buffer, MAXLENBUF, &Iosb)) error_exit(st atus); camtest4c.c: printf("CamExeWAIt : OK\n"); onl50t[98]% この関数は camtest4cプログラム、あるいは camtest41cプログラムでテスト することができる。 (5-3). CamLisLOAD および CamExeWAIt のテスト ここでは camtest4cプログラムを使って CamLisLOAD および CamExeWAIt の テストを行うことにする。 (5-3-1). camtest4c.cファイルの修正 onl50t[102]% pwd /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/camlist onl50t[103]% mv camtest4c.c camtest4c.c-org onl50t[104]% cp camtest4c.c-org camtest4c.c onl50t[105]% vi camtest4c.c /* File name : camtest4c.c * Creation date : July 1992 * Author : Y.Yasu, Online group, Physics department, KEK * Modified : August 1994, Y.Yasu * : For HP-RT * : November 1994, Y.Yasu * Modified : August 2000, E.Inoue */ /* System headers */ #include #include /* Local headers */ #include "camlib.h" /* Macros */ #define MAXLENBUF 10000 #define MAXLENLIST 1000 #ifdef HP_RT extern char *sys_errlist[]; #endif /* Functions */ error_exit(status) int status; { #ifdef HP_RT perror(sys_errlist[status]); #else /* perror(strerror(status)); */ perror((const char *)strerror(status)); #endif exit(status); } static unsigned short List[MAXLENLIST], Buffer[MAXLENBUF], *PtrBuffer; /* Main */ main(argc, argv) int argc; char *argv[]; { int status, Error, i; int Lenlis, action; struct cc_iosb Iosb; char Filename[30]; /* strcpy(Filename, "camtest4etc.obj"); */ /* strcpy(Filename, "camtest4dma.obj"); */ strcpy(Filename, "camtest4single.obj"); /* strcpy(Filename, "camtest4.obj"); */ if (argc > 1) action = atoi(argv[1]); else action = 0xf; Iosb.s_reg = action; if (status = CAM_Open()) error_exit(status); printf("CAM_Open : Done\n"); if (status = CamReaLIST(Filename, List, MAXLENLIST, &Lenlis, &Error)) error_exit(status); printf("CamReaLIST : OK\n"); printf("lenlist = %d\n", Lenlis); if (status = CamLisLOAD(List, Lenlis, &Error)) error_exit(status); printf("CamLisLOAD : OK\n"); printf("list = %x %x %x %x %x\n", List[0], List[1], List[2], List[3]); if (status = CamExeWAIt(Buffer, MAXLENBUF, &Iosb)) error_exit(status); printf("CamExeWAIt : OK\n"); printf("contents of iosb :\n"); printf("iosb.status = %x iosb.ret_length = %x iosb.s_reg = %x ", Iosb.status, Iosb.ret_length, Iosb.s_reg); printf(" iosb.devinfo = %x\n", Iosb.devinfo); printf("contents of buffer :\n"); for( i = 0; i < 12 ;i++) printf("%6x %6x %6x %6x %6x %6x %6x %6x %6x %6x\n", Buffer[10*i+0], Buffer[10*i+1], Buffer[10*i+2], Buffer[10*i+3], Buffer[10*i+4], Buffer[10*i+5], Buffer[10*i+6], Buffer[10*i+7], Buffer[10*i+8], Buffer[10*i+9]); if (status = CAM_Close()) error_exit(status); } onl50t[106]% onl50t[106]% cat camtest4single.asm ; File name : camtest4single.asm ; Creation date : July 1992 ; Author : Y.Yasu, Online group, Physics department, KEK ; Modified : July 21, 2000 E.Inoue SW equ 3 ; CAMAC SWITCH REGISTER MEM equ 4 ; CAMAC BUFFER MEMORY MOUDLE INT equ 5 ; CAMAC INTERRUPT REGISTER LEN equ 10 ; 10 words ; MOVE #1,A SETCRATE A SETCRATE #0 GENZ GENC SETI REMI ; READ (0,SW,1) READ.l (0,SW,1) READ (0,SW,1),A MOVE A,(PTR)+ READ.l (0,SW,1),A MOVE.l A,(PTR)+ WRITE #0x5555,(16,SW,0) WRITE #0x80081,(16,SW,0) WRITE.l #0x80082,(16,SW,0) WRITE A,(16,SW,0) WRITE.l A,(16,SW,0) ; STOP end onl50t[107]% (5-3-2). camtest4c.c、camtest4single.asmファイルのコンパイルおよび実行 onl50t[52]% rm camtest4c onl50t[53]% rm camtest4single.obj onl50t[54]% make camtest4c cc -o camtest4c camtest4c.c -I.. -L.. -lcamac onl50t[55]% make camtest4single.obj ../camasm/camasm camtest4single.asm CAMASM macro assembler V0.1 --- KEK online group --- Modified by Y.T Oct-1991 onl50t[56]% onl50t[56]% cat camtest4single.obj 0024 0329 0001 0000 010A 020B 0000 010C 010D 010F 010E 0201 0620 0202 0620 0203 0620 012C 0204 0620 012D 0305 0610 5555 0305 0610 0081 0406 0610 0082 0008 0207 0610 0208 0610 0100 0000 onl50t[57]% onl50t[53]% camtest4c CAM_Open : Done CamReaLIST : OK lenlist = 36 CamLisLOAD : OK list = 329 1 0 10a ef7a6080 CamExeWAIt : OK contents of iosb : iosb.status = fffffff6 iosb.ret_length = 6 iosb.s_reg = f iosb.devinfo = a000 a0 contents of buffer : 5555 55 5555 5555 55 5555 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 onl50t[54]% CAMAC device driver V1.4x, 1991-1993 by Y.TAKEUCHI (T.I.T. ) cc0 at vme0: vme16d16 0xff00 VME level 4 vector 0xff sparc ipl 7 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x29 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xa NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xb NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xc NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xd NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xf NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0xe NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x1 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x2 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x3 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x2c NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x4 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x2d NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x5 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x5 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x6 NOTICE: cc_write24: cc->ptr_list[2] = 0x82 NOTICE: cc_write24: cc->data1 = 0x80082 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x7 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x8 NOTICE: cc_write: CC_CMD_LOADDOLIST: in while, code = 0x0 ok. 正常に実行できた。 これで、KEKリスト処理のデバッグを終わる。 ---xxxx ここまでやった(継続中) --- (6). 項目タイトル (6-1). サブ項目タイトル (6-1-1). サブサブ項目タイトル