うーん
armadillo500fx で無線 dongle 認識の件ですが、以下な修正を盛り込んで make したイメージにて chroot して起動したらドライバの初期処理の中で TxRx なリングバッファ領域が確保できません、と言いつつ死亡している事が判明。
chroot の中で imsmod ってヤッては駄目なんでしたっけ?
仕方が無いので chroot する前に insmod してるのですが、
ERROR/WifiHW(4553): Unable to open connection to supplicant on "/data/system/wpa_supplicant/ra0": Connection refused
的メセジの出力を確認しております。init.rc にて無理矢理 chmod 777 してみたのですがスルーされている模様。そもそもこのファイルが何のためにあるのか、とかどのタイミングで作成されたのか、等について今から確認入れる方向ッス。
diff が以下ッス。ソースツリーは OESF 提供の em1 なソレです。
diff --git a/build/core/prelink-linux-arm.map b/build/core/prelink-linux-arm.map index 69cde1a..debf19d 100644 --- a/build/core/prelink-linux-arm.map +++ b/build/core/prelink-linux-arm.map @@ -137,3 +137,4 @@ librpc.so 0x9A400000 libtrace_test.so 0x9A300000 libsrec_jni.so 0x9A200000 libcerttool_jni.so 0x9A100000 +libfreerunner_gps.so 0x9A000000 diff --git a/hardware/libhardware_legacy/wifi/wifi.c b/hardware/libhardware_legacy/wifi/wifi.c index 4b0b7a8..6da78db 100644 --- a/hardware/libhardware_legacy/wifi/wifi.c +++ b/hardware/libhardware_legacy/wifi/wifi.c @@ -72,6 +72,9 @@ static const char RT2X00_LIB_DRIVER_MODULE_PATH[] = "/system/lib/modules/rt 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"; static const char DRIVER_MODULE_ARG[] = WIFI_DRIVER_MODULE_ARG; static const char FIRMWARE_LOADER[] = WIFI_FIRMWARE_LOADER; @@ -96,6 +99,8 @@ static int insmod(const char *filename, const char *args) free(module); + LOGD("init_module %s return %d\n", filename, ret); + return ret; } @@ -179,10 +184,12 @@ int wifi_load_driver() if (check_driver_loaded()) { return 0; } - +/* 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); +*/ + insmod(RT2870_LIB_USB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); +/* insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); */ property_set(DRIVER_PROP_NAME, "ok"); property_set("ctl.start", 0); sched_yield(); @@ -205,9 +212,12 @@ int wifi_unload_driver() { int count = 20; /* wait at most 10 seconds for completion */ - if ((rmmod(DRIVER_MODULE_NAME) == 0) && +/* 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)) { +*/ + if(rmmod(RT2870_LIB_USB_DRIVER_MODULE_NAME) == 0) { while (count-- > 0) { if (!check_driver_loaded()) break; diff --git a/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk b/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk index 9277674..e3bfeec 100644 --- a/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk +++ b/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk @@ -16,6 +16,8 @@ include $(BUILD_KEY_CHAR_MAP) # prebuilt wifi driver # PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/rt2870sta.ko:system/lib/modules/rt2870sta.ko \ + $(LOCAL_PATH)/RT2870STA.dat:system/etc/Wireless/RT2870STA/RT2870STA.dat \ $(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 \ diff --git a/vendor/atmark-techno/armadillo500fx/BoardConfig.mk b/vendor/atmark-techno/armadillo500fx/BoardConfig.mk index 6e77e73..bdcfead 100644 --- a/vendor/atmark-techno/armadillo500fx/BoardConfig.mk +++ b/vendor/atmark-techno/armadillo500fx/BoardConfig.mk @@ -23,3 +23,6 @@ BOARD_WPA_SUPPLICANT_DRIVER := WEXT HAVE_NO_RFKILL_SWITCH := true HAVE_NO_BATTERY := true + +BOARD_HAVE_FREERUNNER_GPS := true +BOARD_GPS_LIBRARIES := libfreerunner_gps diff --git a/vendor/atmark-techno/armadillo500fx/dhcpcd.conf b/vendor/atmark-techno/armadillo500fx/dhcpcd.conf index 808e86d..06c8f64 100644 --- a/vendor/atmark-techno/armadillo500fx/dhcpcd.conf +++ b/vendor/atmark-techno/armadillo500fx/dhcpcd.conf @@ -1,7 +1,8 @@ # dhcpcd configuration for Android Wi-Fi interface # See dhcpcd.conf(5) for details. -interface wlan0 +#interface wlan0 +interface ra0 # dhcpcd-run-hooks uses these options. option subnet_mask, routers, domain_name_servers diff --git a/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc b/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc index bf74997..28ca674 100644 --- a/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc +++ b/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc @@ -344,11 +344,13 @@ service keystore /system/bin/keystore socket keystore stream 666 service wpa_supplicant /system/bin/wpa_supplicant \ - -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf -dd + -Dwext -ira0 -c /system/etc/wifi/wpa_supplicant.conf -dd +# -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf -dd disabled group wifi -service dhcpcd /system/bin/dhcpcd -d wlan0 +# service dhcpcd /system/bin/dhcpcd -d wlan0 +service dhcpcd /system/bin/dhcpcd -d ra0 disabled oneshot #group system dhcp @@ -363,7 +365,9 @@ service pppd /system/etc/init.bluetooth-pppd disabled oneshot -service ifcfg_ralink /system/bin/ifconfig wlan0 up +# service ifcfg_ralink /system/bin/ifconfig wlan0 up + +service ifcfg_ralink /system/bin/ifconfig ra0 up on property:init.svc.wpa_supplicant=stopped stop dhcpcd diff --git a/vendor/atmark-techno/armadillo500fx/system.prop b/vendor/atmark-techno/armadillo500fx/system.prop index b5d6245..043d8ad 100644 --- a/vendor/atmark-techno/armadillo500fx/system.prop +++ b/vendor/atmark-techno/armadillo500fx/system.prop @@ -4,7 +4,8 @@ rild.libpath=/system/lib/libreference-ril.so rild.libargs=-d /dev/ttyS0 -wifi.interface = wlan0 +wifi.interface = ra0 ro.config.sync = yes keyguard.no_require_sim=1 +ro.kernel.android.gps=ttyUSB0
確認とか
メセジの出力元は hardware/libhardware_legacy/wifi/wifi.c の wifi_connect_to_supplicant 手続きの以下な部分な模様。
property_get("wifi.interface", iface, WIFI_TEST_INTERFACE); if (access(IFACE_DIR, F_OK) == 0) { snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface); } else { strlcpy(ifname, iface, sizeof(ifname)); } ctrl_conn = wpa_ctrl_open(ifname); if (ctrl_conn == NULL) { LOGE("Unable to open connection to supplicant on \"%s\": %s", ifname, strerror(errno)); return -1; }
この wifi_connect_to_supplicant という手続きの呼び出し元は、というと jni な模様。
$ find frameworks/ |xargs grep wifi_connect_to_supp frameworks//base/core/jni/android_net_wifi_Wifi.cpp: return (jboolean)(::wifi_connect_to_supplicant() == 0); $
上記の部分は以下な模様。
static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject clazz) { return (jboolean)(::wifi_connect_to_supplicant() == 0); }
これは末端部分で以下な形で java 側に export されている模様。
{ "connectToSupplicant", "()Z", (void *)android_net_wifi_connectToSupplicant },
connectToSupplicant で find|grep してみるか。
$ find frameworks/ |xargs grep connectToSupplicant frameworks//base/core/jni/android_net_wifi_Wifi.cpp:static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject clazz) frameworks//base/core/jni/android_net_wifi_Wifi.cpp: { "connectToSupplicant", "()Z", (void *)android_net_wifi_connectToSupplicant }, frameworks//base/wifi/java/android/net/wifi/WifiMonitor.java: if (connectToSupplicant()) { frameworks//base/wifi/java/android/net/wifi/WifiMonitor.java: private boolean connectToSupplicant() { frameworks//base/wifi/java/android/net/wifi/WifiMonitor.java: if (WifiNative.connectToSupplicant()) { frameworks//base/wifi/java/android/net/wifi/WifiNative.java: public native static boolean connectToSupplicant(); $
ええと該当部分が以下で
class MonitorThread extends Thread { public MonitorThread() { super("WifiMonitor"); } public void run() { if (connectToSupplicant()) { // Send a message indicating that it is now possible to send commands // to the supplicant mWifiStateTracker.notifySupplicantConnection(); } else { mWifiStateTracker.notifySupplicantLost(); return; }
上記 MonitorThread なソレを kick しているのが以下?
public void startMonitoring() { new MonitorThread().start(); }
という事で再び find|grep
$ find frameworks/ |xargs grep startMonitoring frameworks//base/core/java/android/net/MobileDataStateTracker.java: public void startMonitoring() { frameworks//base/core/java/android/net/NetworkStateTracker.java: public abstract void startMonitoring(); frameworks//base/services/java/com/android/server/am/DeviceMonitor.java: private synchronized void startMonitoring() { frameworks//base/services/java/com/android/server/am/DeviceMonitor.java: instance.startMonitoring(); frameworks//base/services/java/com/android/server/ConnectivityService.java: t.startMonitoring(); frameworks//base/wifi/java/android/net/wifi/WifiMonitor.java: public void startMonitoring() { frameworks//base/wifi/java/android/net/wifi/WifiStateTracker.java: public void startMonitoring() { frameworks//base/wifi/java/android/net/wifi/WifiStateTracker.java: mWifiMonitor.startMonitoring(); $
上のあたりはスルーで良いのでしょうか。基本的には WifiStateTracker なソレから起動されていると見ておいて良いはず。
public void startEventLoop() { mWifiMonitor.startMonitoring(); }
呼び出し元は何だ。
$ find frameworks/ |xargs grep startEventLoop frameworks//base/core/java/android/server/BluetoothEventLoop.java: private native void startEventLoopNative(); frameworks//base/core/java/android/server/BluetoothEventLoop.java: startEventLoopNative(); frameworks//base/core/jni/android_server_BluetoothEventLoop.cpp:static jboolean startEventLoopNative(JNIEnv *env, jobject object) { frameworks//base/core/jni/android_server_BluetoothEventLoop.cpp: {"startEventLoopNative", "()V", (void *)startEventLoopNative}, frameworks//base/services/java/com/android/server/WifiService.java: mWifiStateTracker.startEventLoop(); frameworks//base/wifi/java/android/net/wifi/WifiStateTracker.java: public void startEventLoop() { $
ええと、WifiService ですか。類推ベースですが、wifi 設定で wifi が on/off されるタイミングで呼び出されていると見てるんだけど違うかな。
なんとかして open できるようにしたいんですが、init.rc なソレがスルーされてるのは痛いな。