Howto

Linux 3.xでMediaTek(旧Ralink Technology)社製チップ搭載USB無線LANアダプタを動作させる

本解説では、MediaTek(旧Ralink Technology)社製チップを搭載したUSB無線LANアダプタを Linux 3.x系カーネル搭載のArmadilloで使用する方法を説明します。


目次


動作確認は表1の環境で行いました。

表1 動作確認環境
ATDE5 amd64 v20151026
Linuxカーネル linux-3.4-at16 (Armadillo-810/840)
linux-3.14-at4 (Armadillo-420)
ユーザーランド (Atmark Dist) atmark-dist-20151026
本解説では、ATDE5上にLinuxカーネル/ユーザーランドのビルド環境が構築済みであることを前提に説明をしています。 ビルド環境を未構築の場合は、製品マニュアル等を参考に構築を行ってください。


## Linuxカーネル/ユーザーランドの変更

Linuxカーネルの変更

MediaTek(旧Ralink Technology)社製チップのドライバーをビルドするには、Linuxカーネルで Linux 802.11 configuration API がサポートされている必要があります。デフォルトでは、本機能は無効になっている為、 Linuxカーネルコンフィギュレーションで有効にします。

図1のようにLinuxカーネルコンフィギュレーションを行い、当該機能を有効化してください。

[*] Networking support  --->
    -*-   Wireless  --->
        <*>   cfg80211 - wireless configuration API                                         #チェックを入れる
         : 一部省略
        [*]     cfg80211 wireless extensions compatibility                                  #チェックを入れる(3.14のみ、3.4はデフォルトで有効)
        <*>   Generic IEEE 802.11 Networking Stack (mac80211)                               #チェックを入れる
    Device Drivers  --->
        [*] Network device support  --->
            [*]   Wireless LAN  --->
                <*>   Ralink driver support  --->                                           #チェックを入れる
                     <*>   Ralink rt27xx/rt28xx/rt30xx (USB) support                        #チェックを入れる
                     [*]     rt2800usb - Include support for rt33xx devices                 #チェックを入れる
                     [*]     rt2800usb - Include support for rt35xx devices (EXPERIMENTAL)  #チェックを入れる
                     [*]     rt2800usb - Include support for rt3573 devices (EXPERIMENTAL)  #チェックを入れる(3.14のみ)
                     [*]     rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)  #チェックを入れる
                     [*]     rt2800usb - Include support for rt55xx devices (EXPERIMENTAL)  #チェックを入れる(3.14のみ)
                     [*]     rt2800usb - Include support for unknown (USB) devices          #チェックを入れる

図1 Linux 802.11 configuration API を有効化

図1では rt2800usb のドライバ全てを有効にしていますが、お使いの無線LANアダプタで使用されているチップの型番が分かる場合は、必要のないドライバのチェックを無効にしても構いません。
また、 (EXPERIMENTAL) と付いているドライバについては、動作が不安定な可能性があります。


ユーザーランドの変更

無線LANアクセスポイントに接続する方法は色々ありますが、今回は atmark-dist-20151026 に含まれている wpa_supplicant を使います。

図2のようにユーザーランドのコンフィギュレーションを行い、 wpa_supplicant を有効化してください。

Userland Configuration
Network Applications  --->
     :
    --- Wireless-tools
     :
    [*] hostap                  #チェックを入れる
    [ ]   hostap driver (Prism2/2.5/3) (NEW)
    [ ]   hostapd (NEW)
    [*]   wpa_supplicant (NEW)  #hostap にチェックを入れると表示されるので、チェックを入れる
     :

図2 wpa_supplicant を組み込む為のユーザーランドコンフィギュレーション


VID、PIDの追加

atmark-dist内の、 linux-3.x/drivers/net/wireless/rt2x00/rt2800usb.c にある構造体 usb_device_id rt2800usb_device_table[] に、 お使いのUSB無線LANアダプタのVIDとPIDを追加します。お使いのUSB無線LANアダプタのVIDとPIDは、lsusbコマンドを用いて調べることが出来ます。 既にusb_device_id rt2800usb_device_table[]の中に、お使いのUSB無線LANアダプタのVIDとPIDが記述されている場合は、この作業は不要です。 ここでは例として、PLANEX社の GW-USMicroN をATDEに接続し、lsusbコマンドでVIDとPIDを確認しています。

atmark@atde5:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 001 Device 002: ID 2019:ed14 PLANEX GW-USMicroN  #VID=2019、PID=ed14

図3 lsusbコマンドによるVIDとPIDの確認


/*
 * rt2800usb module information.
 */
struct usb_device_id rt2800usb_device_table[] = {
  { USB_DEVICE(0x2019, 0xed14) },  #この行をVID、PIDに合わせて追加

図4 GW-USMicroNのVID、PIDの追加


wpa_supplicant コンフィグファイルの修正

この段階でユーザーランドのビルドを行うと、wpa_supplicant がビルドエラーになります。 ビルドエラーを回避するために atmark-dist/user/hostap/wpa_supplicant/.config を図5のように修正してください。

 52 # Driver interface for madwifi driver
 53 #CONFIG_DRIVER_MADWIFI=y      #でコメントアウトする
 54 # Change include directories to match with the local setup
 55 #CFLAGS += -I$(ROOTDIR)/$(LINUXDIR)/drivers/net/wireless/madwifi  #でコメントアウトする

図5 wpa_supplicant/.config (53,55行目) の修正


以上の設定が終わったら、Linuxカーネル/ユーザーランドのビルドを行ってください。

 atmark@atde5:~/atmark-dist$ make clean
 atmark@atde5:~/atmark-dist$ make

図6 Linuxカーネル/ユーザーランドのビルド


Ralink Technology社製チップのLinux用ファームウェアの追加

ファームウェアの展開

Ralink Technology社製チップのLinux用ファームウェアは、Debianのリポジトリからダウンロードすることができます。2015年11月9日時点ではv0.43がDebian jessie(stable)で使われています。 firmware-ralink_0.43_all.deb をATDE5内にダウンロードし、atmark-dist内のromfsディレクトリに展開してください。

atmark@atde5:~$ wget http://ftp.jp.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-ralink_0.43_all.deb
atmark@atde5:~$ dpkg-deb -x firmware-ralink_0.43_all.deb ~/atmark-dist/romfs/

図7 Ralink Technology社製チップのファームウェアの展開

make romfsまたはmake cleanを実行すると、展開したファームウェアは削除されます。削除された場合は再展開してください。


Linuxカーネルとユーザーランドの作成

以上の設定が終わったらLinuxカーネルとユーザーランドのイメージを作成してください。

atmark@atde5:~$ cd ~/atmark-dist
atmark@atde5:~/atmark-dist$ make image

図8 Linuxカーネル/ユーザーランドのイメージ作成


USB無線LANアダプタの動作確認

Armadilloの起動

ここではArmadillo-420を用いてUSB無線LANアダプタの動作確認を行います。 Armadillo-420にUSB無線LANアダプタを接続し、上述した手順でビルドしたカーネルおよびユーザーランドで起動します。 起動後に iwconfig コマンドを実行すると、ネットワークインターフェース wlan0 が確認できます。

[root@armadillo420-0 (ttymxc1) ~]# iwconfig
wlan0     IEEE 802.11bgn  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=0 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on

図9 Armadillo起動時の wlan0 の状態


ネットワークインターフェースの設定

ここではDHCPと、固定IPで運用する場合の設定方法を説明します。

ネットワークインターフェースの設定は /etc/config/interfaces の内容を変更することで行います。 内容を変更後は、 変更内容をフラッシュメモリに保存してください。

DHCPで運用する場合

iface wlan0 inet dhcp

固定IPで運用する場合

iface wlan0 inet static
  address   192.168.0.2
  netmask   255.255.255.0
  broadcast 192.168.0.255
  gateway   192.168.0.1

変更内容をフラッシュメモリに保存

[root@armadillo420-0 (ttymxc1) ~]# flatfsd -s


無線LANアクセスポイントへの接続

ここでは wpa_supplicant を使用して、無線LANアクセスポイントへ接続する手順を説明します。

今回、無線LANアクセスポイントには NEC PA-WR8700N を用いました。 無線LANアクセスポイントは表2のように設定し、確認を行いました。設定値はお使いの環境に合わせて適宜読み替えてください。

表2 接続先の無線LANアクセスポイントの設定
項目 設定値
セキュリティ設定 WPA2-PSK
SSID wpa-ap
パスフレーズ 0123456789ABC

まず wpa_passphare コマンドを用いて、無線LANアクセスポイントへ接続する為の設定ファイルを作成します。

[root@armadillo420-0 (ttymxc1) ~]# wpa_passphrase wpa-ap 0123456789ABC > /etc/config/wpa_supplicant.conf

図10 wpa_supplicant.confの生成


次に /etc/config/wpa_supplicant.confvi などのエディタで編集し WPA2-PSK(AES)用に設定します。設定は図11を参考にしてください。 編集が完了したら、 wpa_supplicant.conf をフラッシュメモリに書き込んでください。

network={
        ssid="wpa-ap"
        #psk="0123456789ABC"   # この行は削除します
        psk=a1ba49620e3388a650e42568fe1b5f198fe611ba239d826d7f34447900723796
        proto=RSN              # 追加する
        key_mgmt=WPA-PSK       # 追加する
        pairwise=CCMP          # 追加する
        group=CCMP             # 追加する
}

図11 wpa_supplicant.confの設定例


次に、wpa_supplicant を実行し、無線LANアクセスポイントへ接続します。

[root@armadillo420-0 (ttymxc1) ~]# wpa_supplicant -i wlan0 -c /etc/config/wpa_supplicant.conf -Dwext -B

図12 wpa_supplicant による無線LANアクセスポイントへの接続コマンド


無線LANアクセスポイントへの接続が成功すると、iwconfig wlan0コマンドで以下の結果が確認できます。

[root@armadillo420-0 (ttymxc1) ~]# iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"wpa-ap"
          Mode:Managed  Frequency:2.472 GHz  Access Point: xx:xx:xx:xx:xx:xx
          Bit Rate=6.5 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
          Link Quality=70/70  Signal level=-29 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

図13 無線LANアクセスポイントへ接続後の wlan0 の状態


次に、ifup コマンドでネットワークの設定を反映させます。

[root@armadillo420-0 (ttymxc1) /etc/config]# ifup wlan0
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 5, CWmax: 10, Aifs: 7, TXop: 0.
[root@armadillo810-0 (ttySC2) /etc/config]# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.0.2  Bcast:192.168.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1741 errors:0 dropped:563 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:285362 (278.6 KiB)  TX bytes:5676 (5.5 KiB)

図14 ネットワーク設定の反映


有線LANポートや、USBハブ経由で有線LANアダプタを用いてネットワークに接続している場合、通信が正常に行われない場合があります。その為、ifconfig コマンドで eth0 を無効にします。

[root@armadillo420-0 (ttymxc1) ~]# ifconfig eth0 down

図15 有線LANポート(eth0)の無効化


スループット計測結果

今回使用した環境で、NPtcpを用いてスループットを測定した結果、Armadillo-420(linux-3.14-at4)は約8Mbps、Armadillo-840(linux-3.4-at16)は約24Mbpsのスループットが確認できました。

linux-3.14-at4で iwconfig を使って通信速度をautoから固定に設定すると、Warningが発生し正しく通信できない場合があります。 原因については現在調査中です。


ieee80211 phy0: rt2800usb_txdone: Warning - Got TX status for an empty queue 2, dropping