ZephyrのR5コアからFPGA(PL)のメモリ・GPIO制御してみた

本サイトはアフィリエイト広告を利用しています。
Zephyr

KV260上で動作するリアルタイムOS「Zephyr」から、PMODインターフェースのGPIOを制御するテストを実施しました。

Vivadoでのハードウェア作成から、デバイスツリーのコンパイル、そしてxmutilを使用したアプリケーションのロードまでの手順をまとめます。

スポンサーリンク

ZephyrのR5コアからFPGA(PL)のメモリ・GPIO制御してみた

KV260上で動作するリアルタイムOS「Zephyr」から、PMODインターフェースのGPIOを制御するテストを実施しました。

Vivadoでのハードウェア作成から、デバイスツリーのコンパイル、そしてxmutilを使用したアプリケーションのロードまでの手順をまとめます。

デモ動画は下記となっています。

詳細は下記hackster.ioの記事でも書いています。

Attention Required! | Cloudflare

 

KV260でZephyrのHelloWorld

下記でKV260でのZephyr(RTOS)を使ったHello Worldの手法を紹介しています。

この準備が前提の記事となっています。

KV260のR5コアにZephyr(RTOS)を実装してみる

KV260のR5コアにZephyr(RTOS)を実装してみる
KV260のR5コアにZephyr(RTOS)を実装してみました。Zephyrの公式ドキュメント通り、まずはテストしてみました。PetaLinuxのインストールからBSPビルドの自分用のメモです。KV260のR5コアにZephyr(RTOS...

 


テスト環境

今回のテスト環境は以下の通りです。

  • 開発PC: Vivado 2025.2 / Vitis 2025.2 /Petalinux 2025.1

  • ターゲットボード: Kria KV260 Vision AI Starter Kit

  • OS: Zephyr RTOS v4.4.0(Cortex-R5F) / PetaLinux (Cortex-A53)

 


Vivadoでのハードウェア作成

まずは、KV260のPMODに接続されたGPIOを含むデザインをVivadoで作成します。

こちらのHackster.ioの記事を参考に、KV260用のGPIOデザインを構築します。

Attention Required! | Cloudflare

 

今回のデザインにおける XDC制約(ピンアサイン) は以下の通りです。PMODインターフェースに合わせて設定しています。

 

論理合成・インプリメンテーションを実行し、 .xsa ファイルをエクスポートします。

 


デバイスツリー(pl.dtbo)の作成

FPGA部分をロードするために、デバイスツリー・オーバーレイ(DTBO)を作成します。

Vitisの xsct を使用して、エクスポートした .xsa から生成およびコンパイルを行います。

作成した pl.dtbo は、後ほどKV260の /lib/firmware/xilinx/ 配下で使用します。


ビットストリーム(.bin)の生成

Vivadoで生成された.bitファイルを、Kriaのユーティリティで扱える.bin形式に変換します。

 


shell.jsonの作成

xmutilでアプリケーションをロードする際に必要なshell.jsonを作成します。

これは、アクセラレータのタイプ(今回はXRT_FLAT)を定義するファイルです。


ZephyrのMPU設定

ZephyrからPL(FPGA)領域のレジスタやメモリにアクセスするためには、MPU(Memory Protection Unit)の設定を変更して、該当するアドレス空間へのアクセスを許可する必要があります。

MPU設定の修正(PL AXI領域の解放)

Zephyrソースコード内の以下のファイルを編集し、PL領域(0x80000000〜)へのアクセス許可を追加します。

対象ファイル: zephyr/soc/xlnx/zynqmp/arm_mpu_regions.c

追記内容:

 


Zephyrのデバイスツリー・オーバーレイ設定

Zephyr側でFPGA上のGPIO(AXI GPIO)を認識させるため、プロジェクト内に .overlay ファイルを作成し、以下の内容を記述します。

  • エイリアスの設定: led0led2sw0 を定義することで、Zephyrのアプリケーション(C言語)側から DT_ALIAS(led0) のような形でデバイスを簡単に参照できるようにしています。

  • アドレスの解釈(&{/soc}): ZynqMPのような64bit対応SoCでは、デバイスツリーのルート直下だとアドレスセルの解釈が複雑になることがありますが、&{/soc} ノードを明示的に指定することで、PL領域の32bitレジスタアドレスを確実にマッピングさせています。

 

 

KV260へのデプロイと実行

作成した3つのファイル(pl.dtbo, design_1_wrapper.bit.bin, shell.json)をKV260に転送し、xmutilでロードします。

フォルダの作成とファイル配置

Zephyrのビルドディレクトリ(build/zephyr/zephyr.elf)にあるバイナリを、KV260の /lib/firmware ディレクトリにコピーします。

 

アプリケーションのロード

現在のアプリをアンロードし、新しく作成したGPIO用のアプリをロードします。

正常にロードされると、ZephyrからPMODのGPIOを叩く準備が整います。

実際にロードすると下記形となります。

 

Zephyrバイナリ(.elf)のデプロイと実行

PL(FPGA)のロードが完了したら、次にZephyrの実行本体である .elf ファイルをR5コアへデプロイして実行します。これにはLinuxの remoteproc フレームワークを使用します。

remoteprocによるロードと起動

Linux側からR5プロセッサ(remoteproc0)に対して、ファームウェアの指定と実行指示を出します。この操作にはroot権限が必要なため、sudo -i で切り替えて実行します。

 

実行状態の確認

正常に起動すれば、KV260に接続したシリアルコンソール等からZephyrのログが確認でき、PMOD経由でのGPIO制御が可能になります。

Zephyrを起動すると、シリアルコンソールに以下のログが表示されます。

ログを確認すると、以下のことが分かります。

  • バージョンの確認: Zephyr OS v4.4.0 が正常に起動しています。

  • GPIOの制御: LEDの状態に合わせて、FPGA上のAXI GPIOレジスタ(0xb0000000)の値が 0x1, 0x2, 0x4 と変化しており、ZephyrからPL(FPGA)側のLEDを正しく制御できています。

  • スイッチの監視: SW0 state の表示により、PL側の入力ピンの状態もリアルタイムに監視できています。

これにより、Cortex-R5上のZephyrから、ZynqMPのPL領域(AXIインターフェース)へ正常にアクセスできていることが確認できました!

冒頭でも紹介しましたが、下記がデモ動画となっています。

 

まとめ

KV260上で動作するリアルタイムOS「Zephyr」から、PMODインターフェースのGPIOを制御するテストを実施しました。

Vivadoでのハードウェア作成から、デバイスツリーのコンパイル、そしてxmutilを使用したアプリケーションのロードまでの手順をまとめました。

コメント