2017/07/08

[ZYBO]DigilentのYocto

こちらが、Xilinxのyocto-manifestsで、ブランチがrel-v2017.2の内容。
https://github.com/Xilinx/yocto-manifests/blob/rel-v2017.2/default.xml
revisionが"rel-v2017.2"になっているので、それぞれのgitからブランチrel-v2017.2を取ってくるようになっている。

そして当面の問題は、meta-xilinxにZYBOの設定ファイルがないのだけどどうしようか、である。
こちらは、rel-v2017.2の設定ファイル一覧。
https://github.com/Xilinx/meta-xilinx/tree/rel-v2017.2/conf/machine
リビジョンが過去になれば存在するかというと、そういうわけでもない。

Yocto 2.1にはまだ入っていない、というQAがあった。
2.1は、krogothというブランチ名のようだ。
How to install Yocto Project 2.1 on ZYBO - FPGA - Digilent Forum

ということは、それより前のバージョンだったらサポートがあるということだろうか?
Digilentのgithubに、repoできるものがあった。
https://github.com/Digilent/meta-manifest

ブランチ名がjethroなので、2.0(2015/11/23)か。
meta-xilinxだと、rel-v2016.2がjethroなのだが、Vivadoなどがv2017.2でもビルドできるのだろうか?
それとも、あまり関係ないのだろうか。。

default.xmlを見ると、かなりシンプルだ。
meta-xilinxもDigilentのもので、こちらもjethroという名前になっていた。


では、やっていこう。

$ repo init -u https://github.com/Digilent/meta-manifest.git -b jethro
$ repo sync
$ repo start jethro --all

ここから先は、Digilent Wikiを見ながらやっていく。

$ export layer_root=`pwd`
$ export target_machine="zybo-linux-bd-zynq7"
$ mkdir tmp
$ cd tmp
$ source ${layer_root}/poky/oe-init-build-env ${target_machine}
$ sed -i "/meta-yocto-bsp/a \  ${layer_root}/meta-openembedded/meta-oe \\\ " conf/bblayers.conf
$ sed -i "/meta-yocto-bsp/a \  ${layer_root}/meta-xilinx \\\ " conf/bblayers.conf
$ sed -i "s/MACHINE ??= \"qemux86\"/MACHINE ?= \"${target_machine}\"/" conf/local.conf

conf/local.confの一番下に、これらを追加。
最後の2行は、いるのかどうかわからんが、あった方がよさそうな気がする。

PREFERRED_PROVIDER_virtual/bootloader = "u-boot-digilent"
PREFERRED_PROVIDER_u-boot = "u-boot-digilent"
PREFERRED_PROVIDER_virtual/kernel = "linux-digilent"
PREFERRED_PROVIDER_virtual/boot-bin = "u-boot-digilent"
IMAGE_INSTALL_append = " mtd-utils"
IMAGE_INSTALL_append = " kernel-modules"

そして、menuconfig。
2つ書いてあるが、うーん、digilentと書いてある方が無難な気がする。
でも、今回はpreferred kernelでも同じかもしれん。

$ bitbake linux-digilent-dev -c menuconfig

何やらダウンロードが始まり、いつものmenuconfig画面が出るのに30分くらいかかった。
General setupで、Local versionが「-digilent」になっているのは気付いたが、それ以外はよくわからんな。
System TypeはXilinx Zynq ARM Cortex A9 Platformになっていた。

まあ、今回は何も変更せずによかろう。


次はBuildだ。
core-image-minimalとcore-image-satoがあるらしい。
satoは佐藤さんではなく、GTK+をベースにしたUIになっていそうだ。
ZYBOには画面出力もあるので、satoでビルドしよう。

$ bitbake core-image-sato

local.confにxtermを追加するような記載があったけど、ビルドする説明の前に書いてくれよ。。。
もうコマンドを打ってダウンロードなどが始まっているから、このまま進めよう。


買い物から帰ってくると、エラーで止まっていた。。。
どうも、ダウンロードにあれこれ失敗しているためか、xserver-xf86-configのconf.dが無いなどといわれている。

こういうときは、UIをあきらめるのがよいだろう。

$ bitbake core-image-minimal

こちらは、あまり時間がかからずに終わった。
core-image-satoをやっていたおかげかもしれん。


次は、build productsだ。

bitbakeした場所から見ると、tmp/deploy/images/zybo-linux-bd-zynq7にできているようだ。

boot.bin@
boot.bin-zybo-linux-bd-zynq7@
boot.bin-zybo-linux-bd-zynq7-v2016.03digilent+gitAUTOINC+4dd0f06c46-u-boot-digilent*
core-image-minimal-zybo-linux-bd-zynq7-20170708062821.rootfs.cpio
core-image-minimal-zybo-linux-bd-zynq7-20170708062821.rootfs.cpio.gz.u-boot
core-image-minimal-zybo-linux-bd-zynq7-20170708062821.rootfs.ext4
core-image-minimal-zybo-linux-bd-zynq7-20170708062821.rootfs.manifest
core-image-minimal-zybo-linux-bd-zynq7-20170708062821.rootfs.tar.gz
core-image-minimal-zybo-linux-bd-zynq7-20170708062821.rootfs.xilinx-sdimg
core-image-minimal-zybo-linux-bd-zynq7.cpio@
core-image-minimal-zybo-linux-bd-zynq7.cpio.gz.u-boot@
core-image-minimal-zybo-linux-bd-zynq7.ext4@
core-image-minimal-zybo-linux-bd-zynq7.manifest@
core-image-minimal-zybo-linux-bd-zynq7.tar.gz@
core-image-minimal-zybo-linux-bd-zynq7.xilinx-sdimg@
download.bit@
download.bit-+gitAUTOINC+63ca49fe02-r0-zybo-linux-bd-zynq7.bit
fitImage-1.0-r0-zybo-linux-bd-zynq7
fit.itb@
linux.bin@
modules--4.0-digilent+git0+86b46b6606-r0-zybo-linux-bd-zynq7-20170708062821.tgz
modules-zybo-linux-bd-zynq7.tgz@
README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt
sdimg@
sdimg-zybo-linux-bd-zynq7@
sdroot-fitImage@
sdroot-fitImage-zybo-linux-bd-zynq7-1.0-r0
sdroot-uImage-its-1.0-r0-zybo-linux-bd-zynq7.its
sdroot-zybo-linux-bd-zynq7.dtb
system.dtb@
system-top.dtb
u-boot.bin@
u-boot.bin-zybo-linux-bd-zynq7-v2016.03digilent+gitAUTOINC+4dd0f06c46-u-boot-digilent*
u-boot-dtb.bin@
u-boot-dtb.bin-zybo-linux-bd-zynq7-v2016.03digilent+gitAUTOINC+4dd0f06c46-u-boot-digilent*
u-boot-dtb.img@
u-boot-dtb.img-zybo-linux-bd-zynq7-v2016.03digilent+gitAUTOINC+4dd0f06c46-u-boot-digilent*
u-boot-spl.bin@
u-boot-spl.bin-zybo-linux-bd-zynq7-v2016.03digilent+gitAUTOINC+4dd0f06c46-u-boot-digilent*
uImage@
uImage--4.0-digilent+git0+86b46b6606-r0-zybo-linux-bd-zynq7-20170708062821.bin
uImage-its-1.0-r0-zybo-linux-bd-zynq7.its
uImage-its-zybo-linux-bd-zynq7.its@
uImage-linux.bin-4.0-digilent+gitAUTOINC+86b46b6606-r0-zybo-linux-bd-zynq7.bin
uImage-zybo-linux-bd-zynq7.bin@
zybo-linux-bd-zynq7.dtb@

多いね。

wicというツールを使えばブートできるSDカードができるらしいのだが、SDカードの場所はどこで指定するのだろうか?
まあいい、やってみよう。

$ wic create -e core-image-minimal ${layer_root}/meta-xilinx/scripts/lib/image/canned-wks/sdimage-xilinx.wks

SDカードを作るのではなく、SDカードに書き込むimageを作るだけのようだ。


SDブートを見ていこう。

boot.bin, fit.itb, download.bit, u-boot-dtb.imgの4ファイルを最初のパーティションにコピーすればよいらしい。
が、注意書きがある。

IMPORTANT Note: User must have u-boot SPL (the FSBL) automatically load the FPGA bitstream or stop at u-boot and load it manually!!! Otherwise the kernel will not boot. The next two sections describe these two methods

内容は、

ユーザはu-boot SPL(FSBL)を持っていなくてはならない!!! さもなくばkernelはブートしないであろう。

くらいの解釈でよいのかな?
"automatically"以下はFSBLの説明だと考えたのだけど、自信がないのでGoogle翻訳してもらおう。

ユーザーはu-boot SPL(FSBL)を自動的にFPGAビットストリームをロードするか、またはu-bootで停止して手動でロードする必要があります。

うーん、mustはhaveではなくloadにかかっているようだ。


2つ方法が書かれていて、u-bootで読込む方法と、SPLから読込む方法があるそうだ。
FPGAマガジンに書かれているのは、たぶん後者だろう。
"bitstream"というファイル名にしておくと、bit形式かbin形式だったら読込んでくれるそうだ。
ここでは、download.bitファイルがFSBLらしいので、download.bitをbitstreamにリネームするようだ。


ここまでやったあとで、先ほどのwicコマンドで作ったイメージを使ってSDカードを作る方法が書かれていた。
最初からこっちだけ説明すればいいやん。。。
https://github.com/Digilent/meta-manifest/wiki/Quick-start-guide#using-sdimg

ddコマンドでSDカードの先頭から書込むと、パーティションまで分けたSDカードができあがるのだ。
fdiskで見ると2つパーティションがあるのだが、gpartedで見ると4つある。

image

16GBのSDカードなのだが、wicの時点ではサイズが分からないのでこうなるのだろう。
まあ、このままでよい。


このSDカードをZYBOに挿すと、起動した。

(前略)
Starting syslogd/klogd: done

Poky (Yocto Project Reference Distro) 2.0.3 zybo-linux-bd-zynq7 /dev/ttyPS0

zybo-linux-bd-zynq7 login:

rootでログインもできる。
やれやれ。


では、bitstreamを書き換えれば、自分の作ったものが自動的にロードされるのだろうか。
SDSoC 2017.1で作ったとき、拡張子がbitになっているファイルがあったので、それを上書きしてみよう。

・・・ダメだ。
Linuxがちゃんと起動しない。
あれは、SDSoCの例だから、Linux側もセットになっているのかも?

その前に作った、VHDLでLEDを点滅させるbitファイルを上書きした。
これは動いて、LEDが点滅しているのだが、Linuxの方が「Starting kernel ...」で止まってしまった。
確か、このメッセージはkernel側が出していたような気がするんだけど、どうなんだろう?

kernelが動いていたときのbitstreamを上書きするとちゃんと起動したので、bitstreamファイルに関係があるのは間違いない。
コンソールログとLED点滅を見比べていくと、かなり早い段階でLED点滅が始まっている。
PL部が何かやっていないためにkernelが待ち状態になっているのだろうか?


http://qiita.com/ikwzm/items/1614c35233e1836c7a26
「FSBLをVivado SDKで作った場合」と書いてあるので、何かしてやらんといかん気がする。


ここを見ると、SDKでアプリを作るとき、FSBLを選択してfsbl_hooks.cだけ変更すればよいらしい。
5. Zynq SDKでFSBLを作る – yuki-sato.com
「zybo_base_system」から持ってくるそうだが、これだろうか?
fsbl_hooks.cファイルは、これと同じようだ。
ZYBO/fsbl_hooks.c at master · Digilent/ZYBO

置き換えてビルドしたのだが、xiicps.hがないということでエラーになった。
SDKのtarget/aarch32-none/includeにあったので、Eclipseの設定でパスを追加。
ビルドすると、今度は「XPAR_PS7_I2C_0_DEVICE_ID」が未定義だと。。。
I2Cは今回使わないからコメントアウトすると、その一帯がエラーになるようなので、もうエラーになるところは全部コメントアウト。

ここまでやって、ようやくFSBLがビルドできた。
あれ、ELF ?
メニューから「Create Image」で作っていくようだけど、これでできるのはBOOT.binだ。
説明では、ここにu-bootのELFファイルを追加するようなのだが、Yoctoで作ったimagesの中にはELFファイルはないように見える。


深みにはまりそうなので、ここは、一時撤退だ。
FPGAマガジンにはU-bootのSPLはFSBLの代わりになるような書き方をしてあったので、FSBLは作らなくてよいと思うのだ。
しかし、bitstreamを上書きして動かないというのも事実なので、何かしないといけないはずだ。
次はそこを調べよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。