LibUsbDotNetを使ってUSRP B200の接続情報を取得する

こんにちはドルフィンシステム福島です。

USB接続型のUSRPであるB200は、USB 2.0でも3.0でも接続が可能です。転送レートで劣るUSB 2.0ポートに接続してしまうと、IQデータのデータ落ちが発生する場合があります。

これを事前に防ぐためにはプログラムでUSB 2.0接続時に警告を表示する等の方法があります。

前回、Linux上でプログラム的にUSRP B200がUSB 3.0で接続されているか、2.0で接続されているのか判別する方法を紹介しました

今回は、Windows上のC#とLabVIEWでUSB デバイスディスクリプタを取得し、USB 2.0か3.0で接続されているかを判別する方法を紹介します。

ここで紹介するソースコードなどはgithubで公開しています。


mikiofuku / get_usrpb200_usb_connected_speed
https://github.com/mikiofuku/get_usrpb200_usb_connected_speed


USRP B200をWindowsで認識させる

WindowsでUSRP B200をPCに接続しても、自動的にドライバはインストールされません。
念のためWindowsでUSRP B200を認識させる方法も紹介しておきます。

以下のページの"Post-Install Tasks"のURLからWindows UHD USB Drivers(erllc_uhd_winusb_driver.zip)をダウンロードし、展開します。

https://files.ettus.com/manual/page_install.html


USRP B200をPCに接続します。するとデバイスマネージャで"WestBridge"というデバイスとして認識されます。


"WestBridge"を右クリック→"ドライバーの更新"→コンピュータを参照してドライバーを検索→参照ボタン→zipを展開したフォルダを選択→OKボタン→次へボタン


下図のように更新されます。


無事認識しました。



コンパイル済LibUsbDotNetをダウンロードする

USRP B200のUSB接続制御は、libusbというドライバで行っています。このlibusbからをC#で制御するライブラリがLibUsbDotNetです。

今回はLibUsbDotNetを通じてB200の情報を取得したいと思います。

LibUsbDotNetはgithub上にソースコードが公開されていますが、コンパイル済バイナリは以下のURLからダウンロード可能です。LibUsbDotNet_Bin.2.2.8.zipをダウンロードしてください。

https://sourceforge.net/projects/libusbdotnet/files/LibUsbDotNet/LibUsbDotNet%20v2.2.8/

ちなみにLibUsbDotNetトップページの"Download"ボタンからダウンロードするとLibUsbDotNetインストーラーがダウンロードされてきますので注意が必要です。


B200を認識していることを確認する

LibUsbDotNet_Bin.2.2.8.zipを適当な場所に展開すると、BenchmarkCon.exeが入っています。
B200を接続した状態でコマンドプロンプトを開き、下図のようにBenchmarkConコマンドを実行します。


B200がリストアップされることを確認します。


C#でプログラム的に認識してみる

C#プロジェクト一式はリポジトリに入っています。

次にC#でプログラム的に認識させてみます。

C#のコンソールプロジェクトを新規作成し、プロジェクトエクスプローラーの参照で"LibUsbDotNet.dll"を選択します。(このファイルは展開したzipファイルに含まれています。)

そして以下のコードを実行し、USB DescriptorからbcdUSBを取得し接続プロトコルを判別します。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LibUsbDotNet;
using LibUsbDotNet.WinUsb;

namespace fs_dotnet
{
	class Program
	{
		static void Main(string[] args)
		{
			// 認識している全デバイスから指定したVendorId, ProductIdで抽出する。
			var dev = UsbDevice.AllDevices.Where(d => 
			{
				return d.Vid == 0x2500 && d.Pid == 0x21;
			});

			foreach(WinUsbRegistry d in dev)
			{
				var wd = (WinUsbDevice)d.Device;
				Console.WriteLine(wd.Info.Descriptor);
				Console.WriteLine("{0:x}", wd.Info.Descriptor.BcdUsb);
			}
		}
	}
}


B200接続して直ぐの状態(USB 2.0接続)


B200の動作が開始してからの状態(USB 3.0接続)


LabVIEWで実装する

C#でUSB Descriptorの取得方法が分かったので、それをLabVIEWから使えるように実装します。

このLabVIEW VIはリポジトリに入っています。


直接ダウンロードするには、以下の2つのページの"Download"ボタンを押してダウンロードしてください。

https://github.com/mikiofuku/get_usrpb200_usb_connected_speed/blob/master/fs-LabVIEW/Get%20bcd%20usb.vi

https://github.com/mikiofuku/get_usrpb200_usb_connected_speed/blob/master/fs-LabVIEW/LibUsbDotNet.dll


実行すればUSB DescriptorからB200の接続速度を取得することが出来ます。



以上、ドルフィンシステム福島でした。


コメント