Raspberry PiにGPIOポートからNICを生やす話。
以前から、GPIOからNICが生える系のボードがあるのは知っていました。ENC28J60という10BASE-TのNICをSPIで接続しているようです。
https://www.adafruit.com/product/3374
でも10Mbpsじゃなあと思ってスルーしていたのですが、これを見たらちょっと欲しくなりました。SPIポート2つあるからたしかにデュアルポートにできるんですよね。
これやってみたい!というわけで、まずはENC28J60モジュールをeBayでポチポチしました。
配線は、先ほどのEthernetBerry Dualのページとraspi.tvのページを参考にSPI0とSPI1につなぐようにします。GPIOピンの表記が物理番号とBCMで違ったりするので注意が必要です(わりと間違えた)。
ブレッドボードでやってもいいですが、NIC1つあたり7本の配線が必要で散らかりそうだったので、HATサイズのバニラボード(今回使用したのはスイッチサイエンスが売っているもので、買ったけどしばらく放置していたやつ。色んなとこでいろんなのが売られてるので好きなやつを使ってね)に一発で実装してしまいました。ピンソケットにブスブスっとモジュールを挿して使うイメージです。
裏の配線。いくつか配線を間違えてますが、設定ファイルの書き換えで済むやつ(INTを間違えた)は諦めてそのままにしました。
ラズピッピに載せた様子。位置的には電源とかHDMIの上に来る感じになりましたが、結構はみ出す形になったのでなんとなくバランスが良くないですねもう少し高めのピンソケットが手元にあれば、もうちょい引っ込めることはできそうです。やらんけど。
設定は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に挿したほうが手っ取り早いし通信も速いし楽です。簡易ルーターとか、あるいはポートミラーリングとかキャプチャみたいな感じのやつとかか。