あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

Raspberry PiにNICをSPI接続で2つ足すやつ(10Mbpsだけど)

Raspberry PiにGPIOポートからNICを生やす話。

以前から、GPIOからNICが生える系のボードがあるのは知っていました。ENC28J60という10BASE-TNICをSPIで接続しているようです。

https://www.adafruit.com/product/3374

でも10Mbpsじゃなあと思ってスルーしていたのですが、これを見たらちょっと欲しくなりました。SPIポート2つあるからたしかにデュアルポートにできるんですよね。

www.industrialberry.com

これやってみたい!というわけで、まずはENC28J60モジュールをeBayでポチポチしました。

www.ebay.com

f:id:Akkiesoft:20190422101337j:plain:w480

配線は、先ほどのEthernetBerry Dualのページとraspi.tvのページを参考にSPI0とSPI1につなぐようにします。GPIOピンの表記が物理番号とBCMで違ったりするので注意が必要です(わりと間違えた)。

raspi.tv

ブレッドボードでやってもいいですが、NIC1つあたり7本の配線が必要で散らかりそうだったので、HATサイズのバニラボード(今回使用したのはスイッチサイエンスが売っているもので、買ったけどしばらく放置していたやつ。色んなとこでいろんなのが売られてるので好きなやつを使ってね)に一発で実装してしまいました。ピンソケットにブスブスっとモジュールを挿して使うイメージです。

f:id:Akkiesoft:20190422102725j:plain:w480

裏の配線。いくつか配線を間違えてますが、設定ファイルの書き換えで済むやつ(INTを間違えた)は諦めてそのままにしました。

f:id:Akkiesoft:20190422102907j:plain:w480

ラズピッピに載せた様子。位置的には電源とかHDMIの上に来る感じになりましたが、結構はみ出す形になったのでなんとなくバランスが良くないですねもう少し高めのピンソケットが手元にあれば、もうちょい引っ込めることはできそうです。やらんけど。

f:id:Akkiesoft:20190422103300j:plain:w480

f:id:Akkiesoft:20190422103325j:plain:w480

設定はEthernetBerry Dualのページにあるtarballをもらってきてスクリプトを実行すればOK。中身はENC28J60のモジュールをコピーして増やしたもののバイナリの一部を書き換えてSPI1で使えるようにして、元のモジュールとコピーしたモジュールそれぞれのdtoverlayを/boot/config.txtに書いているようでした。私はINTの配線を間違えたので、ココでピン番号を入れ替えました。

設定後に再起動すれば、eth1とeth2が増えていることが確認できます。増えていないときは配線があっているかを確認します。

pi@raspberrypi:~ $ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:**:**:** brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 66:e1:d0:**:**:** brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 02:e9:8b:**:**:** brd ff:ff:ff:ff:ff:ff
5: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DORMANT group default qlen 1000
    link/ether b8:27:eb:**:**:** brd ff:ff:ff:ff:ff:ff

pi@raspberrypi:~ $ sudo ethtool -i eth1
driver: enc28j61
version: 1.02
firmware-version: 
expansion-rom-version: 
bus-info: spi1.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
pi@raspberrypi:~ $ sudo ethtool -i eth2
driver: enc28j60
version: 1.02
firmware-version: 
expansion-rom-version: 
bus-info: spi0.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
pi@raspberrypi:~ $ sudo ethtool eth1
Settings for eth1:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full 
	Supported pause frame use: No
	Supports auto-negotiation: No
	Advertised link modes:  Not reported
	Advertised pause frame use: No
	Advertised auto-negotiation: No
	Speed: 10Mb/s
	Duplex: Half
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: off
	MDI-X: Unknown
	Current message level: 0x00000036 (54)
			       probe link ifdown ifup
pi@raspberrypi:~ $ sudo ethtool eth2
Settings for eth2:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full 
	Supported pause frame use: No
	Supports auto-negotiation: No
	Advertised link modes:  Not reported
	Advertised pause frame use: No
	Advertised auto-negotiation: No
	Speed: 10Mb/s
	Duplex: Half
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: off
	MDI-X: Unknown
	Current message level: 0x00000036 (54)
			       probe link ifdown ifup

さて、これで何しましょうかね。動くのを見たかったので特に使いみちは考えていないんですよね(?🤔)。言わずもがな、USB-GbEアダプターをUSBに挿したほうが手っ取り早いし通信も速いし楽です。簡易ルーターとか、あるいはポートミラーリングとかキャプチャみたいな感じのやつとかか。