Zynq の Yocto を使う
blog
2019-4-1 12:42 JST

Zynq で Yocto を使う

Zynq でも Yocto で簡単に Linux の rootfs を構築可能です。

Yocto イメージを作りブートするまで

作業に先立ち、使用している Linux の Distribution で必要なツールをインストールしておきます。(もちろん、開発環境は Linux になります!!)シェルは bash を使います。(私は FreeBSD + tcsh 派なんですが)

参考の環境: Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-32-generic x86_64) サーバ

■ メタデータ(recipes + configuration files + classes)の取得

Freescale のメタデータの扱いがすっきりしているので、sources というディレクトリでまとめる例を示します。poky の中に bitbake が入っているのでそのように poky と他のメタデータを分離可能にしているのだと思います。

Xilinx のメタデータも clone します。

$ mkdir <your-bsp>
$ cd <your-bsp>
$ mkdir sources
$ cd sources
$ git clone git://git.yoctoproject.org/poky
$ git clone git://git.openembedded.org/meta-openembedded 
$ git clone git://git.yoctoproject.org/meta-xilinx 
$ cd ..
■ rootfsの構築
$ . /poky/oe-init-build-env build

Freescale みたいにシェルプロを用意すればよいのかもしれません。引数の build は別の名称でも構いません。複数の build 環境を持つことが出来ます。oe-init-build-env の実行が終わると、自動的に build のディレクトリに移っていて、ちょっと面食らいます。

デフォルトの MACHINE は qemex86 。conf/machine というキーワードでfind すれば設定可能な MACHINE を探すことが出来ます。

$ find ../sources/meta-xilinx/ -name *.conf | grep conf/machine
../sources/meta-xilinx/conf/machine/zc706-zynq7.conf
../sources/meta-xilinx/conf/machine/qemuzynq.conf
../sources/meta-xilinx/conf/machine/zc702-zynq7.conf
../sources/meta-xilinx/conf/machine/zedboard-zynq7.conf
../sources/meta-xilinx/conf/machine/kc705-trd-microblazeel.conf
../sources/meta-xilinx/conf/machine/qemumicroblaze.conf

自働的に conf/bblayers.conf は作成されます。meta-xilinx を追加します。

BBLAYERS ?= " 
  /opt/Yocto/sources/poky/meta 
  /opt/Yocto/sources/poky/meta-yocto 
  /opt/Yocto/sources/poky/meta-yocto-bsp 
  
  /opt/Yocto/sources/meta-xilinx 
"

自働的に conf/local.conf は作成されるので、bash の環境変数に MACHINE を zc702-zynq7 に設定するか、local.conf に MACHINE 名を zc702-zynq7 (あるいは zedboard-zynq7) を追加します。

MACHINE ?= "zc702-zynq7"

あるいは qemux86 を zc702-zynq7 に書き換えてもかまいません。

?= と ??= が混在していますが、意味はBitBake 概要に書いてみました

また、qemu を使わないのであれば Linux の環境に SDL は必要ないので次の項目を local.conf から コメントアウトします。

#PACKAGECONFIG_append_pn-qemu-native = " sdl"
#PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
#ASSUME_PROVIDED += "libsdl-native"

■ イメージの作成
$ bitbake <selected-image>

<selected-image> には "core-image-minimal" や "core-image-sato" を指定します。この環境でどんなレシピの選択肢があるかは show-recipes で表示可能です。

$ bitbake-layers show-recipes

作成されたイメージ等は’tmp/deploy/images の下に作成されます(tmp かよ!!)。作成されたイメージは日付ごとに次々と作成されてしまうので、自分でバージョン管理をする必要があります。

なお、ここにできたファイル群は手で消してはいけません。bitbake -c clean <TARGET> で消します。

bitbake -c clean <TARGET> で消します。

必要によっては次の設定をしてください。イメージの作成が速くなるかもしれません。

BB_NUMBER_THREADS = 2
PARALLEL_MAKE = 2

数字は並列に実行するタスクの数です。プロセッサーの数を指定するのがよいでしょう。プロセッサの数の確認方法は次のとおり。

$ grep -c processor /proc/cpuinfo
2

例えば、次のようにタスクは同時に実行されます。(この場合は2つ)do_configure みたいな処理は同時に2つ処理してもまだ余裕があるケースが多いと予測されるので、BB_NUMBER_THREADS はプロセッサ数以上でもよさそうです。do_compile が make で同時に 2 つ走れば(BB_NUMBER_THREADS x PARALLEL_MAKE)最大 4 つの事象がパラレルに走ります。場合によって(特にサーバなどで実行する場合)は、負荷が高くなりすぎるかもしれません。top などで確認しながら最適な値を見つけてください。

NOTE: Preparing runqueue
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
Currently 2 running tasks (86 of 539):
0: bison-native-2.7.1-r0 do_configure (pid 22712)
1: sqlite3-native-3071700-r0 do_compile (pid 23654)

次の例は top の例。do_compile により複数の cc が走ったため負荷は 94 % になった。do_fetch 時などでただファイルをただとってくるだけなら 30% の時もあった。他の人を気にしなくてよいなら、もっと並列性を高めてもいいかもしれない。

top - 16:56:52 up 281 days, 17:14,  2 users,  load average: 2.98, 2.39, 1.36
Tasks: 132 total,   4 running, 123 sleeping,   5 stopped,   0 zombie
Cpu(s): 94.2%us,  5.7%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  12307384k total, 12069076k used,   238308k free,  2049088k buffers
Swap:   524284k total,     5144k used,   519140k free,  6611228k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
22149 ryos      20   0  418m 393m 7756 R   64  3.3   0:16.46 cc1plus
22907 ryos      20   0 39892  11m 3024 R    1  0.1   0:00.03 cc1plus

また、サーバで環境を共用する場合次の指定もいいかもしれません。特に SSTATE_DIR は有効でしょう(時間短縮になる)。

TMPDIR = "/opt/Yocto/tmp/<USER>"
#DL_DIR ?= "${BSPDIR}/downloads/"
DL_DIR ?= "/opt/Yocto/Cache/downloads"
SSTATE_DIR ?= "/opt/Yocto/Cache/sstate-cache"
■ Zynq 用のイメージの作成

Zynq 用に BOOT.BIN を作りましょう。ここからは Windows での作業になります(Linux でも可能ですが)。用意すべきファイルは次のとおり。

  • bif ファイル:bootgen コマンドで BOOT.BIN を作る際に必要なファイル
  • zynq_fsbl.elf:FSBL。Zynq が ARM として最初に実行するファイル
  • bit ファイル:ビットストリーム。
  • u-boot.elf:Yocto で作成した u-boot.elf

U-boot.elf は先の手順で bitbake に成功していれば次のディレクトリに生成されています。

tmp/deploy/images/zc702-zynq7/u-boot.elf

bif ファイルは次のとおり。

the_ROM_image:
{
    [bootloader]zynq_fsbl.elf
    zc702_wrapper.bit
    u-boot.elf
}

次のバッチファイルで bitgen を実行。VIVADO_PATH は各自の環境に合わせます。

set VIVADO_PATH=C:XilinxVivado2013.3
call %VIVADO_PATH%settings64.bat

bootgen -w -image stitch.bif -o i BOOT.BIN

SD カードに次のファイルを用意します。BOOT.BIN は上の手順でつくったもの、それ以外は Yocto で作ったものでtmp/deploy/images の下に作成されています。SD カードを ZC702 に差し込み、電源ON!!
Enjoy your Zynq life!!

  • BOOT.BIN:上の手順で作った BOOT.BIN
  • uImage:Yocto で作った uImage。
  • uramdisk:Yocto で作った uramdisk。
  • devicetree.dtb:Yocto で作った uImage-zc702-zynq7.dtb。

参考までに apt-get

http://www.openembedded.org/wiki/Getting_started に apt-get する方法がかかれています。たぶん libsdl1.2-dev はGUIを使わなければ必要ありません。もちろん X を使っていなければ xterm も必要ないでしょう。こういうapt-get一括方式はどうなんでしょうね?

sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib 
    build-essential chrpath