
組み込みLinuxの作業中に無線LANが要るのに、USBの子機が手元にない。白一百(baiyibai)氏は店に買いに行く代わりに、引き出しにあったRaspberry Pi Pico Wを子機に変えるファームウェア「pico-usb-wifi」を書いた。パソコンに挿すだけで使え、ドライバーの導入は要らない。MITライセンスでGitLabに公開している。
普通のUSB無線LAN子機は、パソコン側にドライバーと無線の処理一式を入れる必要がある。pico-usb-wifiはそこを避けた。Pico WをUSBの規格であるCDC-NCMの機器として見せる。パソコンからは有線LANのアダプターが挿さったように見え、Windows 10以降やmacOS、Linux、Android、iOSに最初から入っているクラスドライバーだけで動く。Linuxでは10年以上前からカーネル本体に入っている。無線機、接続の手続き、WPA2の認証、電波の規制まわりの処理は、すべてPico Wの側で完結する。
難所は無線LANの仕組みそのものにあった。Wi-Fiの子機は、複数のMACアドレスを透過的に中継できない。アクセスポイントに接続すると、そこで与えられるMACアドレスは1つだけで、送るフレームもそのアドレスに縛られる。アクセスポイント側が対応する必要のある特殊なフレームを使わない限り、背後にいる別の機器のフレームは運べない。無線の子機はブリッジできない、という広く知られた制約だ。
そこで同氏は、パソコンとPico Wを1つのMACアドレスにまとめた。パソコン側のUSBインターフェースに、Pico Wの無線側のMACアドレスをそのまま与える。端から端まで同じアドレスになるため、Pico WはEthernetのフレームをUSBと無線の間でそのまま流せる。IPアドレスを持つのはパソコンだけで、Pico Wは持たない。ネットワークから見えるのはパソコン1台で、Pico Wは姿を見せない。NATもプライベートなサブネットもポート開放の設定もいらず、IPv4とIPv6のどちらも通る。
設定はCDC-ACMのシリアルコンソールから済ませる。接続先の名前とパスワードを打ち込んで保存すれば、ファームウェアを書き換えても残る。ネットワークにつながっていなくても設定でき、統計や診断も同じコンソールから見られる。
速度は割り切りが要る。実測の平均は4.75Mbit/sで、頭打ちの原因は無線ではなくRP2040のUSBにある。Pico WのUSBはFull-Speedの12Mbit/sまでしか出ない。同氏は、Wi-Fiの処理をRP2040のもう1つのコアに回す、PIOを使ったUSBの実装を試す、High-Speed対応のUSB PHYを載せた基板を起こす、といった改善の道筋を挙げている。
作りは標準的なpico-sdkのCMakeプロジェクトで、ARM向けのツールチェーンとCMake、Python 3があればビルドできる。

