Yocto ProjectによるLinuxの作成 Vol.2 ~Vivado™で設計したデザインを取り込む方法~
Petalinuxをお使いのみなさま、こんにちは。
Yocto ProjectによるLinuxの作成方法の第2回目です。
今回は評価ボードBSPに対してVivado™で設計したペリフェラルを取り込む方法について紹介します。
目次
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
を実行します。
$ source setupsdk
$ cp conf/local.conf conf/local.conf.bk
$ cp conf/bblayers.conf conf/bblayers.conf.bk
$ bitbake-layers create-layer $ROOT/sources/meta-example
$ROOTは setupsdk で設定されています。
yocto2023_2_zcu102_custom/sources/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
$ bitbake-layers add-layer $ROOT/sources/meta-example
以上でカスタムレイヤーの作成は完了です。
カスタムレイヤーに対してハードウェアデザインの取り込み
LinuxをBuildする際に使用するMACHINEのデータを作成します。
そこにVivadoで作成したXSAファイルも取り込みます。
方法は以下のとおりです。
yocto2023_2_zcu102_custom/sources/meta-example/conf/machine に example-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を編集します。
方法は以下のとおりです。
以下の内容を記述します。
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
}
以下の内容を記述します。
/ {
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ドライバのノードが生成されることを確認します。
$ MACHINE=example-zcu102-zynqmp runqemu qemuparams='-serial mon:stdio' petalinux-image-minimal
起動は Yocto ProjectによるLinuxの作成 Vol.1 で示したようなログで正常に行われます。
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サイトに掲載していますので、ぜひご覧ください。
FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。