前置き
PetaLinuxはXILINX製プロセッサで組み込みLinux開発を行うためのツールである。
XILINX製Zynq-7000 SoCを搭載する評価ボードZedBoardでPetaLinuxによる
組み込みLinux開発を行うまでの環境構築、セットアップ手順をやってみた
PetaLinux version:2020.2
VIVADO version:2020.2
[XILIMX PetaLinux ツール概要]
https://japan.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html
なお、このセットアップ手順は下記資料をほぼそのまま実行している。
[PetaLinux ツール資料リファレンスガイド]
https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2020_2/ug1144-petalinux-tools-reference-guide.pdf
1. PetaLinuxツール 準備
環境構築はLinux PCでUbuntuのDocker Imageを作成し行った。
OS: Ubuntu 18.04.3 LTS (Bionic Beaver)
1.1. PetaLinuxツールのインストール
事前にpetalinuxツールの展開に必要なパッケージをインストールしておく。
これだけで足りなければ.runのインストール時にErrorが出るので
適宜インストールする。
$ sudo apt install -y xterm libtool zlib1g-dev gcc-multilib build-essential
$ sudo apt install -y rsync
$ sudo apt install -y net-tools
$ sudo apt install -y ncurses-dev
$ sudo apt install -y tofrodos
$ sudo apt install -y iproute2
$ sudo apt install -y gawk
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install zlib1g:i386
PetaLinux ツールインストーラをインストールしてくる。
(要ユーザー登録)
[PetaLinux ツール - インストーラー - 2020.2 Full Product Installation]
https://japan.xilinx.com/member/forms/download/xef.html?filename=petalinux-v2020.2-final-installer.run
インストーラを任意のディレクトリに置き、任意のディレクトリにインストールする。
このとき、root権限だと展開できないため、ユーザー(zed)を生成した。
$ cd /workspace/share/petalinux/
$ mkdir <installer-folder>
$ mkdir /opt/pkg
$ mkdir /opt/pkg/petalinux
$ mkdir /opt/pkg/petalinux/2020.2
$ useradd zed
(パスワード等は適宜設定する)
$ su zed
(ここからはzedユーザーで実施)
$ cd <installer-folder>
$ ./petalinux-v2020.2-final-installer.run -d /opt/pkg/petalinux/2020.2
1.2. PetaLinux作業環境のセットアップ
settingsスクリプトを実行する
ユーザーシェルがbashとCシェルの場合で実行ファイルが異なる。
今回はbashを使う
$ cd /opt/pkg/petalinux/2020.2/
$ source settings.sh
WARNINGが出るが気にしなくて良い模様。
正しくセットアップされたことを確認。
$ echo $PETALINUX
/opt/pkg/petalinux/2020.2
2. プロジェクトの作成
2.1. PetaLinux BSPのインストール
BSPは各ボードに適したものをインストールする。
今回はZedBoardを使用するので、下記URLの、
「Zynq-7000 SoC ボード サポート パッケージ - 2020.2」->「ZED BSP」をダウンロード
(要ユーザー登録)
2.2. PetaLinuxプロジェクトの作成
ダウンロードしたBSPファイルを開発環境Linux側の任意のフォルダに置く。
<petalinux-bsp-folder>/avnet-digilent-zedboard-v2020.2-final.bsp
プロジェクト作成する任意のフォルダを作成し移動
$ cd /workspace/share/petalinux/project
$ mkdir workspace
$ cd workspace
ここからPetaLinuxコマンドを使用していくが、どうやらLANG=C
が必要らしいので
あらかじめalias
しておく
$ vi ~/.bashrc
alias petalinux-setup='source /opt/pkg/petalinux/2020.2/settings.sh'
alias petalinux-boot='LANG=C petalinux-boot'
alias petalinux-build='LANG=C petalinux-build'
alias petalinux-config='LANG=C petalinux-config'
alias petalinux-create='LANG=C petalinux-create'
alias petalinux-package='LANG=C petalinux-package'
alias petalinux-util='LANG=C petalinux-util'
プロジェクト作成のコマンドを実行する。
(root権限でないユーザーで実行した。)
petalinux-create -t project -s <petalinux-bsp-folder>/avnet-digilent-zedboard-v2020.2-final.bsp
※ユーザーログオフするたびにpetalinux-setup
しないとpetalinuxコマンドが
有効にならないため注意。
下記のようなプロジェクトフォルダが生成された。
このプロジェクトはインストールされたBSPに基づくものである。
<petalinux-project-folder>/avnet-digilent-zedboard-2020.2
3. VIVADO セットアップ
3.1. VIVADOインストール
PetaLinuxとバージョンを合わせたVIVADOが必要となる。
「Vivado Design Suite - HLx Edition - 2020.2 Full Product Installation」
->「ザイリンクス統合インストーラー 2020.2: Windows 用自己解凍型ウェブ インストーラー」をダウンロード
VIVADOはGUIでやるので手元のWindows PCにインストールした。
[ダウンロードページ]
https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/vivado-design-tools.html
-
ダウンロード時の注意
Xilinxのツールをダウンロードする際はサインインが必要。
サインイン後も詳細情報の⼊⼒画⾯に遷移するが、ページ下部のDownloadを押せば良い。 -
インストール時の注意
User Authentication欄はダウンロード時と同じアカウントを指定する。
エディションは Vivado HL WebPACK を選択する。
その他はデフォルト設定のままにしておく。
3.2. VIVADOによるハードウェアプラットフォームの生成
Zynq7000だけの単純なPSをとりあえず作成した。
プロジェクトの作成が終わったら、
「File」->「Export」->「Export Hardware」
を実行する。
これによりXSAファイルが生成される。
<vivado-project-folder>/design_xxx_wrapper.xsa
4. 設定およびビルド
4.1. ハードウェア コンフィギュレーションのインポート
ここからはまたUbuntu環境。
PetaLinux プロジェクトディレクトリに移動
$ cd <petalinux-project-folder>/avnet-digilent-zedboard-2020.2
XSAファイルを任意のフォルダに置いておく
<vivado-xsa-folder>/design_xxx_wrapper.xsa
XSAファイルのあるディレクトリへのパスを指定してpetalinux-config
コマンドを実行。
(root権限でないユーザーで実行した。このときXSAファイルの閲覧権限やプロジェクトディレクトリの書込権限がないとKconfigの生成ができずハマる。rootでできるのだろうか。。。)
$ petalinux-config --get-hw-description=<vivado-xsa-folder>
このようなConfig画面が出る。今回は特に変更せず< Exit >
これでVIVADOで生成したハードウェア設定が反映された。
4.2. システムイメージのビルド
PetaLinux プロジェクトディレクトリに移動
$ cd <petalinux-project-folder>/avnet-digilent-zedboard-2020.2
petalinux-build
を実行してビルドする。
$ petalinux-build
ビルドが完了すると、images
ディレクトリにイメージが生成されている。
$ ls images/linux/
boot.scr rootfs.cpio rootfs.jffs2 system.bit u-boot.elf zImage
image.ub rootfs.cpio.gz rootfs.manifest system.dtb uImage zynq_fsbl.elf
pxelinux.cfg rootfs.cpio.gz.u-boot rootfs.tar.gz u-boot.bin vmlinux
4.3. Zynq-7000用ブートイメージのビルド
petalinux-package
コマンドで、.BIN
フォーマットのブートイメージを生成する。
$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/*.bit --u-boot
images/linux
下にBOOT.BIN
が生成された。
$ ls images/linux/
BOOT.BIN pxelinux.cfg rootfs.cpio.gz.u-boot rootfs.tar.gz u-boot.bin vmlinux
boot.scr rootfs.cpio rootfs.jffs2 system.bit u-boot.elf zImage
image.ub rootfs.cpio.gz rootfs.manifest system.dtb uImage zynq_fsbl.elf
5. 起動確認
5.1. SDへの書き込み
ZedBoardに挿入するSDカードを用意。
まずパーティションを2つに分けておく必要がある。
パーティション1をfat32に、2をext4にフォーマットする必要がある。
PetaLinuxデフォルトだとブートファイル、イメージファイルはBOOT.BIN、image.ubに
合成されているらしく、この2つがあればよいらしい。
パーティション | フォーマット | ファイル |
---|---|---|
1 | fat32 | BOOT.BIN |
1 | fat32 | image.ub |
2 | ext4 | rootfs.tar.gzを展開 |
5.2. ZedBoardでの起動確認
SDをZedBoardに挿入し電源ONするとU-Bootが走り、下記ログがUSB-UARTから吐き出された。
Bootモードからカーネルの起動が始まらない様子。
U-Boot 2020.01 (Feb 26 2021 - 05:21:28 +0000)
CPU: Zynq 7z020
Silicon: v3.1
Model: Zynq Zed Development Board
DRAM: ECC disabled 512 MiB
Flash: 0 Bytes
NAND: 0 MiB
MMC: mmc@e0100000: 0
Loading Environment from SPI Flash... SF: Detected s25fl256s1 with page size 256 Bytes, erase size 64 KiB, total 32 MiB
OK
In: serial@e0001000
Out: serial@e0001000
Err: serial@e0001000
Net:
ZYNQ GEM: e000b000, mdio bus e000b000, phyaddr 0, interface rgmii-id
Warning: ethernet@e000b000 MAC addresses don't match:
Address in DT is (※MACアドレスA)
Address in environment is (※MACアドレスB)
eth0: ethernet@e000b000
Hit any key to stop autoboot: 0
Device: mmc@e0100000
Manufacturer ID: 13
OEM: 4b47
Name: SD08G
Bus Speed: 50000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
Device: mmc@e0100000
Manufacturer ID: 13
OEM: 4b47
Name: SD08G
Bus Speed: 50000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
Zynq>
U-Bootの環境変数を確認する。
Zynq> printenv
(一部抜粋)
bootcmd=run $modeboot
modeboot=sdboot
sdboot=mmcinfo; run fpgaload; fatload mmc 0:1 0x2080000 zImage && fatload mmc 0:1 0x2000000 zynq-zed.dtb && bootz 0x2080000 - 0x2000000;
Linux Kernelの起動はbootcmdにより実行される。
run
はあとに続くコマンドを順に実行していく。
この設定だと最終的にsdboot
に書き並べられたコマンドが実行されていくことで
Linuxの起動が行われることが分かる。
これによるとzImage
とzynq-zed
が必要そうだ。
petalinux-build
実行後の生成物を見直すため、image/linux
内を再度のぞくと、
BOOT.BIN pl.dtbo rootfs.cpio.gz rootfs.manifest system.dtb uImage zynq_fsbl.elf
boot.scr pxelinux.cfg rootfs.cpio.gz.u-boot rootfs.tar.gz u-boot.bin vmlinux
image.ub rootfs.cpio rootfs.jffs2 system.bit u-boot.elf zImage
zImage
はあるがzynq-zed.dtb
はなく、system.dtb
がある。
これに合わせてU-Bootの環境変数を書き換えてみる。
Zynq> env set sdboot "mmcinfo; run fpgaload; fatload mmc 0:1 0x2080000 zImage && fatload mmc 0:1 0x2000000 sytem.dtb && bootz 0x2080000 - 0x2000000;"
Zynq> env save
ついでにethernetのMACアドレスについてWarningが出ているため、修正
$ petalinux-config
Subsystem AUTO Hardware Settings --->
Ethernet Settings --->
Ethernet MAC address
(※MACアドレスB)を入力
< OK >
< Save >
< Exit >
再ビルド
$ petalinux-build
$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/*.bit --u-boot --force
SDカードのパーティション1に
images/linux/zImage
images/linux/system.dtb
をコピーする。
※zImageはZynq-7000デバイス用のカーネルイメージ(RootFS含む)
最終的にSDカードの構成はこうなった。
パーティション | フォーマット | ファイル |
---|---|---|
1 | fat32 | BOOT.BIN |
1 | fat32 | image.ub |
1 | fat32 | zImage |
1 | fat32 | system.dtb |
2 | ext4 | rootfs.tar.gzを展開 |
SDカードをZedBoardに挿入し、電源を入れるとLinuxが起動した。
初期のlogin IDとPasswordはどちらも"root"となっている。
avnet-digilent-zedboard-2020_2 login: root
Password:
これでPetaLinuxシステムにログインできた。
OS情報はこうなっている。
root@avnet-digilent-zedboard-2020_2:~# uname -a
Linux avnet-digilent-zedboard-2020_2 5.4.0-xilinx-v2020.2 #1 SMP PREEMPT Fri Feb 26 05:21:35 UTC 2021 armv7l GNU/Linux
まとめ
とりあえずOSの起動までたどり着いた。
リファレンスではパーティション1にBOOT.BIN
,image.ub
の2ファイルがあれば良いと記載があるが、それでうまく行かない理由が分かっていない。U-Bootの環境変数はPetaLinux上で設定できるのだろうか?要勉強。
参考資料
https://qiita.com/iwatake2222/items/e1895900635fc29196b0
https://dora.bk.tsukuba.ac.jp/~takeuchi/?plugin=related&page=%E9%9B%BB%E6%B0%97%E5%9B%9E%E8%B7%AF%2Fzynq%2FPetalinux%20%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89