イーサが動かない問題
はじめに
初めて作成した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に設定されていれば、初期化は失敗している可能性が非常に高い。
調査結果
調査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応答に失敗する。その原因を調査する。
調査内容
参考サイト:No.8に記載されているが、Windows10 はファイアウォールのせいで、ping応答に失敗するらしい。そこで、この参考サイトに従って設定を変更したところ、Windows10からもping応答が成功した。
調査結果
色々試して大変だったが、問題が解決できてよかった。
参考サイト
- Zyboリファレンスマニュアル
https://reference.digilentinc.com/reference/programmable-logic/zybo/reference-manual Ether PHYデータシート:RTL8211E
http://download3.dvd-driver.cz/realtek/datasheets/pdf/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdfZybo回路図
https://reference.digilentinc.com/_media/reference/programmable-logic/zybo/zybo_sch.pdfEthernet for Zybo Linux
https://forum.digilentinc.com/topic/9503-ethernet-for-zybo-linux/PetaLinux - システムのデバイスツリー DTS にイーサネット PHY 情報が含まれていない
https://japan.xilinx.com/support/answers/61117.htmlU-Bootコマンドの使用
http://www.u-boot.jp/download/Documents/uboot-commands.pdfZynq 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[Windows] Windows10 で ping が応答しない場合に確認すべき内容(Windows ファイアウォール) https://blog.dreamhive.co.jp/mkoba/?p=6055