USRP B200がUSB 3.0で接続されているか、2.0で接続されているか判別する。

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

先日のブログ「鼓膜を動かせますか?」で動かせる人がいたらアンケートに書いて欲しいと、呼びかけたところ、なんと鼓膜を動かせる人がいました!

いや~仲間がいてうれしいです!

その方は、ずっと、病気・ケガ類と思っていたとのこと。確かにそう思えますよね。不便はないので病気だと思っていても、病院に行くほどでも無いんですよね。

アンケートありがとうございました!



さて本題ですが、今日はプログラミングテクニックです。

USRP B200シリーズ(NI USRP-2900)は、USB接続のソフトウェア無線機です。

B200シリーズは色々とじゃじゃ馬で使用者を悩ませることが多いソフトウェア無線機ですが、使用者が「USB 2.0ポートに接続してしまい、送受信レートが出ない」という失敗をやらかす事があります。

今回は、B200がUSB 3.0 B200がUSB 3.0で接続されているか、2.0で接続されているか判別していみます。


UHDの場合

USRPをUHD(オープンソースのコード)で使用する場合は、以下のコードで判別可能です。

プログラムの起動時にUSB 2.0で接続されていたら警告を出せば接続ミスを事前に防ぐことが出来ますね。

USRPのデバイス情報のリンクレートから判別することが出来ます。

uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);

string devicename = usrp->get_device()->get_tree()->access("/mboards/0/name").get();
double maxrate = usrp->get_device()->get_tree()->access("/mboards/0/link_max_rate").get();
if((devicename == "B200" or devicename == "B200mini") and maxrate < 500000000)
{

}

Linuxでの場合

Linuxでの場合はC++のコードを書かなくてもlsusbコマンドで判別可能です。

lsusbは、接続されているUSBデバイスをリストアップするコマンドです。


B200を接続してコマンドを実行すると、以下の様にデバイス名が空白のデバイスがリストされます。これがB200です。

$ lsusb
Bus 002 Device 002: ID 2500:0020
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

B200が見つかったら、次にB200製造元ettus のvendor IDとProduct IDを入れてコマンドを実行します。

(接続されているB200が1台ならProduct IDは無くても大丈夫)

$ lsusb -v -d 2500:0020
$ lsusb -v -d 2500:

ずらずら表示されますが、bcdUSBの行に接続バージョンが表示されます。

$ lsusb -v -d 2500:0020|grep bcdUSB
  bcdUSB               3.00
		
$ lsusb -v -d 2500:0020|grep bcdUSB
  bcdUSB               2.00

ちなみにB200は、PCに接続したときはUSB 2.0で接続されています。

その後、何らかのコマンドを実行してB200にアクセスするとB200にFPGAイメージがロードされ、USB 3.0接続で動き出します。


Windowsの場合

Windowsの場合は、Microsoftが提供しているUSB Device Viewer(usbview.exe)で見る事が出来ます。
ソースコードは以下のgithubにありますが、ビルドが大変なのでFTDIのサイトからダウンロードするのが無難です。


Utilities
https://ftdichip.com/utilities/#MicrosoftUSBView


microsoft/Windows-driver-samples
https://github.com/Microsoft/Windows-driver-samples/tree/master/usb/usbview


下図のように、PCに接続直後のB200を見ると、USB 1.1, 2.0で接続されている事が分かります。


ここでuhd_find_deviceを動かすと、B200にFPGAがロードされ動作を開始します。


USB 3.0で接続されている事が分かります。


LabVIEWの場合

usbview.exeで表示される情報は、USB Device descriptorです。

これをLabVIEWで直接見る方法はないので、libusbやLibUSB.net等の外部ライブラリを経由する必要があります。

アクセスする方法は今後試してみたいと思います。


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

コメント