うーん

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 なソレがスルーされてるのは痛いな。

元々なイメージの /data/system/wpa_supplicant/ra0 なパーミッションを変えればいいんじゃねぇか、な超乱暴なアイデアを思いつく。そーゆー手法はあまりにも、、、なんですが背に腹は変えられん (を
このファイル、そもそも 770 で root:wifiパーミッションのはずなので、アクセスできない、というのが問題だと思うんだけどなぁ。