bc9-android-sdk--release20090815

android-1.5r3 for bc9(bc9-android-sdk--release20090815 Ver.)

android-1.5r3 を checkout して変更を加えたものです。

  • android-1.5r3 は android-sdk-1.5_r3 の次に作成された tag branch です。
  • android-1.5r3 は cupcake-release branch に振られた tag branch です。
  • android-1.5r3 では kernel source は android の repo 管理から外れました。必要な場合は git で別途取得します。

ソースコード取得

android-1.5r3 branch

以下のようにして android の source code を取得します。

$ mkdir ~/android-1.5r3
$ cd android-1.5r3
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.5r3
$ repo sync

ALSA

android-1.5r3 branch は cupcake-release branch の特定時点に打たれた tag branch なので、
local_manifest.xml に追記する方法では master branch、cupcake branch のみの ALSA を repo sync で取得することができません。
ALSA を統合するためには、ALSA 関連のファイルを git で取得し android-1.5r3 source tree の所定の位置に配置して build を行う必要があります。
また、alsa_sound は 8月以降の commit で cupcake への統合 build 時に error が出るため、7月最後の commit を指定して取得します。
具体的には以下のような手順で取得します。

$ cd ~android-1.5r3/external
$ git clone git://android.git.kernel.org/platform/external/alsa-lib.git
$ cd alsa-lib
$ git checkout 7d7fc0e
$ cd ~android-1.5r3/hardware
$ git clone git://android.git.kernel.org/hardware/alsa_sound
$ cd alsa_sound
$ git checkout a5cf8cc

build 内容の調整

alsa-lib の調整

android-1.5_r3/external/alsa-lib/Android.mk を以下のように修正します。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u external/alsa-lib/Android.mk.orig external/alsa-lib/Android.mk
--- external/alsa-lib/Android.mk.orig	2009-08-30 15:00:52.000000000 +0900
+++ external/alsa-lib/Android.mk	2009-08-30 15:01:13.000000000 +0900
@@ -55,7 +55,7 @@
 	-fPIC -DPIC -D_POSIX_SOURCE \
 	-DALSA_CONFIG_DIR=\"/system/usr/share/alsa\" \
 	-DALSA_PLUGIN_DIR=\"/system/usr/lib/alsa-lib\" \
-	-DALSA_DEVICE_DIRECTORY=\"/dev/snd/\"
+	-DALSA_DEVICE_DIRECTORY=\"/dev/\"
 
LOCAL_SRC_FILES := $(sort $(call all-c-files-under, src))

電源状態 patch

修正なしに build すると起動時に low battery と判断して起動しない状態になるので、添付の

を当てます。

$ cd android-sdk-1.5_r3
$ patch -b -p1 < ../dummy-battery.patch

Wi-Fi の調整

wpa_supplicant の調整

android-1.5r3/external/wpa_supplicant/.config を以下のように修正します。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u external/wpa_supplicant/.config.orig external/wpa_supplicant/.config
--- external/wpa_supplicant/.config.orig	2009-08-31 20:33:30.000000000 +0900
+++ external/wpa_supplicant/.config	2009-08-31 20:33:50.000000000 +0900
@@ -19,13 +19,13 @@
 CONFIG_PKCS12=y
 # CONFIG_PCSC=y
 CONFIG_SMARTCARD=y
-# CONFIG_WIRELESS_EXTENSION=y
+CONFIG_WIRELESS_EXTENSION=y
 CONFIG_CTRL_IFACE=y
 # CONFIG_DRIVER_HOSTAP=y
 # CONFIG_DRIVER_HERMES=y
 # CONFIG_DRIVER_MADWIFI=y
 # CONFIG_DRIVER_ATMEL=y
-# CONFIG_DRIVER_WEXT=y
+CONFIG_DRIVER_WEXT=y
 # CONFIG_DRIVER_NDISWRAPPER=y
 # CONFIG_DRIVER_BROADCOM=y
 # CONFIG_DRIVER_IPW=y

android-1.5r3/external/wpa_supplicant/wpa_supplicant.conf を以下のように修正します。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u external/wpa_supplicant/wpa_supplicant.conf.orig external/wpa_supplicant/wpa_supplicant.conf
--- external/wpa_supplicant/wpa_supplicant.conf.orig	2009-08-31 20:34:30.000000000 +0900
+++ external/wpa_supplicant/wpa_supplicant.conf	2009-08-31 20:36:13.000000000 +0900
@@ -72,7 +72,9 @@
 # DACL (which will reject all connections). See README-Windows.txt for more
 # information about SDDL string format.
 #
-ctrl_interface=tiwlan0
+#ctrl_interface=tiwlan0
+#ctrl_interface=wlan0
+ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=system
 
 # IEEE 802.1X/EAPOL version
 # wpa_supplicant is implemented based on IEEE Std 802.1X-2004 which defines

wifi.c の修正

android-1.5r3/hardware/libhardware_legacy/wifi/wifi.c を修正し、rt73usb ドライバ使用の USB Wi-Fi で android の GUI から Wi-Fi 操作が可能になるようにします。
途中の動作状態を確認できるよう大量に LOG 出力を追加していますので、邪魔な場合はコメントアウトして調節して下さい。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u hardware/libhardware_legacy/wifi/wifi.c.orig hardware/libhardware_legacy/wifi/wifi.c
--- hardware/libhardware_legacy/wifi/wifi.c.orig        2009-08-31 21:34:21.000000000 +0900
+++ hardware/libhardware_legacy/wifi/wifi.c     2009-08-31 22:21:03.000000000 +0900
@@ -48,17 +48,23 @@
 // TODO: use new ANDROID_SOCKET mechanism, once support for multiple
 // sockets is in

-static const char IFACE_DIR[]           = "/data/system/wpa_supplicant";
-static const char DRIVER_MODULE_NAME[]  = "wlan";
-static const char DRIVER_MODULE_TAG[]   = "wlan ";
-static const char DRIVER_MODULE_PATH[]  = "/system/lib/modules/wlan.ko";
-static const char FIRMWARE_LOADER[]     = "wlan_loader";
-static const char DRIVER_PROP_NAME[]    = "wlan.driver.status";
-static const char SUPPLICANT_NAME[]     = "wpa_supplicant";
-static const char SUPP_PROP_NAME[]      = "init.svc.wpa_supplicant";
-static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";
-static const char SUPP_CONFIG_FILE[]    = "/data/misc/wifi/wpa_supplicant.conf";
-static const char MODULE_FILE[]         = "/proc/modules";
+static const char IFACE_DIR[]                          = "/data/system/wpa_supplicant";
+static const char DRIVER_MODULE_NAME[]                 = "rt73usb";
+static const char DRIVER_MODULE_TAG[]                  = "rt73usb ";
+static const char DRIVER_MODULE_PATH[]                 = "/system/lib/modules/rt73usb.ko";
+static const char RT2X00_LIB_DRIVER_MODULE_NAME[]      = "rt2x00lib";
+static const char RT2X00_LIB_DRIVER_MODULE_TAG[]       = "rt2x00lib ";
+static const char RT2X00_LIB_DRIVER_MODULE_PATH[]      = "/system/lib/modules/rt2x00lib.ko";
+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 FIRMWARE_LOADER[]                    = "wlan_loader";
+static const char DRIVER_PROP_NAME[]                   = "wlan.driver.status";
+static const char SUPPLICANT_NAME[]                    = "wpa_supplicant";
+static const char SUPP_PROP_NAME[]                     = "init.svc.wpa_supplicant";
+static const char SUPP_CONFIG_TEMPLATE[]               = "/system/etc/wifi/wpa_supplicant.conf";
+static const char SUPP_CONFIG_FILE[]                   = "/data/misc/wifi/wpa_supplicant.conf";
+static const char MODULE_FILE[]                        = "/proc/modules";

 static int insmod(const char *filename)
 {
@@ -66,6 +72,7 @@
     unsigned int size;
     int ret;

+    LOGI("%s\n", __FUNCTION__);
     module = load_file(filename, &size);
     if (!module)
         return -1;
@@ -82,6 +89,7 @@
     int ret = -1;
     int maxtry = 10;

+    LOGI("%s\n", __FUNCTION__);
     while (maxtry-- > 0) {
         ret = delete_module(modname, O_NONBLOCK | O_EXCL);
         if (ret < 0 && errno == EAGAIN)
@@ -91,30 +99,35 @@
     }

     if (ret != 0)
-        LOGD("Unable to unload driver module \"%s\": %s\n",
+        LOGE("Unable to unload driver module \"%s\": %s\n",
              modname, strerror(errno));
     return ret;
 }

 int do_dhcp_request(int *ipaddr, int *gateway, int *mask,
                     int *dns1, int *dns2, int *server, int *lease) {
+    LOGI("1. inside %s\n", __FUNCTION__);
     /* For test driver, always report success */
-    if (strcmp(iface, "sta") == 0)
+    if (strcmp(iface, "wlan0") == 0)
         return 0;

+    LOGI("2. inside %s\n", __FUNCTION__);
     if (ifc_init() < 0)
         return -1;

+    LOGI("3. inside %s\n", __FUNCTION__);
     if (do_dhcp(iface) < 0) {
         ifc_close();
         return -1;
     }
     ifc_close();
     get_dhcp_info(ipaddr, gateway, mask, dns1, dns2, server, lease);
+    LOGI("4. inside %s\n", __FUNCTION__);
     return 0;
 }

 const char *get_dhcp_error_string() {
+    LOGI("Inside %s\n", __FUNCTION__);
     return dhcp_lasterror();
 }

@@ -140,10 +153,12 @@
     }
     while ((fgets(line, sizeof(line), proc)) != NULL) {
         if (strncmp(line, DRIVER_MODULE_TAG, strlen(DRIVER_MODULE_TAG)) == 0) {
+            LOGI("driver %s has been installed\n",DRIVER_MODULE_TAG);
             fclose(proc);
             return 1;
         }
     }
+    LOGE("Cannot find driver %s in proc",DRIVER_MODULE_TAG);
     fclose(proc);
     property_set(DRIVER_PROP_NAME, "unloaded");
     return 0;
@@ -154,23 +169,31 @@
     char driver_status[PROPERTY_VALUE_MAX];
     int count = 100; /* wait at most 20 seconds for completion */

+    LOGI("Loading WiFi Modules\n");
+    sleep(1);
+
+    property_set(DRIVER_PROP_NAME, "ok");
     if (check_driver_loaded()) {
         return 0;
     }
-
-    if (insmod(DRIVER_MODULE_PATH) < 0)
-        return -1;
-      
+    insmod(RT2X00_LIB_DRIVER_MODULE_PATH);
+    insmod(RT2X00_LIB_USB_DRIVER_MODULE_PATH);
+    insmod(DRIVER_MODULE_PATH);
     property_set("ctl.start", FIRMWARE_LOADER);
     sched_yield();
     while (count-- > 0) {
+        usleep(500000);
         if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
-            if (strcmp(driver_status, "ok") == 0)
+            if (strcmp(driver_status, "ok") == 0) {
+                property_set("ctl.start", "ifcfg_ralink");
+                usleep(1000000);
+                //property_set("ctl.start", "dhcpcd");
                 return 0;
-            else if (strcmp(DRIVER_PROP_NAME, "failed") == 0)
+            }
+            else if (strcmp(DRIVER_PROP_NAME, "failed") == 0) {
                 return -1;
+            }
         }
-        usleep(200000);
     }
     property_set(DRIVER_PROP_NAME, "timeout");
     return -1;
@@ -178,20 +201,30 @@

 int wifi_unload_driver()
 {
-    int count = 20; /* wait at most 10 seconds for completion */
+    LOGI("Unloading WiFi Modules\n");
+    sleep(1);

     if (rmmod(DRIVER_MODULE_NAME) == 0) {
-       while (count-- > 0) {
-           if (!check_driver_loaded())
-               break;
-           usleep(500000);
-       }
-       if (count) {
-           return 0;
-       }
-       return -1;
-    } else
+        usleep(1000000);
+    } else {
+        LOGE("Unloading Ralink RT73USB WLAN Module Failed\n");
+        return -1;
+    }
+
+    if (rmmod(RT2X00_LIB_USB_DRIVER_MODULE_NAME) == 0) {
+        usleep(1000000);
+    } else {
+        LOGE("Unloading RT2X00_LIB_USB Module Failed\n");
+        return -1;
+    }
+
+    if (rmmod(RT2X00_LIB_DRIVER_MODULE_NAME) == 0) {
+        usleep(1000000);
+    } else {
+        LOGE("Unloading RT2X00_LIB Module Failed\n");
         return -1;
+    }
+    return 0;
 }

 int ensure_config_file_exists()
@@ -200,6 +233,7 @@
     int srcfd, destfd;
     int nread;

+    LOGE("%s\n", __FUNCTION__);
     if (access(SUPP_CONFIG_FILE, R_OK|W_OK) == 0) {
         return 0;
     } else if (errno != ENOENT) {
@@ -252,6 +286,7 @@
     unsigned serial = 0;
 #endif

+    LOGI("start %s",__FUNCTION__);
     /* Check whether already running */
     if (property_get(SUPP_PROP_NAME, supp_status, NULL)
             && strcmp(supp_status, "running") == 0) {
@@ -260,7 +295,7 @@

     /* Before starting the daemon, make sure its config file exists */
     if (ensure_config_file_exists() < 0) {
-        LOGE("Wi-Fi will not be enabled");
+        LOGE("Configuration file does not exist. Wi-Fi will not be enabled");
         return -1;
     }

@@ -291,9 +326,11 @@
         if (pi != NULL) {
             __system_property_read(pi, NULL, supp_status);
             if (strcmp(supp_status, "running") == 0) {
+                LOGI("Wi-Fi is running\n");
                 return 0;
             } else if (pi->serial != serial &&
                     strcmp(supp_status, "stopped") == 0) {
+                LOGI("Wi-Fi has been stopped");
                 return -1;
             }
         }
@@ -313,6 +350,7 @@
     char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
     int count = 50; /* wait at most 5 seconds for completion */

+    LOGI("%s called",__func__);
     /* Check whether supplicant already stopped */
     if (property_get(SUPP_PROP_NAME, supp_status, NULL)
         && strcmp(supp_status, "stopped") == 0) {
@@ -337,6 +375,7 @@
     char ifname[256];
     char supp_status[PROPERTY_VALUE_MAX] = {'\0'};

+    LOGI("%s called",__func__);
     /* Make sure supplicant is running */
     if (!property_get(SUPP_PROP_NAME, supp_status, NULL)
             || strcmp(supp_status, "running") != 0) {
@@ -344,7 +383,7 @@
         return -1;
     }

-    property_get("wifi.interface", iface, "sta");
+    property_get("wifi.interface", iface, "wlan0");

     if (access(IFACE_DIR, F_OK) == 0) {
         snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface);
@@ -352,6 +391,8 @@
         strlcpy(ifname, iface, sizeof(ifname));
     }

+    LOGI("Interface directory = %s", IFACE_DIR);
+    LOGI("Interface name = %s", ifname);
     ctrl_conn = wpa_ctrl_open(ifname);
     if (ctrl_conn == NULL) {
         LOGE("Unable to open connection to supplicant on \"%s\": %s",
@@ -370,6 +411,7 @@
         ctrl_conn = monitor_conn = NULL;
         return -1;
     }
+    LOGI("Connect to Supplicant done\n");
     return 0;
 }

@@ -377,20 +419,24 @@
 {
     int ret;

+    LOGI("%s, cmd = %s\n", __FUNCTION__, cmd);
     if (ctrl_conn == NULL) {
         LOGV("Not connected to wpa_supplicant - \"%s\" command dropped.\n", cmd);
         return -1;
     }
+    memset(reply, 0, *reply_len);
     ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), reply, reply_len, NULL);
     if (ret == -2) {
         LOGD("'%s' command timed out.\n", cmd);
         return -2;
     } else if (ret < 0 || strncmp(reply, "FAIL", 4) == 0) {
+        LOGI("reply:%s\n",reply);
         return -1;
     }
     if (strncmp(cmd, "PING", 4) == 0) {
         reply[*reply_len] = '\0';
     }
+    LOGI("returning reply %s for cmd %s\n", reply, cmd);
     return 0;
 }

@@ -403,16 +449,19 @@
     struct timeval tval;
     struct timeval *tptr;

+    LOGI("%s called",__func__);
+    LOGI("monitor_conn checking \n");
     if (monitor_conn == NULL)
         return 0;

+    LOGI("calling wpa_ctrl_recv\n");
     result = wpa_ctrl_recv(monitor_conn, buf, &nread);
     if (result < 0) {
         LOGD("wpa_ctrl_recv failed: %s\n", strerror(errno));
         return -1;
     }
     buf[nread] = '\0';
-    /* LOGD("wait_for_event: result=%d nread=%d string=\"%s\"\n", result, nread, buf); */
+    LOGI("wait_for_event: result=%d nread=%d string=\"%s\"\n", result, nread, buf);
     /* Check for EOF on the socket */
     if (result == 0 && nread == 0) {
         /* Fabricate an event to pass up */
@@ -437,11 +486,13 @@
             memmove(buf, match+1, nread+1);
         }
     }
+    LOGI("returning nread\n");
     return nread;
 }

 void wifi_close_supplicant_connection()
 {
+    LOGI("%s called",__func__);
     if (ctrl_conn != NULL) {
         wpa_ctrl_close(ctrl_conn);
         ctrl_conn = NULL;
@@ -454,5 +505,6 @@

 int wifi_command(const char *command, char *reply, size_t *reply_len)
 {
+    LOGI("%s called, cmd:%s",__func__,command);
     return wifi_send_command(ctrl_conn, command, reply, reply_len);
 }

WifiService.java の修正

android-1.5r3/frameworks/base/services/java/com/android/server/WifiService.java を以下のように修正します。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u frameworks/base/services/java/com/android/server/WifiService.java.orig frameworks/base/services/java/com/android/server/WifiService.java
--- frameworks/base/services/java/com/android/server/WifiService.java.orig      2009-08-31 20:40:25.000000000 +0900
+++ frameworks/base/services/java/com/android/server/WifiService.java   2009-08-31 20:57:57.000000000 +0900
@@ -75,7 +75,7 @@
  */
 public class WifiService extends IWifiManager.Stub {
     private static final String TAG = "WifiService";
-    private static final boolean DBG = false;
+    private static final boolean DBG = true;
     private static final Pattern scanResultPattern = Pattern.compile("\t+");
     private final WifiStateTracker mWifiStateTracker;

@@ -1219,53 +1219,18 @@
                 }
                 int lineLen = lineEnd - lineBeg;
                 if (0 < lineLen && lineLen <= SCAN_RESULT_BUFFER_SIZE) {
-                    int scanResultLevel = 0;
                     /*
                      * At most one thread should have access to the buffer at a time!
                      */
                     synchronized(mScanResultBuffer) {
-                        boolean parsingScanResultLevel = false;
                         for (int i = lineBeg; i < lineEnd; ++i) {
-                            char ch = reply.charAt(i);
-                            /*
-                             * Assume that the signal level starts with a '-'
-                             */
-                            if (ch == '-') {
-                                /*
-                                 * Skip whatever instances of '-' we may have
-                                 * after we parse the signal level
-                                 */
-                                parsingScanResultLevel = (scanResultLevel == 0);
-                            } else if (parsingScanResultLevel) {
-                                int digit = Character.digit(ch, 10);
-                                if (0 <= digit) {
-                                    scanResultLevel =
-                                        10 * scanResultLevel + digit;
-                                    /*
-                                     * Replace the signal level number in
-                                     * the string with 0's for caching
-                                     */
-                                    ch = '0';
-                                } else {
-                                    /*
-                                     * Reset the flag if we meet a non-digit
-                                     * character
-                                     */
-                                    parsingScanResultLevel = false;
-                                }
-                            }
-                            mScanResultBuffer[i - lineBeg] = ch;
+                            mScanResultBuffer[i - lineBeg] = reply.charAt(i); 
                         }
-                        if (scanResultLevel != 0) {
-                            ScanResult scanResult = parseScanResult(
-                                new String(mScanResultBuffer, 0, lineLen));
-                            if (scanResult != null) {
-                              scanResult.level = -scanResultLevel;
-                              scanList.add(scanResult);
-                            }
-                        } else if (DBG) {
-                            Log.w(TAG,
-                                  "ScanResult.level=0: misformatted scan result?");
+                        ScanResult scanResult = parseScanResult(
+                                       new String(mScanResultBuffer,0,lineLen));
+                        if (scanResult != null) {
+                               scanList.add(scanResult);
+                               if (DBG) Log.d(TAG, "ScanResult: " + scanResult);
                         }
                     }
                 } else if (0 < lineLen) {

Wi-Fi I/F 名の修正

android-1.5r3 のソースコード内で tiwlan0 になっている箇所を以下のように変更します。
android-1.5r3/external/dhcpcd/android.conf

beat@bc9-android-sdk:~/android-1.5r3$ diff -u external/dhcpcd/android.conf.orig external/dhcpcd/android.conf
--- external/dhcpcd/android.conf.orig	2009-08-31 22:50:34.000000000 +0900
+++ external/dhcpcd/android.conf	2009-08-31 22:51:09.000000000 +0900
@@ -1,6 +1,6 @@
 # dhcpcd configuration for Android Wi-Fi interface
 # See dhcpcd.conf(5) for details.
 
-interface tiwlan0
+interface wlan0
 # dhcpcd-run-hooks uses these options.
 option subnet_mask, routers, domain_name_servers

android-1.5r3/frameworks/base/services/java/com/android/server/WifiWatchdogService.java

beat@bc9-android-sdk:~/android-1.5r3$ diff -u frameworks/base/services/java/com/android/server/WifiWatchdogService.java.orig  frameworks/base/services/java/com/android/server/WifiWatchdogService.java
--- frameworks/base/services/java/com/android/server/WifiWatchdogService.java.orig	2009-08-31 22:55:09.000000000 +0900
+++ frameworks/base/services/java/com/android/server/WifiWatchdogService.java	2009-08-31 22:55:25.000000000 +0900
@@ -81,7 +81,7 @@
      * DHCP-replied DNS server anyway.
      */
     /** The system property whose value provides the current DNS address. */
-    private static final String SYSTEMPROPERTY_KEY_DNS = "dhcp.tiwlan0.dns1";
+    private static final String SYSTEMPROPERTY_KEY_DNS = "dhcp.wlan0.dns1";
 
     private Context mContext;
     private ContentResolver mContentResolver;

android-1.5r3/frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java

beat@bc9-android-sdk:~/android-1.5r3$ diff -u frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java.orig frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java
--- frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java.orig	2009-08-31 22:58:00.000000000 +0900
+++ frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java	2009-08-31 22:58:17.000000000 +0900
@@ -321,7 +321,7 @@
 
         mSettingsObserver = new SettingsObserver(new Handler());
 
-        mInterfaceName = SystemProperties.get("wifi.interface", "tiwlan0");
+        mInterfaceName = SystemProperties.get("wifi.interface", "wlan0");
         sDnsPropNames = new String[] {
             "dhcp." + mInterfaceName + ".dns1",
             "dhcp." + mInterfaceName + ".dns2"

sound リソースファイル

build 時に ringtone などの sound リソースファイルが所定の位置にコピーされるよう、AudioPackage2.mk を Android.mk としてコピーします。

$ cd ~android-1.5_r3/frameworks/base/data/sounds/
$ cp AudioPackage2.mk Android.mk

BoardConfig.mk の調整

ALSA統合、Wi-Fi 対応のため android-1.5r3/build/target/board/generic/BoardConfig.mk を以下のように修正します。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u build/target/board/generic/BoardConfig.mk.orig build/target/board/generic/BoardConfig.mk 
--- build/target/board/generic/BoardConfig.mk.orig	2009-08-30 15:03:29.000000000 +0900
+++ build/target/board/generic/BoardConfig.mk	2009-08-30 15:03:50.000000000 +0900
@@ -8,4 +8,7 @@
 TARGET_NO_KERNEL := true
 TARGET_NO_RADIOIMAGE := true
 HAVE_HTC_AUDIO_DRIVER := true
-BOARD_USES_GENERIC_AUDIO := true
+BOARD_USES_ALSA_AUDIO := true
+WPA_BUILD_SUPPLICANT := true
+BOARD_WPA_SUPPLICANT_DRIVER := WEXT
+#BOARD_USES_GENERIC_AUDIO := true

system.prop の調整

Wi-Fi の I/F 名が wlan0 になるよう、 android-1.5r3/build/target/board/generic/system.prop を以下のように修正します。
build 実行後この変更は android の system/build.prop に反映されます。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u build/target/board/generic/system.prop.orig build/target/board/generic/system.prop
--- build/target/board/generic/system.prop.orig	2009-08-31 20:37:40.000000000 +0900
+++ build/target/board/generic/system.prop	2009-08-31 20:38:16.000000000 +0900
@@ -2,5 +2,10 @@
 # system.prop for generic sdk 
 #
 
-rild.libpath=/system/lib/libreference-ril.so
-rild.libargs=-d /dev/ttyS0
+# RILD settings
+#rild.libpath=/system/lib/libreference-ril.so
+#rild.libargs=-d /dev/ttyS0
+
+# WiFi settings
+wifi.interface = wlan0
+

build

以上の修正・調整が完了したら、build を実行します。

$ cd ~/android-1.5r3
$ make

build が完了しても ~/android-1.5r3/out/target/product/generic/system/lib 以下に OpenWnn の libファイル群がビルドされていませんので、
OpenWnn の追加ビルドを行います。

追加 build

OpenWnn

bc9 は landscape での動作が基本ですので、 OpenWnn の landscape 設定のコメントアウトを外し landscape 表示を有効にします。
android-1.5_r3/packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java を以下のように修正します。

beat@bc9-android-sdk:~/android-1.5r3$ diff -u packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java.orig packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java
--- packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java.orig    2009-09-01 11:36:59.000000000 +0900
+++ packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java 2009-09-01 11:37:47.000000000 +0900
@@ -847,7 +847,7 @@
     private void createKeyboardsLandscape(OpenWnn parent) {
         Keyboard[][] keyList;
         /* qwerty shift_off (landscape) */
-/*        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
+        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
         keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_landscape);
         keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_full_alphabet_landscape);
         keyList[KEYMODE_JA_FULL_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_full_symbols_landscape);
@@ -856,9 +856,9 @@
         keyList[KEYMODE_JA_HALF_NUMBER][0]   = new Keyboard(parent, R.xml.keyboard_qwerty_half_symbols_landscape);
         keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_qwerty_half_katakana_landscape);
         keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone_landscape);
-*/
+
         /* qwerty shift_on (landscape) */
-/*        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
+        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
         keyList[KEYMODE_JA_FULL_HIRAGANA][0] =
             mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_HIRAGANA][0];
         keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_full_alphabet_shift_landscape);
@@ -872,9 +872,9 @@
             mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_KATAKANA][0];
         keyList[KEYMODE_JA_HALF_PHONE][0] =
             mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
-*/
+
         /* 12-keys shift_off (landscape) */
-/*        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
+        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
         keyList[KEYMODE_JA_FULL_HIRAGANA][0] = new Keyboard(parent, R.xml.keyboard_12keyjp_landscape);
         keyList[KEYMODE_JA_FULL_HIRAGANA][1] = new Keyboard(parent, R.xml.keyboard_12keyjp_input_landscape);
         keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_alphabet_landscape);
@ -888,9 +888,9 @@
         keyList[KEYMODE_JA_HALF_KATAKANA][0] = new Keyboard(parent, R.xml.keyboard_12key_katakana_landscape);
         keyList[KEYMODE_JA_HALF_KATAKANA][1] = new Keyboard(parent, R.xml.keyboard_12key_katakana_input_landscape);
         keyList[KEYMODE_JA_HALF_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone_landscape);
-*/
+
         /* 12-keys shift_on (landscape) */
-/*        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
+        keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
         keyList[KEYMODE_JA_FULL_HIRAGANA]
             = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_HIRAGANA];
         keyList[KEYMODE_JA_FULL_ALPHABET]
@@ -907,7 +907,7 @@
             = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_KATAKANA];
         keyList[KEYMODE_JA_HALF_PHONE]
             = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE];
-*/
+
     }

     /**

修正完了後、OpenWnn を追加 buildします。

$ cd ~/android-1.5_r3/build/
$ source envsetup.sh
$ cd ~/android-1.5_r3/packages/inputmethods/OpenWnn
$ mm

これで、~/android-1.5r3/out/target/product/generic/system/lib 以下に OpenWnn のlibファイル群がビルドされます。

android-root 作成

build された android ファイルの配置

上記の作業が完了したら、build されたファイルを以下のように起動可能な配置に整えます。

$ cd ~/
$ mkdir android-root
$ cp -a ~/android-1.5r2/out/target/product/generic/root/* ~/android-root/
$ cp -a ~/android-1.5r2/out/target/product/generic/system/* ~/android-root/system/

kernel module の配置

chroot で Android が起動した後 android の GUI から driver を insmod/rmmod して Wi-Fi の On/Off ができるよう、
rt73usb 関連の kernel module と rt73 の firmware を以下のように android-root 内に配置します。
注意!kernel module を使用しますので、kernel module と同じ version の kernel で bc9 を起動する必要があります。

$ mkdir ~/android-root/system/lib/modules/
$ cp ~/kernel_work/linux-android-2.6.29-bc9-r6/drivers/net/wireless/rt2x00/*.ko ~/android-root-1.5r3-alsa-wifi/system/lib/modules/
$ mkdir ~/android-root/system/etc/
$ cp kernel_work/RT71W_Firmware_V1.8/LICENSE.ralink-firmware.txt android-root-1.5r3-alsa-wifi/system/etc/firmware/
$ cp kernel_work/RT71W_Firmware_V1.8/rt73.bin android-root-1.5r3-alsa-wifi/system/etc/firmware/

init.rc の編集

alsa、Wi-Fi 用に設定を追加・調節し、android-root/init.rc を以下のように修正します。

--- init.rc.orig        2009-08-30 14:59:02.000000000 +0900
+++ init.rc     2009-09-01 15:34:35.000000000 +0900
@@ -36,16 +36,16 @@

 # mount mtd partitions
     # Mount /system rw first to give the filesystem a chance to save a checkpoint
-    mount yaffs2 mtd@system /system 
-    mount yaffs2 mtd@system /system ro remount
+    # mount yaffs2 mtd@system /system 
+    # mount yaffs2 mtd@system /system ro remount

     # We chown/chmod /data again so because mount is run as root + defaults
-    mount yaffs2 mtd@userdata /data nosuid nodev
+    # mount yaffs2 mtd@userdata /data nosuid nodev
     chown system system /data
     chmod 0771 /data

     # Same reason as /data above
-    mount yaffs2 mtd@cache /cache nosuid nodev
+    # mount yaffs2 mtd@cache /cache nosuid nodev
     chown system cache /cache
     chmod 0770 /cache

@@ -78,10 +78,35 @@
     chown root root /cache/lost+found
     chmod 0770 /cache/lost+found

+    chmod 0666 /dev/bc9_leds
+
+    setprop alsa.mixer.playback.master Master
+    setprop alsa.mixer.capture.master Capture
+    setprop alsa.mixer.playback.earpiece Master
+    setprop alsa.mixer.capture.earpiece Capture
+    setprop alsa.mixer.playback.headset Master
+    setprop alsa.mixer.playback.speaker Master
+    chmod 0777 /dev/pcmC0D0c
+    chmod 0777 /dev/pcmC0D0p
+    chmod 0777 /dev/controlC0
+    chmod 0777 /dev/timer
+    chown root audio /dev/controlC
+    chown root audio /dev/pcmC0D0c
+    chown root audio /dev/pcmC0D0p
+    chown root audio /dev/timer
+
+    # create wifi filesystem structure
+    mkdir /data/misc/wifi 0770 system system
+    mkdir /data/misc/wifi/sockets 0770 system system
+    mkdir /data/system/wpa_supplicant 0770 system system
+    mkdir /data/misc/dhcp 0770 dhcp dhcp
+    chown dhcp dhcp /data/misc/dhcp
+
+
 on boot
 # basic network init
     ifup lo
-    hostname localhost
+    hostname bc9 
     domainname localdomain

 # set RLIMIT_NICE to allow priorities from 19 to -20
@@ -110,6 +135,9 @@
     setprop ro.CONTENT_PROVIDER_MEM 5632
     setprop ro.EMPTY_APP_MEM 6144

+    setprop wifi.interface wlan0 
+    setprop wlan.driver.status ok
+
 # Write value must be consistent with the above properties.
 # Note that the driver only supports 6 slots, so we have HOME_APP at the
 # same memory level as services.
@@ -204,11 +232,11 @@

 service debuggerd /system/bin/debuggerd

-service ril-daemon /system/bin/rild
-    socket rild stream 660 root radio
-    socket rild-debug stream 660 radio system
-    user root
-    group radio cache inet misc
+#service ril-daemon /system/bin/rild
+#    socket rild stream 660 root radio
+#    socket rild-debug stream 660 radio system
+#    user root
+#    group radio cache inet misc

 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
     socket zygote stream 666
@@ -219,38 +247,59 @@
     user media
     group system audio camera graphics inet net_bt net_bt_admin

-service bootsound /system/bin/playmp3
-    user media
-    group audio
-    oneshot
-
-service dbus /system/bin/dbus-daemon --system --nofork
-    socket dbus stream 660 bluetooth bluetooth
-    user bluetooth
-    group bluetooth net_bt_admin
-
-service hcid /system/bin/hcid -s -n -f /etc/bluez/hcid.conf
-    socket bluetooth stream 660 bluetooth bluetooth
-    socket dbus_bluetooth stream 660 bluetooth bluetooth
-    # init.rc does not yet support applying capabilities, so run as root and
-    # let hcid drop uid to bluetooth with the right linux capabilities
-    group bluetooth net_bt_admin misc
-    disabled
+#service bootsound /system/bin/playmp3
+#    user media
+#    group audio
+#    oneshot
+
+#service dbus /system/bin/dbus-daemon --system --nofork
+#    socket dbus stream 660 bluetooth bluetooth
+#    user bluetooth
+#    group bluetooth net_bt_admin
+
+#service hcid /system/bin/hcid -s -n -f /etc/bluez/hcid.conf
+#    socket bluetooth stream 660 bluetooth bluetooth
+#    socket dbus_bluetooth stream 660 bluetooth bluetooth
+#    # init.rc does not yet support applying capabilities, so run as root and
+#    # let hcid drop uid to bluetooth with the right linux capabilities
+#    group bluetooth net_bt_admin misc
+#    disabled
+
+#service hfag /system/bin/sdptool add --channel=10 HFAG
+#    user bluetooth
+#    group bluetooth net_bt_admin
+#    disabled
+#    oneshot
+
+#service hsag /system/bin/sdptool add --channel=11 HSAG
+#    user bluetooth
+#    group bluetooth net_bt_admin
+#    disabled
+#    oneshot
+
+
+#service wlan_loader /system/bin/wlan_loader
+#   disabled
+#   oneshot
+
+service ifcfg_ralink /system/bin/ifconfig wlan0 up
+#   disabled
+#   oneshot
+
+service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf -dd
+   disabled
+   group system
+
+service dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d wlan0
+   disabled
+   oneshot
+   #group system dhcp

-service hfag /system/bin/sdptool add --channel=10 HFAG
-    user bluetooth
-    group bluetooth net_bt_admin
-    disabled
-    oneshot
-
-service hsag /system/bin/sdptool add --channel=11 HSAG
-    user bluetooth
-    group bluetooth net_bt_admin
-    disabled
-    oneshot
+on property:init.svc.wpa_supplicant=stopped
+    stop dhcpcd

 service installd /system/bin/installd
     socket installd stream 600 system system

-service flash_recovery /system/bin/flash_image recovery /system/recovery.img
-     oneshot
+#service flash_recovery /system/bin/flash_image recovery /system/recovery.img
+#    oneshot

alsa 設定ファイル

android-root/system/etc/ に ALSA の設定ファイル

をコピーします。

asound.state

asound.state は bc9 用に gumstix-oe で OpenEmbedded 環境を build した際に OpenEmbedded の /etc/ に生成されたものです。

asound.conf

asound.conf は 上記の asound.state を元に各 control が正しく設定されるよう作成したものです。

vold 設定ファイル

Android での sdcard の mount は /system/bin/vold が実行します。
vold は 設定ファイル android-root/system/etc/vold.conf に従って動作するので、以下の内容で作成します。

## vold configuration file for bc9
volume_sdcard {
  media_path     /devices/platform/pxa2xx-mci.0/mmc_host/mmc0
  media_type     mmc
  mount_point    /sdcard
  ums_path       /devices/platform/usb_mass_storage/lun0
}

これを設定することで microSD の第1パーティションがメディアファイルの保存用にマウントされます。
第一パーティションに画像、音声、動画ファイルを置くと Android 上から参照できます。

ボタン配置設定

bc9 の android でのボタン配置は以下のように設定しています。
(上から)

  • HOME
  • MENU
  • BACK

bc9 には gpio 接続の3つのボタンがあり、キーボードの F1, F2, F3 として割り振られています。
それぞれを HOME, MENU, BACK に割り当てます。
android-root/system/usr/keylayout/qwerty.kl を以下のように修正してください。

--- qwerty.kl.orig	2009-09-01 16:44:37.000000000 +0900
+++ qwerty.kl	2009-09-01 16:45:24.000000000 +0900
@@ -11,18 +11,18 @@ key 10    9
 key 11    0
 key 158   BACK              WAKE_DROPPED
 key 230   SOFT_RIGHT        WAKE
-key 60    SOFT_RIGHT        WAKE
+key 60    MENU              WAKE
 key 107   ENDCALL           WAKE_DROPPED
 key 62    ENDCALL           WAKE_DROPPED
 key 229   MENU              WAKE_DROPPED
 key 139   MENU              WAKE_DROPPED
-key 59    MENU              WAKE_DROPPED
+key 59    HOME              WAKE
 key 127   SEARCH            WAKE_DROPPED
 key 217   SEARCH            WAKE_DROPPED
 key 228   POUND
 key 227   STAR
 key 231   CALL              WAKE_DROPPED
-key 61    CALL              WAKE_DROPPED
+key 61    BACK              WAKE
 key 232   DPAD_CENTER       WAKE_DROPPED
 key 108   DPAD_DOWN         WAKE_DROPPED
 key 103   DPAD_UP           WAKE_DROPPED

default.prop

default.prop の末尾に以下のように OpenDNS の IP を設定します。
(OpenDNS の利用に制限がある場合は bc9 を動作させる環境で利用可能な DNS サーバアドレスを設定して下さい。)

net.eth0.dns1=208.66.222.222
net.dns1=208.67.222.222

Screen Timeout

Power Management 機能に無効化パッチを当てた状態では Screen Timeout でスリープモードに入った android を復帰させることができません。
これを回避するために、Screen Timeout を無効にしておく必要があります。
android 起動時に、以下の設定をおこないます。

  • [Menu] - [Settings] - [Sound & display] - [Screen timeout] - [Never timeout]

device_provisioned

アクティベート関連の処理が OpenSource 版にも影響を与えています。
初回起動後作成される設定 dbファイルに以下の操作実行することで android がアクティベートされた状態になります。
(android の userland 上で直接実行することはできません。Linux 上で sqlite3 を使用します。)

# cd /data/data/com.android.providers.settings/databases
# sqlite3 settings.db
sqlite> insert into "secure" values(NULL,"device_provisioned", "1");
sqlite> .exit

アクティベートされると android 起動時 の HOME 画面にキーロックダイアログ表示が追加されます。
アクティベート前は起動後そのまま HOME 画面に移行しますが、
アクティベート後は起動後キーロックダイアログが表示され MENU ボタンを押すことで HOME 画面が表示されます。
なお、キーロックダイアログに(No SIM Card/通信サービスなし)と表示されますが、3G通信ができないというだけの意味で Ethernet は使用できます。

アクティベートされていない場合は、以下のような問題が確認されています。

  • HOMEキーが無効になっている。
  • 起動時のキーロックダイアログが表示されない。

以上で android1.5-r3 の build 、起動準備は完了です。


添付ファイル: fileasound.state 1782件 [詳細] fileasound.conf 1849件 [詳細] filedummy-battery.patch 1924件 [詳細]

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-09-01 (火) 22:59:12 (5351d)