« ZYNQのLinuxでMPC79411というRTCを使う方法 | トップページ | 長いJTAGチェーンを仮想的に作る »

2019.04.11

LAN9514のEEPROMをLinuxから設定する方法

Micrichip社のLAN9514というICがあります。

USBのハブとホストに加え100BASEのUSB-LANを搭載しているICで、コネクタをつなぐだけで4ポートのUSBホストと100BASEのLANが実現できます。

Lan9514

RaspberryPiやZynqberryにも搭載されています。(RaspberryPiではEEPROMにMACアドレスを書いていないという話もあるので、この方法で変わるかどうかは試していない。ZynqberryはOK)

このICが作るLANのMACアドレスはEEPROMに設定されていなければ電源を投入するたび(リセットするたび)ランダムで決まります。

ランダムになってしまうと、例えばDHCPサーバが割り当てるIPアドレスがリブートのたびに変わるので、困る場合があります。例えば、Windowsでホスト名でファイル共有をするのに時間がかかるとか。

そこで、このICのMACアドレスをLinuxから設定することを試してみました。

LAN9514のEEPROMを設定するには、まずデバイスドライバを読んでみたところethtoolsという構造体があったので、ethtoolsとは何ぞやということで調べてみると、PHYの管理などができるそういうツールがあるようです。

これはZYNQのLinuxからサクッとapt-getでインストールできました。

zynqberry@zynqberry:~$ sudo apt-get install ethtool
[sudo] password for zynqberry:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
bind9-host geoip-database libavahi-core7 libbind9-90 libdaemon0 libdns100
libgeoip1 libisc95 libisccc90 libisccfg90 liblwres90
これを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
ethtool
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
84.5 kB のアーカイブを取得する必要があります。
この操作後に追加で 284 kB のディスク容量が消費されます。
取得:1 http://ports.ubuntu.com/ubuntu-ports/ trusty/main ethtool armhf 1:3.13-1 [84.5 kB]
84.5 kB を 1秒 で取得しました (74.3 kB/s)
以前に未選択のパッケージ ethtool を選択しています。
(データベースを読み込んでいます ... 現在 50239 個のファイルとディレクトリがイン ストールされています。)
Preparing to unpack .../ethtool_1%3a3.13-1_armhf.deb ...
Unpacking ethtool (1:3.13-1) ...
ethtool (1:3.13-1) を設定しています ...

起動してみます。一般ユーザでやる場合はsudoを付けてください。

zynqerry@zynqberry:~$ sudo ethtool -e eth0
Offset Values
------ ------
0x0000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0060: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0070: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0110: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0120: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0130: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0140: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0150: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0160: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0170: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0180: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0190: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

初期状態では、中身は全部FFのようです。

ethtoolsを使ってEEPROMを書き込むには、ethtools -E eth0 の後ろにmagicやoffset、lengthを指定する必要があります。LAN9514のmagicは0x9500です。offsetはEEPROMの何番地から書き込むかで、これは0。lengthは140にします。

書き込むべきデータはLAN9514のデータシートに載っているので、それをコピペするなどしてテキスト化し、それをもとにバイナリファイルを作ります。Linuxで16進のテキストからバイナリ列を作るには、echoの後ろに-enを付けて、エスケープシーケンスを含んだ文字列を書けばよいようです。

echo -en "\xA5\x12\x34\x56\x78\x9A\xBC\x01\x04\x05\x09\x04\x0A\x1D\x00\x00\x00\x00\x00\x00\x00\x00\x12\x22\x12\x2B\x12\x34\x12\x3D\x00\x00\x24\x04\x14\x95\x00\x01\x9B\x18\x00\x02\x00\x00\x01\x00\x01\x00\x32\x00\x00\x00\x00\x00\x21\x43\x05\x01\x0A\x03\x53\x00\x4D\x00\x53\x00\x43\x00\x12\x01\x00\x02\xFF\x00\x01\x40\x24\x04\x00\xEC\x00\x01\x01\x00\x00\x01\x09\x02\x27\x00\x01\x01\x00\xE0\x01\x09\x04\x00\x00\x03\xFF\x00\xFF\x00\x12\x01\x00\x02\xFF\x00\xFF\x40\x24\x04\x00\xEC\x00\x01\x01\x00\x00\x01\x09\x02\x27\x00\x01\x01\x00\xE0\x01\x09\x04\x00\x00\x03\xFF\x00\xFF\x00" > eeprom.bin

これで140バイトの設定データが出来ました。

上の赤い部分がMACアドレスなので、必要に応じて書き換えてください。なお、最初の1バイトのbit1が'1'になっている(つまり0x02)MACアドレスはプライベートアドレスなので、自分の責任で自由に使うことができます。

ethtool -E eth0 magic 0x9500 offset 0 length 140 < eeprom.bin

これで書き込まれました。
確認してみましょう

zynqberry@zynqberry:~$ sudo ethtool -e eth0
Offset Values
------ ------
0x0000: a5 12 34 56 78 9a bc 01 04 05 09 04 0a 1d 00 00
0x0010: 00 00 00 00 00 00 12 22 12 2b 12 34 12 3d 00 00
0x0020: 24 04 14 95 00 01 9b 18 00 02 00 00 01 00 01 00
0x0030: 32 00 00 00 00 00 21 43 05 01 0a 03 53 00 4d 00
0x0040: 53 00 43 00 12 01 00 02 ff 00 01 40 24 04 00 ec
0x0050: 00 01 01 00 00 01 09 02 27 00 01 01 00 e0 01 09
0x0060: 04 00 00 03 ff 00 ff 00 12 01 00 02 ff 00 ff 40
0x0070: 24 04 00 ec 00 01 01 00 00 01 09 02 27 00 01 01
0x0080: 00 e0 01 09 04 00 00 03 ff 00 ff 00 ff ff ff ff
0x0090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x00f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x0100: a5 12 34 56 78 9a bc 01 04 05 09 04 0a 1d 00 00
0x0110: 00 00 00 00 00 00 12 22 12 2b 12 34 12 3d 00 00
0x0120: 24 04 14 95 00 01 9b 18 00 02 00 00 01 00 01 00
0x0130: 32 00 00 00 00 00 21 43 05 01 0a 03 53 00 4d 00
0x0140: 53 00 43 00 12 01 00 02 ff 00 01 40 24 04 00 ec
0x0150: 00 01 01 00 00 01 09 02 27 00 01 01 00 e0 01 09
0x0160: 04 00 00 03 ff 00 ff 00 12 01 00 02 ff 00 ff 40
0x0170: 24 04 00 ec 00 01 01 00 00 01 09 02 27 00 01 01
0x0180: 00 e0 01 09 04 00 00 03 ff 00 ff 00 ff ff ff ff
0x0190: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0x01f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

ちゃんと書き込まれているのがわかります。

起動時のメッセージを見ると、今まではランダムになっていたのが、

[    2.669168] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[ 2.675982] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.686405] smsc95xx v1.0.5
[ 2.784367] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-ci_hdrc.0-1.1, smsc95xx USB 2.0 Ethernet, fe:c0:42:d9:23:f9
[ 7.477999] EXT4-fs (mmcblk0p2): recovery complete
[ 7.485256] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 7.493315] VFS: Mounted root (ext4 filesystem) on device 179:2.

下のように設定したが使われているのがわかります。

[    2.663831] init: ureadahead main process (1120) terminated with status 5
[ 2.688673] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[ 2.695469] usb 1-1.1: New USB device strings: Mfr=1, Product=0, SerialNumber=0
[ 2.705719] usb 1-1.1: Manufacturer: SMSC
[ 2.718420] smsc95xx v1.0.5
[ 2.823765] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-ci_hdrc.0-1.1, smsc95xx USB 2.0 Ethernet, 12:34:56:78:9a:bc

ifconfigで見てみると、

eth0      Link encap:イーサネット  ハードウェアアドレス 12:34:56:78:9a:bc
inetアドレス:192.168.1.215 ブロードキャスト:192.168.1.255 マスク:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:99 エラー:0 損失:14 オーバラン:0 フレーム:0
TXパケット:75 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:8532 (8.5 KB) TXバイト:9821 (9.8 KB)

lo Link encap:ローカルループバック
inetアドレス:127.0.0.1 マスク:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 メトリック:1
RXパケット:106 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:106 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1
RXバイト:5300 (5.3 KB) TXバイト:5300 (5.3 KB)

ちゃんと書き変わりました。

なお、ethtoolsでは、140バイトのデータを正しく書かないとLAN9514が起動しなくなってしまいます。その場合はEEPROMを物理的に外すなどの処置が必要になるので多少の危険を伴います。最初の7バイトだけを書き込んだら動かなくなったので、復旧に苦労しました。

 

もっと簡単な方法としては、

ifconfig eth0 down
ifconfig eth0 hw ether 02:01:02:03:04:05
ifconfig eth0 up

で設定してしまうことです。これを/etc/rc.localに書いておけば起動時に設定されます。

ZYNQの内蔵のGigabitEtherは、Linuxのドライバの問題によりこの方法ではMACアドレスを変更できませんが、LAN9514経由のUSB-LANであればifconfigでMACアドレスを変更できるので、より安全で手軽です。

ユーザがSDカードをどんなふうに書き換えても動くようにハード的に固定値を書き込んでおきたいという場合にはethtooslでEEPROMに書き込むのがよいでしょう。

 

|

« ZYNQのLinuxでMPC79411というRTCを使う方法 | トップページ | 長いJTAGチェーンを仮想的に作る »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ZYNQのLinuxでMPC79411というRTCを使う方法 | トップページ | 長いJTAGチェーンを仮想的に作る »