Yocto ProjectによるLinuxの作成 Vol.3 ~カスタム・ボードのためのLinux作成~

PetaLinuxをお使いのみなさま、こんにちは。
Yocto ProjectによるLinuxの作成方法の第3回目です。
今回はカスタム・ボードをターゲットにLinuxを作成する方法を紹介します。
本ブログではAMD社のZynq™ UltraScale+™ MPSoC ZCU104 評価キット(ZCU104)用のVivado™デザインを使用しますが、評価ボード用MACHINEではなく、“カスタムMACHINE”の作成手法でカスタム・ボード用のMACHINEを作成します。
また、カスタムMACHINE用Device Treeの調整方法も紹介します。
1. Zynq™ MPSoC向けVivado™デザインの作成
【開発環境】
開発ツール | Vivado™ 2024.2 |
---|---|
ターゲット | ZCU104評価ボード(xczu7ev) |
※ ZCU104(xczu7ev)を選んだ理由は後ほど。 |
【仕様】
- FPGAにAXI_GPIOを2つ実装し、ZCU104のDip Switchからの割り込みを受けて、LEDを点滅させる。
- 2つのAXI_GPIOはUIOドライバを用いたLinuxアプリケーションで制御。
FPGAデザインについては、ZCU104用ボードファイルのテンプレートを使用すれば簡単に設計できます。
プロジェクト名を “zcu104_hw” とし、Block Design名を “design_1_wrapper” としました。
Generate Bitstreamを実行すればハードウェアは完成です。
2. ハードウェアデザインのExport
Vivado™のメニューバー「File」→「Export」→「Export Hardware」を使用します。
“Include bitstream” を選択します。
XSAファイルの格納先はデフォルトで構いません。必要であれば「Export to」のフォルダを指定します。
本ブログの例では、design_1_wrapper.xsa が生成されます。
3. XSAファイルを使用してカスタムMACHINEを作成
今回は rel-v2024.2 を使用します。
$ repo init -u https://github.com/Xilinx/yocto-manifests.git -b rel-v2024.2
によってダウンロードしたYocto Projectに対して評価ボードのMACHINEを使用するのではなく、XSAファイルからMACHINEの定義ファイルを作成して、BitBakeに渡します。
以下に手順を示します。
今回のworkディレクトリを yocto_rel2024_2 としています。
yocto_rel2024_2 ディレクトリで
$ repo init -u https://github.com/Xilinx/yocto-manifests.git -b rel-v2024.2
$ repo sync
$ repo start rel-v2024.2 --all
を実行します。
$ source setupsdk
カスタムMACHINEの作成に関する情報は以下です。
$ gen-machineconf parse-xsa --soc-family zynqmp --hw-description ../../zcu104_hw/design_1_wrapper.xsa --xsct-tool <PETALINUX_INSTALLATION_DIR>/components/xct
これによって yocto_rel2024_2/build/conf/machine が作成されます。
“zynqmp-generic-xczu7ev” がMACHINE名です。
yocto_rel2024_2/build/conf/machine/zynqmp-generic-xczu7ev.conf に
MACHINE_FEATURES += "vcu" の1行を追記します。
# Yocto IMAGE_FEATURES Variable
MACHINE_HWCODECS = "libvcu-omxil"
IMAGE_FEATURES += "hwcodecs"
MACHINE_FEATURES += "vcu"
以上でカスタムMACHINEの作成は完了です。
4. LinuxのBuild (その1)
作成したMACHINEによってLinuxをBuildします。
こうすることで、カスタムMACHINEに対する各種レイヤ(レシピ)が生成されます。
Linuxのチューニング(Device TreeやKernel Config)はその後にできます。
方法は以下です。
MACHINE名は “zynqmp-generic-xczu7ev” です。
$ MACHINE=zynqmp-generic-xczu7ev bitbake petalinux-image-minimal
5. Device Treeの編集
BitBakeによってXSAファイルからDevice Treeを自動生成します。
フォルダは
yocto_rel2024_2/build/tmp/work/zynqmp_generic_xczu7ev-xilinx-linux/device-tree/xilinx-v2024.2+git/device-tree-build/device-tree
です。
今回はVivado™にAXI_GPIOを実装し、LEDを制御するようにしました。(前述のBlock Designを参照のこと)
このAXI_GPIOにUIOドライバを割り当て、Linuxアプリケーションから制御できるようにします。
そのために、Device Treeを編集します。
方法を以下に示します。
device-tree.bb 抜粋
# Copy the EXTRA_DT_FILES and EXTRA_DT_INCLUDE_FILES files in prepend operation so that
# it can be preprocessed.
do_configure:prepend () {
# Create DT_FILES_PATH directory if doesn't exist during prepend operation.
if [ ! -d ${DT_FILES_PATH} ]; then
mkdir -p ${DT_FILES_PATH}
fi
for f in ${EXTRA_DT_FILES} ${EXTRA_DT_INCLUDE_FILES}; do
if [ "$(realpath ${WORKDIR}/${f})" != "$(realpath ${DT_FILES_PATH}/`basename ${f}`)" ]; then
cp ${WORKDIR}/${f} ${DT_FILES_PATH}/
fi
done
}
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
}
devicetree_do_compile:append() {
import subprocess
:
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ドライバを指定する
};
6. LinuxのBuild (その2)
Device Treeを反映させたLinuxをBuildします。
$ MACHINE=zynqmp-generic-xczu7ev bitbake petalinux-image-minimal
yocto_rel2024_2/build/tmp/work/zynqmp_generic_xczu7ev-xilinx-linux/device-tree/xilinx-v2024.2+git/device-tree-build/device-tree に system-user.dtsi が反映されます。
7. Build結果の確認
Yocto ProjectによるLinuxの作成 Vol.1 でご案内したように、QEMUを使ってAXI_GPIOにUIOドライバのノードが生成されることを確認します。
$ MACHINE=zynqmp-generic-xczu7ev runqemu qemuparams='-serial mon:stdio' petalinux-image-minimal
起動は Yocto ProjectによるLinuxの作成 Vol.1 で示したようなログで正常に行われます。
zynqmp-generic-xczu7ev:/sys/class/uio$ ls
uio0 uio1 uio2 uio3 uio4
zynqmp-generic-xczu7ev:/sys/class/uio$ cat uio4/name
gpio <<== axi_gpio を指している
zynqmp-generic-xczu7ev:/sys/class/uio$
8. おわりに
今回は、カスタム・ボード用のXSAファイルを使ってLinuxを作成する方法を解説しました。
次回はさらにカスタマイズの方法について説明します。
最後までご覧いただきありがとうございました!
弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。
サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。
FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。