カーネル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!
SDカードのフォーマット
OSを書き込む前に、最新のSDメモリカードフォーマッター(執筆時点で5.0.1)を使ってフォーマットします。
Mac版、Win版どちらもあるのでサイトからダウンロードして使いましょう。
OSの書込み
balenaEtcherというアプリを使います。こちらもMac/Win/Linux対応なのでサイトからダウンロードして使います。
balenaEtcherを起動して、イメージファイルの選択→書き込むディスクの選択→Flash!の3ステップで完了します。
私の環境で約2分程かかりました。
従来のNOOBSに比べたら圧倒的に高速!
特に大量のクローンを作る時の効果は絶大!
初期設定
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.98 → Linux 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をあてる
- 標準のモジュールを無効化する
となります。
それではみなさん、よいラズパイ生活を!
ディスカッション
コメント一覧
記事を参考にさせていただき、GW-450D2をRaspbianで認識させることができました。
ありがとうございます。
同じRaspberry PiにGW-450D2を2つ接続し、1つをWifiルータへ接続、もう1つをアクセスポイントとして利用したいと考えています。
記事内の設定を終わらせ、モジュールを2つ接続したところ、1つはra0として認識されるのですが、もう1つはどうしても認識されませんでした。
もしも、何か設定方法をご存知であれば、教えていただけないでしょうか?
よろしくお願いします。
n_tktnさま、
お役に立ったようで何よりです!
ご質問の件ですが、残念ながら複数のモジュールの認識には至っていない状況です。
可能性としては、以下のものが考えられます。
(1)5GHz対応のRaspi 3B+にGW-450D2を接続
内蔵の無線LANがwlan0、GW-450D2がra0として認識されるので、wlan0をAPに設定、ra0でWiFiルータに接続できるかもしれません。
(2)Raspbianの対応を待つ
Kernal 4.19からGW-450D2への対応が始まっていますが、まだ不完全のようです。OSそのもので対応してくれるとwlan0、wlan1として認識されるので個別に設定できると思います。※以前試した時は認識されるもののエラーが出て通信できない。。。
(3)目的達成をRaspiにこだわらない
もし、WiFiのブリッジが目的ならば、こういう製品を使うのも手です。
・BUFFALO、WMR-433W2シリーズ
https://www.buffalo.jp/product/detail/wmr-433w2-bk.html
以上、ご参考まで。
RasPi側の対応を待ったほうが確実ですね。
だとしたら、BUFFALOの製品の購入を考えてみたいと思います。
解決策ありがとうございます。