独自SDR用のSoapySDRドライバ作成
環境
- 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の戻り値をここでは一旦削除します。
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オプションでライブラリの場所を指定します。
/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 DriverGuideやSoapyHackRFのコードが参考になります。
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