May 30,1997 FORCE CPU-5V、Solaris 2.5用 ccドライバのデバッグ. (デバッグ時に変更した個所のリスト) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/onl5v4-sol2.5/debug-memo.txt) (ftp://onl5v4.kek.jp/export/home/onl5v4/inoue/CAMAC/Log/ debug-memo/changes.log) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). はじめに FORCE CPU-5V SPARC ボードを使って、Solaris 2.5のもとでccドライバの デバッグを行なった。 この時の環境と、デバッグの最中に元のファイル から変更した部分を明確にしておくために、この文書を書いた。 (2). 確認した動作 デバッグ後、次の動作が正常に実行できることを確認した。 (A). camacシングル・アクション 24ビットread/write。 (B). camac LAM 割り込み処理。 (C). camacブロック転送 16ビットread/write。 (D). camacブロック転送 24ビットread/write。 動作確認をした時の記録は、以下のURLに置いた。 http://www-online.kek.jp/~inoue/CAMAC/onl5v4-sol2.5/test.txt (3). デバッグ時の環境 (A). デバッグで使用した、ハードウェアおよびソフトウェア (A-1). ハードウェア (a). CPU ボード FORCE製、 SPARC,CPU-5V is a "SPARC CPU-5V/48-110-X" (b). ディスク アイ・エー・アイ製、c0t3d0(sd3) is a "SDX4300" 4.0GB disk drive (c). vme-camac インターフェース kineticSystem製、k2917 kineticSystem製、k3922 (d). camac テスト用モジュール kek製、camac 24ビット・スイッチ・レジスタ・モジュール (e). コンソール HITACHI製、X端末HT-3451-G11 (A-2). ソフトウェア (a). OS Solaris2.5 (b). コンパイラ SPARCompilers 2.0.1。 これは、 ftp://kiwifs.kek.jp/public2/sun/Solaris2/SUNWspro/SC2.0.1/cc をNFSマウントして使用した。 (c). vme ドライバ VMEbus Driver CPU-5V/5VT/20VT/24VT Solaris 2.5 V2.0.2 (d). デバッグの元にした ccドライバ camac.sol2-1.30 (B). 元にしたキット ftp://onlnews.kek.jp/pub/kek/camac/camac.sol2-1.30.tar.gz 確認のために、元にしたキットに含まれるファイルの一覧を下に示す。 onl5v4[52]% tar tvf camac.sol2-1.30.tar drwxr-xr-x 112/100 0 Dec 13 15:27 1994 camac.sol2/ -rw-r--r-- 112/100 1805 Dec 13 09:38 1994 camac.sol2/Makefile -rw-r--r-- 112/100 2451 Dec 13 09:38 1994 camac.sol2/README -rw-r--r-- 112/100 1170 Dec 13 09:38 1994 camac.sol2/cam1.c -rw-r--r-- 112/100 2056 Dec 13 09:38 1994 camac.sol2/cam3.c -rw-r--r-- 112/100 9674 Dec 13 09:38 1994 camac.sol2/camlib.c -rw-r--r-- 112/100 1415 Dec 13 09:38 1994 camac.sol2/camlib.h -rw-r--r-- 112/100 62572 Dec 13 09:38 1994 camac.sol2/cc.c -rw-r--r-- 112/100 293 Dec 13 09:38 1994 camac.sol2/cc.conf -rw-r--r-- 112/100 2748 Dec 13 09:38 1994 camac.sol2/cc.h -rw-r--r-- 112/100 2288 Dec 13 09:38 1994 camac.sol2/cc_common.h -rw-r--r-- 112/100 876 Dec 13 09:38 1994 camac.sol2/cc_config.h -rw-r--r-- 112/100 3289 Dec 13 09:38 1994 camac.sol2/forlib.c -rw-r--r-- 112/100 4058 Dec 13 09:38 1994 camac.sol2/k2917.h drwxr-xr-x 112/100 0 Dec 13 11:29 1994 camac.sol2/script/ -rwxr-xr-x 112/100 234 Dec 13 09:38 1994 camac.sol2/script/cc_build.sh -rwxr-xr-x 112/100 611 Dec 13 09:38 1994 camac.sol2/script/cc_load.sh -rwxr-xr-x 112/100 270 Dec 13 09:38 1994 camac.sol2/script/cc_unload.sh -rwxr-xr-x 112/100 233 Dec 13 09:38 1994 camac.sol2/script/cc_build.gcc.sh -rwxr-xr-x 112/100 450 Dec 13 09:38 1994 camac.sol2/script/cc_link.sh -rw-r--r-- 112/100 37 Dec 13 09:38 1994 camac.sol2/script/awk2.txt -rw-r--r-- 112/100 66 Dec 13 09:38 1994 camac.sol2/script/awk1.txt onl5v4[53]% (C). デバッグ後のキット デバッグ用に展開した各ファイルに対して、デバッグ時にいろいろと書き込ん だり変更を加えた。 この変更を加えた各ファイルをそのままの状態で以下の 場所に置いた。 これは、デバッグの状態を確認する目的で残しておいた。 http://www-online.kek.jp/~inoue/CAMAC/onl5v4-sol2.5/camac-5v.sol2.5-debug.tar.gz 近日中に、この各ファイル中のゴミをきれいに落したものを、ユーザへ公開 するためのものとして、別に提供する予定である。 (4). デバッグ時に変更した個所の一覧 (4-1). camac.sol2ディレクトリ上のファイルの変更個所 (A). Makefile ファイルの変更個所 (a). ブロック転送のテスト用プログラム、cam2.f をコンパイルするための 変更 : FC = f77 FFLAGS = -fast -O3 -u : all : cc libcamac.a cam1 cam3 cam2 : cam2 : cam2.f $(FC) $(FFLAGS) cam2.f -o cam2 $(CLIB) : clean: \rm -f cc *.o libcamac.a cam1 cam3 *~ core cam2 を追加および修正した。 (B). README ファイルの変更個所 "INSTALLATION" の説明のところに手順の項目を追加した。 : 1-1. Reboot your system shutdown : boot -r : この追加は、/dev/cc ファイルが正しく作られるようにするためのもの である。 (C). cam1.c ファイルの変更個所 変更なし。 (D). cam3.c ファイルの変更個所 テストに使用した camac クレートは、東陽テクニカ(株)のモデル PS-6000 である。 このクレートは、スロット番号1 から6 までと、スロット番号25 の合わせて 7スロットしか装備していない。 ところで、camac-sol2 のキットに含まれている cam3.cテスト・プログラム はスロット番号11 からの割り込みを処理することを前提にしているので、 PS-6000 を使った場合、具合がわるい。 そこで cam3.cテスト・プログラム を修正してスロット番号3 からの割り込みを処理するように変更した。 (E). cam2.f ファイルの追加および変更個所 camac.sol2-1.30の中には、cam2.f ファイルは含まれていなかった。 この ファイルは、Solaris1.x用の camac インストール・キット、"camac.sparc- 1.22d.tar.gz"から抜き出した。 そして、修正した。 ブロック転送 write時の転送データ設定がされていなかった。 転送データ 設定の部分を追加した。 : if (nf .ge. 16 .and. nf .lt. 24) then CCCC CCCC set up on 16bits data or 24 bits data. CCCC print 20 read(*, *) dat do 200 j = 1, len if (nword .eq. 1) then ndats(j) = dat else ndat(j) = dat endif 200 continue endif CCCCC : 20 format('Input data >', $) : (F). camlib.c の変更個所 必須の変更ではないが、プログラム中で使われていないヘッダ・ファイル を削除した。 #include : /*#include #include */ <--- この部分 : #include "cc_config.h" (G). camlib.h の変更個所 変更なし。 (H). cc.c の変更個所 cc.c の修正は、"Solaris 2.5 DDK" の中のファイル "ddk_2.5/driver_dev/ dma/sparc/dma.c および pio.c" の例題、および、"Solaris 2.5 Writing Device Drivers" のマニュアルを参考にしながら行なった。 (a). ヘッダ・ファイルの部分の修正 ddk_2.5/driver_dev/dma/sparc/dma.c および pio.c の例に従って cc.c のヘッダ・ファイルの部分を修正した。 次の行を削除した。 追加した行 はない。 #include #include #include #include #include #include #include #include #include #include #include #include (b). デバイス・コンフィギュレーションの部分の修正 cc.c プログラムでは、cc_info で定義されているが、Solaris2.5 では pio_getinfo という記述になっている。 混乱を避けるために、cc_info という記述を cc_getinfo に変更した。 さらに、宣言文の記述法も Solaris2.5 に合わせた。 : /*static int cc_info(dev_info_t *, ddi_info_cmd_t , void *, void **); */ static int cc_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result); static int cc_identify(dev_info_t *dip); static int cc_probe(dev_info_t *dip); static int cc_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); static int cc_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); static int cc_open(dev_t *devp, int flag, int otyp, cred_t *cred_p); static int cc_close(dev_t dev, int flag, int otyp, cred_t *cred_p); static int cc_write(dev_t dev, struct uio *uio, cred_t *cred_p); static int cc_ioctl(dev_t dev, int cmd, int arg, int flag, cred_t *cred_p, int *rval_p); static int cc_strategy(struct buf *bp); static void cc_minphys(struct buf *bp); static u_int cc_intr(); static void cc_timeout(); static int camac_s(struct cc_device *cc, u_short mode, u_short naf, u_short *dat); static int camac_b(struct cc_device *cc, u_short mode, u_short naf, int len,nt *retlen); : struct dev_ops cc_ops = { DEVO_REV, /* devo_rev, */ 0, /* refcnt */ cc_getinfo, /* info */ cc_identify, /* identify */ : /* * Given the device number return the devinfo pointer. */ /* ARGSUSED */ static int cc_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result) { register dev_t dev = (dev_t) arg; register int instance, error; register struct cc_device *cc = &ccdevice[0]; : (c). オート・コンフィギュレーション用のデータ・ストラクチャの部分の修正 (c-1). cb_ops構造体の中の cb_flagメンバを Solaris2.5 に合わせて変更 した。 "D_NEW | D_MTSAFE" を "D_NEW | D_MP"に変更。 : static struct cb_ops cc_cb_ops = { : D_NEW | D_MP /* Driver comaptibility flag */ }; (c-2). dev_ops構造体の中のエントリ・ポイントを変更した。 : struct dev_ops cc_ops = { : cc_getinfo, /* info */ : }; (d). ローダブル・インターフェース部の修正 この部分で次のようにヘッダファイルをインクルードしてあった。 #include が、これは Solaris2.5 に合わせて削除した。 (e). デバイス・アクセス cc_open()部の修正 "k->csr = CC_RST" の命令は、cc_open()ルーチンの中で、一度だけ実行 するように変更した。 : /* set busy flag */ cc->cc_busy = CC_BUSY; /* 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); : (f). cc_ioctlルーチン、CCIOC_REG_DUMP処理部の修正 このルーチン中で "k->csr = CC_RST;" が実行されている。 この命令を 実行すると、k2917をパワーオン・リセットの状態にされてしまう。 この ため、k2917のインタラプト・ベクタ・レジスタの設定値も消えてしまう。 以後、camac からの割り込み処理を正しく処理することができなくなる。 そこで、このルーチンの中の "k->csr = CC_RST;" 命令は削除することに した。 /* k->csr = CC_RST; */ (g). cc_ioctlルーチン、CCIOC_READ_STATUS処理部の修正 上記(f)項と同じ理由で、このルーチンの中の "k->csr = CC_RST;" 命令は 削除することにした。 /* k->csr = CC_RST; */ (h). cc_ioctlルーチン部、CCIOC_RESET処理部の修正 このルーチン中で "k->csr = CC_RST;" が実行されている。 この命令を 実行すると、上記(f)で説明した事態になる。 そこで、この命令を実行 した後で、再度、k2917のインタラプト・ベクタ・レジスタの設定をする ように修正した。 case CCIOC_RESET : k->csr = CC_RST; /* by E.Inoue from >>> */ /* 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; /* to <<< */ break; (i). cc_strategyルーチン部の修正 (i-1). uprintf()文を削除 オリジナルのキットに含まれていたuprintf()文を削除した。 ドライバ・プログラムの実行には、必要ないと判断した。 /* uprintf("count in 32bit=%d\n", cc->dma_cookie.dmac_size); */ (i-2). "k->csr = CC_RST;"命令を削除 オリジナルのキットに含まれていた"k->csr = CC_RST;"命令を削除 した。 cc_strategyルーチンは、ブロック転送が要求された時に コールされる。 "k->csr = CC_RST;"命令が cc_strategyルーチン 部で実行されると、ブロック転送の終了を知らせる割り込み信号の 処理ができなくなる。 従って、このルーチンの中の"k->csr = CC_RST;" 命令は削除することにした。 /* k->csr = CC_RST; */ /* K2917 Reset */ (j). camac_bルーチン部の修正 (j-1). uprintf()文を削除 オリジナルのキットに含まれていたuprintf()文を削除した。 ドライバ・プログラムの実行には、必要ないと判断した。 /* uprintf(" in: %d %d %d %d %d\n", uio->uio_iov->iov_len, uio->uio_iovcnt, uio->uio_resid, uio->uio_segflg, uio->uio_offset); */ (j-2). uprintf()文を削除 オリジナルのキットに含まれていたuprintf()文を削除した。 ドライバ・プログラムの実行には、必要ないと判断した。 /* uprintf("out: %d %d %d %d %d\n", uio->uio_iov->iov_len, uio->uio_iovcnt, uio->uio_resid, uio->uio_segflg, uio->uio_offset); */ (k). camac_sルーチン部の修正 camac_sルーチンは camac アクセスが要求されるたびにコールされる。 camac_s()ルーチンの中に、"k->csr = CC_RST" の記述がある。 これは、 上記(f)項と同じ理由で、不都合である。このルーチンの中の "k->csr = CC_RST;" 命令は削除することにした。 /* k->csr = CC_RST; */ /* K2917 Reset */ (I). cc.conf の変更個所 nexus ドライバの指定の部分を修正した。 name="cc" class="vme" reg=0x2d,0xff00,0x00ff interrupts=4,0xff; (J). cc.h の変更個所 変更なし。 (K). cc_common.h の変更個所 変更なし。 (L). cc_config.h の変更個所 変更なし。 (M). forlib.c の変更個所 変更なし。 (N). k2917.h の変更個所 変更なし。 (4-2). camac.sol2/script ディレクトリ上のファイルの変更個所 (A). awk1.txt の変更個所 変更なし。 (B). awk2.txt の変更個所 変更なし。 (C). cc_build.gcc.sh の変更個所 変更なし。 (D). cc_build.sh の変更個所 変更なし。 (E). cc_link.sh の変更個所 /dev/cc のシンボリック・リンクを作ると、 /dev/cc -> /devices/iommu@0,10000000/VME@0,7ffffe00/cc@2d,ff00/:cc ~~~ ↑ この部分 となってしまって、/dev/ccを正しくオープンできなかった。 そこで、以下のように変更した。 : if (${CCNAM}=="")then ln -s ${CCDIR}:cc /dev/cc else ln -s ${CCDIR}/${CCNAM}:cc /dev/cc endif : (F). cc_load.sh の変更個所 変更なし。 (G). cc_unload.sh の変更個所 変更なし。 以上.