Guide on adding WiFi drivers to Android

http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html


こういうドキュメントは少ないので、ありがたい。
とりあえず和訳してみた。添削よろしく〜。>all

    • -

WiFiドライバをAndroidに移植する


わたしたちは、mini-box.comのpicoPCのために、USBとminiPCIのWiFiドングルを対応させる必要がありました。このガイドは、カスタムしたAndroid環境に、新しいWiFiドライバを追加し、WiFiが動作するように設定する手順を解説します。(このガイドは、Android 2.1のために書かれていますが、それ以前のリリースや、おそらく将来のリリースにも適用できるでしょう。)


目次
0. AndroidでのWiFiの動作を理解する http://d.hatena.ne.jp/kinneko/20100507/p2
1. BoardConfig.mkでwpa_supplicantのビルドを有効にする http://d.hatena.ne.jp/kinneko/20100507/p3
2. (任意) wpa_supplicantのデバッグを有効にする http://d.hatena.ne.jp/kinneko/20100507/p4
3. 使用デバイスに合わせてwpa_supplicant.confを編集する http://d.hatena.ne.jp/kinneko/20100507/p5
4. 正しいパスとパーミッションをinit.rcで設定する http://d.hatena.ne.jp/kinneko/20100507/p6
5. init.rcでwpa_supplicantとdhcpd(任意)を起動する http://d.hatena.ne.jp/kinneko/20100507/p7
6. WiFiドライバをモジュール、もしくはkernelに組み込みで構築し、対応するAndroidソースコードを修正する http://d.hatena.ne.jp/kinneko/20100507/p8
7. WiFiドライバが専用のファームウエアを必要とするのであれば、それを組み込む http://d.hatena.ne.jp/kinneko/20100507/p9
8. wpa_supplicantのコマンドと、SIOCSIWPRIV ioctlを使い、WiFiドライバをAndroidで動作するように変更する http://d.hatena.ne.jp/kinneko/20100507/p10

Guide on adding WiFi drivers to Android - 0. AndroidでのWiFiの動作を理解する

Androidは、WiFiに対応するために、改変されたwpa_supplicant(external/wpa_supplicant)デーモンを使っています。
wpa_supplicantは、frameworks/base/wifi/java/android/net/wifi/以下にある、android.net.wifiパッケージによってユーザーインターフェースが提供されています。
android.net.wifiパッケージは、hardware/libhardware_legacy/wifi/wifi.cを通じたソケット通信と、それに対応してjniで実装されたframeworks/base/core/jni/android_net_wifi_Wifi.cppを制御しています。
より上位のネットワーク管理機能は、frameworks/base/core/java/android/netで提供されています。

Guide on adding WiFi drivers to Android - 1. BoardConfig.mkでwpa_supplicantのビルドを有効にする

これは、単純にBoardConfig.mkに以下を追記するだけです:

BOARD_WPA_SUPPLICANT_DRIVER := WEXT

これは、external/wpa_supplicant/Android.mkの中で、WPA_BUILD_SUPPLICANTをtrueに設定し、driver_wext.cのビルドを有効にします。
もし、madwifiのような専用のwpa_supplicantドライバーが必要であれば、 以下のように設定することができます。

BOARD_WPA_SUPPLICANT_DRIVER := MADWIFI

Guide on adding WiFi drivers to Android - 2. (任意) wpa_supplicantのデバッグを有効にする

そのまま使用すると、wpa_supplicantは、MSG_INFOにあまり情報を出力しません。より多くのメッセージを表示するためには、以下の変更を行います。

  • ommon.cを修正し、wpa_debug_levelにMSG_DEBUGを設定します。
  • common.hを修正し、

#ifdef ANDROID to if ((level) >= MSG_DEBUG) instead of if ((level) >= MSG_INFO)

#define wpa_printf

に書き換えてください。

Guide on adding WiFi drivers to Android - 3. 使用デバイスに合わせてwpa_supplicant.confを編集する

wpa_supplicant.confは重要なファイルです。Android用の制御ソケットがこのファイル(ctrl_interface=)に記載されているからです。このファイルは、AndroidBoard.mkの$(TARGET_OUT_ETC)/wifi にコピーされる必要があります(標準的には/system/etc/wifi/wpa_supplicant.confに置かれます)。
この配置は、init.rcのservice wpa_supplicantで、wpa_supplicant設定ファイルとして二重に確認されます。


wpa_supplicant.confの最低必要な設定:

ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
update_config=1


ドライバが必要とするなら、以下を追記します。

ap_scan=1

無線アクセスポイントの認識に問題がある場合は、p_scan=0に設定すると、wpa_supplicantの代わりにドライバがそれを行います。


wpa_supplicantが、WPAでないオープンな無線ネットワーク(標準ではスキップされる)に接続するのであれば、以下のように設定します。

network={
key_mgmt=NONE
}

Guide on adding WiFi drivers to Android - 4. 正しいパスとパーミッションをinit.rcで設定する

パーミッションの設定を誤ると、wpa_supplicantは、制御ソケットを作成したり開いたりすることができず、libhardware_legacy/wifi/wifi.cは接続ができなくなります。
wpa_supplicantは、Googleによって、wifiユーザーとグループで動作するように修正されているので、ファイルとディレクトリ構造のオーナーをwifiに設定しておく必要があります(wpa_supplicant/os_unix.cのos_program_init()関数を確認のこと)。


そのように設定しない場合は、以下のようなエラーになります:

E/WifiHW ( ): Unable to open connection to supplicant on "/data/system/wpa_supplicant/wlan0": No such file or directory will appear.


また、wpa_supplicantが修正するので、wpa_supplicant.confもwifiユーザー/グループに設定されている必要があります。もし、システムが置かれている/Systemが読み取り専用であり、このファイルが/data/misc/wifi/wpa_supplicant.conf に置かれている場合は、init.rcのwpa_supplicant serviceを修正して、読み書き可能な場所を設定してください。


init.rcの中で正しいパスが設定されていることを確認する:

mkdir /system/etc/wifi 0770 wifi wifi
chmod 0770 /system/etc/wifi
chmod 0660 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf

# wpa_supplicant socket
mkdir /data/system/wpa_supplicant 0771 wifi wifi
chmod 0771 /data/system/wpa_supplicant

#wpa_supplicant control socket for android wifi.c
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf

Guide on adding WiFi drivers to Android - 5. init.rcでwpa_supplicantとdhcpd(任意)を起動する

init.rcでwpa_supplicantを開始するには以下のように設定します:

service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf
group system wifi inet
disabled
oneshot

WiFIドライバが、wlan0以外の名前でデバイスを作成するのであれば、上記の該当部分を修正してください。


同様に、dhcpcdを起動するには、以下のように設定します。

service dhcpcd /system/bin/dhcpcd wlan0
group system dhcp
disabled
oneshot

Guide on adding WiFi drivers to Android - 6. WiFiドライバをモジュール、もしくはkernelに組み込みで構築し、対応するAndroidのソースコードを修正する

はじめに、使っているkernelでCONFIG_PACKETとCONFIG_NET_RADIO(wireless extensionsにある)が有効になっているかを確認してください。
ドライバは、モジュール形式(Androidでの一般的なやり方)もしくは、kernel組み込み(USB WiFiのような複数デバイスへの対応をkernelの自動認識にまかせるのであれば)でビルドされている必要があります。どちらもソースコードの変更が必要になります(後述)。

  • kernelモジュールの場合:

BoardConfig.mkで以下の項目を定義します。
1. WIFI_DRIVER_MODULE_PATH := (モジュール名をパスとともに記載します。一般的な例では/system/lib/modules/wlan.ko)
2. WIFI_DRIVER_MODULE_NAME:= (たとえば、wlan0)
3. WIFI_DRIVER_MODULE_ARG:= (たとえば、nohwcrypt)
Androidをビルドする時に、正しい位置にモジュールが置かれているか確認してください。

  • kernel組み込みの場合:

最初に、init.rcを変更する必要があります。ドライバがすでに読み込まれ、wpa_supplicantのステイタスが動作中に設定されている、hardware/libhardware_legacy/wifi/wifi.cで定義されたインターフェース名を知らせる必要があります。

setprop wifi.interface "wlan0"
setprop wlan.driver.status "ok"
setprop init.svc.wpa_supplicant "running"

次に、insmod/rmmod操作で0を返し(単純に0を返すだけです。kernelに組み込む場合は関数の最初の行は不要です)、 check_driver_loaded()関数で/proc/modulesを確認する前に戻るように、hardware/libhardware_legacy/wifi/wifi.cを書き換える必要があります。

Guide on adding WiFi drivers to Android - 7. WiFiドライバが専用のファームウエアを必要とするのであれば、それを組み込む

ドライバが、専用のファームウエアを必要とするのであれば、Androidのビルド時に、/etc/firmwareにファームウエアをコピーしておく必要があります。Androidは、標準的なhotplugプログラムを使用しません(ただし、Android-x86ではsystem/code/toolbox/hotplug.cで有効になっています)。そのかわりに、initがファームウエアのイベントを処理し、/etc/firmwareからファームウエアをロードしています(system/core/init/devices.c内のhandle_firmware_event()関数を参照のこと)。
ファームウエアのファイル名はドライバで定義され、たとえばRTL8192SU/rtl8192sfw.binのようにディレクトリ名を含んでいます。すべてのファイルパスは、/etc/firmware以下に存在する必要があります。

Guide on adding WiFi drivers to Android - 8. wpa_supplicantのコマンドと、SIOCSIWPRIV ioctlを使い、WiFiドライバをAndroidで動作するように変更する

Androidは、ドライバにコマンドを送り、信号強度、無線APのMACアドレス、リンク速度のような情報を取得するためにIOCSIWPRIV ioctlを使います。このioctlは、Googleのmsm kernelブランチにあるbcm4329をのぞいて、ほとんどのワイヤレスドライバで実装されていません。


このioctlを実装しておかないと、以下のようなエラーになります:

E/wpa_supplicant( ): wpa_driver_priv_driver_cmd failed wpa_driver_priv_driver_cmd RSSI len = 4096
E/wpa_supplicant( ): wpa_driver_priv_driver_cmd failed
D/wpa_supplicant( ): wpa_driver_priv_driver_cmd LINKSPEED len = 4096
E/wpa_supplicant( ): wpa_driver_priv_driver_cmd failed
I/wpa_supplicant( ): CTRL-EVENT-DRIVER-STATE HANGED

4行目のあと、WEXT_NUMBER_SEQUENTIAL_ERRORSエラーで、Androidはデバイスの使用を中止します。


インターフェイスから、WiFiを簡単にテストするには、external/wpa_supplicant/driver_wext.cのエラーチェックを無効にします。ioctlが呼ばれた後に、wpa_driver_priv_driver_cmd()でret = 0; を返すようにします。こうすることで、信号やMACアドレスがなくても、全てのアクセスポイントがAndroidの画面に表示されることになります。


適切にioctlを実装するには、SIOCSIWPRIV ioctlでRSSI(電波強度)やMACADDRコマンド応答するようにkernelドライバを変更することが重要です。


より良い方法は、Googleによるexternal/wpa_supplicant/以下にwpa_driver_priv_driver_cmd()関数を含んだdriver_xxx.cカスタムドライバを追加することでしょう。これは、SIOCGIWSTATS ioctlに呼び出しを通じてRSSIとMACADDRを返し、残りの機能はdriver_wext.cから呼ばれるようにします。


以下は、 mini-box.com picoPC用にAndroidをビルドするために作成したwpa_supplicantのパッチです。それは、新たに、無線LAN拡張ioctlを使って、Androidドライバコマンドをエミュレートするawextドライバを作成します。


このドライバを使うには:
1. BoardConfig.mkにBOARD_WPA_SUPPLICANT_DRIVER := AWEXTと定義します
2. init.rcのwpa_supplicant service command行を、DwextからDawextに書き換えます


Patch download: 0001-Added-a-separate-driver-awext-to-emulate-Android-dri.patch
http://www.linuxconsulting.ro/android/patches/0001-Added-a-separate-driver-awext-to-emulate-Android-dri.patch

続きを読む

日本Androidの会 金沢支部 第五回勉強会 5/15にやります

IS01を持って来てもらえそうですので、タッチ&トライします。

 日時:2010年5月15日(土) 13:00 - 17:00
 定員:50名
 費用:無料
 場所:石川工業高等専門学校 トライアル研究センター2F 基礎情報教育演習室
    石川県河北郡津幡町北中条タ1
    JR西日本 北陸本線 津幡駅から徒歩15分,タクシー5分、駐車場あり
 主催:日本Androidの会 金沢支部
 共催:石川工業高等専門学校 技術振興交流会

 内容:調整中です。
  13:00 受付開始
  13:10 ごあいさつ
  13:20 「Android&BeableBoardで学ぶ組込入門」出村さん
  14:50 休憩
  15:00 「Android & ZigBeeセンシングネットワーク」インターラップの松吉さん
  16:00 「au IS01の紹介と開発者支援について」KDDI オープンプラットフォーム部 主任 平野裕介さん
  16:30 au IS01タッチ&トライ
  17:30 終了

「Xperia」首位陥落 「iPhone 3GS」が再び首位に

http://plusd.itmedia.co.jp/mobile/articles/1005/06/news040.html
いきなり3位になってしまったのは、実弾が不足しているからかな?
それとも、みんなもう飽きた?
天下は3週間だけだったわけね。
GfKだから、そんなにアテにはならないけどさ。

「RhodesではObjective-Cのコードを生成し、Apple純正の開発環境を利用してコンパイルを行うため問題にはならないと信じている」

http://www.rhomobile.com/
http://sourceforge.jp/magazine/10/05/06/0956240
Rhodesは、RubyとHTMLでクロスプラットフォームのモバイルアプリ開発を行うフレームワーク
MITライセンス。
同期サーバーのRhoSyncは課金される。

「Appleは世界制覇をもくろんでいる。App Storeプラットフォームを通じてSteve Jobsはウェブに根本的な変化をもたらそうとしている。しかしAppleには一点だけ欠けている分野がある。Appleはウェブベースのサービスの重要性を理解していない。たとえば(そもそもあまり魅力的でない)MobileMeサービスを有料化したことなどがその例だ。またソーシャルグラフを取得しようという努力もほとんど払っていない」

http://jp.techcrunch.com/archives/20100506tim-oreilly-steve-jobs-is-trying-to-build-a-fundamental-challenge-to-the-web/

「紙との共存ができるなら協力するが、紙の出版を維持できないなら協力はできない。こちらがコンテンツを出さなければ向こうも(電子書籍端末を)出すことはできない」

http://jp.reuters.com/article/technologyNews/idJPJAPAN-15153520100506?pageNumber=3&virtualBrandChannel=0
電書協のありえないコメント。
攘夷派かよ!
どうやって食べていくかは、自分たちで考えろよ...

「ところがどうだろう。日本最強の捜査機関をもってしても、小沢サイドがゼネコンからヤミ献金を受け取っていたという事実は証拠のカケラも出てこなかった。土地購入の原資にゼネコンマネーが含まれているという証拠はないのだ。」

http://www.the-journal.jp/contents/yamaguchi/2010/05/post_95.html