衝動買いで 5Gz(11ac) の無線LANのルータとドングルを購入したので RaspberryPi で試そうと思ったらえらくハマったのメモ。

購入した製品はこちら。

ルータは 4000円からさらにキャンペーン割引で 3600円と 5GHz 対応の無線LANルータとしては暴安だったので購入。

ドングルはこの機種(GW-450D)が RaspberryPi で動作したとの情報をチラと見たので深く考えず購入。 そしてハマるw

GW-450D の Linux 用ドライバ

Linux用ドライバのソースはチップメーカーから供給されていて Planex のサイトからも落とせるようになっています。

しかし、これを README にしたがってコンパイルしてもエラーになります。

make: *** /lib/modules/3.10.25+/build: No such file or directory.  Stop.

これは Rasbian のバイナリイメージにカーネルのヘッダソースが含まれていない為です。

じゃあインストールしてやれば良いかと言うとバージョンの合うパッケージがありません。

$ sudo apt-cache search linux-header
linux-headers-3.10-3-all - All header files for Linux 3.10 (meta-package)
linux-headers-3.10-3-all-armhf - All header files for Linux 3.10 (meta-package)
linux-headers-3.10-3-common - Common header files for Linux 3.10-3
linux-headers-3.10-3-rpi - Header files for Linux 3.10-3-rpi
linux-headers-3.2.0-4-all - All header files for Linux 3.2 (meta-package)
linux-headers-3.2.0-4-all-armhf - All header files for Linux 3.2 (meta-package)
linux-headers-3.2.0-4-common - Common header files for Linux 3.2.0-4
linux-headers-3.2.0-4-rpi - Header files for Linux 3.2.0-4-rpi
linux-headers-3.6-trunk-all - All header files for Linux 3.6 (meta-package)
linux-headers-3.6-trunk-all-armhf - All header files for Linux 3.6 (meta-package)
linux-headers-3.6-trunk-common - Common header files for Linux 3.6-trunk
linux-headers-3.6-trunk-rpi - Header files for Linux 3.6-trunk-rpi
linux-headers-rpi - Header files for Linux rpi configuration (meta-package)
linux-headers-rpi-rpfv - This metapackage will pull in the headers for the raspbian kernel based on

ちなみに linux-headers-3.10-3-rpi をインストールしてビルドしたバイナリは insmod しようとするとバージョンチェックで蹴られます。

$ sudo insmod mt7650u_sta.ko
Error: could not insert module mt7650u_sta.ko: Invalid module format
$ dmesg
[  375.421162] mt7650u_sta: disagrees about version of symbol module_layout

じゃあ、カーネルのソースを落としてくればと思ったのですが Git リポジトリには最新の 3.10.37 のソースしかなくバイナリリリースされている 3.10.25 のタグが切られていません。
何の為の Git なのか意味不明なのですがとにかくそういうソース管理のようです。

結論

対処方の結論はこちらの参考サイトに書いてありました。

自分で最新のカーネルをビルドしなおしてそのソースを使えと言うことらしいです。
ドライバのインストールの為にカーネルのビルドが必要というだいぶ時代が逆行した感が有りますがしかたありません。

私の行った手順は参考サイトと微妙に違っているのでメモして置きます。

尚、これは 2014年4月時点 2014-01-07-wheezy-raspbian.zip を前提とした手順です。

準備

$ sudo apt-get update
$ sudo apt-get -y dist-upgrade
$ sudo apt-get -y install gcc make bc screen ncurses-dev

カーネルソース取得

$ wget https://github.com/raspberrypi/linux/archive/rpi-3.10.y.tar.gz
$ wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers

※wget で Module.symvers が取得出来ない場合はブラウザで取得できます。

カーネルのビルド

$ cd /usr/src
$ sudo su
# tar -xvzf ~/linux-rpi-3.10.y.tar.gz 
# cd linux-rpi-3.10.y
# cp ~/Module.symvers .
# gzip -dc /proc/config.gz > .config
# make oldconfig
# make clean
# make
# make modules_install
# mkdir boot
# make INSTALL_PATH=/usr/src/linux/boot install
# cp /usr/src/linux/boot/vmlinuz-3.10.37 /boot
# vi /boot/config.txt
    kernel=vmlinuz-3.10.37
# ln -s /usr/src/linux-rpi-3.10.y /lib/modules/3.10.37/build
# reboot

   …再起動…

$ uname -r
    3.10.37         <-- カーネルが更新されて要ることを確認

GW-450Dドライバのビルド

$ unzip gw-450d_driver_linux_v3002.zip
$ cd gw-450d_driver_linux_v3002
$ tar xvjf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
$ cd mt7610u_wifi_sta_v3002_dpo_20130916
$ vi common/rtusb_dev_id.c (コード追加)
    USB_DEVICE_ID rtusb_dev_id[] = {
    #ifdef MT76x0
            {USB_DEVICE(0x2019,0xab31)}, /* GW-450D */  <-- 追加
$ vi os/linux/config.mk (設定変更)
    HAS_WPA_SUPPLICANT=y
    HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
$ make
$ sudo make install
$ sudo rm -r /etc/Wireless/RT2860STA
$ sudo mkdir -p /etc/Wireless/RT2870STA
$ sudo cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
$ sudo insmod /lib/modules/3.10.37/kernel/drivers/net/wireless/mt7650u_sta.ko
$ iwconfig ra0
    ra0       Ralink STA  ESSID:"11n-AP"  Nickname:"MT7610U_STA"
              Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated   
              Bit Rate:1 Mb/s   
              RTS thr:off   Fragment thr:off
              Link Quality=100/100  Signal level:0 dBm  Noise level:0 dBm
              Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
              Tx excessive retries:0  Invalid misc:0   Missed beacon:0

iwconfig が以下のようになる場合はビルドに失敗しています。

$ iwconfig ra0
ra0       No such device

ローカル環境の設定

環境毎に設定値は違います。

$ sudo vi /etc/modules (設定追加)
    mt7650u_sta
$ sudo vi /etc/Wireless/RT2870STA/RT2870STA.dat (設定変更)
    SSID=
    AuthMode=WPA2PSK     <-- ルータの設定に合わせる
    EncrypType=AES       <-- ルータの設定に合わせる
$ sudo vi /etc/network/interfaces (設定追加)
    allow-hotplug ra0
    auto ra0
    iface ra0 inet dhcp
    wpa-ssid “ルータのSSID”
    wpa-psk “ルータのパスワード”
# sudo reboot

   …再起動…

$ iwconfig ra0
    ra0       Ralink STA  ESSID:"ルータのSSID"  Nickname:"MT7610U_STA"
              Mode:Managed  Frequency=5.22 GHz  Access Point: 00:11:22:33:44:55   
              Bit Rate=135 Mb/s   
              RTS thr:off   Fragment thr:off
              Link Quality=100/100  Signal level:-49 dBm  Noise level:-68 dBm
              Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
              Tx excessive retries:0  Invalid misc:0   Missed beacon:0
$ ifconfig ra0
    ra0       Link encap:Ethernet  HWaddr 00:11:22:33:44:55  
              inet addr:192.168.0.201  Bcast:192.168.0.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:1618 errors:0 dropped:0 overruns:0 frame:0
              TX packets:79 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:468584 (457.6 KiB)  TX bytes:9181 (8.9 KiB)

ifconfig で DHCP のアドレスがちゃんと振られていれば接続完了です。