2017/07/10

[zybo]PetaLinux (2)

前回は、PetaLinux v2017.2をカスタマイズ無しでビルドして、ZYBOで動くことは確認できたけれども、Ethernetの設定などが動いていなさそうだ、というところまでだった。


ログを見る限りでは、IntelのEthernetドライバを使っているようだったのだが、ZYBOにはカニマークのチップが載っている。
RTL8211E-VLというチップのようだ。
FPGAはともかく、デバイスドライバ周りはLinuxの範囲だから、ちゃんと仕立てないといかん。


PetaLinux v2017.2のリファレンスガイドによると、ZYBOで関係しそうなAuto Config SettingsのDevice-Treeファイルは、

  • skeleton.dtsi
  • zynq-7000.dtsi
  • pcw.dtsi
  • system-conf.dtsi
  • system-top.dts

のようだ。

それ以外にLinuxで関係するのだったら、kernelのconfigか。
こちらは別フォルダで、project-spec/meta-plnx-generated/recipes-kernel/linux/configs/plnx_kernel.cfgにある。
reciepsというフォルダ名があるので、Yocto Projectなのか。


Digilentのpetalinux-bspsにもdevice-treeのディレクトリがある。
そして、kernelのconfigもあるようだ。


まず、Device Treeから片付ける。

dtsiの"i"は、includeの"i"。
components/plnx_workspace/device-tree-generation/system-top-dtsの中で*.dtsiをincludeしている。

推測だが、zynq7000.dtsiは差分があるものの、zynq7000シリーズに共通の設定が書いてありそうな気がするから、最新のものを使った方がよいのではなかろうか。

pcw.dtsiは、差分をマージしよう。
skeleton.dtsiは差分がないので、そのまま。

残るはsystem-conf.tdsiとsystem-top.dts。
どちらも差分が多い。

Digilentの方は、system-top.dtsでsystem-conf.dtsiだけをincludeし、system-conf.dtsiが他をincludeしている。

system-top.dts
  system-conf.dtsi
    skeleton.dtsi
    zynq-7000.dtsi
    pcw.dtsi
    pl.dtsi


生成した方はzynq-7000.dtsi, pl.dtsi, pcw.dtsi, 最後にsystem-user.dtsiをincludeしている。
system-conf.dtsiは、plnx_arm-system.ppというファイルに出てきたのだが、これは自動生成されたファイルのような気がする。
コメントからすると、system-user.dtsiがsystem-conf.dtsiをincludeしているのかな?

system-top.dtsi
  zynq-7000.dtsi
  pl.dtsi
  pcw.dtsi
  system-user.dtsi
    system-conf.dtsi


system-conf.dtsiはコメントに"DO NOT modify"となっているから、いじりたくはない。
しかし、アドレスっぽいものが書いてあるので、system-conf.dtsiに反映するための設定がどこかにあるはずだ。


他の設定はともかく、Ethernetのドライバは、kernelのmenuconfigで、ドライバを適当に選んだらうまいことやってくれるんじゃないの?

zynq / zybo > ZyboにてPetalinuxでEthernetを使うまでの手順 - Qiita

&gem0を書き換えたそうだ。
petalinux-config -c kernelも見てみたが、PHYなんかは比較的設定されているように見えるのだ。

system-conf.dtsiは書き換えたくなかったが、includeの関係からすると、そこを書き換えるのが一番よさそうに見える。
今回は、ZYBOの方にある&gem0の設定を追記して、petalinux-buildし直す。

ダメだ、変わらん。
ZYBOのPHY設定をコピーするのではなく、上記リンク先に書いてあるように書き換えた。
違いは、regやxlnxが追加されているというところか。

・・・ダメだった。
ログが変わらんので、どこかが足りないのか。

Generic PHY e000b000.etherne:00: attached PHY driver [Generic PHY] (mii_bus:phy_addr=e000b000.etherne:00, irq=-1)
e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
e1000e: Copyright(c) 1999 - 2015 Intel Corporation.

しかし、こちらのログでは、e1000eだがネットにつながっている。
PetaLinuxプロジェクトの新規作成 - ぼくの技術日誌

こちらはPHY driverがRTL8211Eとなっているが、私のところではGeneric PHYになっている。
そこだろうけど、kernelのconfigはRealtek PHYsにチェックを入れてるしなぁ。


Subsystem AUTO Hardware SettingsのEthernet Settingsで"ps7_ethernet_0"になっているのが関係しているのだろうか?
これ以外の選択は"manual"しかないのだが。。。



リファレンスガイドを見ていると、そういう設定は"system-user.dtsi"に書くようだ。
場所は、project-spec/meta-user/recipes-bsp/device-tree/filesの下にあった。

/include/ "system-conf.dtsi"
/ {
};
&gem0 {
	phy-handle = <&phy0>;
	phy-mode = "rgmii-id";
	reg = <0xe000b000 0x1000>;
	xlnx,eth-mode = <0x1>;
	xlnx,has-mdio = <0x1>;
	xlnx,ptp-enet-clock = <108333336>;
	ps7_ethernet_0_mdio: mdio {
		phy0: phy@1 {
			compatible = "realtek,RTL8211E";
			device_type = "ethernet-phy";
			reg = <1>;
		};
	};
};

新しくprojectを作り直した。
が、全然だめになった。

macb e000b000.ethernet: invalid hw address, using random
libphy: MACB_mii_bus: probed
mdio_bus e000b000.etherne:01: mdio_device_register
macb e000b000.ethernet eth0: no PHY found

少なくとも、以前はPHYを認識できていたということか。
そして比較して気付いたが、U-Bootの段階で以前はログが出ていた。

Net:   ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
PHY is not detected
GEM PHY init failed
No ethernet found.

ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
No ethernet found.
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'

eth0はLinuxで見えていたのだが、U-Bootだから設定していないので出ているログなのだろうか?

念のため、system-user.dtsiに追加した部分をコメントアウトしたが、ちゃんとeth0が見えた。
ただ、U-Bootのログが出ていない・・・・あ、Subsystem AUTO Hardware SettingsのEthernet SettingsでPrimary Ethernetをmanualにしていたのをわすれていた。
設定をp7にすると、U-Bootに同じログが出た。


ということは、Subsystem AUTO Hardware SettingsはLinuxでEthernetを使うことに関しては影響がないということか。
PHYのところがうまくいってないのか。

まあ、少なくとも、system-user.dtsiに書いたことが原因でethernetのPHYが認識しなくなったのだから、ここにうまいこと書けばよいのだろう。


&gem0 {
	phy-handle = <&phy0>;
	phy-mode = "rgmii-id";
	gem0_mdio: mdio {
		phy0: phy@1 {
			compatible = "realtek,RTL8211E";
			device_type = "ethernet-phy";
			reg = <1>;
		};
	};
};

これはpetalinux-bspsに書いてあった内容だが、ダメ。
U-Bootに出てくるログで、phyaddrが1になった。

macb e000b000.ethernet eth0: Cadence GEM rev 0x00020118 at 0xe000b000 irq 145 (00:0a:35:00:22:01)
Generic PHY e000b000.etherne:00: attached PHY driver [Generic PHY] (mii_bus:phy_addr=e000b000.etherne:00, irq=-1)

  ↓↓

mdio_bus e000b000.etherne:01: mdio_device_register
macb e000b000.ethernet eth0: no PHY found

見比べると、eth0が見えているときはirq=-1だから、変な感じがする。
アドレスは指定していないのに、0xe000b000になるのも、なんとなく気になる。


うーん、わからん。。。
知識がない分、地道にdtsiを変更しながら動作を見ていくしかないのか。

2 件のコメント:

  1. わたしも同じ状況で、今やPetalinux2014.4に戻そうかと思ってます。
    「Xilinxのバカヤローこの3日間の休みを返せ、余計な変更ばかりして」との思いです

    返信削除
    返信
    1. うぅ、仲間が。。。

      Linux環境ができたらHDL勉強するんだ!とがんばっているものの、気力が続くか心配です。
      Xilinxの開発ボードだったら標準でサポートされてるんでしょうね。

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。