wifi.c の続き

昨晩放っておいたソレは以下な出力でした。

$ find . |xargs grep do_dhcp_request
grep: ./external/webkit/WebCore/manual-tests/inspector/errors-with-space: No such file or directory
grep: in-url.html: No such file or directory
./frameworks/base/core/jni/android_net_wifi_Wifi.cpp:    jboolean succeeded = ((jboolean)::do_dhcp_request(&ipaddr, &gateway, &mask,
./hardware/libhardware_legacy/include/hardware_legacy/wifi.h: * do_dhcp_request() issues a dhcp request and returns the acquired
./hardware/libhardware_legacy/include/hardware_legacy/wifi.h:int do_dhcp_request(int *ipaddr, int *gateway, int *mask,
./hardware/libhardware_legacy/include/hardware_legacy/wifi.h: * Return the error string of the last do_dhcp_request().
./hardware/libhardware_legacy/wifi/wifi.c:int do_dhcp_request(int *ipaddr, int *gateway, int *mask,
grep: ./packages/apps/Email/images/Android: No such file or directory
grep: Buttons.ai: No such file or directory
$

今朝方ぼさっと考えてたんですが、frameworks と external 配下だけを find すれば良いんじゃないかな、と。
ちなみに上記出力によれば frameworks/base/core/jni/android_net_wifi_Wifi.cpp がフレームワーク側の i/f になってるのかな。
で、find|grep 続行。

$ find frameworks/ external/ |xargs grep check_driver_loaded
grep: external//webkit/WebCore/manual-tests/inspector/errors-with-space: No such file or directory
grep: in-url.html: No such file or directory
$ find frameworks/ external/ |xargs grep wifi_load_driver
frameworks//base/core/jni/android_net_wifi_Wifi.cpp:    return (jboolean)(::wifi_load_driver() == 0);
grep: external//webkit/WebCore/manual-tests/inspector/errors-with-space: No such file or directory
grep: in-url.html: No such file or directory
$ find frameworks/ external/ |xargs grep wifi_unload_driver 2>/dev/null
frameworks//base/core/jni/android_net_wifi_Wifi.cpp:    return (jboolean)(::wifi_unload_driver() == 0);
$ find frameworks/ external/ |xargs grep wifi_start_supplicant 2>/dev/null
frameworks//base/core/jni/android_net_wifi_Wifi.cpp:    return (jboolean)(::wifi_start_supplicant() == 0);
$ find frameworks/ external/ |xargs grep wifi_stop_supplicant 2>/dev/null
frameworks//base/core/jni/android_net_wifi_Wifi.cpp:    return (jboolean)(::wifi_stop_supplicant() == 0);
$ find frameworks/ external/ |xargs grep wifi_connect_to_supplicant 2>/dev/null
frameworks//base/core/jni/android_net_wifi_Wifi.cpp:    return (jboolean)(::wifi_connect_to_supplicant() == 0);
$

このあたりまでやってようやくこれは jni との i/f なんだな、という事が分かってきてたりして。wpa_supplicant 側を wifi.c が呼び出しているのだろうと類推。
しかし jni 側で関数のアタマに :: 付けるのって何だったか、と (弱

とりあえず

修正して実機に流してみる事に。TODO としては以下?

  • rt2870sta.ko の make の方法
    • Makefile 修正 (LINUX_SRC と CROSS_COMPILE)
    • make ARCH=arm で OK?
  • ko なソレを vendor 配下に置いて AndroidBoard.mk も修正
    wifi.c も変更する必要あり
  • em1 のソレだと vendor/atmark-techno/armadillo500fx 配下にカーネルモジュールとか wpa_supplicant.conf とかを置けば良い模様
    • AndroidBoard.mk の修正が必要
  • system.prop の wifi.interface の追加も必要?
    →gps 関連は書き換えられなかった件orz

rt2870sta.ko な Makefile ですが ARCH=arm がコメントアウトされていたorz
以下に書き換えて make 実行。

PLATFORM = ARMADILLO

ifeq ($(PLATFORM),ARMADILLO)
#LINUX_SRC = /home/ojag/android/armadillo500fx-droid/kernel/common
LINUX_SRC = /home/ojag/android/Embedded-Master-ARM/kernel/arm/imx/armadillo-500fx
ARCH = arm
#CROSS_COMPILE = /home/ojag/android/armadillo500fx-droid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
CROSS_COMPILE = /home/ojag/android/Embedded-Master-ARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
endif

clean せずにヤッちゃってますが大丈夫かな。一応全部コンパイルしているように見えます。が念の為再度 make clean && make しますた。
で、これを vendor 配下にコピります。

$ cp os/linux/rt2870sta.ko $ANDROID/vendor/atmark-techno/armadillo500fx/.

で、vendor/atmark-techno/armadillo500fx/AndroidBoard.mk を以下に。

# prebuilt wifi driver
#
PRODUCT_COPY_FILES += \
	$(LOCAL_PATH)/rt2870sta.ko:system/lib/modules/rt2870sta.ko \
	$(LOCAL_PATH)/rt73usb.ko:system/lib/modules/rt73usb.ko \
	$(LOCAL_PATH)/rt2x00usb.ko:system/lib/modules/rt2x00usb.ko \
	$(LOCAL_PATH)/rt2x00lib.ko:system/lib/modules/rt2x00lib.ko \
	$(LOCAL_PATH)/rt73.bin:system/etc/firmware/rt73.bin

system.prop を以下に。

#
# system.prop for generic sdk 
#

rild.libpath=/system/lib/libreference-ril.so
rild.libargs=-d /dev/ttyS0
wifi.interface = ra0
ro.config.sync = yes
keyguard.no_require_sim=1

ro.kernel.android.gps=ttyUSB0

あとは何だろ。wpa_supplicant.conf とか dhcpcd.conf とかもだ。dhcpcd.conf が以下で。

# dhcpcd configuration for Android Wi-Fi interface
# See dhcpcd.conf(5) for details.

#interface wlan0
interface ra0

# dhcpcd-run-hooks uses these options.
option subnet_mask, routers, domain_name_servers

wpa_supplicant.conf はヒミツ。(何
ただ修正したのは

network={

なナニの追加のみ。これで wifi.c を修正すれば良い、のかな。。
カーネルの .config 見たら

CONFIG_WIRELESS_EXT=y

との事にてスルー。wifi.c の修正部分は以下。(diff 取る準備するの忘れてましたorz)
まず文字列の定義をしておいて

static const char RT2X00_LIB_USB_DRIVER_MODULE_NAME[]  = "rt2x00usb";
static const char RT2X00_LIB_USB_DRIVER_MODULE_TAG[]   = "rt2x00usb";
static const char RT2X00_LIB_USB_DRIVER_MODULE_PATH[]  = "/system/lib/modules/rt2x00usb.ko";
static const char RT2870_LIB_USB_DRIVER_MODULE_NAME[]  = "rt2870sta";
static const char RT2870_LIB_USB_DRIVER_MODULE_TAG[]   = "rt2870sta";
static const char RT2870_LIB_USB_DRIVER_MODULE_PATH[]  = "/system/lib/modules/rt2870sta.ko";

あとは insmod と rmmod の追加。insmod は wifi_load_driver 手続きの以下の部分で

int wifi_load_driver()
{
    char driver_status[PROPERTY_VALUE_MAX];
    int count = 100; /* wait at most 20 seconds for completion */

    if (check_driver_loaded()) {
        return 0;
    }

    insmod(RT2870_LIB_USB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);
    insmod(RT2X00_LIB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);
    insmod(RT2X00_LIB_USB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);
    insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);

rmmod は wifi_unload_driver の以下の部分。

int wifi_unload_driver()
{
    int count = 20; /* wait at most 10 seconds for completion */

    if ((rmmod(DRIVER_MODULE_NAME) == 0) && 
        (rmmod(RT2X00_LIB_USB_DRIVER_MODULE_NAME) == 0) && 
        (rmmod(RT2870_LIB_USB_DRIVER_MODULE_NAME) == 0) && 
        (rmmod(RT2X00_LIB_DRIVER_MODULE_NAME) == 0)) {

結構いい加減な修正ですな。これで make clean && make してみます。残り時間は 2h 足らず。終わらなかったら途中で止めて明日ヤリ直す方向。