カーネル4.19のラズパイZeroで5GHz対応のGW-450D2を動かす(Raspbian Buster対応)

2019年6月にリリースされた最新版のRaspbian Buster。
raspi zeroを自動でupgradeするようしていたら5GHzのWi-Fiアダプタ使えなくなって沈黙してましたw

試行錯誤の結果、ようやく安定して使えるようになったので、ドライバの作成&設定方法を公開します(^o^)

今回の突破口は、金丸隆志先生の「neuralassemblyのメモ」で公開されていた方法です。有益な情報を公開してくださって感謝!

こちらに掲載されている方法にいくつか設定を加えることで、安定して動作するようになります。

準備するモノ

  • Raspberry Pi Zero WH
  • Raspbian Buster Lite (Linux Kernel 4.19.50+、debian_version 10.0、gcc 8.3.0)
  • 開発環境一式(外付けのUSBハブ、ディスプレイ、キーボードなど)

前準備 Raspbian Busterのインストール

Raspbian StretchやJessieからのアップグレードは推奨されていないので、まっさらな状態からスタートします。

最近オススメの方法は、balenaEtcherを使ってSDカードに書き込む方法です。NOOBSより時間がかからなくて楽!

OSのダウンロード

まずは、ダウンロードサイトにアクセスし、Raspbian Buster Lite をダウンロードします。
DL速度が以前よりだいぶ速くなった気が!

ダウンロードしたら、念のためハッシュ値を確認しておきましょう。

shasum -a 256 2019-06-20-raspbian-buster-lite.zip

Webサイトに記載されているモノと同じ英数字が表示されていたらOK!

Raspbian Buster Lite をダウンロードする!

SDカードのフォーマット

OSを書き込む前に、最新のSDメモリカードフォーマッター(執筆時点で5.0.1)を使ってフォーマットします。
Mac版、Win版どちらもあるのでサイトからダウンロードして使いましょう。

OSの書込み

balenaEtcherというアプリを使います。こちらもMac/Win/Linux対応なのでサイトからダウンロードして使います。

balenaEtcherを起動して、イメージファイルの選択→書き込むディスクの選択→Flash!の3ステップで完了します。

私の環境で約2分程かかりました。
従来のNOOBSに比べたら圧倒的に高速!
特に大量のクローンを作る時の効果は絶大!

SDカードに書き込み中!6%完了時点で残り1m51s

初期設定

OSを書き込んだSDカードをラズパイZeroに差し込んで起動します。
詳細は割愛しますがraspi-configで最低限以下をやればOK。

  • Localisation Options
    • Change Keyboard Layout
    • Genericキーボードで、Japanese対応のモノ
  • Change User Password

SSHで作業する人は、Interfacing Options でSSHを有効化しましょう。

テキストが豆腐(■)になっている場合は、LANG=Cと打ってあげればなんとかなります。

カーネルモジュール(ドライバ)を作ろう!

 以前はgcc-4.8を使うという荒技でしたが、今回は冒頭で紹介した金丸先生公開のパッチを使うことで gcc 8.3.0 で make できることを確認しました!

 $ gcc --version | head -1
gcc (Raspbian 8.3.0-6+rpi1) 8.3.0

ドライバ開発用のカーネルヘッダーをインストール

raspberrypi-kernel-headersを入れます。

sudo apt-get update
sudo apt-get install raspberrypi-kernel-headers vim

※サラッとvimを入れてますが、各自好きなエディタでどうぞ。以降のvimも適宜読み替えてください。

ドライバのソースファイルダウンロード

PCからPlanexのサイトにアクセスして、ファイルを取得します。

ダウンロードしたzipファイルを展開すると「mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2」とうファイルがあるので、これをラズパイの適当なフォルダ(/home/pi/src/とか)にコピーします。

以下、ラズパイの/home/pi/src/で作業するものとします。

展開して中に入ります。

tar xf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2 
cd mt7610u_wifi_sta_v3002_dpo_20130916/

パッチの適用とmake

Kernel 4.19に対応したパッチを入手します。

wget https://raw.githubusercontent.com/neuralassembly/raspi/master/gw-450d/gw-450d-rpi-kernel414.patch

パッチを当てます。

patch -p0 < gw-450d-rpi-kernel414.patch

パッチを当てたら make していきましょう。

make

ずらずらっと色々表示されて、途中 Warning が出てきたりもしますが、20分弱で終わります。ストレッチでもしながらノンビリ待ちましょう!

終わったらインストールします。

sudo make install

設定ファイルのコピー

make install すると、RT2860STA.dat/etc/Wireless/RT2860STA/にコピーされるようになっていますが、これを消して新たにRT2870STA作成します。

sudo mkdir -p /etc/Wireless/RT2870STA/
sudo cp RT2870STA.dat /etc/Wireless/RT2870STA/
sudo rm -r /etc/Wireless/RT2860STA/

コピーした設定ファイルを編集していきます。

sudo vim /etc/Wireless/RT2870STA/RT2870STA.dat

変更点はこんな感じ

--- /home/pi/src/mt7610u_wifi_sta_v3002_dpo_20130916/RT2870STA.dat      2013-09-16 23:03:08.000000000 +0900
+++ /etc/Wireless/RT2870STA/RT2870STA.dat       2019-07-06 23:12:59.288129406 +0900
@@ -1,14 +1,14 @@
 #The word of "Default" must not be removed
 Default
 CountryRegion=5
-CountryRegionABand=7
-CountryCode=
+CountryRegionABand=1
+CountryCode=JP
 ChannelGeography=1
-SSID=11n-AP
+SSID=
 NetworkType=Infra
 WirelessMode=5
 EfuseBufferMode=0
 BeaconPeriod=100
 TxPower=100
 BGProtection=0
@@ -19,8 +19,8 @@
 PktAggregate=0
 WmmCapable=1
 AckPolicy=0;0;0;0
-AuthMode=OPEN
-EncrypType=NONE
+AuthMode=WPA2PSK
+EncrypType=AES
 WPAPSK=
 DefaultKeyID=1
 Key1Type=0

オプションの細かい説明はドライバソースの中にあるので気になる方はどうぞ。

less src/mt7610u_wifi_sta_v3002_dpo_20130916/README_STA_usb

最初から入っているモジュールを外す

実はKernel 4.19には最初からmt76をサポートするドライバが入っています。しかし、日本製のGW-450D2には対応しておらず、「wlan1として登録したあげく、エラーを吐いて止まる」という現段階では邪魔にしかならない存在。

おそらくカーネルソースをいじって登録して全ビルドすれば良いのですが、時間かかるよね。。。

ということでサクッと「ブラックリスト」に入れて無効化しちゃいます。

ブラックリストのつくり方は「Raspberry Pi 3の無線LAN(内蔵WiFi)をオフにする」 を参考にしました。

raspi-blacklist.conf を作ってmt76を無効化する

ブラックリストのファイルを作ります。

sudo vim /etc/modprobe.d/raspi-blacklist.conf

中身はこんな感じ。

# disable mt76 kernel modules
blacklist mt76
blacklist mt76x0

設定ファイルを保存したら再起動して、mt76、mt76x0が表示されないことを確認しましょう。

lsmod |grep mt

GW-450D2を接続してアクセスポイントに接続する

ここまで準備出来たら、GW-450D2を接続してみましょう!

正しく動作していれば、以下のようにモジュールがロードされていると思います。

$ lsmod |grep mt
mt7650u_sta  972972  1

アクセスポイントを探す

自宅のWi-Fiアクセスポイント(AP)を探してみましょう。

sudo iwlist ra0 scan |grep 'ESSID'

1回目では何も出てこない場合があるので、数秒後に再度実行するとずらっと出てくると思います。ここで目的のAPが見つかったら、接続の設定をしていきます。

以下のコマンドを実行して、wpa_supplicant.confに設定を記録します。

sudo sh -c 'wpa_passphrase ${SSID} ${PASS} | grep -v "#psk=" >> /etc/wpa_supplicant/wpa_supplicant.conf'

※${SSID}と${PASS}は、接続しようとしているAPの設定に置き換えてください。

IPの設定

IP取得方法を設定します。DHCPで動的に設定する方法と、固定IPを設定する方法を示します。

DHCPでIPを動的に設定する場合

設定ファイルを作成します。

sudo vim /etc/network/interfaces.d/ifcfg-ra0

中身はこんな感じ。

allow-hotplug ra0
auto ra0
iface ra0 inet dhcp
 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

ファイルを保存したら、GW-450D2を抜き差ししてみてください。
iwconfig ra0や、ifconfig ra0でAPへの接続状態・IPの割り当てなどが確認できればOKです。

接続できていない場合は、sudo ifdown ra0 && sudo ifup ra0を実行したり、sudo rebootで再起動したりして様子を見てみてください。

DHCPでうまく行かない場合は、次の固定IPを試してみて下さい。

固定IPを設定する場合

何度か試していると、コールドスタート時にDHCPでアドレスが上手く割り当てられないことがあったので、固定IPにしてみました。

まず、/etc/dhcpcd.conf に設定を記載します。

sudo vim /etc/dhcpcd.conf

中身はこんな感じで。

# Example static IP configuration:
interface ra0
static ip_address=192.168.1.200/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8

次に、/etc/network/interfaces.d/ifcfg-ra0 を編集します。

sudo vim /etc/network/interfaces.d/ifcfg-ra0

以下のように、inet manual にします。

allow-hotplug ra0
auto ra0
iface ra0 inet manual 
 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

設定を反映させます。

sudo systemctl daemon-reload

再起動してみましょう。

sudo reboot

無事に接続できたら完了です!

おまけ: なぜ5GHzのWi-Fiアダプタ(GW-450D2)が使えなくなったか

 カーネルモジュールが競合しているのと、ドライバのデバイス対応が不完全なのが影響していると推測しています。※設定方法がわからないとも言う。

最新のアップデートで、Linux kernel 4.14.98Linux kernel 4.19.50 に大幅に変更されました。このアップデートの中で、mt76チップがサポートされ始めたのですが、まだまだ過渡期のようで海外の掲示板でも動かないと話題 でした。

実際に、まっさらな Raspbian Buster Lite の状態でGW-450D2を接続すると、モジュールがロードされています。

$ lsmod|grep mt76
mt76x0                 94957  0
mt76                   31816  1 mt76x0
mac80211              685385  2 mt76,mt76x0

demsg してみると、mt76x0 がerrorを吐いている。。。

[  677.536206] usb 1-1.3: new high-speed USB device number 5 using dwc_otg
 [  677.683553] usb 1-1.3: New USB device found, idVendor=2019, idProduct=ab31, bcdDevice= 1.00
 [  677.683581] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
 [  677.683593] usb 1-1.3: Product: GW-450D
 [  677.683604] usb 1-1.3: Manufacturer: Planex
 [  677.683614] usb 1-1.3: SerialNumber: 1.0
 [  678.056170] usb 1-1.3: reset high-speed USB device number 5 using dwc_otg
 [  678.192170] mt76x0 1-1.3:1.0: ASIC revision: 76100002 MAC revision: 76502000
 [  678.193744] mt76x0 1-1.3:1.0: Direct firmware load for mediatek/mt7610u.bin failed with error -2
 [  678.194489] mt76x0: probe of 1-1.3:1.0 failed with error -2
 [  678.209806] usbcore: registered new interface driver mt76x0

この問題が発覚した当初は、標準ドライバをなんとか動かせないか奮闘していましたが、時間がかかりすぎたので諦めました(笑)

まとめ: Kernel 4.19のラズパイZeroとGW-450D2で5GHzのWi-Fiに接続できた!

ラズビアンOSの最新版「Raspbian Buster Lite (Linux Kernel 4.19.50+、debian_version 10.0)」を搭載したラズパイZeroで、GW-450D2を使ってWi-Fiに接続する方法を紹介しました。

ポイントは、

  • すてきなpatchをあてる
  • 標準のモジュールを無効化する

となります。

それではみなさん、よいラズパイ生活を!