🦁

独自SDR用のSoapySDRドライバ作成

2021/11/22に公開

環境

  • PC: Ubuntu 18.04
  • HackRF One (SDR)

目的

Open SourceのSDRインターフェースライブラリであるSoapySDRを使用すれば、GNU RadioなどのアプリケーションでSDRを使用できるようになります。
本記事では独自SDR用のSoapySDRドライバの作成方法について説明します。

SoapySDRのインストール

まずはSoapySDRをインストールします。

$ git clone https://github.com/pothosware/SoapySDR.git
$ cd SoapySDR
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ sudo make install
$ sudo ldconfig
$ SoapySDRUtil --info

HackRFドライバ(参考用)

いきなり自作ドライバを作成するのはハードルが高いため、まずは参考となるGREAT SCOTT GADGETS社のSDRであるHackRFのドライバの動作を確認してみます。

HackRFのHost用ライブラリをインストール

HackRFのHost用ライブラリをインストールします。本ライブラリを使用すればSoapySDRを使用しなくてもHackRFと接続ができます。

$ sudo apt-get install build-essential cmake libusb-1.0-0-dev pkg-config libfftw3-dev
$ git clone https://github.com/greatscottgadgets/hackrf
$ cd hackrf/host
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig

HackRFをUSBで接続してから、下記のコマンドで動作確認ができます。

$ hackrf_info
hackrf_info version: git-26c0f70
libhackrf version: git-26c0f70 (0.6)
Found HackRF
Index: 0
Serial number: 000000000000000006d065dc2aa875df
Board ID Number: 2 (HackRF One)
Firmware Version: 2018.01.1 (API:1.02)
Part ID Number: 0xa000cb3c 0x007d435d

HackRFのSoapySDR用ライブラリ(SoapyHackRF)をインストール

SoapyHackRFはSoapySDRのAPIでHackRFを動作させるためのライブラリです。SoapySDRとHackRFライブラリがインストールされている状態で下記を実行すると、 /usr/local/lib/SoapySDR/modules0.8にlibHackRFSupport.soが追加されます。

$ git clone https://github.com/pothosware/SoapyHackRF.git
$ cd SoapyHackRF
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

HackRFをUSBで接続してから、下記のコマンドで動作確認ができます。

$ SoapySDRUtil --probe="driver=hackrf"
######################################################
##     Soapy SDR -- the SDR abstraction library     ##
######################################################

Probe device driver=hackrf
[INFO] Opening HackRF One #0 6d065dc2aa875df...

----------------------------------------------------
-- Device identification
----------------------------------------------------
  driver=HackRF
  hardware=HackRF One
  clock source=external
  part id=a000cb3c007d435d
  serial=000000000000000006d065dc2aa875df
  version=2018.01.1

----------------------------------------------------
-- Peripheral summary
----------------------------------------------------
  Channels: 1 Rx, 1 Tx
  Timestamps: NO
  Other Settings:
     * Antenna Bias - Antenna port power control.
       [key=bias_tx, default=false, type=bool]

----------------------------------------------------
-- RX Channel 0
----------------------------------------------------
  Full-duplex: NO
  Supports AGC: NO
  Stream formats: CS8, CS16, CF32, CF64
  Native format: CS8 [full-scale=128]
  Stream args:
     * Buffer Count - Number of buffers per read.
       [key=buffers, units=buffers, default=15, type=int]
  Antennas: TX/RX
  Full gain range: [0, 116] dB
    LNA gain range: [0, 40, 8] dB
    AMP gain range: [0, 14, 14] dB
    VGA gain range: [0, 62, 2] dB
  Full freq range: [0, 7250] MHz
    RF freq range: [0, 7250] MHz
  Sample rates: 1, 2, 3, 4, 5, ..., 16, 17, 18, 19, 20 MSps
  Filter bandwidths: 1.75, 2.5, 3.5, 5, 5.5, ..., 14, 15, 20, 24, 28 MHz

----------------------------------------------------
-- TX Channel 0
----------------------------------------------------
  Full-duplex: NO
  Supports AGC: NO
  Stream formats: CS8, CS16, CF32, CF64
  Native format: CS8 [full-scale=128]
  Stream args:
     * Buffer Count - Number of buffers per read.
       [key=buffers, units=buffers, default=15, type=int]
  Antennas: TX/RX
  Full gain range: [0, 61] dB
    VGA gain range: [0, 47, 1] dB
    AMP gain range: [0, 14, 14] dB
  Full freq range: [0, 7250] MHz
    RF freq range: [0, 7250] MHz
  Sample rates: 1, 2, 3, 4, 5, ..., 16, 17, 18, 19, 20 MSps
  Filter bandwidths: 1.75, 2.5, 3.5, 5, 5.5, ..., 14, 15, 20, 24, 28 MHz

自作ドライバ

Example Driverの実行

大枠の流れがわかったところで、SoapySDRが提供しているExample Driverを使用して、自作ドライバを作成してみます。

$ git clone https://github.com/pothosware/SoapySDR.git
$ cd SoapySDR/ExampleDriver
$ nano makeMyDevice.cpp

このままコンパイルするとエラーとなるので、MyDeviceSupport.cppのmakeMyDeviceの戻り値をここでは一旦削除します。

MyDeviceSupport.cpp
SoapySDR::Device *makeMyDevice(const SoapySDR::Kwargs &args)
{
    //create an instance of the device object given the args
    //here we will translate args into something used in the constructor
    return new MyDevice();
}
$ mkdir build
$ cd build
$ cmake ..
$ nano CMakeFiles/MyDevice.dir/link.txt

リンクでLibSoapySDR.soが見つからないというエラーが出るので、link.txtを修正して-Lオプションでライブラリの場所を指定します。

link.txt
/usr/bin/c++.exe -O3 -DNDEBUG -shared -Wl,--enable-auto-import -o cygMyDevice.dll -Wl,--major-image-version,0,--minor-image-version,0 CMakeFiles/MyDevice.dir/MyDeviceSupport.cpp.o  -L/usr/local/lib -lSoapySDR -Wl,--no-undefined -pthread 
$ make
$ sudo make install

/usr/local/lib/SoapySDR/modules0.8にlibMyDevice.soが追加されて、SoapySDRからmy_deviceが使用できるようになります。

$ SoapySDRUtil --info
######################################################
##     Soapy SDR -- the SDR abstraction library     ##
######################################################

Lib Version: v0.8.1-g722207a2
API Version: v0.8.0
ABI Version: v0.8
Install root: /usr/local
Search path:  /usr/local/lib/SoapySDR/modules0.8
Module found: /usr/local/lib/SoapySDR/modules0.8/libHackRFSupport.so (0.3.3-8d2e7be)
Module found: /usr/local/lib/SoapySDR/modules0.8/libMyDevice.so
Available factories... hackrf, my_device
...

独自SDR用にAPIを修正

SoapySDR::Deviceクラスに記載されているAPIのうち、独自SDRで必要なものをオーバーロードして実装します。
SoapySDR DriverGuideSoapyHackRFのコードが参考になります。

API一覧

API 概要 関数(一部)
Registration デバイスの登録 registerMyDevice
- Discoverying Device デバイスの発見 findMyDevice
- Instantiating Device デバイスの作成 makeMyDevice
Identification ドライバ、デバイスID取得 getDriverKey, getHardwareKey
Channels チャネル、Duplex getNumChannels, getFullDuplex
Stream データ読み書き readStream, writeStream
Direct Buffer Access DMAによるデータ読み書き acquireReadBuffer, acquireWriteBuffer
Antenna アンテナ getAntenna
Frontend Corrections 補正処理(DC Offset, IQ Imbalance等) hasDCOffsetMode
Gain ゲイン getGain
Frequency 周波数 getFrequency
Sample Rate サンプリングレート getSampleRate
Bandwidth 帯域(フィルタ) getBandwidth
Clocking クロック getMasterClockRate
Time 時刻同期 getTimeSource
Sensor ステータスモニタ(RSSI等)の読み出し readSensor

おまけ(Cygwin環境)

Windows+Cygwinの環境でも試しましたが、デフォルトで作成されるライブラリ名がUbuntuとは異なるため、動作しませんでした。下記のようにライブラリ名をUbuntuでのライブラリと同じ名前に変更すると動作しました。

  • /usr/local/lib/libSoapySDR.dll.a --> libSoapySDR.so
  • /usr/local/lib/SoapySDR/modules0.8/cygHackRFSupport.dll --> libHackRFSupport.so

Discussion