1500円ZYNQ基板で microSD から起動する

#はじめに
1500円 ZYNQ 基板(EBAZ4205)で、microSD から起動できるようにします。
標準搭載の NAND 起動と、microSD 起動を、スイッチで切り替えられます。
リセットボタンの追加で、電源を入れたままスイッチを切り替えて、NAND / microSD どちらでも、即再起動が可能になります。

(2021.4.22 更新)
「NAND/microSD 起動切り替えスイッチの取り付け」の回路図と写真を更新しました。
SW で R2577 をショートして VCC 直結だと、microSD 起動したときに NAND が認識されませんでした。
SW で 1KΩ プルアップを ON/OFF に変更して、microSD 起動時に NAND の認識/書換ができるようにしました。


#microSDソケットのはんだ付け

購入した EBAZ4205 は、後期コストダウン版のため、microSD のソケットが実装されていませんでした。
ソケットが別添付されている物を購入しましたので、自分ではんだ付けします。

はんだ吸い取り線で、端子(パッド)のはんだを吸い取って、綺麗にしてから、ソケットをはんだ付けします。
フラックスクリーナ(うちはジッポーのオイル + 綿棒)で綺麗にしたら出来上がり。
![5_SD_socket.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/63bb01ce-cc29-fc82-355f-8d5898733683.jpeg)


#NAND/microSD 起動切り替えスイッチの取り付け
ZYNQ のブートデバイスを切り替え式にするため、スイッチを取り付けます。
NC(非実装)になっている R2577 に、1KΩ プルアップを ON/OFF するスイッチを取り付けると、オンで microSD 起動、オフで NAND 起動になります。
![1-1改.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/1fe09316-47c2-5cfc-1022-c1079195f093.png)

取り付けるスイッチは、SPST のものでよいです。
今回は手持ちの SPDT のものを使っています。

R2577 に 1KΩ 抵抗を取り付けて、配線を引き出します。
![1_改.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/c3679fd8-9c47-10d7-b753-edf45e3af65e.jpeg)

部品面にスイッチを取り付けます。
分かりやすいよう、基板に起動モードを書いておきました。
写真の位置だと、microSD から起動します。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7e4681ec-d57f-386c-21d9-e8c4c45fd071.jpeg)


#リセットボタンの取り付け
ZYNQ のハードウェアリセットを行うため、リセットボタンを追加します。
リセットボタンは無くても使えますが、再起動時にいちいち電源のオン・オフをするのは、とても面倒です。
ZYNQ の開発では、リセットボタンが必須ですので、是非つけましょう。

リセットIC U65(SGM706-SYS8) の 1pin(MR = Manual Reset 端子)と GND をショートさせると、リセットを掛けられます。
![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/3e6992e6-9df8-f5d2-02b4-5b1f2081be96.png)

U65 の 1pin と GND 間に小型タクトスイッチを取り付けました。
電源オンのままで起動モードを切り替えて、ボタンを押せばリブートできます。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/aadfdf94-d698-fb84-90e2-b0db57eff4a5.jpeg)


写真で、基板外周のベタ部分は、ねじ穴をフレームと接続するために信号 GND とは高インピーダンス接続になっていて、GND になりません。
Y3 のガード部分が通常の GND ですので、そこに接続しています。

リセット信号は、ZYNQ の PS_POR_B と、Ether PHY の RESET.N 端子に接続されています。
リセットボタンを押すと、強制リセットがかかります。

ZYNQ がハングアップしたり、microSD のイメージを書き換えて再起動したりするとき、ポチっと押すだけでよいので、とても捗ります。


#microSD 起動テスト用のブートイメージ

野良リソース検索の結果、こちらでテスト用のブートイメージが紹介されていました。
https://embed-me.com/ebaz4205-recycle-cheap-crypto-miner-part-1/

Buildroot image
https://drive.google.com/file/d/16wQKpiYsH0gQ7KmnnYMrmFdCxwkF3WS4/view?usp=sharing

RasPi でもおなじみ、Win32 Disk Imager で microSD に書き込みます。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/c62489f9-4727-d66c-43e8-b4c2f0c4d1e1.png)

#microSD からブート
スイッチを切り替えて、microSD からブートするとこんな感じ。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0a9a6b56-da95-77c5-c97c-1d51725fece8.png)
root/root でログインできます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7a2c21dc-f507-3532-3175-6d53287ef458.png)


LAN(eth0)は認識されません。

PHY に供給する 25 MHz の振動子+周辺部品が実装されていない後期コストダウン版 EBAZ4205 では、PS から 25MHz を出力する必要があります。
そのように構築されていない事が原因のようです。

紹介ページの後ろの方に、boot.bin を置き換えれば eth0 が認識されると記述があります。
試したところ eth0 は確かに認識されるのですが、PS から 25 MHz が出力されず、やはり LAN は使えませんでした。

#microSD の見え方
/dev/mmcblk0
/dev/mmcblk0p1
/dev/mmcblk0p2

の3つが microSD のデバイスです。

mount /dev/mmcblk0p2 /mnt/
とすると、microSD のパーティション2 が /mnt にマウントされます。

```
buildroot ~ # mount /dev/mmcblk0p2 /mnt/
buildroot ~ # cd /mnt
buildroot /mnt # ls
bin   dev  lib    linuxrc     media  opt   root  sbin  tmp  var
boot  etc  lib32  lost+found  mnt    proc  run   sys   usr
buildroot /mnt #
```

/dev/mmcblk0p1 は、fat ファイルシステムが buildroot イメージに含まれていないため、マウントできないようです。

buildroot ブートイメージでは、PS に i2c とか spi の機能も含まれていません。

RasPi 的に使える汎用ブートイメージを作って、PS から PL を都度ダウンロードする形にするのが理想です。
ここから先はガチの petalinux 開発が必要になりますので、後日の課題にします。
(私自身、petalinux の環境構築はやったことが無いので、ゼロからのスタート)

なお、FPGAプログラミング大全 Xilinx 編(第2版)の Appendix II-3 では、ベアメタル？で SD カード起動する方法が解説されています。


#microSD を読んでみる
上で作成した microSD を挿したまま、起動元を NAND に切り替えて再起動します。

元の EBAZ4205 マイニング用 linux が起動しますが、microSD を自動でマウントしてくれ、読み書きできます。

マウント先は、
/run/media/mmcblk0p1
/run/media/mmcblk0p2
の2箇所です。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/6ae52009-544e-e4f7-0c44-3e634673c7f5.png)


mmcblk0p1 は、windows から読み書きできるパーティションで、ZYNQ のブートファイル(boot.bin, boot.scr, u-boot.bin)があります。
mmcblk0p2 は、buildroot の linux 起動パーティションで、/ 以下の各ディレクトリがあります。


#まとめ
EBAZ4205 で、microSD を使ってブートイメージの開発ができることがわかりました。
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d97e89f9-90d1-307d-26eb-b98d53bc5bae.jpeg)