ZYBO (Zynq) 初心者ガイド (13) LAN(Ethernet 0)を使う (PetaLinux)

- [1回目: 開発環境の準備](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b)
- [2回目: Hello Worldプロジェクト](https://qiita.com/take-iwiw/items/24a8a94741fdbb80f62a)
- [3回目: PSのGPIOでLチカ](https://qiita.com/take-iwiw/items/39d2ed00fa88a1204fce)
- [4回目: PLのAXI GPIOでPSからLチカ](https://qiita.com/take-iwiw/items/a3b935a4e4dbd41593e1)
- [5回目: PLだけでLチカ](https://qiita.com/take-iwiw/items/efcdfca1866b9941fd2a)
- [6回目: 自作IPでLチカ](https://qiita.com/take-iwiw/items/b0f2ce7b4653bc6f32b9)
- [7回目: ブートイメージを作る](https://qiita.com/take-iwiw/items/ece0cdf83e6e1908fad8)
- [8回目: Linux起動する](https://qiita.com/take-iwiw/items/6e6915f7318689818368)
- [9回目: Linuxカーネルを少しカスタマイズする](https://qiita.com/take-iwiw/items/6f2644d16cbfdb021d07)
- [10回目: LinuxのRootFSをカスタマイズする / PythonでHello World](https://qiita.com/take-iwiw/items/94a90047978664159681)
- [11回目: LinuxユーザアプリケーションでLチカ](https://qiita.com/take-iwiw/items/5e4ab9a106acfda2c866)
- [12回目: LinuxカーネルモジュールでLチカ](https://qiita.com/take-iwiw/items/e7efc48d92d7b979efdc)
- __[13回目: LAN(Ethernet 0)を使う](https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8) <--- 今回の内容__
- [14回目: Linuxユーザアプリをデバッグする / RootFSに取り込む](https://qiita.com/take-iwiw/items/8134ca7098622219b177)
- [15回目: Linux起動時にアプリケーションを自動実行させる](https://qiita.com/take-iwiw/items/50065df6cdd1ba8bcbd6)
- [16回目: Linuxから自作IPをUIOで制御する](https://qiita.com/take-iwiw/items/da91ce4dc2a8a8df3c0a)
- [17回目: Linuxで自作IPのデバイスドライバを作る](https://qiita.com/take-iwiw/items/05eb1204cb51ce0a5c03)
- [18回目: IoT化してスマホからLチカ](https://qiita.com/take-iwiw/items/e9311292c5078d785699)

この記事の内容を3分で見る ( https://youtu.be/n2yYwEIjD2Y の前半)

# ZYBO (Zynq) 初心者ガイド (13) LAN(Ethernet 0)を使う (PetaLinux)
ZYBOでLAN(Ethernet 0)を使い、ネットワーク接続するための方法です。数時間ハマり、ネットの情報も探しまくってようやくできるようになりました。問題はVivadoでのハードウェア設定でした。(デバイスツリー(dtsi)の編集は不要)

# 環境
- 開発用PC: Windows 10 64-bit
    - Vivado 2017.4 WebPACKライセンス
    - Xilinx SDK 2017.4 <- 今回は使わない
- 開発用PC (Linux): Ubuntu 16.04 本家 (日本語版じゃない) (on VirtualBox 5.2.4)
    - PetaLinux 2017.4
- ターゲットボード: ZYBO (Z7-20)
    - ボードファイル: https://github.com/Digilent/vivado-boards/archive/master.zip
  
# Vivadoでハードウェアを作る
Vivadoプロジェクトを作ります。ボードにはZ7-20を指定して、IP Integrator上でPSのみを配置します。[こちらの記事の前半](https://qiita.com/take-iwiw/items/24a8a94741fdbb80f62a)を参考にしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214268/7cf22e7e-bab8-a980-86ce-cd6538ef248f.png)

## PSのPeripheral I/O Pinsの設定
__これが重要です__

下記はZybo Z7 Board Reference Manual内に記載されているEthernet PHYの信号接続図です。これを見ると、MDIOはMIO52とMIO53に接続されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214268/2f41af14-776c-4428-d711-8aa30765d977.png)

プロジェクトの初期状態だと、Ethernet 0のMDIOはEMIOに接続されているので、それをMIO52とMIO53に変えます。IP Integrator上でPSブロックをダブルクリックして、Peripheral I/O Pinsタブを開き、以下のようにMDIOを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214268/5ef53e84-4583-474a-e6fe-116e3024d118.png)

https://forum.digilentinc.com/topic/4975-solved-ethernet-phy-on-zybo-board-using-vivado-20172/
https://forum.digilentinc.com/topic/4964-zybo-z7-20s-embed-linux-could-not-connect-ethernet-is-there-a-bug-in-the-board-file-of-zybo-z7-20/

2017/10/10に中の人っぽい人が、「ボードファイル作っているエンジニアにこの問題を知らせておくよ」って言っているので、おそらくこれはDigilentのボードファイルのバグ。まだ治っていないもよう。

# PetaLinuxでLinuxイメージを作る
PetaLinuxツールでLinuxイメージを作ります。Vivadoで作成したhdf(project_1.sdkフォルダ)をUbuntu側にコピーして、以下コマンドを発行します。[こちら](https://qiita.com/take-iwiw/items/6e6915f7318689818368)を参考にしてください。

```sh:開発PC(Linux)のターミナル
cd ~/work/peta
petalinux-create --type project --template zynq --name SimplePS
cd SimplePS/
petalinux-config --get-hw-description=../project_1.sdk
petalinux-build
petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/design_1_wrapper.bit --u-boot
```

カーネルコンフィグやデバイスツリー(dtsi)を変更する必要はありません。


# 確認する
出来上がったBOOT.binとimage.ubをSDカードにコピーして起動します。なお、ZYBOボードのLANポートにはLANケーブルを刺して、家庭内のルータに接続します(DHCP有効)。

起動後、ifconfigで確認すると、ちゃんとネットワークに接続されて、IPアドレスも取得出来ています。

```sh:Zyboのターミナル
oot@Eth:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0A:35:00:1E:53
          inet addr:192.168.1.87  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20a:35ff:fe00:1e53%lo/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1076 (1.0 KiB)  TX bytes:1709 (1.6 KiB)
          Interrupt:27 Base address:0xb000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1%1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```

同じルータに接続されているWindows PCからpingを打ってみます。ちゃんと通信出来ていることが確認できます。

```sh:PCのコマンドプロンプト
C:\Users\tak>ping 192.168.1.87

192.168.1.87 に ping を送信しています 32 バイトのデータ:
192.168.1.87 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.1.87 からの応答: バイト数 =32 時間 =1ms TTL=64
```

さらに、Googleさんに接続してみます。ちゃんとコンテンツを取得出来ています。

```sh:Zyboのターミナル
root@Eth:~# wget http://www.google.co.jp/
Connecting to www.google.co.jp (216.58.196.227:80)

index.html           100% |*******************************| 11289   0:00:00 ETA
root@Eth:~# more index.html
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="
```

# まとめ
ということで、悪いのは全て、Vivado上でのIOの接続設定でした。