[[bc9-android-sdk--release20090815]] #contents *android-1.5r3 for bc9(bc9-android-sdk--release20090815 Ver.) [#q2768409] 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 で別途取得します。 *ソースコード取得 [#se9d00ae] **android-1.5r3 branch [#u6cd7dd2] 以下のようにして 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 [#z0eb4855] 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 内容の調整 [#p9309f5e] ** alsa-lib の調整 [#s4b25568] 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 [#q187ac00] 修正なしに build すると起動時に low battery と判断して起動しない状態になるので、添付の #ref(dummy-battery.patch) を当てます。 $ cd android-sdk-1.5_r3 $ patch -b -p1 < ../dummy-battery.patch **Wi-Fi の調整[#ed198993] ***wpa_supplicant の調整 [#n0785818] 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 の修正 [#k8d1d2ad] 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 の修正 [#w2fc8a1f] 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 名の修正 [#f844bc40] 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 リソースファイル [#e28a89d7] build 時に ringtone などの sound リソースファイルが所定の位置にコピーされるよう、AudioPackage2.mk を Android.mk としてコピーします。 $ cd ~android-1.5_r3/frameworks/base/data/sounds/ $ cp AudioPackage2.mk Android.mk ** BoardConfig.mk の調整 [#w32a4160] 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 の調整 [#r749cfe9] 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 [#l917747c] 以上の修正・調整が完了したら、build を実行します。 $ cd ~/android-1.5r3 $ make build が完了しても ~/android-1.5r3/out/target/product/generic/system/lib 以下に OpenWnn の libファイル群がビルドされていませんので、~ OpenWnn の追加ビルドを行います。~ * 追加 build [#e429b38a] ** OpenWnn [#kee553f3] 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 作成 [#g6d192ca] ** build された android ファイルの配置 [#mb401dc3] 上記の作業が完了したら、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 の配置 [#i18ce984] 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 の編集 [#b3d6b8a3] 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 設定ファイル[#f830bd64] android-root/system/etc/ に ALSA の設定ファイル asound.conf と asound.state をコピーします。~ android-root/system/etc/ に ALSA の設定ファイル #ref(asound.conf) と #ref(asound.state) をコピーします。~ ***asound.state [#u17595d2] asound.state は bc9 用に gumstix-oe で OpenEmbedded 環境を build した際に OpenEmbedded の /etc/ に生成されたものです。 ***asound.conf [#h7cefd42] asound.conf は 上記の asound.state を元に各 control が正しく設定されるよう作成したものです。 ** vold 設定ファイル[#w4196ee2] 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 上から参照できます。 ** ボタン配置設定 [#j05e64bc] 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 [#dc05d9e4] default.prop の末尾に以下のように OpenDNS の IP を設定します。~ (OpenDNS の利用に制限がある場合は bc9 を動作させる環境で利用可能な DNS サーバアドレスを設定して下さい。) net.eth0.dns1=208.66.222.222 net.dns1=208.67.222.222 ** Screen Timeout [#gb27f637] Power Management 機能に無効化パッチを当てた状態では Screen Timeout でスリープモードに入った android を復帰させることができません。~ これを回避するために、Screen Timeout を無効にしておく必要があります。~ android 起動時に、以下の設定をおこないます。~ - [Menu] - [Settings] - [Sound & display] - [Screen timeout] - [Never timeout] ** device_provisioned [#i13e8be0] アクティベート関連の処理が 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 、起動準備は完了です。~