ZYBOのクロス開発環境の構築(2) SDカードからのLinux起動⇒失敗

#はじめに
[ZYBOのクロス開発環境の構築 (2017年10月時点)](https://qiita.com/Rohira/items/de246219b82bfededd35)でLinuxのビルドが完了してから、実際にDigilentのZYBOでLinuxが起動するまでを記載する。(結局本稿内ではまだBoot完了できておらず…)　実働工数は12h程度。

#ビルド生成物の確認
bitbakeコマンド実行後、ビルドが完了したら`/poky/build/tmp/deploy/images/zybo-zynq7`に以下のファイルが出来ていることを確認する。(各ファイルの役割は前回に続き[ikwzmさんの記事](https://qiita.com/ikwzm/items/efacec8d8e0744e17d45)を参照されたい)

- 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ベースシステム](https://reference.digilentinc.com/reference/programmable-logic/zybo/start)をダウンロードした上で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キャッシュを使う"にチェックを入れて解決した)

- [仮想環境のUbuntuがSDカードスロットを認識してくれない問題](http://rizwanansari.net/access-sd-card-on-linux-from-windows-using-virtualbox/)
- [EXT4フォーマットしてfile systemをMountするとVM上のUbuntuがハングする問題](https://unix.stackexchange.com/questions/254696/formatting-an-sdcard-with-mkfs-hangs-indefinitely)

SDカードの準備諸々は有難いことに[marseeさんのブログ](http://marsee101.blog19.fc2.com/blog-entry-2818.html)で丁寧に説明されており、このままの手順で参考にさせて頂いたため省略。最後に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.img


>U-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 environment

>In:    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 failed

>Warning: 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カードからの読出し)に失敗している？ようだ。検索すると[似たような報告](https://lists.yoctoproject.org/pipermail/meta-xilinx/2017-June/003012.html)がされており、解決のために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.bit 

>6 file(s), 0 dir(s)

#おわりに
次回は上記の不具合原因を掘り下げて解決した上で、Linuxの起動までを追っていきたい。