Feb 10,1997 onl5v4: Solaris 2.5 cc ドライバのデバッグ. cam3 テスト・プログラムによるデバッグ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/onl5v4-sol2.5/debug-step9-log.txt) (ftp://onl5v4.kek.jp/export/home/onl5v4/inoue/CAMAC/Log/step9.log) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). 現状確認。 (a). camac_s()ルーチン中に記述してある"k->csr = CC_RST" を実行した直後 にインタラプト・ベクタ・レジスタがリセットされていることを確認 した。 この命令は、k2917 をパワーオン・リセット状態にする。 (b). すべての camac コマンドが実行されるたびに camac_s()ルーチンが コールされる。 つまり、LAM イネーブル camac コマンドを実行した とたんに、せっかく設定してあったインタラプト・ベクタ・レジスタの 内容はリセットされてしまう。 (2). 方針 1. "k->csr = CC_RST" の命令は camac_s()ルーチンの中ではやらないで、 cc_open()ルーチンの中で、一度だけ実行するように変更する。 この変更に伴って何か問題が起こるかどうか調べる。 このテストは、 cam1、cam3 のプログラムを使って行なう。 (3). cc.c を修正する。 onl5v4[42]% vi cc.c : static int camac_s(struct cc_device *cc, u_short mode, u_short naf, u_short *dat) { register struct K_REG *k = cc->k; register int counter; cc->status = 0; /* by E.Inoue */ uprintf("camac_s: debug: before RST cc->k->lamv = 0x%x\n", cc->k->lamv); /* */ /* k->csr = CC_RST; */ /* K2917 Reset */ /* by E.Inoue */ uprintf("camac_s: debug: after RST cc->k->lamv = 0x%x\n", cc->k->lamv); /* */ k->cma = CC_CMA_INIT; /* Initialize memory pointer */ : mac_s()ルーチン中の "k->csr = CC_RST;" を削除。 : static int cc_open(dev_t *devp, int flag, int otyp, cred_t *cred_p) { register int unit; register struct cc_device *cc = &ccdevice[0]; void bzero(); /* by E.Inoue */ register struct K_REG *k = cc->k; /* */ : /* by E.Inoue */ k->csr = CC_RST; /* K2917 Reset */ /* */ /* set interrupt registers of K2917 */ cc->k->lamc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->donc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->empc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->aboc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->lamv = (u_short)intrvec; cc->k->donv = (u_short)intrvec; cc->k->empv = (u_short)intrvec; cc->k->abov = (u_short)intrvec; : cc_open()ルーチンに "k->csr = CC_RST;" 命令を追加。 これで、コンパイル、ロード、cam1、cam3 の実行をやってみる。 onl5v4[47]% cam1 5 camlib: debug: enter CAMOPN() cc_open: debug: enter cc_open cc_open: debug: uprintf cc->k->lamv = 0xffff cc_getinfo: debug: enter cc_getinfo cc_getinfo: debug: enter cc_getinfo camlib: debug: CAMOPN() normal return camlib: debug: CSETCR() normal return cc_ioctl: CCIOC_SET_CRATE retrun: debug: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camlib: debug: CGENC() normal return cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x3c11 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camlib: debug: CGENZ() normal return cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x3c11 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x3c11 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camlib: debug: CREMI() normal return cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x3c11 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff Input n a f (data)>3 0 0 camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 16 5555 cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x610 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff N=3 A=0 F=16 Q=1 X=1 Data:0015B3(Hex) 00005555(Dec) Input n a f (data)>3 0 0 camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff N=3 A=0 F=0 Q=1 X=1 Data:0015B3(Hex) 00005555(Dec) Input n a f (data)>3 0 16 0 cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x610 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff N=3 A=0 F=16 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 0 camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) onl5v4[48]% ok. cam1(シングル・アクション read/write) のテストでは、何も問題は起 こっていない。 cam3(割り込み) のテストをやってみる。 onl5v4[50]% cam3 camlib: debug: enter CAMOPN() cc_open: debug: enter cc_open cc_open: debug: uprintf cc->k->lamv = 0xffff cc_getinfo: debug: enter cc_getinfo cc_getinfo: debug: enter cc_getinfo camlib: debug: CAMOPN() normal return camlib: debug: CSETCR() normal return cc_ioctl: CCIOC_SET_CRATE retrun: debug: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camlib: debug: CGENC() normal return cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x3c11 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camlib: debug: CGENZ() normal return cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x3c11 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camlib: debug: CREMI() normal return cc_write: debug: camac write: cc= 0xf5d59598, mode= 0x0, naf=0x3c11 cc_write: debug: camac write: cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff *** Now waiting LAM ... N=3 Loop=10 Timeout=0 sec cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Timeout !! count=1 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Interrupted !! count=2 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Interrupted !! count=3 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Interrupted !! count=4 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Timeout !! count=5 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Timeout !! count=6 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Timeout !! count=7 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Timeout !! count=8 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Timeout !! count=9 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM enter: debug: uprintf cc->k->lamv = 0xffff cc_ioctl: CCIOC_WAIT_LAM: debug: uprintf cc->k->lamv = 0xffff Timeout !! count=10 call CAMAC(nafclrlam, &dat, &q, &x) camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff camac_s: debug: before RST cc->k->lamv = 0xffff camac_s: debug: after RST cc->k->lamv = 0xffff *** cam3 nomal end. onl5v4[51]% ok. 10回の割り込みテストの内、1回目はタイムアウトが起こるまで何もしない で待った。 2回目、3回目、4回目は camac のLAMを立ててやった。 そして、 5回目から10回目までは、またタイムアウトが起こるまで何もしないで待った。 結果は、正しく cc ドライバが応答していることを確認した。 (4). camac 割り込みに関係した部分の修正。 cam1、および cam3 によるテスト結果からわかるように、上記の項目(2) の修正 で問題はないようだ。 そのように修正することにする。 (5). デバッグのために入れてあった uprintf 文をはずして実行してみた。 onl5v4[65]% cam1 5 Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 16 55555 N=3 A=0 F=16 Q=1 X=1 Data:00D903(Hex) 00055555(Dec) Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:00D903(Hex) 00055555(Dec) Input n a f (data)>3 0 16 0 N=3 A=0 F=16 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) onl5v4[66]% onl5v4[79]% cam3 *** Now waiting LAM ... N=3 Loop=10 Timeout=0 sec Interrupted !! count=1 Interrupted !! count=2 Interrupted !! count=3 Interrupted !! count=4 Interrupted !! count=5 Interrupted !! count=6 Interrupted !! count=7 Interrupted !! count=8 Interrupted !! count=9 Interrupted !! count=10 *** cam3 nomal end. onl5v4[80]% ok. 問題なく動いている。 (6). 現在の cc.c では、"camac LAM enable" コマンドを実行すると、k2917 のイン タラプト・ベクタ・レジスタの内容を設定し直している。 これをはずして実行 してみる。 onl5v4[67]% vi cc.c : case CCIOC_ENABLE_LAM : camac_s(cc, CC_BIT24, NAF(30, 13, 17), (u_short *)data); camac_s(cc, CC_BIT16, NAF(30, 0, 1), &sdat); sdat |= 0x100; camac_s(cc, CC_BIT16, NAF(30, 0, 17), &sdat); /* by E.Inoue */ /* set interrupt registers of K2917 */ /* cc->k->lamc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->donc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->empc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->aboc = (u_short)(CC_INT_AUTO_CLEAR | intrpri); cc->k->lamv = (u_short)intrvec; cc->k->donv = (u_short)intrvec; cc->k->empv = (u_short)intrvec; cc->k->abov = (u_short)intrvec; */ /* */ break; : onl5v4[68]% これで、コンパイル、ロード、cam1、cam3 の実行をやってみる。 onl5v4[55]% cam1 5 Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 16 55555 N=3 A=0 F=16 Q=1 X=1 Data:00D903(Hex) 00055555(Dec) Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:00D903(Hex) 00055555(Dec) Input n a f (data)>3 0 16 0 N=3 A=0 F=16 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) onl5v4[56]% ok. camac シングル・アクション read/write の動作は問題ない。 onl5v4[56]% cam3 *** Now waiting LAM ... N=3 Loop=10 Timeout=0 sec Interrupted !! count=1 Interrupted !! count=2 Interrupted !! count=3 Interrupted !! count=4 Interrupted !! count=5 Interrupted !! count=6 Interrupted !! count=7 Interrupted !! count=8 Interrupted !! count=9 Interrupted !! count=10 *** cam3 nomal end. onl5v4[57]% わざとタイムアウトを起こした状況で実行してみる。 3回目、6、7、8回目で タイムアウトが起こるようにしてみる。 onl5v4[57]% cam3 *** Now waiting LAM ... N=3 Loop=10 Timeout=0 sec Interrupted !! count=1 Interrupted !! count=2 Timeout !! count=3 Interrupted !! count=4 Interrupted !! count=5 Timeout !! count=6 Timeout !! count=7 Timeout !! count=8 Interrupted !! count=9 Interrupted !! count=10 *** cam3 nomal end. onl5v4[58]% ok. 割り込みの動作は、問題ない。 (7). これで、シングル・アクション read/write、および割り込みのテストを終る。 続いて、ブロック転送のテストをやる。