1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. Yocto ProjectによるLinuxの作成 Vol.2 ~Vivado™で設計したデザインを取り込む方法~

TECHブログ

Yocto ProjectによるLinuxの作成 Vol.2 ~Vivado™で設計したデザインを取り込む方法~

Yocto ProjectによるLinuxの作成 Vol.2 ~Vivado™で設計したデザインを取り込む方法~

Petalinuxをお使いのみなさま、こんにちは。
Yocto ProjectによるLinuxの作成方法の第2回目です。

今回は評価ボードBSPに対してVivado™で設計したペリフェラルを取り込む方法について紹介します。

目次

  1. Zynq™ MPSoC向けVivado™デザインの作成
  2. ハードウェアデザインのExport
  3. Yocto Project カスタムレイヤーの作成
  4. カスタムレイヤーに対してハードウェアデザインの取り込み
  5. Device Treeの編集
  6. LinuxのBuild
  7. Build結果の確認
  8. おわりに

Zynq™ MPSoC向けVivado™デザインの作成

【開発環境】

開発ツール Vivado 2023.2
ターゲット ZCU102評価ボード

【仕様】

  • FPGAに AXI_GPIO を2つ実装し、ZCU102のDip Switchからの割り込みを受けて、LEDを点滅させる。
  • 2つの AXI_GPIO は、UIOドライバを用いたLinuxアプリケーションで制御。

FPGAデザインについては、ZCU102用ボードファイルのテンプレートを使用すれば簡単に設計できます。
プロジェクト名を “zcu102_gpio_hw” とし、Block Design名を “zcu102_axi_gpio_design” としました。

アドレスマップ

Generate Bitstreamを実行すればハードウェアは完成です。

ハードウェアデザインのExport

Vivadoのメニューバー「File」→「Export」→「Export Hardware」を使用します。

“Include bitstream” を選択します。

XSAファイルの格納先はデフォルトで構いません。必要であれば「Export to」のフォルダを指定します。

本ブログの例では、zcu102_axi_gpio_design_wrapper.xsa が生成されます。

Yocto Project カスタムレイヤーの作成

前回のブログ Yocto ProjectによるLinuxの作成 Vol.1

左右にスクロールしてご覧ください
repo init -u https://github.com/Xilinx/yocto-manifests.git -b rel-v2023.2

によってダウンロードしたYocto Projectに対してカスタムレイヤーを作成します。
作成したカスタムレイヤーに対して、ユーザが設計したハードウェア情報を反映させます。

手順は以下のとおりです。

今回のworkディレクトリを yocto2023_2_zcu102_custom/yocto としています。
yocto2023_2_zcu102_custom ディレクトリで

左右にスクロールしてご覧ください
repo init -u https://github.com/Xilinx/yocto-manifests.git -b rel-v2023.2

を実行します。

STEP
yocto のworkディレクトリで以下の環境のセットアップを行います。
左右にスクロールしてご覧ください
$ source setupsdk
STEP
build/confs にあるファイルを以下のようにバックアップします。
左右にスクロールしてご覧ください
$ cp conf/local.conf conf/local.conf.bk
$ cp conf/bblayers.conf conf/bblayers.conf.bk
STEP
カスタムレイヤー “meta-example” を作成します。
左右にスクロールしてご覧ください
$ bitbake-layers create-layer $ROOT/sources/meta-example
注意
レイヤー名 mata-“xxxx” には大文字は使用しないでください。

$ROOTは setupsdk で設定されています。

yocto2023_2_zcu102_custom/sources/meta-example が生成されます。

STEP
カスタムレイヤー “meta-example” にサブ・ディレクトリを作成します。
左右にスクロールしてご覧ください
$ mkdir -p $ROOT/sources/meta-example/conf/machine
$ mkdir -p $ROOT/sources/meta-example/recipes-kernel/linux-xlnx
$ mkdir -p $ROOT/sources/meta-example/recipes-bsp/u-boot/u-boot-xlnx
$ mkdir -p $ROOT/sources/meta-example/recipes-bsp/device-tree/files
STEP
カスタムレイヤーをYocto Projectに登録します。
左右にスクロールしてご覧ください
$ bitbake-layers add-layer $ROOT/sources/meta-example

以上でカスタムレイヤーの作成は完了です。

カスタムレイヤーに対してハードウェアデザインの取り込み

LinuxをBuildする際に使用するMACHINEのデータを作成します。
そこにVivadoで作成したXSAファイルも取り込みます。

方法は以下のとおりです。

yocto2023_2_zcu102_custom/sources/meta-example/conf/machineexample-zcu102-zynqmp.conf ファイルを作成し
以下の内容を書き込みます。

左右にスクロールしてご覧ください
require conf/machine/zcu102-zynqmp.conf
HDF_BASE = "file://"
HDF_PATH = "/home/yocto2023_2_zcu102_custom/zcu102_hw/design_1_wrapp.xsa”

ここでカスタムデザインに対応したLinuxをBuildします。
MACHINE名は “example-zcu102-zynqmp” です。

左右にスクロールしてご覧ください
$ MACHINE=example-zcu102-zynqmp bitbake petalinux-image-minimal

Device Treeの編集

BitbakeによってXSAファイルからDevice Treeを自動生成します。
フォルダは
$ROOT/build/tmp/work/example_zcu102_zynqmp-xilinx-linux/device-tree/xilinx-v2023.2+gitAUTOINC+1a5881d004-r0/device-tree-build/device-tree
です。

今回はVivadoに AXI_GPIO を実装し、LEDを制御するようにしました。(前述のBlock Designを参照のこと)
そこで、AXI_GPIO にUIOドライバを割り当て、Linuxアプリケーションから制御できるようにします。
そのために、Device Treeを編集します。

方法は以下のとおりです。

STEP
$ROOT/sources/meta-example/recipes-bsp/device-tree/device-tree.bbappend を作成し
以下の内容を記述します。
左右にスクロールしてご覧ください
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"   
 
SYSTEM_USER_DTSI ?= "system-user.dtsi"
 
SRC_URI:append = " file://${SYSTEM_USER_DTSI}"
 
do_configure:append() {
  cp ${WORKDIR}/${SYSTEM_USER_DTSI} ${B}/device-tree
  echo "/include/ \"${SYSTEM_USER_DTSI}\"" >> ${B}/device-tree/system-top.dts
}
注意
上記の FILESEXTRAPATHS:prepend := "${THISDIR}/files:" の行頭にスペースが入るとエラーになります。
STEP
$ROOT/sources/meta-example/recipes-bsp/device-tree/files/system-user.dtsi を作成し
以下の内容を記述します。
左右にスクロールしてご覧ください
/ {
    chosen {
	bootargs = "earlycon clk_ignore_unused   uio_pdrv_genirq.of_id=generic-uio";
	stdout-path = "serial0:115200n8";
    };
};

&axi_gpio_0 {
    compatible = "generic-uio";  <<== axi_gpio に対してUIOドライバを指定する
};

LinuxのBuild

Device Treeを反映させたLinuxをBuildします。

左右にスクロールしてご覧ください
$ MACHINE=example-zcu102-zynqmp bitbake petalinux-image-minimal

$ROOT/build/tmp/work/example_zcu104_zynqmp-xilinx-linux/device-tree/xilinx-v2023.2+gitAUTOINC+1a5881d004-r0/device-tree-build/device-tree/ に system-user.dtsi が反映されます。

Build結果の確認

Yocto ProjectによるLinuxの作成 Vol.1 でご案内しましたように、QEMUを使って AXI_GPIO にUIOドライバのノードが生成されることを確認します。

STEP
QEMUによってLinuxを起動します。
左右にスクロールしてご覧ください
$ MACHINE=example-zcu102-zynqmp runqemu qemuparams='-serial mon:stdio' petalinux-image-minimal

起動は Yocto ProjectによるLinuxの作成 Vol.1 で示したようなログで正常に行われます。

STEP
UIOドライバの様子を確認します。
左右にスクロールしてご覧ください
example-zcu104-zynqmp:/sys/class/uio$ ls
   uio0  uio1  uio2  uio3  uio4
example-zcu104-zynqmp:/sys/class/uio$ cat uio4/name
   gpio   <<== axi_gpio を指している
example-zcu104-zynqmp:/sys/class/uio$

おわりに

いかがでしたでしょうか。
今回は、評価ボードをベースとし、ユーザが設計したFPGA部のペリフェラルを取り込む方法を解説しました。

次回はさらにカスタマイズの方法について説明します。
最後までご覧いただきありがとうございました!

弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。
サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。

設計受託・ODMの概要については
こちら

FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。

FPGAの活用・設計検討の
お問い合わせはこちら

このブログのシリーズ

関連ブログ