イーサが動かない問題

はじめに

初めて作成したLinuxのイメージは、イーサが動かなかった(pingが応答しない)。原因は次の3つによるものであったが、これを見つけ出すのにすごく時間がかかった。


備忘録として、問題の解決策と原因を見つけ出すときに役立ったことをまとめる。

目次


イーサの原因調査

調査1:Ether PHYのリセット有効

LINK LEDや ACT LEDが点灯しなかったので、イーサが動かない原因は、Ether PHYのリセットが解除されていないのだと仮定した。

調査内容

  • 回路図とリファレンスマニュアルより、Ether PHYのリセット信号の接続関係や論理について調べる。

Zyboのリファレンスマニュアルより、イーサのブロック図を見ると、PHYのリセット信号「PHYRSTB」がFPGAにつながっていた。

イーサのブロック図

そして、Ether PHYのデータシートからリセット信号「PHYRSTB」の論理を見ると、ローアクティブであった。

リセット信号

Zyboの回路図を見ると、この信号は3.3vでプルアップされているので、FPGA側をLowに落とさない限り、電源投入後にリセットは解除される。

イーサ回路図

ただ、リセットが解除されていることを明示的にするため、トップモジュールに次を記述した。

module TopZybo(
+   output wire        ETH_RST_B,
    );
+    assign ETH_RST_B=1'b1;


調査結果

イーサが動かない原因は、Ether PHYのリセット信号によるものではなかった。

調査2:デバイスツリーの記述

次に、デバイスツリーの記述を疑った。ネットで検索すると、Xilinxリポジトリにあるデバイスツリーは、MDIOの記述がないらしい。

調査内容

  • MDIOのデバイスツリーを記載する箇所と記載内容を調査する。

ダウンロードしたXilinxリポジトリにあるデバイスツリーzynq-7000.dtsiを見ると、確かにMDIOの記載がなかった。他のデバイスツリーにもMDIOについては記載していなかった。

gem0: ethernet@e000b000 {
    compatible = "cdns,zynq-gem", "cdns,gem";
    reg = <0xe000b000 0x1000>;
    status = "disabled";
    interrupts = <0 22 4>;
    clocks = <&clkc 31>, <&clkc 31>, <&clkc 14>;
    clock-names = "pclk", "hclk", "tx_clk";
    #address-cells = <1>;
    #size-cells = <0>;
};


一方、digilentのデバイスツリーzynq-zybo.dtsを見るとMIDOの記載があった。試しに、このデバイスツリーを使用したのがだ、イーサは動かないままであった。

ps7_ethernet_0: ps7-ethernet@e000b000 {
    #address-cells = <1>;
    #size-cells = <0>;
    clock-names = "ref_clk", "aper_clk";
    clocks = <&clkc 13>, <&clkc 30>;
    compatible = "xlnx,ps7-ethernet-1.00.a";
    interrupt-parent = <&ps7_scugic_0>;
    interrupts = <0 22 4>;
    phy-handle = <&phy0>;
    phy-mode = "rgmii-id";
    reg = <0xe000b000 0x1000>;
    xlnx,eth-mode = <0x1>;
    xlnx,has-mdio = <0x1>;
    xlnx,ptp-enet-clock = <108333336>;
    mdio {
        #address-cells = <1>;
        #size-cells = <0>;
        phy0: phy@1 {
            compatible = "realtek,RTL8211E";
            device_type = "ethernet-phy";
            reg = <1>;
        } ;
    } ;
} ;


digilentのフォーラムを色々と検索していると、同じ問題に遭遇している人が書き込みしていた参考サイト:No.4参考サイト:No.5より、どうやら、Ether PHYの情報はボード固有のものなので、zynq-7000.dtsiには書き込まないらしい。そこで、フォーラムの内容を参考に、MIDOのデバイスツリーを追加した。その内容は、ここで説明している。

調査結果

  • MDIOのデバイスツリーの記述が抜けていた。
  • ただし、この記述を追加しても、イーサは動かなかった。

調査3:U-bootでイーサの動作確認

バイスツリーを修正したにもかかわらず、イーサが動かなかった。原因がデバイスツリー側によるものなのか、Ubuntu側によるものなのか、わからなかった。そこで、デバイスツリーが正しいことを確認するために、U-bootでイーサの動作を行った。

調査内容

  • U-bootでイーサの動作を行い、デバイスツリーが正しいか確認する。

U-bootでイーサの動作確認(ping応答)を確認するために、IPアドレスの設定を行う。参考サイト:No.6-7を参考にしている。

手順

1.次のコマンドを入力し、IPアドレスを設定する。
Zynq> setenv ipaddr 192.168.1.10

2.設定したアドレスが反映されているか確認する。
Zynq> print ipaddr
ipaddrの後に設定したアドレスが記載されていればよい。
ipaddr=192.168.1.10

3.ping応答によるイーサの動作確認を行う。デバイスツリーの設定が正しければ2回目にはping応答確認が成功する。

Zynq> ping 192.168.1.5
ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
ping failed; host 192.168.1.5 is not alive
Zynq> ping 192.168.1.5
Using ethernet@e000b000 device
host 192.168.1.5 is alive


バイスツリーの設定が間違えていた場合、2回目以降もping応答は失敗するとの表示が出る。

Zynq> ping 192.168.1.5
Using ethernet@e000b000 device

ARP Retry count exceeded; starting again
ping failed; host 192.168.1.5 is not alive


4.ちなみに、ping応答に失敗した場合、PHYの初期化がどこまで確認されたか確認した方がよい。その場合のコマンドと結果を次に示す。

Zynq> mii info
PHY 0x00: OUI = 0x0732, Model = 0x11, Rev = 0x05, 100baseT, FDX
PHY 0x01: OUI = 0x0732, Model = 0x11, Rev = 0x05, 100baseT, FDX
Zynq> mii dump
0.     (1140)                 -- PHY control register --
  (8000:0000) 0.15    =     0    reset
  (4000:0000) 0.14    =     0    loopback
  (2040:0040) 0. 6,13 =   b10    speed selection = 1000 Mbps
  (1000:1000) 0.12    =     1    A/N enable
  (0800:0000) 0.11    =     0    power-down
  (0400:0000) 0.10    =     0    isolate
  (0200:0000) 0. 9    =     0    restart A/N
  (0100:0100) 0. 8    =     1    duplex = full
  (0080:0000) 0. 7    =     0    collision test enable
  (003f:0000) 0. 5- 0 =     0    (reserved)


speed selection が1000 Mbpsに設定されていれば、初期化は正常に行われている可能性が高い。逆に、speed selection が10 Mbpsに設定されていれば、初期化は失敗している可能性が非常に高い。

調査結果

  • U-bootでイーサが正常に動作することを確認した。
  • バイスツリーは正しく設定されており、Ubuntu側に問題があることが分かった

調査4:Ubuntu側の設定確認

調査3より、イーサが動かない原因はUbuntu側にあることが分かった。Ubuntuでイーサが動かない原因を調査する。

調査内容

  • Ubuntuでイーサが動かない原因を調査する。

手順

1.ifconfigでネットワーク状況を確認する。

ita@ita-VirtualBox:~$ ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:164 errors:0 dropped:0 overruns:0 frame:0
          TX packets:164 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:12136 (12.1 KB)  TX bytes:12136 (12.1 KB)

表示では、eth0が表示されていなかった。

2.次に、ifconfig -a コマンドを入力し、稼働していないネットワークも含めて状況を確認した。 でネットワーク状況を確認する。

eth0      Link encap:Ethernet  HWaddr e2:7c:ef:97:da:b4
          BROADCAST MULTICAST  MTU:1500  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:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:28 Base address:0xb000

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

sit0      Link encap:IPv6-in-IPv4
          NOARP  MTU:1480  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:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0は認識されてはいるが、IPアドレスが設定されていないようだった。そこで、eth0のIPアドレスを設定する。
3.sudo ifconfig eth0 192.168.1.10とコマンドを入力し、IPアドレスを設定する。

ita@ita-VirtualBox:~$ sudo ifconfig eth0 192.168.1.10
sudo: unable to resolve host ita-VirtualBox: Connection refused


4.ifconfigでネットワーク状況を確認する。

[sudo] password for ita:
ita@ita-VirtualBox:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr e2:7c:ef:97:da:b4
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::e07c:efff:fe97:dab4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:43 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3442 (3.4 KB)  TX bytes:656 (656.0 B)
          Interrupt:28 Base address:0xb000

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

eth0が表示されるようになった。

5.この状態で、pingの応答確認を行う。

ita@ita-VirtualBox:~$ ping 192.168.1.5
PING 192.168.1.5 (192.168.1.5) 56(84) bytes of data.
64 bytes from 192.168.1.5: icmp_seq=1 ttl=128 time=0.452 ms
64 bytes from 192.168.1.5: icmp_seq=2 ttl=128 time=0.364 ms
64 bytes from 192.168.1.5: icmp_seq=3 ttl=128 time=0.380 ms
64 bytes from 192.168.1.5: icmp_seq=4 ttl=128 time=0.384 ms
64 bytes from 192.168.1.5: icmp_seq=5 ttl=128 time=0.476 ms


IPアドレスを設定することで、Ubuntu側でイーサが動作した。 ただし、電源投入時に毎回IPアドレスの設定しなければならないので、設定ファイルを書き換えた。

6.設定ファイルの変更(IPアドレス追加) 方法は、ここ記載している。

これにより、毎回IPアドレスを設定しなくてもUbuntu側でイーサが動作する。ただし、windows側ではping応答に失敗することが分かった。次は、この原因を調査する。


調査結果

調査5:Window側の設定確認

Ubuntu側(Zybo)でイーサが動作したが、windows側ではping応答に失敗する。その原因を調査する。

調査内容

  • windows側ではping応答に失敗する原因の調査

参考サイト:No.8に記載されているが、Windows10 はファイアウォールのせいで、ping応答に失敗するらしい。そこで、この参考サイトに従って設定を変更したところ、Windows10からもping応答が成功した。

調査結果

色々試して大変だったが、問題が解決できてよかった。

参考サイト

  1. Zyboリファレンスマニュアル
    https://reference.digilentinc.com/reference/programmable-logic/zybo/reference-manual
  2. Ether PHYデータシート:RTL8211E
    http://download3.dvd-driver.cz/realtek/datasheets/pdf/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf

  3. Zybo回路図
    https://reference.digilentinc.com/_media/reference/programmable-logic/zybo/zybo_sch.pdf

  4. Ethernet for Zybo Linux
    https://forum.digilentinc.com/topic/9503-ethernet-for-zybo-linux/

  5. PetaLinux - システムのデバイスツリー DTS にイーサネット PHY 情報が含まれていない
    https://japan.xilinx.com/support/answers/61117.html

  6. U-Bootコマンドの使用
    http://www.u-boot.jp/download/Documents/uboot-commands.pdf

  7. Zynq 7010: u-boot PHY is not detected
    https://forums.xilinx.com/t5/Embedded-Linux/Zynq-7010-u-boot-PHY-is-not-detected/td-p/804993

  8. [Windows] Windows10 で ping が応答しない場合に確認すべき内容(Windows ファイアウォールhttps://blog.dreamhive.co.jp/mkoba/?p=6055