Nov 18, 2002
onlsbc1: CAMACコントローラのデバッグ用ツールの整備
--- デバッグ用ツール #1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(http://www-online.kek.jp/~inoue/para-CAMAC/
Work/CAMAC-debug.html)
高エネルギー加速器研究機構
素粒子原子核研究所
物理、オンライングループ
井上 栄二
目的
CAMACコントローラのデバッグツールを整備する。
(1). 構成
(2). 構築
(3). 実行
--------------------------------------------------------------------
(1). 構成
(1-1). 書き込みテスト用
キーボードから入力するパラメータ:
PCIアドレス: Hexの数値を入力
ライトデータ: Hexの数値を入力
(1-2). 読み出しテスト用
キーボードから入力するパラメータ:
PCIアドレス: Hexの数値を入力
(1-3). プラグアンドプレイの自動設定アドレスのチェック
[inoue@onlpara inoue]$ cat /proc/pci
PCI devices found:
Bus 0, device 0, function 0:
Host bridge: Intel Corp. 82845 845 (Brookdale) Chipset Host Bridge (rev 17).
Prefetchable 32 bit memory at 0xf8000000 [0xfbffffff].
Bus 0, device 1, function 0:
PCI bridge: Intel Corp. 82845 845 (Brookdale) Chipset AGP Bridge (rev 17).
Master Capable. Latency=64. Min Gnt=10.
Bus 0, device 29, function 0:
USB Controller: PCI device 8086:24c2 (Intel Corp.) (rev 1).
IRQ 11.
I/O at 0xe800 [0xe81f].
Bus 0, device 29, function 1:
USB Controller: PCI device 8086:24c4 (Intel Corp.) (rev 1).
IRQ 5.
I/O at 0xe880 [0xe89f].
Bus 0, device 29, function 2:
USB Controller: PCI device 8086:24c7 (Intel Corp.) (rev 1).
IRQ 9.
I/O at 0xec00 [0xec1f].
Bus 0, device 29, function 7:
USB Controller: PCI device 8086:24cd (Intel Corp.) (rev 1).
IRQ 10.
Non-prefetchable 32 bit memory at 0xfebffc00 [0xfebfffff].
Bus 0, device 30, function 0:
PCI bridge: Intel Corp. 82820 820 (Camino 2) Chipset PCI (rev 129).
Master Capable. No bursts. Min Gnt=6.
Bus 0, device 31, function 0:
ISA bridge: PCI device 8086:24c0 (Intel Corp.) (rev 1).
Bus 0, device 31, function 1:
IDE interface: PCI device 8086:24cb (Intel Corp.) (rev 1).
IRQ 9.
I/O at 0x0 [0x7].
I/O at 0x0 [0x3].
I/O at 0x0 [0x7].
I/O at 0x0 [0x3].
I/O at 0xffa0 [0xffaf].
Non-prefetchable 32 bit memory at 0x20000000 [0x200003ff].
Bus 0, device 31, function 3:
SMBus: PCI device 8086:24c3 (Intel Corp.) (rev 1).
IRQ 3.
I/O at 0xe000 [0xe01f].
Bus 0, device 31, function 5:
Multimedia audio controller: PCI device 8086:24c5 (Intel Corp.) (rev 1).
IRQ 3.
I/O at 0xe400 [0xe4ff].
I/O at 0xe080 [0xe0bf].
Non-prefetchable 32 bit memory at 0xfebff800 [0xfebff9ff].
Non-prefetchable 32 bit memory at 0xfebff400 [0xfebff4ff].
Bus 1, device 0, function 0:
VGA compatible controller: PCI device 10de:0253 (nVidia Corporation) (rev 16
3).
IRQ 11.
Master Capable. Latency=64. Min Gnt=5.Max Lat=1.
Non-prefetchable 32 bit memory at 0xfd000000 [0xfdffffff].
Prefetchable 32 bit memory at 0xe8000000 [0xefffffff].
Prefetchable 32 bit memory at 0xf4280000 [0xf42fffff].
Bus 2, device 2, function 0:
Ethernet controller: Intel Corp. 82557 [Ethernet Pro 100] (rev 8).
IRQ 9.
Master Capable. Latency=64. Min Gnt=8.Max Lat=56.
Non-prefetchable 32 bit memory at 0xfeaff000 [0xfeafffff].
I/O at 0xdc00 [0xdc3f].
Non-prefetchable 32 bit memory at 0xfe900000 [0xfe9fffff].
[inoue@onlpara inoue]$
(2). 構築
(2-1). I/Oポートアクセスのテスト
#include <stdio.h>
#include <sys/io.h>
/* #include <asm/io.h> */
main() {
unsigned char value8;
unsigned short value16;
unsigned int value32;
unsigned long valuelong;
/*
printf("size of char = %d, size of short = %d, size of int = %d, size of
long = %d\n", sizeof(char), sizeof(short), sizeof(int), sizeof(long));
*/
if( iopl(3) ){
printf("can not change the privilege level\n");
exit(0);
}
/* a = inb(0x70); */
/* a = (unsigned long) inb(0xe400); */
value8 = inb(0xe400);
value16 = inw(0xe400);
value32 = inl(0xe400);
printf("inb(0xe400) = %x, inw(0xe400) = %x, inl(0xe400) = %x\n", value
8, value16, value32);
/* outb(0x70,a); */
}
[inoue@onlpara CAMACDebug]$
[inoue@onlpara CAMACDebug]$ gcc -O -o t4 t4.c
[inoue@onlpara CAMACDebug]$
[root@onlpara CAMACDebug]# ./t4
inb(0xe400) = 90, inw(0xe400) = 90, inl(0xe400) = 90
[root@onlpara CAMACDebug]#
(2-2). I/Oポートアクセスのテスト(その2)
[inoue@onlpara CAMACDebug]$ pwd
/home/inoue/CAMACDebug
[inoue@onlpara CAMACDebug]$ cat t15.c
#include
#include
/* #include */
main(argc, argv)
int argc;
char *argv[];
{
unsigned int addr;
int rwf, qf;
unsigned int value32;
int loop;
loop = (argc > 1) ? atoi(argv[1]): 20;
if( iopl(3) ){
printf("can not change the privilege level\n");
exit(0);
}
while (loop-- > 0) {
rwf = 0;
rewind(stdin);
printf("Read(: enter '1') or Write(: enter '2') ?");
scanf("%d", &rwf);
switch ( rwf ){
case 1:
printf("Read: Address(hex)= ");
scanf("%x", &addr);
value32 = inl(addr);
printf("inl(0x%x) = %x\n", addr, value32);
break;
case 2:
printf("Write: Date(hex)= ");
scanf("%x", &value32);
printf("Write: Address(hex)= ");
scanf("%x", &addr);
/* outl(value32, addr); */
/* printf("Confirm: Address(hex)= %x, Data(hex)= %x\n", addr, va
lue32); */
printf("outl(0x%x, 0x%x)\n", addr, value32);
break;
default:
printf("Wrong Mode\n");
break;
}
printf("\n");
}
}
[inoue@onlpara CAMACDebug]$
[inoue@onlpara CAMACDebug]$ gcc -O -o t15 t15.c
[inoue@onlpara CAMACDebug]$
(3). 実行
[root@onlpara CAMACDebug]# ./t15
Read(: enter '1') or Write(: enter '2') ?1
Read: Address(hex)= e400
inl(0xe400) = 90
Read(: enter '1') or Write(: enter '2') ?1
Read: Address(hex)= febff800
inl(0xfebff800) = ffffffff
Read(: enter '1') or Write(: enter '2') ?2
Write: Date(hex)= abcd5678
Write: Address(hex)= 987def34
outl(0x987def34, 0xabcd5678)
Read(: enter '1') or Write(: enter '2') ?
[root@onlpara CAMACDebug]#
---xxxx