2010年09月28日

KZM-CA9-01のARM UbuntuでUSBの無線LANアダプタを使う (その1)

引き出しの中に埋もれていたUSBの無線LANアダプタをKZM-CA9-01のARM Ubuntu上で使えるようにしました。

Pocket WiFi(イーモバイルのモバイルルータ)と接続できることを確認しています。これで出先でのデモで外のインターネットにつなぐことができるようになりました。

使用したUSB無線LANアダプタはバッファローのWLI-U2-KG54L

3年前くらいに買った100円ライターの大きさのものです。

使用しているチップは ZD1211。



下準備

まずこのUSB無線LANアダプタをx86_64のUbuntu 9.04のPCに挿してみました。すると、自動認識してドライバがロードされ、GUIでWiFiの設定をしたら、もうそれで使うことができました。好感触。

lsmodで見てみると、どうやら無線LANのためにロードされたのは以下の3つのモジュールらしい。

  • zd1211rw
  • mac80211
  • cfg80211

また、kernelのバージョンは2.6.28-19-generic でした。だからこれより上のバージョンのカーネルならこのドライバは標準で入っている可能性が高いと思います。

カーネルのリビルド

今回はまず2.6.29のカーネルで試しました。

上記の3つを念頭に、make menuconfig でwireless networkとdevice driverを追加しました。モジュールでなく、カーネル本体に組み込みました。

再ビルドは問題なく終了。

起動してみた

とりあえずこれで、USBの無線LANアダプタを挿した状態で起動してみました。

  ...

usb 1-1.3: new high speed USB device using isp1760 and address 3
usb 1-1.3: configuration #1 chosen from 1 choice
usb 1-1.3: reset high speed USB device using isp1760 and address 3
wmaster0 (zd1211rw): not using net_device_ops yet
wlan0 (zd1211rw): not using net_device_ops yet
zd1211rw 1-1.3:1.0: phy0

  ....

usb 1-1.3: firmware: requesting zd1211/zd1211b_ub
usb 1-1.3: Could not load firmware file zd1211/zd1211b_ub. Error number -2
zd1211rw 1-1.3:1.0: couldn't load firmware. Error number -2
usb 1-1.3: firmware: requesting zd1211/zd1211b_ub
usb 1-1.3: Could not load firmware file zd1211/zd1211b_ub. Error number -2
zd1211rw 1-1.3:1.0: couldn't load firmware. Error number -2

zd1211rwのドライバはちゃんと入ったようです。

でも zd1211/zd1211b_ubというファイルが無くてエラーになっているようです。

apt-fileでこのファイルを探してみます。(参考になるページ)

$ apt-file search zd1211/zd1211b_ub
linux-firmware: /lib/firmware/zd1211/zd1211b_ub

このファイルは/lib/firmwareの下にあるべきで、そしてそれはlinux-firmware というパッケージに入っていることがわかりました。

$ sudo apt-get install linux-firmware

これで、/lib/firmware/zd1211/zd1211b_ub が入ったので再度チャレンジ。

usb 1-1.3: firmware: requesting zd1211/zd1211b_ub
usb 1-1.3: firmware: requesting zd1211/zd1211b_uphr
zd1211rw 1-1.3:1.0: firmware version 4725
zd1211rw 1-1.3:1.0: zd1211b chip 0411:00da v4810 high 00-16-01 AL2230S_RF pa0 g--N-
Reloading ptd d7405200/d78e1240... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001
Reloading ptd d74053e0/d79a5de0... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001
Reloading ptd d74053e0/d79a5de0... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001
Reloading ptd d74053e0/d79a5de0... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001
Reloading ptd d74053e0/d79a5de0... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001
Reloading ptd d74053e0/d79a5de0... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001
Reloading ptd d74053e0/d79a5de0... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001
Reloading ptd d74053e0/d79a5de0... qh d74063e0 readed: 0 of 4800 done: 00000000 cur: 00000001

 ....

先に進んだようですが、なんか延々とエラーメッセージが表示されています。うーむ。

/etc/network/interfacesの記述

このページを参考にして、/etc/network/interfacesは以下のように書きました。

暗号化はWEP 64bitでパスワードは"12345"の場合です。

パスワードは16進数で記述します。

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wireless-essid D25HW-XXXXXXXXXXXX
wireless-key 3132333435

WEPを使うにはwireless-tools パッケージをインストールする必要があると書かれていたので、それをインストール。

$ sudo apt-get install wireless-tools

つながった!

以下のようにDHCPでIPアドレスがちゃんと割り振られています。

$ sudo ifconfig
eth0      Link encap:Ethernet  HWaddr ee:64:22:1c:0f:bc  
          inet addr:192.168.150.10  Bcast:192.168.150.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24505 errors:0 dropped:20 overruns:0 frame:0
          TX packets:19037 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:13748024 (13.7 MB)  TX bytes:3057269 (3.0 MB)
          Interrupt:66 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr 00:16:01:d0:26:16  
          inet addr:192.168.2.101  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3206 (3.2 KB)  TX bytes:1168 (1.1 KB)

wmaster0  Link encap:UNSPEC  HWaddr 00-16-01-D0-26-16-00-00-00-00-00-00-00-00-00-00  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

$ 
$ sudo iwconfig

lo        no wireless extensions.

eth0      no wireless extensions.

wmaster0  no wireless extensions.

wlan0     IEEE 802.11bg  ESSID:"D25HW-XXXXXXXXXXXX"  
          Mode:Managed  Frequency:2.412 GHz  Access Point: 00:25:68:D8:02:C8   
          Bit Rate=54 Mb/s   Tx-Power=27 dBm   
          Retry min limit:7   RTS thr:off   Fragment thr=2352 B   
          Encryption key:3132-3334-35   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level:78/100  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

$ 

コンソールのエラーメッセージ対策

うまく動いているようですが、延々と出るコンソールのエラーメッセージはどうしたもんだろう。

ダメ元で "Reloading ptd" でGoogle検索してみたら、このパッチが見つかりました。

これと同じUSBホストドライバがKZM-CA9-01ボードで使われています。まさにジャストミート。

このメッセージは特にエラーではないそうなので、このprintkごとコメントアウトしてカーネルをリビルドしました。

これでエラーメッセージはなくなりました。

(2.6.35のカーネルではすでにこのパッチが適用されていました。)

Androidではどうなる?

同じカーネルを使ってAndroidでちょっと試しました。

hardware/libhardware_legacy/wifi/wifi.c のwifi_load_driver で

/system/lib/modules/wlan.ko というカーネルモジュールをinsmodしようとしてそれに失敗しています。

どうやら無線LANを有効にしたときにこのカーネルモジュールをinsmodして、無効にしたらrmmodしてるようです。メモリを有効利用するためでしょうね。とりあえず今はカーネルモジュールを作らずに全てカーネルにリンクしてしまっているので、後でまたゆっくり調べます。

Ubuntuが起動した状態からchrootでAndroidを起動すれば(Andorid on Ubuntu)、もちろんUbuntu側で有効にした無線LANがAndroid側からも使えます。

このようにカーネルに新しいドライバを組み込むときにはいきなりAndroidでやるよりも、まずUbuntuやDebianで試すほうがツールや情報が豊富でやりやすいですね。

新しいカーネルでは?

まず試したカーネルは2.6.29で、これはうまくいきました。

次にもっと新しいカーネルで試したのですが、最終的にはデバイスドライバを少し修正することでうまくいきました。これに関してはまた後日。

まとめ

初めてなので試行錯誤しましたが、ARM Ubuntuで無線LANを動かすときの手順をまとまると

  1. カーネルに必要なドライバを入れる。
  2. ユーザーランドに必要なツール、ファイルを入れる。
    • sudo apt-get install wireless-tools linux-firmware
  3. /etc/network/interfaces に無線LANの設定を記述する。


トラックバックURL

トラックバック一覧

4コアのCortex-A9のKZM-CA9-01ボードを使って実験したことを書いたページをまとめてみました。

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード