はじめに
ZYBOのクロス開発環境の構築 (2017年10月時点)でLinuxのビルドが完了してから、実際にDigilentのZYBOでLinuxが起動するまでを記載する。(結局本稿内ではまだBoot完了できておらず…) 実働工数は12h程度。
ビルド生成物の確認
bitbakeコマンド実行後、ビルドが完了したら/poky/build/tmp/deploy/images/zybo-zynq7
に以下のファイルが出来ていることを確認する。(各ファイルの役割は前回に続きikwzmさんの記事を参照されたい)
- boot.bin (u-boot-spl)
- u-boot.img (u-boot)
- uImage (Linuxカーネル)
- uImage-zybo-zynq7.dtb (デバイスツリー)
- uEnv.txt (u-bootの定義ファイル)
- core-image-minimal-zybo-zynq7.tar.gz (root filesystem)
上記のファイルに加えて、FPGAロジック(PL)のビットストリームファイルを別途準備する必要がある。今回はDigilentのZYBOベースシステムをダウンロードした上でVivado 2017.3で再生成した.bitファイルを利用した。
Boot手順のサマリ
meta-XilinxディレクトリにあるREADME.booting.md
の『Loading via SD』の項に記載がある通り、SDカードのパーティションを2つに分けたうえで、FAT16/32でフォーマットしたパーティション1にU-bootやデバイスツリーを、EXT4でフォーマットしたパーティション2にroot filesystem関連ファイルを置くという流れ。
SDカードの準備
8GB以上のMicro SDカードを使いパーティションを作成する。ちなみに私はラップトップPCのSDカードスロットを使ったことが祟ったのか、下記2件の対応で一夜を無駄にしてしまった。100均で購入したUSB-SDカードリーダーを使用することで一瞬で解決したのだが。。(追記:file systemマウント時のハングはVM設定のSATAの"ホストのI/Oキャッシュを使う"にチェックを入れて解決した)
SDカードの準備諸々は有難いことにmarseeさんのブログで丁寧に説明されており、このままの手順で参考にさせて頂いたため省略。最後にVivadoで生成したZYBOベースシステムのbitstream(.bit)をパーティション1にコピーしたら準備完了。
ZYBO動作確認⇒Boot失敗
ZYBOのMicro SDスロットにカードを入れ、JP5のジャンパをSDカードブートモードに変更したらボードに電源を投入。J11にUSBケーブルを繋ぎシリアルコンソールで起動ログを確認する。(ボーレートは115200)
U-Boot SPL 2017.01 (Oct 13 2017 - 20:26:56)
mmc boot
Trying to boot from MMC1reading system.dtb
spl_load_image_fat_os: error reading image system.dtb, err - -1
reading u-boot.img
reading u-boot.imgU-Boot 2017.01 (Oct 13 2017 - 20:26:56 +0900)
Model: Zynq ZYBO Development Board
Board: Xilinx Zynq
I2C: ready
DRAM: ECC disabled 512 MiB
MMC: sdhci@e0100000: 0
SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 16 MiB
*** Warning - bad CRC, using default environmentIn: serial@e0001000
Out: serial@e0001000
Err: serial@e0001000
Model: Zynq ZYBO Development Board
Board: Xilinx Zynq
Net: ZYNQ GEM: e000b000, phyaddr 0, interface rgmii-id
I2C EEPROM MAC address read failedWarning: ethernet@e000b000 (eth0) using random MAC address - 06:34:4e:34:c3:63
eth0: ethernet@e000b000
** Bad device size - mmc 0 **
Checking if uenvcmd is set ...
Hit any key to stop autoboot: 2 1 0
Copying FIT from SD to RAM...
** Bad device size - mmc 0 **
Zynq>
ステージ1のu-boot-splの起動(SDカードからの読出し)に失敗している?ようだ。検索すると似たような報告がされており、解決のためにmeta-Xilinxにパッチを2件適用してみろとのこと。
https://github.com/nathanrossi/meta-xilinx/commit/20ae90016aaacec9569c1cb34a60552231fe733d
https://github.com/nathanrossi/meta-xilinx/commit/6472328917c240d1ad03561f038a6fe2de8bb382
試しにBoot失敗後、下記のようにコンソールからmmcinfo
やfatls mmc 0
を実行するとSDカードのパーティション1のファイル群(6つ)が認識できていることが分かる。mmcをRe-scanすれば解決ということだろうか?
Zynq> mmcinfo
Device: sdhci@e0100000
Manufacturer ID: 2
OEM: 544d
Name: SA16G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 14.5 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
Zynq> fatls mmc 0
67184 boot.bin
475479 u-boot.img
3600208 uimage
582 uenv.txt
9235 uimage-zynq-zybo.dtb
2083850 system_wrapper.bit6 file(s), 0 dir(s)
おわりに
次回は上記の不具合原因を掘り下げて解決した上で、Linuxの起動までを追っていきたい。