WSL2 (ubuntu 24.04)でbladeRF X40を使う

# はじめに

急に思い立って、SDRを触ってみよう！、ということで、手元にあるbaldeRF X40 をWSL2 (ubuntu 24.04)につないでみました。そのメモです。

WSL2でUSBデバイスを扱う一般の設定をpowershell で行いますが、それ以外に、baldeRF X40のFW, FPGAの更新が必要でした。こちらにあるpySDRにある bladeRFの説明をなぞっています。

https://pysdr.org/content/bladerf.html

下記に製品のページがありますが、今は baldeRF 2.0 micro xA4　というのが後継の？製品のようですね。

https://www.nuand.com/product/bladerf-x40/

# 内容

## 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
```

下記にも書かれています。

https://github.com/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)