はじめに
急に思い立って、SDRを触ってみよう!、ということで、手元にあるbaldeRF X40 をWSL2 (ubuntu 24.04)につないでみました。そのメモです。
WSL2でUSBデバイスを扱う一般の設定をpowershell で行いますが、それ以外に、baldeRF X40のFW, FPGAの更新が必要でした。こちらにあるpySDRにある bladeRFの説明をなぞっています。
下記に製品のページがありますが、今は baldeRF 2.0 micro xA4 というのが後継の?製品のようですね。
内容
Windows(ホスト側)の設定
usbipd のインストール
powershwll で usbipd コマンドを利用します。無ければインストールします。
msi をダウンロードしてクリックしてインストールできるようですが、今回はpowershell からインストールしました。
powershell でWSL2でUSBを使えるようにする。
下記のコマンドでインストールできた。
PS> winget search usbipd
'msstore' ソースでは、使用する前に次の契約を表示する必要があります。
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
ソースが正常に機能するには、現在のマシンの 2 文字の地理的リージョンをバックエンド サービスに送信する必要があります (例: "US")。
すべてのソース契約条件に同意しますか?
[Y] はい [N] いいえ: Y
名前 ID バージョン 一致 ソース
--------------------------------------------------------------------------
usbipd-win dorssel.usbipd-win 5.0.0 Moniker: usbipd winget
WSL USB Manager nickbeth.wsl-usb-manager 1.2.1 Tag: usbipd-win winget
PS> > winget install dorssel.usbipd-win
下記にも書かれています。
bladeRFをWSL2に接続する
まず、baldeRFをつなぐ前の状態でpowershell で接続しているUSBデバイスを見てみます。
PS > usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-5 13d3:56b9 USB2.0 HD UVC WebCam Not shared
1-8 8087:0a2b インテル(R) ワイヤレス Bluetooth(R) Not shared
1-9 27c6:5201 Goodix fingerprint Not shared
Persisted:
GUID DEVICE
接続すると、下記のようになりました。
PS > usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-5 13d3:56b9 USB2.0 HD UVC WebCam Not shared
1-8 8087:0a2b インテル(R) ワイヤレス Bluetooth(R) Not shared
1-9 27c6:5201 Goodix fingerprint Not shared
2-5 1d5c:5100 Generic Billboard Device Not shared
4-4 1d50:6066 bladeRF Not shared
Persisted:
GUID DEVICE
これをbind, attach します。管理者権限で行うためにpowershell を管理者還元で立ち上げました。
PS C:\WINDOWS\system32> usbipd bind --busid 4-4
PS C:\WINDOWS\system32> usbipd attach --wsl --busid 4-4
usbipd : usbipd: info: Using WSL distribution 'Ubuntu-24.04' to attach; the device will be available in all WSL 2 distributions.
発生場所 行:1 文字:1
+ usbipd attach --wsl --busid 4-4
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (usbipd: info: U... distributions.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
usbipd: info: Detected networking mode 'nat'.
usbipd: info: Using IP address 172.29.64.1 to reach the host.
WSL2 でUSBデバイスを確認する
$demsg
(略)
[ 288.854459] WSL (2): Creating login session for root
[ 290.670269] vhci_hcd vhci_hcd.0: pdev(0) rhport(0) sockfd(3)
[ 290.670273] vhci_hcd vhci_hcd.0: devid(262148) speed(5) speed_str(super-speed)
[ 290.670318] vhci_hcd vhci_hcd.0: Device attached
[ 291.029088] usb 2-1: SetAddress Request (2) to port 0
[ 291.029104] usb 2-1: new SuperSpeed USB device number 2 using vhci_hcd
[ 291.076737] usb 2-1: LPM exit latency is zeroed, disabling LPM.
[ 291.081904] usb 2-1: New USB device found, idVendor=1d50, idProduct=6066, bcdDevice= 0.00
[ 291.081908] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 291.081909] usb 2-1: Product: bladeRF
[ 291.081911] usb 2-1: Manufacturer: Nuand
[ 291.081912] usb 2-1: SerialNumber: ecac1a2a3f5c88eb0beba9a6b03aefef
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 1d50:6066 OpenMoko, Inc. Nuand BladeRF
ここに書かれているidVender,などを登録しておきます。
root 権限で下記のファイル /etc/udev/rules.d/88-nuand.rules を作成します。
ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="6066", MODE="0666"
そして下記のudev の更新を実行しました。
sudo udevadm control --reload-rules && sudo udevadm trigger
bladeRFのtool をインストール
書いてある通りにします。
$ git clone https://github.com/Nuand/bladeRF.git
注意点としては、bladeRF/host でcmake したときに、いろいろ足りずエラーが出ました。
自分が入れたのは下記のlibusbとcurl でした。
$ sudo apt install libusb-1.0-0-dev
$ sudo apt install libcurl4-openssl-dev
あとは書いてある通りに実行しました。
$ cd host
$ mkdir build && cd build
$ cmake ..
$ make -j8
$ sudo make install
$ sudo ldconfig
$ cd ../libraries/libbladeRF_bindings/python/
$ sudo python3 setup.py install
ツールのインストールされていることを確認します。
$ bladerf-tool version
libbladeRF version: v2.6.0 ("2.6.0-git-bb26efdd")
bladerf-tool version: v1.1.0
firmware, FPGAの更新
動かそうとすると、下記のようにエラーが出ます。
$ bladeRF-cli -i
[WARNING @ host/libraries/libbladeRF/src/backend/usb/libusb.c:529] Found a bladeRF via VID/PID, but could not open it due to insufficient permissions.
No bladeRF device(s) available.
If one is attached, ensure it is not in use by another program
and that the current user has permission to access it.
bladeRF> version
bladeRF-cli version: 1.10.0-git-bb26efdd
libbladeRF version: 2.6.0-git-bb26efdd
Device version information unavailable: No device attached.
直接bladerf-tool で情報を観ようとすると、firmware >= v2.5.0, fpga >= v0.16.0 にせよと言われます。
$ bladerf-tool info
*** Devices found: 1
*** Device 0
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:935] Using legacy message size. Consider upgrading firmware >= v2.5.0 and fpga >= v0.16.0
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:1116] FPGA bitstream file not found.
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:1117] Skipping further initialization...
Board Name bladerf1
Device Speed Super
FPGA Size 40
FPGA Configured False
FPGA Version Not Configured
Flash Size 32 Mbit (assumed)
Firmware Version v1.8.0 ("1.8.0")
RX Channel Count 1
Channel RX1:
[ERROR @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:1775] Board state insufficient for operation (current "Firmware Loaded", requires "Initialized").
Traceback (most recent call last):
File "/usr/local/bin/bladerf-tool", line 33, in <module>
sys.exit(load_entry_point('bladerf==1.4.0', 'console_scripts', 'bladerf-tool')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/dist-packages/bladerf-1.4.0-py3.12.egg/bladerf/_tool.py", line 397, in main
File "/usr/local/lib/python3.12/dist-packages/bladerf-1.4.0-py3.12.egg/bladerf/_tool.py", line 145, in cmd_info
File "/usr/local/lib/python3.12/dist-packages/bladerf-1.4.0-py3.12.egg/bladerf/_tool.py", line 122, in _print_cmd_info
File "/usr/local/lib/python3.12/dist-packages/bladerf-1.4.0-py3.12.egg/bladerf/_tool.py", line 49, in _print_channel_details
File "/usr/local/lib/python3.12/dist-packages/bladerf-1.4.0-py3.12.egg/bladerf/_bladerf.py", line 1136, in gain
File "/usr/local/lib/python3.12/dist-packages/bladerf-1.4.0-py3.12.egg/bladerf/_bladerf.py", line 619, in get_gain
File "/usr/local/lib/python3.12/dist-packages/bladerf-1.4.0-py3.12.egg/bladerf/_bladerf.py", line 403, in _check_error
bladerf._bladerf.NotInitError: Insufficient initialization for the requested operation
$ bladerf-tool probe
Device Information
backend libusb
serial ecac1a2a3f5c88eb0beba9a6b03aefef
usb_bus 2
usb_addr 3
instance 0
なので、ダウンロードして入れました。適当なディレクトリで作業しました。firmwareは下記から。
https://www.nuand.com/fx3_images/
$ wget https://www.nuand.com/fx3/bladeRF_fw_v2.6.0.img
$ bladeRF-cli -f bladeRF_fw_v2.6.0.img
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:935] Using legacy message size. Consider upgrading firmware >= v2.5.0 and fpga >= v0.16.0
Flashing firmware...
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:504] Erasing 3 blocks starting at block 0
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:508] Erasing block 2 (100%)...
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:520] Done erasing 3 blocks
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:731] Writing 484 pages starting at page 0
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:736] Writing page 483 (100%)...
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:747] Done writing 484 pages
[INFO @ host/libraries/libbladeRF/src/driver/spi_flash.c:114] Verifying 484 pages, starting at page 0
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:619] Reading 484 pages starting at page 0
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:623] Reading page 483 (100%)...
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:636] Done reading 484 pages
Successfully wrote firmware to flash!
NOTE: A power cycle is required to load the new firmware.
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:935] Using legacy message size. Consider upgrading firmware >= v2.5.0 and fpga >= v0.16.0
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:1116] FPGA bitstream file not found.
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:1117] Skipping further initialization...
USBケーブルを一度抜き、再度挿しなおします。そうしないと、接続しているFWは古いままのようです。
再度、管理者権限でpower shell から usbipd bind, usbipd attach を実行します。そして、FPGAも差し替えます。
https://www.nuand.com/fpga_images/
$ wget https://www.nuand.com/fpga/hostedx40-latest.rbf
$ bladeRF-cli -l hostedx40-latest.rbf
Loading FPGA...
[WARNING @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:1730] RX DC calibration table not found. Manual gain control will be used instead.
[INFO @ host/libraries/libbladeRF/src/board/bladerf1/bladerf1.c:1731] To enable AGC, see "Generating a DC offset table" at https://github.com/Nuand/bladeRF/wiki/DC-offset-and-IQ-Imbalance-Correction
Successfully loaded FPGA bitstream!
それでも下記のエラーが出ていて、良く分かりません。
$ bladerf-tool info
*** Devices found: 1
*** Device 0
Board Name bladerf1
Device Speed Super
FPGA Size 40
FPGA Configured True
FPGA Version v0.16.0 ("0.16.0")
Flash Size 32 Mbit
Firmware Version v2.6.0 ("2.6.0-git-09c82087")
RX Channel Count 1
Channel RX1:
Gain 33
Gain Mode Manual
[ERROR @ host/libraries/libbladeRF/src/board/bladerf2/bladerf2.c:3120] bladerf_get_rfic_rssi: Board type "bladerf1" not supported
Symbol RSSI None
Frequency 2484000000
Bandwidth 28000000
Sample Rate 1000000
TX Channel Count 1
Channel TX1:
Gain 38
Frequency 2446999999
Bandwidth 28000000
Sample Rate 1000000
書きコマンドで何か保存はされていました。良いのかな。。。
$ bladerf-tool rx --num-samples 1000000 /tmp/samples.sc16 100e6 10e6
[INFO @ fpga_common/src/lms.c:2258] Clamping frequency to 237500000Hz
$ ls -lth /tmp/samples.sc16
-rw-r--r-- 1 x77 x77 3.9M May 24 22:25 /tmp/samples.sc16
まとめ
とりあえず、自分のノートPC(windows)でlinux 環境で bladeRF X40をつないでIFのデータを取れるようになったみたい。中身はこれから確認します。
参考情報
- NuandのBaldeRFのコードと情報
https://github.com/Nuand/bladeRF.git - こちらでGNSSで動かしているようです。https://s-taka.org/pocketsdr-ap-with-bladerf/
- メモ https://github.com/Nuand/bladeRF/wiki/bladeRF-CLI-Tips-and-Tricks
一日で動くようになって良かった。日頃の行いが良いのかな。。。(2025/5/24)