Raspberry Pi 3で GW-450D2(5GHz, 無線LAN)をセットアップする方法【カーネルの全ビルド不要!】

2017年7月20日

Pocket

はじめに

Raspberry Pi 3は無線LAN(2.4GHz)を内蔵しています。しかし、今時2.4GHz帯なんて電波の干渉が多すぎて使えない(汗

なので、5GHz帯に対応した無線LANのUSBアダプタ(Planex, GW-450D2)を使えるようにしたいと思います。

参考情報を色々探してみましたが、ほとんどカーネルを全てビルドしており、かなりの時間(数時間!)がかかります。。。実は、公式の情報を使うと、必要なモジュールだけビルドするので数十分で終わります!

公式の情報が少し古いので、自分の環境に合わせて細かい所を修正しつつ、gcc4.9でビルドできるようにしています(力技でw)。

【公式の情報】 

使ったモノ

  • Planex, GW-450D2
  • 無線LANアクセスポイント(5GHz帯のネットワーク、DHCP割当て)

方法

ドライバの入手

まず、Linux用ドライバをダウンロードします。
http://www.planex.co.jp/support/download/gw-450d/driver_linux.shtml

設定用のPCでダウンロードしたものを転送するか、ラズパイにデスクトップ環境がある場合は、ブラウザでアクセスしてダウンロードしてください。

ファイルは ~pi/Downloads/ にあるとします。

ダウンロードしたファイルを展開します。

unzip gw-450d2_driver_linux_v3002.zip

中身の確認

cd gw-450d2_driver_linux_v3002/
ls

中にある mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2/usr/local/src に移動します。

sudo cp mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2 /usr/local/src/

※ダウンロードしたファイルは、無線LANチップメーカーのサイトで公開されているもの(v3002)と同じバージョンのようです。

ビルドの準備

まず、カーネルバージョンを確認します。

uname -r
4.9.24-v7+   ←ここを覚えておく。

更新とカーネルの取得

レポジトリを更新して、

sudo apt-get update
sudo apt-get -y dist-upgrade

ビルドに必要なツールを一式インストールします。

sudo apt-get -y install gcc make bc screen ncurses-dev

作業用フォルダに移動して、

cd /usr/src/

先ほど確認したカーネルバージョンrpi-X.XXで指定してダウンロードします。

sudo wget https://github.com/raspberrypi/linux/archive/rpi-4.9.y.tar.gz

展開します(ちょっと時間かかります)。

sudo tar xvfz rpi-4.9.y.tar.gz

シンボリックリンクを作成します(rpi-X.XXを忘れずに!)

sudo ln -s /usr/src/linux-rpi-4.9.y/ /lib/modules/`uname -r`/build

中に入ります。

cd /lib/modules/`uname -r`/build

コンフィグレーションをまっさらな状態に初期化します。

sudo make mrproper

config.gzを準備します

sudo modprobe configs

コンフィグレーションを作成(展開してコピー)します。

sudo gzip -dc /proc/config.gz > .config

カーネルモジュールをコンパイルするために必要なファイルを準備します。

sudo make modules_prepare

Support for Allo DigiOne (SND_BCM2708_SOC_ALLO_DIGIONE) [N/m/?] (NEW) と聞かれたら、m を押して[Enter]
※bc が入っていないと「/bin/sh: 1: bc: not found」と言われるので注意。

シンボル・モジュールチェック用ファイルを入手します。

sudo wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers

ビルドを始めよう

ソースコードを展開します。

cd /usr/local/src
sudo tar xvjf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
cd mt7610u_wifi_sta_v3002_dpo_20130916

パッチをあてる

ソースコードを修正してデバイスIDなどを加えていくのですが、これらを全てやってくれるパッチが公開されているのでそれを利用させてもらいます。

修正パッチを入手して適用します。
(先駆者が情報を公開してくださっています。ありがたや〜。「Raspberry Pi 2 + RASPBIAN JESSIEでPLANEXのGW-450D(無線LANドングル)を使う」

piユーザーで、/home/pi にてgit cloneを実行します。

git clone https://gist.github.com/moutend/cb35a37297910c99d3e2 gist

ソースを/usr/local/srcに置いている場合の修正作業

公式の手順でドライバのソースを/usr/local/srcに置いたので、patch.shを修正する必要があります。※先駆者情報の通り、/home/piにソースを展開していたら、以下のややこしい修正は不要です。

vim ./gist/patch.sh

# 以下の2行を追加

SRC=/usr/local/src
UDIR=/home/pi

書き換えるソースファイルの指定を$HOMEから$SRCに変更します。同様にパッチファイルは$HOMEから$UDIRへ変更します。

# patch $HOME/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/rt_linux.c < $HOME/gist/rt_linux.c.patch
patch $SRC/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/rt_linux.c < $UDIR/gist/rt_linux.c.patch

他の部分も同様に、patchコマンドの行を全て書き換えます。

パッチを当てます。

sudo ./gist/patch.sh

gcc-4.9でコンパイルが通るように修正する

いざmakeしてみると、コンパイラでエラーになって詰んでしまいます。

error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]

gcc-4.9からチェックが厳しくなったらしいのですが、ググると解決方法はいくつか出てきて、

  1. Werror=date-time をつける
  2. gcc-4.8でコンパイルする

というのがありますが、1つ目はカーネルパニックが起きるという未確認情報も。2つ目はなんだか負けたような気がするので、3つ目の方法として、ソースをいじってgcc-4.9でコンパイルが通るようにしてみました。

問題となっているのはソースファイルに記述されている__DATE____TIME__なので、これを探して修正します。

以下のコマンドを実行し、該当するファイルを見つけます。

fgrep -lr -- __DATE .

sta/sta_cfg.c と、common/cmm_info.c が見つかりました。

出てきた、ファイルを編集します。

sudo vim sta/sta_cfg.c

4502行目付近で、日付と時刻を強制的に指定します。

case SHOW_DRVIER_VERION:
//snprintf(extra, size, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );
snprintf(extra, size,"Driver version-%s, %s %s\n", STA_DRIVER_VERSION, "Apr 1 2017", "00:00:00");

__DATE__は、ANSI/ISO 標準事前定義マクロによると、アメリカ形式`”Mmm dd yyyy”`で記載するとのことなので、コンパイルした時の日付を記載すると良いかと思います。

もう1つヒットしたファイルを開いて修正します。

sudo vim common/cmm_info.c

47行目付近を同様に書き換えます。

DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s %s %s\n", STA_DRIVER_VERSION, "Apr 1 2017", "00:00:00"));

 

makeしてインストールする

makeします。大量のwarningが出ますが、5分ほどで終わります。「よし、勝った

sudo make

※もしカーネルを全てビルドしていたら、数時間〜十数時間かかりますが、モジュールだけなのですぐ終わります。

インストールします。

sudo make install

モジュールをロード&追加する

モジュールをロードします。uname -rで自動的に指定するか、

sudo insmod /lib/modules/`uname -r`/kernel/drivers/net/wireless/mt7650u_sta.ko

カーネルバージョンを直接指定します。4.9.24-v7+の部分は、自分の環境に合わせてください。

sudo insmod /lib/modules/4.9.24-v7+/kernel/drivers/net/wireless/mt7650u_sta.ko 

カーネルの依存関係情報を更新します。

sudo depmod -a

モジュールを追加します。

sudo vim /etc/modules

以下の1行を末尾に追加します。

mt7650u_sta

無線LAN設定を確認します。

cat /etc/Wireless/RT2870STA/RT2870STA.dat

以下の3つパラメータが次のようになっていればOKです。

SSID=
AuthMode=WPA2PSK
EncrypType=AES

ネットワークの設定

ネットワークインタフェースの設定ファイルを編集します。

sudo vim /etc/network/interfaces

wlan0(wlan1も)がある部分を#でコメントアウトします。

SSIDとパスフレーズを直接記述する方法と、暗号鍵を作る方法がありますので、段階に応じて適宜選んでください。

セキュリティ的によろしくないけどとりあえず試す方法

以下を追記

allow-hotplug ra0
auto ra0
iface ra0 inet dhcp
wpa-ssid "SSID入れる"
wpa-psk "パスフレーズ入れる"

見ての通り、パスフレーズが丸見えです。

暗号鍵を作る方法

先駆者の情報を参考に、設定を行います。
(参考: RaspberryPi3をモニター・キーボードレスセットアップしてみた

以下のコマンドで[SSID][パスフレーズ]自分の環境に適宜書き換えて暗号鍵を作成します。

sudo sh -c 'wpa_passphrase [SSID] [パスフレーズ] >> /etc/wpa_supplicant/wpa_supplicant.conf'

できたファイルにはご丁寧にパスフレーズが平文で併記されています(#psk=)ので、消しておきましょう(笑)。

sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

そして、/etc/network/interfaces を編集します。

sudo vim /etc/network/interfaces

wpa-confの設定を追加して、ついでに以下の2行も削除しておきましょう。

#wpa-ssid "SSID入れる"
#wpa-psk "パスフレーズ入れる"

最終的に、無線LANアダプタ(ra0)の設定部分は次のようになります。

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

これで設定は完了です。
デバイスをUSBポートに差しこむと自動的に使えるようになります。念のため、ifconfigで確認しておきましょう。

ifconfig ra0

inetアドレス: 192.168.x.x と表示されていればバッチリ接続できています。

おまけ

数日経つと無線LANに繋がらなくなる現象の対策

無線LANアダプタを使用して数日経つと、expired と表示されてつながらなくなる現象が発生しました。

ラズパイ本体にアクセスできる環境なら、インターフェースをダウン/アップして解決できます。

sudo ifdown ra0; sudo ifup ra0;

自動的に更新されるように、以下のようなスクリプトを作ってcron.dailyで実行させるようにしました。

sudo vim /etc/cron.daily/wlan_reset
#!/bin/bash
sudo ifdown ra0
sudo ifup ra0

【追記:2017-07-20】スクリプトの各コマンドにsudoが抜けていたので追記しました。sudoをつけないとifdown/ifupがパーミッションが無いといって実行されません(^_^;)

DHCPクライアントを直接再起動する場合は以下のコマンドで。
リリース

sudo dhclient -r ra0

再取得
sudo dhclient ra0

参考にしたサイト