LoginSignup
0
0

EMLinux 3.1 (202404) をQEMUでエミュレートしたZCU102で動かしてみた

Last updated at Posted at 2024-04-18

はじめに

手順の概要

  1. PetaLinux (rel-v2023.2) のビルドを実行し、QEMUでPetaLinuxを実行できる環境を作る。
  2. EMLinux 3.1 (202404) をビルドする。
  3. EMLinuxのビルド生成物を、上記PetaLinuxのビルド環境にコピーし、runqemuコマンドでEMLinuxを起動する。
    • runqemuコマンド (実体はPython3のスクリプト) を実行すると、以下の記事の付録に記載のように、qemu-system-microblazeelコマンドおよびqemu-system-aarch64コマンドに多くのオプションが指定しされて実行されます。これらのオプションを手動で実行するのが面倒なので、runqemuコマンドを使いました。

参考

構成図

+------------------------------------------------------+
| +--------------------------------------------------+ |
| | +----------------------------------------------+ | |
| | | +------------------------------------------+ | | |
| | | | EMLinux 3.1 (202404)                     | | | |
| | | +------------------------------------------+ | | |
| | | Zynq UltraScale+ MPSoC ZCU102 Evaluation Kit | | |
| | +----------------------------------------------+ | |
| | QEMU                                             | |
| +--------------------------------------------------+ |
| Ubuntu Server                                        |
+------------------------------------------------------+

各ソフトウェアのバージョン

Ubuntu Server

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"

QEMU

$ ./qemu-system-aarch64 --version 
QEMU emulator version 7.1.0 (v2.6.0-55433-g23b643ba16-dirty)
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
  • QEMUはPetaLinuxビルド時に生成されたqemu-system-aarch64コマンドを使用しました。
    /home/petalinux/github/petalinux-emlinux/build/tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin
    

前提条件

  • 以降の作業は、sudo権限を持つユーザiotsudoで実行しました。
  • iotsudoユーザのホームディレクトリは/hoem/iotsudoです。以降の作業は、/home/iotsudo上で行いました。

PetaLinux (rel-v2023.2) のビルド

  1. 作業用のディレクトリを作成し、そのディレクトリに移動してください。
    mkdir -p /home/iotsudo/github/petalinux-emlinux
    
    cd /home/iotsudo/github/petalinux-emlinux
    
  2. 以下の記事を参考にPetaLinuxをビルドし、起動できることを確認してください。
  3. 起動確認後、別のターミナルを起動し、killコマンドでqemu-system-aarch64をkillしてください。
    $ ps ax|grep qemu-system-aarch64
    (snip)
    1633421 pts/1    Sl+    7:14 /home/iotsudo/github/petalinux-emlinux/build/(snip)/qemu-system-aarch64 (snip)
    $ kill -9 1633421
    
  4. PetaLinuxのOSイメージが保存されているディレクトリを、以下のようにリネームしてください。
    cd /home/iotsudo/github/petalinux-emlinux/build/tmp/deploy/images
    
    mv zcu102-zynqmp zcu102-zynqmp_org
    

EMLinux 3.1 (202404) のビルド

  1. 以下を参考に、ビルドに必要なパッケージをインストールしてください。また、EMLinuxの展開まで行ってください。
  2. EMLinuxの展開後、以下のファイルを参考に作業を進めます。
    • EMLinux_3.1-202404/source/emlinux-3.1-202404/repos/meta-emlinux-ext-mpsoc/SETUP.md
  3. PetaLinuxのBSPファイルを以下から入手してください。
  4. 任意のディレクトリ (e.g., petalinux-bsp) を作成し、xilinx-zcu102-v2023.2-10140544.bspを保存してください。
    mkdir -p /home/iotsudo/petalinux-bsp
    
  5. bspファイルから取り出したfirmwareを保存するディレクトリ (e.g., firmware-2023.2) を作成してください。
    mkdir -p /home/iotsudo/petalinux-bsp/firmware-2023.2
    
  6. 以下のコマンドを実行し、bspファイルからfirmwareを取り出してください。
    tar xf xilinx-zcu102-v2023.2-10140544.bsp -C firmware-2023.2 --strip-component=4 xilinx-zcu102-2023.2/pre-built/linux/images/pmufw.elf
    
    tar xf xilinx-zcu102-v2023.2-10140544.bsp -C firmware-2023.2 --strip-component=4 xilinx-zcu102-2023.2/pre-built/linux/images/zynqmp_fsbl.elf
    
    tar xf xilinx-zcu102-v2023.2-10140544.bsp -C firmware-2023.2 --strip-component=4 xilinx-zcu102-2023.2/pre-built/linux/images/system.bit
    
  7. 上記、pmufw.elf, zynqmp_fsbl.elf, system.bitファイルを、EMLinuxのディレクトリにコピーしてください。
    cd /home/iotsudo/petalinux-bsp/firmware-2023.2
    
    cp * /home/iotsudo/EMLinux_3.1-202404/source/emlinux-3.1-202404/repos/meta-emlinux-ext-mpsoc/recipes-bsp/bootbin/files
    
  8. 以下の記事を参考に、EMLinuxをビルドするためのコンテナを起動してください。
  9. シンボリックリンクを作成してください。
    ln -sf ../repos/meta-emlinux-ext-mpsoc/scripts/add-layer-emlinux-ext-mpsoc setup-hooks/30-add-layer-emlinux-ext-mpsoc
    
  10. ビルドに必要な環境変数を設定してください。
    source setup-emlinux build
    
  11. conf/local.confファイルに以下を追記してください。
    vi conf/local.conf
    
    MACHINE = "zcu102-zynqmp"
    FSBL_FILE ="zynqmp_fsbl.elf"
    PMU_FILE = "pmufw.elf"
    BITSTREAM_FILE = "system.bit"
    
  12. ビルドを実行してください。
    bitbake emlinux-image-base
    
  13. ビルド完了後、exitコマンドでコンテナを終了してください。

EMLinuxの起動

  1. EMLinuxのビルド完了後、以下のディレクトリに移動してください。
    cd /home/iotsudo/EMLinux_3.1-202404/source/emlinux-3.1-202404/build/tmp/deploy/images/
    
  2. zcu102-zynqmpをコピーしてください。
    cp -a zcu102-zynqmp /home/iotsudo/github/petalinux-emlinux/build/tmp/deploy/images
    
  3. cd
    cd /home/iotsudo/github/petalinux-emlinux/build/tmp/deploy/images/zcu102-zynqmp
    
  4. wicファイルをリネームし、ファイルサイズが2の乗数 (e.g., 1G) になるように変更してください。
    cp emlinux-image-base-emlinux-bookworm-zcu102-zynqmp.wic petalinux-image-minimal-zcu102-zynqmp.wic.qemu-sd
    
    qemu-img resize petalinux-image-minimal-zcu102-zynqmp.wic.qemu-sd 1G
    
  5. devicetreeディレクトリを作成してください。
    mkdir devicetree
    
  6. devicetreeディレクトリに移動し、シンボリックリンクを作成してください。
    cd devicetree
    
    ln -s ../zynqmp-zcu102-rev1.0.dtb system-top.dtb
    
  7. 1つ上の階層のディレクトリに戻り、qemu-hw-devicetrees/multiarchディレクトリを作成してください。
    cd ../
    
    mkdir -p qemu-hw-devicetrees/multiarch
    
  8. zcu102-zynqmp_orgから、zcu102-arm.dtbとzynqmp-pmu.dtbを、qemu-hw-devicetrees/multiarchにコピーしてください。
    cp ../zcu102-zynqmp_org/qemu-hw-devicetrees/multiarch/zcu102-arm.dtb qemu-hw-devicetrees/multiarch
    
    cp ../zcu102-zynqmp_org/qemu-hw-devicetrees/multiarch/zynqmp-pmu.dtb qemu-hw-devicetrees/multiarch
    
  9. 以下のファイルをコピーしてください。
    cp ../zcu102-zynqmp_org/arm-trusted-firmware.elf .
    
    cp ../zcu102-zynqmp_org/petalinux-image-minimal-zcu102-zynqmp.qemuboot.conf .
    
    cp ../zcu102-zynqmp_org/pmu-firmware-zcu102-zynqmp.elf .
    
    cp ../zcu102-zynqmp_org/system.dtb .
    
    cp ../zcu102-zynqmp_org/u-boot.elf .
    
  10. treeコマンドの実行結果が以下のようになることを確認してください。
    $ tree
    .
    ├── arm-trusted-firmware.elf
    ├── devicetree
    │   └── system-top.dtb -> ../zynqmp-zcu102-rev1.0.dtb
    ├── emlinux-image-base-emlinux-bookworm-zcu102-zynqmp.dpkg_status
    ├── emlinux-image-base-emlinux-bookworm-zcu102-zynqmp-initrd.img
    ├── emlinux-image-base-emlinux-bookworm-zcu102-zynqmp.manifest
    ├── emlinux-image-base-emlinux-bookworm-zcu102-zynqmp.tar.gz
    ├── emlinux-image-base-emlinux-bookworm-zcu102-zynqmp.wic
    ├── emlinux-image-base-emlinux-bookworm-zcu102-zynqmp.wic.bmap
    ├── emlinux-image-base-emlinux-bookworm-zcu102-zynqmp.wic.gz
    ├── files.modified_timestamps
    ├── Image
    ├── petalinux-image-minimal-zcu102-zynqmp.qemuboot.conf
    ├── petalinux-image-minimal-zcu102-zynqmp.wic.qemu-sd
    ├── pmu-firmware-zcu102-zynqmp.elf
    ├── pmu-rom.elf
    ├── qemu-hw-devicetrees
    │   └── multiarch
    │       ├── zcu102-arm.dtb
    │       └── zynqmp-pmu.dtb
    ├── system.dtb
    ├── u-boot.elf
    └── zynqmp-zcu102-rev1.0.dtb
    
  11. /home/iotsudo/github/petalinux-emlinux/に移動し、環境変数を設定してください。
    cd /home/iotsudo/github/petalinux-emlinux/
    
    source setupsdk
    
  12. 以下のコマンドを実行してください。
    MACHINE=zcu102-zynqmp runqemu petalinux-image-minimal nographic
    
  13. ログインプロンプトが出てきたら、ユーザ名root、パスワードrootでログインしてください。
    (snip)
    Starting kernel ...
    
    [    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
    [    0.000000] Linux version 6.1.80-cip16 (isar-users@googlegroups.com) (aarch64-linux-gnu-gcc (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP Thu, 01 Jan 1970 01:00:00 +0000
    [    0.000000] Machine model: ZynqMP ZCU102 Rev1.0
    (snip)
    EMLinux 3.1 EMLinux3 ttyPS0
    EMLinux3 login: root
    Password: 
    Linux EMLinux3 6.1.80-cip16 #1 SMP Thu, 01 Jan 1970 01:00:00 +0000 aarch64
    (snip)
    

さいごに

まだ、残項目はあるものの、EMLinux 3.1 (202404) をQEMUでエミュレートしたZCU102で動かしてみました。

残項目

IPアドレスが有効にならない

root@EMLinux3:~# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
3: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
    link/can 
4: end0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 1a:60:57:80:25:cf brd ff:ff:ff:ff:ff:ff
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0