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 の方法
- 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 足らず。終わらなかったら途中で止めて明日ヤリ直す方向。