2024年4月7日日曜日

 




 


環境

  • 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チャネル、DuplexgetNumChannels, getFullDuplex
Streamデータ読み書きreadStream, writeStream
Direct Buffer AccessDMAによるデータ読み書き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

0 件のコメント:

コメントを投稿