勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

ZYBOを進める - 16. Ethernetを使う

いつものチュートリアル通りなら、カーネルモジュールを作ってみるところですが、通常のユーザアプリケーションとそれほど変わらなかったので、必要になったらやろうと思います。

Ethernetの使用

ZYBOには、LANコネクタ(RJ45)とPHY(Realtek RTL8211E-VL)が載っていて、イーサネットを使うことができます。
また、Microchipの24AA02E48 EEPROMが搭載されていて、この中にMACアドレスも入っています。

前回までで作成したものですでにイーサネットが使えるようになっていたようで、ZYBOをLANケーブルでルータに接続して、ifconfigをしてみると、

root@Zybo-base-linux-peta:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0A:35:00:1E:53
          inet addr:192.168.0.10  Bcast:192.168.0.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:625 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:30380 (29.6 KiB)  TX bytes:8316 (8.1 KiB)
          Interrupt:29 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)

root@Zybo-base-linux-peta:~# random: crng init done

と、IPアドレスの取得ができているようでした。

ちなみに、ZYBOのLAN接続なしで起動して、ifconfigをやってみると、

root@Zybo-base-linux-peta:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0A:35:00:1E:53
          UP 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:29 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)

root@Zybo-base-linux-peta:~#

と、IPアドレスは取得されていませんでした。

MACアドレス

ifconfigの結果を見てみると、MACアドレス00:0A:35:00:1E:53 となっています。
これを調べてみると、上側3桁はどうもXilinxのOUI (Organizationally Unique Identifier)のようでした。

MACアドレス検索 - UIC

しかも、参考サイトと全く同じ番号でした。 なので、これはXilinxが一律で適当に割り当てたMACアドレスだと考えられます。

ちゃんと固有のMACアドレスを使うようにしたいので、調べてみました。
ちょうどDigilentのフォーラムでぴったりのものがありました。

forum.digilentinc.com

FSBLのプロジェクトで、fsbl_hooks.cのFsblHookBeforeHandoff()関数の中に、上記に記載のコードをコピーすればいいようです。

ちょうど一度FSBLのプロジェクトを作成していた(https://nokixa.hatenablog.com/entry/2019/07/03/015508)ので、ここにコードをコピーして、ビルドしてfsbl.elfを作成します。

やってみると、コンパイルでエラーが出てしまいました。 f:id:nokixa:20190812170551p:plain:w400

いくつかのドライバへのインクルードを追加しないといけないようです。

#include "xiicps.h"
#include "xemacps.h"

ついでに、fsbl.debug.hに#define FSBL_DEBUG_INFOを追加しておくと、FSBLのデバッグメッセージが見られるようです。 zybo のカスタムシステムの作成 - ippeiの日記

これでコンパイルが通りました。

次に、Linux起動イメージを作成します。
petalinux-packageコマンドを実行したときに、fsblを指定するオプションがあったので、ここで今回作成したfsbl.elfを指定します。

petalinux-package --boot --force --fsbl ../fsbl.elf --fpga images/linux/system_wrapper.bit --u-boot

※Petalinuxプロジェクトディレクトリの1つ上にfsbl.elfを置きました。

これで、BOOT.BINが更新されたようです。

noki@ubuntu:~/work/Petalinux/Zybo-base-linux-peta$ ll images/linux/
total 210932
drwxrwxr-x 2 noki noki     4096 Jul  1 15:19 ./
drwxrwxr-x 3 noki noki     4096 Jun 30 12:24 ../
-rw-rw-r-- 1 noki noki  2624888 Aug 12 02:08 BOOT.BIN
-rw-r--r-- 1 noki noki  3771012 Jul 29 12:45 image.ub
-rw-r--r-- 1 noki noki 15282688 Jul 29 12:45 rootfs.cpio
-rw-r--r-- 1 noki noki  6963256 Jul 29 12:45 rootfs.cpio.gz

...

このBOOT.BINをSDにコピーして、これでZYBOを起動してみます。 ちなみに、FSBLのデバッグメッセージが以下のように出てきます。

Xilinx First Stage Boot Loader
Release 2017.4  Aug 12 2019-18:47:37
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000

...

DMA Done !

FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00019A9A
Data Word Len: 0x00019A9A
Partition Word Len:0x00019A9A
Load Addr: 0x04000000
Exec Addr: 0x04000000
Partition Start: 0x000868C0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xF7F2C500
Application
Handoff Address: 0x04000000
In FsblHookBeforeHandoff function
Look Up I2C Configuration                    #### このあたりでMACアドレス読み出し ####
I2C Initialization
Set I2C Clock
Set Memory Read Address
Get Mac Address
MAC Addr: D8 80 39 5C 83 8B
Look Up Emac Configuration
Emac Initialization
Set Emac MAC Address
Verify Emac MAC Address
SUCCESSFUL_HANDOFF
FSBL Status = 0x1


U-Boot 2017.01 (Aug 14 2019 - 10:54:44 -0700)        #### <-ここからU-Boot ####
...

こんな形で、MACアドレスの読み出しを行っていることが確認できました。 再度ifconfigしてみると、

root@Zybo-base-linux-peta:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0A:35:00:1E:53
          inet addr:192.168.0.10  Bcast:192.168.0.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:1306 errors:0 dropped:0 overruns:0 frame:0
          TX packets:87 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:62672 (61.2 KiB)  TX bytes:15854 (15.4 KiB)
          Interrupt:29 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)

だめでした...

MACアドレスの設定

調べてみると、Petalinuxプロジェクトの設定の中にMACアドレスを設定するところがありました。

参照 → Petalinux Reference Guide (UG1144) のp86 "Ethernet Settings" https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_2/ug1144-petalinux-tools-reference-guide.pdf

開発用Ubuntuに戻って、petalinux-configで設定を確認してみます。
今回は、メインメニュー ---> Subsystem AUTO Hardware Settings ---> Ethernet Settings を見てみます。

f:id:nokixa:20190815015300p:plain:w600

EEPROMからMACアドレスを読み出す場合は、この中の、"Ethernet MAC address"を空にすればいいようです。

空にしてSave、Exitします。 その後、いつも通りビルド、ブートイメージの作成を行い、SDカードに成果物をコピー、これでZYBOを起動します。 ifconfigしてみると、

root@Zybo-base-linux-peta:~# ifconfig
eth0      Link encap:Ethernet  HWaddr CA:D0:EC:57:1E:02
          inet addr:192.168.0.12  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::c8d0:ecff:fe57:1e02%lo/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:326 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:16094 (15.7 KiB)  TX bytes:3555 (3.4 KiB)
          Interrupt:29 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)

一応前とは違うMACアドレスになっています。
ですが、FSBLで表示されていたMACアドレスとは異なっています。

もう一度Petalinuxユーザガイドを見てみると、U-Bootのほうもいじらないといけないよう。

f:id:nokixa:20190815134229p:plain:w400

というわけで、もう一度開発用Ubuntuに戻ります。

U-Bootの設定

Petalinuxプロジェクトディレクトリに移動して、以下のコマンドでU-Bootの設定ができます。

petalinux-config -c u-boot

しばらくすると、設定画面が現れます。

f:id:nokixa:20190815134957p:plain

この設定画面で、Networking support メニューに入り(下のほうにあります)、"Random ethaddr if unset"のチェックを外します。

f:id:nokixa:20190815135514p:plain

この後、同じ手順(Save、Exit、ビルド、ブートイメージの作成、SDへのコピー)を行って、ZYBOを起動します。
ifconfigすると、

root@Zybo-base-linux-peta:~# ifconfig
eth0      Link encap:Ethernet  HWaddr D8:80:39:5C:83:8B
          inet addr:192.168.0.14  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::da80:39ff:fe5c:838b%lo/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:105 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5468 (5.3 KiB)  TX bytes:2045 (1.9 KiB)
          Interrupt:29 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)

やっといけた!

今回得られたこと

最終的にMACアドレスを適切なものに設定する、ということができるようになりましたが、その過程で、

  • FSBLのカスタマイズ
  • カスタマイズしたFSBLの取り込み
  • Petalinuxでのイーサネット関連設定
  • U-Bootのカスタマイズ

ができました。
今後役に立つと思います。