T-SH7706LANにUSBポートを増設


3.Wireless LANアダプタ組み込み編

ここでは、USBポートに接続したWireless LANアダプタを、SH3-linuxから利用できるようにするまでの手順を紹介します。
大筋の手順は、以下のようになります。


  1. カーネルのコンフィギュレーション
    →Wireless LANの支援機能を有効にします

  2. Wireless LANアダプタ用 ドライバのコンパイル
    →ドライバのソースコードをコンパイルします

  3. ターゲット(T-SH7706LAN)でドライバの動作確認をする
    →取り敢えず動作を確認してみる

  4. ドライバを組み込む
    →起動時にドライバを自動ロードするように設定する

なお、今回利用するアダプタは、PlanexのGW-US54Mini2(USB接続タイプ)です。
RT73という若干古いチップを使っているのですが、枯れたチップなだけに、動作実績やログが豊富なことから、今回はこれを使うことにします。

GW-US54Mini2(パッケージ)

#入手製の良さでは、BUFFALO ULI-U2-KG54辺りですが、巧く動作させることができませんでしたorz

1) カーネルのカスタマイズ

Wireless LANの機能を有効にするため、再びLinuxカーネルをカスタマイズします。
WLANアダプタのドライバをコンパイルする際、カーネルソースを参照するため、ドライバのコンパイルよりも先に、カーネルをカスタマイズしておく必要があるという点に注意します。(殆どのドライバがそんな感じです)

コマンドラインから以下のように入力し、コンフィギュレーションメニューを起動します。

 $ make ARCH=sh menuconfig

変更する内容は以下の通りです。
それぞれ、カーネルによるWLAN機能の支援に必要なオプションです。

Device Drivers --->
  Generic Driver Options --->
    <*> Hotplug firmware loading support

Device Drivers --->
  Networking support --->
    Wireless LAN (non-hamradio) --->
      <*> Wireless LAN drivers (non-hamradio) & Wireless Extensions

設定を変更したら、カーネルの再コンパイルの手順で、カーネルをコンパイルします。
また、忘れないように、ここで新しいカーネルをターゲットに組み込んでおきましょう。

2) WLANアダプタ用 ドライバのダウンロード

GW-US54Mini2をSH3-Linuxから利用するためには、Linux用のドライバが必要です。
ドライバは、以下のRalinktech社のサイトからダウンロードすることができます。

http://www.ralinktech.com/ralink/Home/Support/Linux.html

なお、ファイル名は、2009_0206_RT73_Linux_STA_Drv1.1.0.2.tar.bz2です。
ダウンロードしたファイルは、コマンドラインから以下のように入力すると展開することができます。

 $ tar xvfj 2009_0206_RT73_Linux_STA_Drv1.1.0.2.tar.bz2

3) WLANアダプタ用 ドライバのコンパイル

ダウンロードしたドライバをコンパイルします。
但し、ダウンロードしたドライバでは、今回のGW-US54Mini2のPID(プロダクトID)に対応していませんので、ソースコードを若干変更する必要があります(よくあります)。また、Makefileを組み込み用に変更する必要があります。

変更するファイルの1つ目は、展開したディレクトリのModuleディレクトリにあるrtmp_def.hです。
末尾付近に以下の行を追加します。

  …中略…
  {USB_DEVICE(0x13b1,0x0020)}, /* Linksys WUS54GC */ \
  {USB_DEVICE(0x2019,0xab50)}, /* Planex GW-US55Mini2 */ \ ←この行を追加
  { }/* Terminating entry */ \
} /* end marker */

更に、同じ階層のディレクトリにあるMakefileも編集します。

  …中略…
  #PLATFORM=PC  ←PC用の設定。コメントアウトする
  PLATFORM=CMPC  ←組み込み用の設定。コメントを外す

  …中略…

  ifdef KERNDIR
   KERNEL_SOURCES := $(KERNDIR)
  else
   KERNEL_SOURCES := /home/yokomizu/shlinux/linux
                  ↑カーネルソースのディレクトリを指定する
  endif

※カーネルソースのディレクトリは、1)の手順でカスタマイズしたカーネルソースを、絶対パスで指定します。

次に、ドライバをコンパイルします。
ドライバを展開したディレクトリの下にある、Moduleディレクトリに入り、以下のコマンドを実行します。

 $ make ARCH=sh CROSS_COMPILE=sh3-linux-

もしも、ここでカーネルシンボルが見つからないというWarningが表示される場合は、カーネルのコンフィギュレーションが不十分ということなので、1)の手順を確認します。

コンパイルに成功すると、makeを実行したディレクトリの下に、rt73.ko が出力されます。
他に必要なファイルは、rt73.bin(ファームウェア)と、rt73sta.dat(SSIDなどの設定ファイル)です。

4) ドライバのファイルの組み込み(ファイルのコピー)

3)の手順でコンパイルしたドライバを、ターゲットへ組み込みます。
それぞれのファイルをターゲットへコピーし、以下のように配置します。(READMEより)

 rt73.bin => /etc/Wireless/RT73STA/
 rt73sta.dat => /etc/Wireless/RT73STA/
 rt73.ko => 取り敢えずどこでも良い(例:ホームディレクトリ)

配置したら、ターゲットで以下のコマンドを入力します。(READMEより)

 # dos2unix /etc/Wireless/RT73STA/rt73sta.dat

次に、接続するAPのSSID等の設定を行います。
ターゲット上で、rt73sta.datファイルを編集します。

 # vi /etc/Wireless/RT73STA/rt73sta.dat

設定方法は、READMEにかなり詳しく書かれているので、詳細は割愛しますが、例としてWEP暗号化+オープンシステムを使う場合を紹介したいと思います。
WEP暗号化を使う場合に、最低限として設定を書き換える項目は以下の通りです。

 SSID =  <接続しようとするアクセスポイントのSSIDをASCIIで書く>
 EncryptType =  WEP
 Key1Str =  <WEP暗号化キーを16進数で書く。例:'ABCDE'の場合→4142434445>

但し、AP側の設定によっては、他にも変更すべき点があるかも知れませんので、APの設定を確認しておきましょう。

5) ドライバの動作確認

ドライバが動作するかどうかを確認してみます。

rt73.ko ファイルをコピーしたディレクトリの下で、以下のコマンドを実行する。

 # insmod rt73.ko

次のメッセージが表示されるとOK。

 -RT73-<7>usb_rtusb_init-->
 usbcore: registered new driver rt73

ここで、WLANアダプタを挿してみる。
以下のようなメッセージが表示されるとOK。(もの凄く長いメッセージです)

usb 1-1: new full speed USB device using sl811-hcd and address 2
-RT73-<7>usb_rtusb_probe-->
idVendor = 0x2019, idProduct = 0xab50
 
…中略…
-RT73-<7><-- MLME Initialize
-RT73-<7>usb_rtusb_init_device<--
-RT73-<7>usb_rtusb_probe<--

途中で、以下のようなメッセージが表示されることがありますが、恐らく問題ありません。
要は、ロードしようとしたrt73.binよりも、ローカル(内蔵?)のファームの方が新しいだろという事のようです。

ERROR!!! <7>NICLoadFirmware: Ver=1.7, local Ver=2.2, used FirmwareImage talbe instead
-RT73-<7>NICLoadFirmware failed, used local Firmware(v 2.2) instead

次に、APへ接続し、IPアドレスを割り当ててみます。

以下のコマンドを実行する。

 # udhcpc -i rausb0

暫くしてWLANアダプタのランプが青色点灯し、更に待つとコマンドラインに戻ってくるはずです。
但し、デバッグメッセージが有効のままですので、エラい勢いでメッセージが流れ続けると思います。
(後に修正する方法も紹介しています)

次に、IPアドレスが取得できている事を確認します。

 # ifconfig

以下のようにIPアドレスが取得できていればOK。

 rausb0 Link encap:Ethernet HWaddr 00:22:CF:01:5A:55
 inet addr:192.168.11.7 Bcast:192.168.11.255 Mask:255.255.255.0
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 RX packets:2990 errors:0 dropped:0 overruns:0 frame:0
 TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:253590 (247.6 KiB) TX bytes:4724 (4.6 KiB)

あとは、pingコマンドをターゲットや外部から実行し、疎通を確認してみましょう。
ここまで問題が無ければ、あとは普通のネットワークポートとして使うことができます。

電源を落とす前か、アダプタを取り外す前に、以下のコマンドを入力します。

 # ifconfig rausb0 down
 # rmmod rt73

6) デバッグメッセージをOFFにする

動作することを確認できたら、デバッグメッセージは不要となるので無効にします。
デバッグメッセージを無効にするには、ドライバのMakefileファイルを変更します。

…中略…
 ## Comment/uncomment the following line to enable/disable debugging
 #EXTRA_CFLAGS += -DDBG ←この行の先頭に#マークを入れてコメントアウトする
…中略…

ドライバを再びmakeし、新しい rt73.ko をターゲットへコピーします。

7) 自動起動する

このままでは、起動する度にドライバを手動で組み込む必要がありますので、自動化します。
以下は、SH3-Linuxでの作業手順を示しています。

まず、ディレクトリを作成する。

 # mkdir /lib/modules
 # mkdir /lib/modules/2.6.12.6

次に、RT73.koをそこにコピーする。

 # cp rt73.ko /lib/modules/2.6.12.6

そしてモジュールの依存関係を更新する。

 # depmod -a 2.6.12.6
 # depmod -n

これで、/lib/modules/2.6.12.6/の下に、「modules.dep」というファイルが作成されるはずです。

次に、/etc/modules.confを編集します。(無い場合は新規作成します)
以下の行を追加します。

alias rausb0 rt73

これによって、「rausb0」というデバイスにアクセスしようとしたとき、自動的にrt73.koがロードされるようになります。
試しに、T-SH7706LANを再起動した後、rausb0デバイスにアクセスしてみます。

 # udhcpc -i rausb0

これで、WLANデバイスがAPに接続される筈です。
もしもハングする場合は、一旦WLANアダプタを取り外してから装着し、上のコマンドをリトライします。

あとは、起動時に自動的にAPに接続するよう、/etc/rc.d/rc.sysinitの最後尾に上のコマンドを追加します。
これで起動時に自動的にドライバをロードし、APに接続できるようになります。

ただ、現時点では、この方法だと、そこはかとなく不安定な動作になるようです。
方法としてはこれで良い筈なのですが、何故かうまくいきません。(気が向いたらデバッグしてみます)

不安定な場合、モジュールのロードと、 APへの接続の処理を分離するとうまくいくようです。
#それじゃmodules.confの意味が無いよう!という話もあります。
取り敢えず、etc/rc.d/rc.sysinitには以下の行だけを追加し、ログインした後にAPへ接続すると良いです。

modprobe rt73 ←取り敢えずモジュールだけロードする

8) シャットダウン時にネットワークI/Fを無効にする

システムのシャットダウン時にWLANアダプタが有効なままだと、何かのプロセスが終了せず、途中で固まってしまいます。
これではちょっと気持ちが悪いので、解決策が見付かるまでの回避手段として、システムのシャットダウン時にWLANアダプタを自動的に無効にする方法を紹介します。

 # vi /etc/rc.d/rc0

 「sync」コマンドが置いてある行のすぐ上に、以下の行を追加します。

ifconfig rausb0 down
rmmod rt73

これで完璧にシャットダウンできるようになるはずです。
…ということで、細かい課題は残りますが、説明は以上です。


[戻る]