いつものチュートリアル通りなら、カーネルモジュールを作ってみるところですが、通常のユーザアプリケーションとそれほど変わらなかったので、必要になったらやろうと思います。
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)のようでした。
しかも、参考サイトと全く同じ番号でした。 なので、これはXilinxが一律で適当に割り当てたMACアドレスだと考えられます。
ちゃんと固有のMACアドレスを使うようにしたいので、調べてみました。
ちょうどDigilentのフォーラムでぴったりのものがありました。
FSBLのプロジェクトで、fsbl_hooks.cのFsblHookBeforeHandoff()関数の中に、上記に記載のコードをコピーすればいいようです。
ちょうど一度FSBLのプロジェクトを作成していた(https://nokixa.hatenablog.com/entry/2019/07/03/015508)ので、ここにコードをコピーして、ビルドしてfsbl.elfを作成します。
やってみると、コンパイルでエラーが出てしまいました。
いくつかのドライバへのインクルードを追加しないといけないようです。
#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 を見てみます。
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のほうもいじらないといけないよう。
というわけで、もう一度開発用Ubuntuに戻ります。
U-Bootの設定
Petalinuxプロジェクトディレクトリに移動して、以下のコマンドでU-Bootの設定ができます。
petalinux-config -c u-boot
しばらくすると、設定画面が現れます。
この設定画面で、Networking support メニューに入り(下のほうにあります)、"Random ethaddr if unset"のチェックを外します。
この後、同じ手順(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のカスタマイズ
ができました。
今後役に立つと思います。