1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. Yocto ProjectによるLinuxの作成 Vol.3 ~カスタム・ボードのためのLinux作成~

TECHブログ

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

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

を実行します。

STEP
yoctoのworkディレクトリで以下の環境のセットアップを行います。
左右にスクロールしてご覧ください
$ source setupsdk
STEP
XSAファイルによってMACHINEフォルダを作成します。

カスタム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名です。

STEP
VCUを含むデバイスへの対応(「ZCU104(xczu7ev)を選んだ理由は後ほど」というのはこの事です)

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を編集します。

方法を以下に示します。

STEP
yocto_rel2024_2/source/meta-xilinx/meta-xilinx-core/recipes-bsp/device-tree/device-tree.bbappend に以下の内容を追記します。

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
}
//以下の太字の記述でsystem-user.dtsiを登録します。
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
を登録します。
STEP
yocto_rel2024_2/source/meta-xilinx/meta-xilinx-core/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ドライバを指定する
};

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ドライバのノードが生成されることを確認します。

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

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

STEP
UIOドライバの様子を確認します。
左右にスクロールしてご覧ください
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サイトに掲載していますので、ぜひご覧ください。

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

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

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

このブログのシリーズ

関連ブログ