KiNOKO-DAQ 関連情報 掲示板

このスレッドに記事を投稿する
前のスレッド | 次のスレッド | 掲示版ホーム

Bit3
2005 年 12 月 31 日 12 時 33 分
投稿者: 塚田 暁

さんしろう様

東北大学の塚田といいます。
Bit3でVMEを読もうと思って、こちらのvmedrvを利用させてもらおうかと思っています。617を差して、データを取ることはできるようになりました(linux2.2.xxです。)。そこで、お聞きしたいことがあるのですが、二つのBit3を一台のPCで読むことは可能でしょうか。
お忙しい時期とは思いますが、よろしくお願いします。



2006 年 1 月 5 日 1 時 59 分
投稿者: 榎本 三四郎

塚田 様

遅くなってすいません。
現在の vmedrv では、一台の PC で複数の VME を扱うことはできません。これは、私が VME を1セットしか持っておらず、開発やテストができないためです。ドライバ自体の変更はそれほど多くはないのですが...

数ヵ月中に、数台の VME が手に入る予定ですので、そのときにこの機能を実装したいと思います。お役に立てず、申し訳ありません。



2006 年 1 月 5 日 18 時 13 分
投稿者: 塚田

やはりそうですか。
ありがとうございました。


2台の制御
2006 年 1 月 15 日 22 時 28 分
投稿者: 葛西 和夫

こちらではvmedrvで2台制御しています。
まだ、あまりデバッグしていないため、信頼性は低いのですが、いまの所、問題はありません。方法は、vmedrvを登録名とdevファイル名をvmedrvaとvmedrvbのふたつにして動かしているだけです。つまり、モジュールを2個登録します。ioctlのマジックナンバーも適当に変更しました。


PCI カードの区別
2006 年 1 月 15 日 22 時 39 分
投稿者: 榎本三四郎

ドライバを2つ別の名前で登録するのはいいとして、
それぞれに違う PCI カードを検出させなければなりませんよね?

vmedrvb の detect_pci_devide() の中身に

===================================
    dev = NULL;
    dev = pci_find_device(vendor, device, dev);

    if (dev == NULL) {
        return -ENODEV;
    }

+    /* 2枚目を検出させるため以下の 5 行を追加 */
+    dev = pci_find_device(vendor, device, dev);
+
+    if (dev == NULL) {
+        return -ENODEV;
+    }

    for (base_index = 0; base_index < 4; base_index++) {
====================================

みたいなことをしなければならない(実際には n 枚目として
ループにする?)と思うのですが、このあたりはどのようにしたのでしょうか?


2006 年 1 月 15 日 23 時 20 分
投稿者: 葛西 和夫

すいません。忘れていました。
dev = pci_find_device(vendor, device, dev);
を2回続けます。



2006 年 1 月 15 日 23 時 24 分
投稿者: 葛西 和夫

tar.gzファイルを送ります。

添付ファイル: vmedrvb.tar.gz (13.7 kb)



2006 年 2 月 15 日 14 時 45 分
投稿者: 塚田 暁

葛西樣、三四郎樣

貴重な情報をありがとうございます。
今、redhat9.0(2.4.20-8)でテストをしているのですが、同じようにできるものでしょうか?
Bit3は616と620-3です。
とりあえず二台差して、ドライバの名前を変えてインストールしてみました。
一つめは成功して、616を認識しました。IRQとioportの値も正しく対応しています。
--- dmesg ---
vmedrv: SBS(Bit3) Model 616 VME-PCI Bus Adapter is detected at ioport 0xc800 on irq 9.
I/O Mapped Node at 0xc800.
Memory Mapped Node at 0xea010000.
Mapping Register at 0xea020000.
Remote Memory at 0xe8000000.
Adapter ID (I/O): 0x80
Adapter ID (mem): 0x80
vmedrv: successfully installed at 0xc800 on irq 9 (major = 254).
------------

ですが、二つめをインストールしようとすると、
"vmedrvb.o: init_module: No such device
Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters."

とでてきてしまいます。
dmesgを見ると
--- dmesg ---
vmedrvb: unable to find VME-PCI Bus Adapter.
-------------
スロットを変えて試してもみたのですが、同じでした。
ちなみに616を抜いて、620-3単体ならきちんとインストールできます。
お忙しいとは思いますが、何かアドバイスなどありましたらお願いします。



2006 年 2 月 16 日 20 時 31 分
投稿者: 榎本 三四郎


616 と 620 ではデバイスIDが異なるので、pci_find_device() に別のデバイスとして
指定しなければならず、上記の変更はそのままでは動作しません。

vmedrva で 616 を、vmedrvb で 620 を使うには、一番簡単には
init_module() 関数中で detect_pci_device() を呼んでいる部分を
以下のように変更することでしょう。

==== オリジナル ====
    for (index = 0; index < number_of_devices; index++) {
	vender_id = vmedrv_device_id_table[index].vender_id;
	device_id = vmedrv_device_id_table[index].device_id;	  
	model_name = vmedrv_device_id_table[index].model_name;

	result = detect_pci_device(vender_id, device_id, &pci_config);
	if (result == 0) {
	    break;
	}
    }

===== vmedrva (616) =====
    index = 0;
    vender_id = vmedrv_device_id_table[index].vender_id;
    device_id = vmedrv_device_id_table[index].device_id;	  
    model_name = vmedrv_device_id_table[index].model_name;

    result = detect_pci_device(vender_id, device_id, &pci_config);

===== vmedrvb (620) =====
    index = 2;
    vender_id = vmedrv_device_id_table[index].vender_id;
    device_id = vmedrv_device_id_table[index].device_id;	  
    model_name = vmedrv_device_id_table[index].model_name;

    result = detect_pci_device(vender_id, device_id, &pci_config);


なお、detect_pci_device() 関数中で find_pci_device()
を2回呼ぶようにしたところは、元に戻す必要があります。


2006 年 2 月 17 日 19 時 39 分
投稿者: 塚田

無事ふたつとも動作させることができました。
すばやいお返事ありがとうございます。


このスレッドに記事を投稿する