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を動かすときの手順をまとまると
- カーネルに必要なドライバを入れる。
- ユーザーランドに必要なツール、ファイルを入れる。
- sudo apt-get install wireless-tools linux-firmware
- /etc/network/interfaces に無線LANの設定を記述する。
関連するページ
ARM Debian/Ubuntuの上でAndroidを動かす
KZM-CA9-01ボードのリンク集 Links related KZM-CA9-01(Quad core Cortex-A9 board)