OSQZSS

オープンソース準天頂衛星(QZSS)受信機

Petalinuxでiiostream

2023-01-15 15:57:55 | SDR
Petalinuxのmeta-adiレイヤで追加しているlibiioを使って、
AD9361を操作するアプリケーションを作成してみます。

サンプルとして、ADIが公開しているAD9361 IIO streaming exampleを使います。

https://github.com/analogdevicesinc/libiio/blob/master/examples/ad9361-iiostream.c

ライブラリを使うアプリケーションのビルドの手順は、こちらを参考にしました。

PetaLinux Yocto Tips: Creating Apps (which uses libraries) in PetaLinux Project

まずは、いつも通りにpetalinux-createでアプリケーションのプロジェクトを生成します。

次に、すでにビルドされているlibiioのフォルダから、libiio.soとlibiio.hをプロジェクトのfilesにコピーします。





さらに、Makefileを編集して、リンカがlibiioを探せるようにします。
-liioのオプションだけではリンカがlibiioを見つけられず、-Lでフォルダを指定してもダメでした。
DEPENDSにlibiioを追加する必要があります。

【訂正】DEPENDSのラインはMakefileではなく、.bbファイルに追加します。(2023/09/13)





これで準備完了です。petalinux-buildでアプリケーションをビルドします。



ビルドされたアプリケーションをSDカードのrootfsパーティションの/usr/bin/にコピーします。



SDカードをZedBoardのスロットに差し込み、Petalinuxを起動。
AD9361によるstreamingが確認できました。



これで一通りの開発フローが分かったので、測位信号の送受信機能を組み込んでいきます。
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

UART user space example

2023-01-15 11:46:59 | SDR
PetalinuxでAXI UART Liteが正常に動作するようになったので、
user spaceのアプリケーションを作成し、動かしてみます。

今回試すアプリは、こちらのUART Demo。
入力されたキャラクタをエコーバックするだけのサンプルです。

https://github.com/Digilent/linux-userspace-examples

まずは、petalinux-createでアプリケーションのプロジェクトを作成します。



次に、project-spec/meta-user/recipes-apps/<app_name>/に自動生成された.bbファイルに
ソースファイルを追加します。



さらに、<app_name>/files/MakefileのAPP_OBJSに、オブジェクトファイルを追加します。



これで準備が整いましたので、アプリケーションをビルドします。



ビルドされたアプリケーションをSDカードのrootfsパーティションの/usr/bin/にコピーします。



SDカードをZedBoardのスロットに差し込み、Petalinuxを起動。
UART Demoの実行が確認できました。





さて、次はLibiioを使って、AD9361を動かしてみよう。
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

SpiderSDR

2023-01-15 09:30:35 | ソフトウェア受信機
SpiderSDRの部品実装が完了。良い感じに仕上がりました。



PocketSDRを参考に、ソフトウェアを開発していこう。
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AXI UART Liteのinterrupt ID(2)

2023-01-14 10:47:14 | SDR
Petalinuxが自動生成するdevice treeで誤ってアサインされてしまうinterrupt IDをオーバーライトするために、
system-user.dtsiでAXI UART Liteに接続したinterrupt sourceのIDを直接指定してみます。



その後、device treeをリビルド。



image/linux/system.dtbをdecompileして、中身をチェックしてみると、interruptsのパラメータが
system-user.dtsiで指定した値にオーバーライトされています。



Petalinuxを起動し、ttyUL1の出力を受信してみます。





正しいinterrupt IDのおかげで、スムーズに通信ができています。
誤ったinterrupt IDがアサインされてしまう原因は不明なままですが、とりあえず良しとしましょう。
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Interrupt IDとConcat

2023-01-13 22:22:12 | SDR
fmcomms2_zedに追加したAXI UART Liteのinterrupt IDが、Petalinuxのdevice treeでは
Block Designと異なるinterrupt sourceに接続されてしまいます。

AXI UART Liteのinterrupt ID

何が原因などだろうと気になったので、シンプルなZynqとAXI UART LiteだけのDiagramに
Concatを追加して、fmcomms2_zedのHDLを模擬してみました。

PetalinuxでAXI UART Liteを使う



新しいxsaファイルでPetalinuxをリビルドして、device treeを確認してみると、
Block Design通りにbit 10のinterrupt sourceに対応するIDである86-32=54になっていました。



どうやら、Petalinuxのバグというわけではないようです。
fmcomms2_zedで指定するkernel dtbであるzynq-zed-adv7511-ad9361-fmcomms2-3の影響でしょうか?
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AXI UART Liteのinterrupt ID

2023-01-12 12:00:34 | SDR
fmcomms2_zedに追加したAXI UART Liteがpetalinuxでstallするのは、
割り込みが正常に動作していないように見えるので、device treeをチェックしてみます。

まず、petalinux-buildで/images/linux/system.dtbに生成されたバイナリのdevice treeを、
device tree compiler(dtc)でdecompileして、テキストファイルに変換します。

https://siliconbladeconsultants.com/2022/05/26/decompiling-the-linux-device-tree-dtb/



テキストファイルに変換されたdevice treeをチェックしてみると、
AXI UART Liteがamba_plのserial@42c0000として追加されています。



interruptsのパラメータを見てみると<0x0 0x22 0x1>となっています。
それぞれの値が何を意味しているのか調べてみると、最初のパラメータはshared peripheral interruptかどうか、
2番目はinterruptのIDから32を引いた値、最後は割り込みのタイプで0x1はrising edgeです。

http://xillybus.com/tutorials/device-tree-zynq-4

ここで気になるのが、2番目の値です。0x22(34)に32を足すと、interrputのIDは66になります。
ZynqのPLからPSへの16ビットのinterrupt portであるIRQ_F2PのIDは[91:84], [68:61]となっており、
MSBが91になります。



fmcomms2_zedに追加したAXI UART Liteは、bit 10のinterrupt sourceに接続したので、IDは86のはずです。
そうであれば、device treeのinterruptsの2番目の値は、86-32=54(0x36)になるべきでは?

ちなみに、オリジナルのfmcomms2_zedのAXIデバイスは、interrupt IDの[91:87]に接続されています。

Petalinuxが自動生成してくれるdevice treeのバグでしょうか?
ユーザ側でオーバーライトするには、どうすればいいのだろう。
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Petalinuxのビルド

2023-01-07 13:58:42 | SDR
AXI UART Liteを追加したfmcomms2_zed用に、Petalinuxをビルドします。
まずは、いつも通りにプロジェクトを作成し、petalinux-configでxsaファイルを指定します。



設定メニューで、Yocto Settings -> User layersに進み、meta-adi-coreとmeta-adi-xilinxのレイヤを追加します。



さらに、Yocto Settingsで、Enable Network sstate feedsのオプションをdisableします。



ついでに、axi_uartlite_0が追加されていることを確認します。



設定が完了したら、Saveして設定メニューを終了します。

続いて、device treeを指定します。
fmcomms2_zedのHDLには、zynq-zed-adv7511-ad9361-fmcomms2-3を選択します。



次に、petalinux-config -c kernelで、カーネルの設定を変更します。
ここでは、Xilinx uartlite serial port supportをenableし、Maximum number of uartlite serial portsの値を2に設定します。



さらに、system-user.dtsiでデバイスツリーにstatus = "okay"を追加し、axi_uartlite_0を有効にします。



これで準備が整いました。buildフォルダに移動し、Petalinuxをビルドします。



ビルドが完了したら、ブートイメージを作成し、SDカードに書き込みます。





SDカードをZedBoardのスロットに挿入し、Petalinuxの起動を確認。
axi_uartlite_0に対応したttyUL1が追加されています。



PmodにUSBシリアル変換のアダプタを接続し、ttyUL1の出力を受信してみます。



素直に動作してくれるかなと期待したのですが、TX側のコマンドがストールした感じになり、
RX側には送信した文字が途中までしか表示されません。





ZYBOでのテストとは異なり、ADIが提供するユーザレイヤやデバイスツリーが追加されているので、
その辺りとコンフリクトがあるのかもしれません。

さて、どこから手を付けよう?
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする