Android on Freerunner/zh tw
From Openmoko
Languages: |
English • العربية • Български • Česky • Dansk • Deutsch • Esperanto • Eesti • Español • فارسی • Suomi • Français • עברית • Magyar • Italiano • 한국어 • Nederlands • Norsk (bokmål) • Polski • Português • Română • Русский • Svenska • Slovenčina • Українська • 中文(中国大陆) • 中文(台灣) • Euskara • Català |
Contents |
在Freerunner上執行Android
Google 釋出了他們Android手機的開放源碼軟體套件。為了要讓它可以在Freerunner上使用,很多 patche需要在armv4 java exception上被套用、編譯。
編譯套件
Android對於gcc 的版本相當的挑剔。若沒有修改的狀況下,針對armv4它也需要一些 java exception支援。以下是我用來build Android的工具:
Binutils 2.18
曾經我有使用在 armv5t程式架構下編譯的 Android,它會導致連結器產生這些blx 指令,讓它無法在armv4下使用。我無法確定這是否仍然是必要的,但我仍然有下面的變更I'm not sure if this is still necessary, but I still have the following change applied to binutils:
diff -urN binutils-2.18-orig/bfd/elf32-arm.c binutils-2.18/bfd/elf32-arm.c --- binutils-2.18-orig/bfd/elf32-arm.c 2007-08-07 02:59:23.000000000 +0700 +++ binutils-2.18/bfd/elf32-arm.c 2008-03-15 11:30:17.000000000 +0700 @@ -3093,8 +3093,8 @@ static void check_use_blx(struct elf32_arm_link_hash_table *globals) { if (bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, - Tag_CPU_arch) > 2) - globals->use_blx = 1; + Tag_CPU_arch) >= TAG_CPU_ARCH_V5T) + globals->use_blx = 0; } bfd_boolean
configure --prefix={devel path}/android/cross --target=arm-eabi
gcc 4.2.4 with gcc41-java-arm4.patch
configure --prefix={devel path}/android/cross --target=arm-eabi --with-arch=armv4t --enable-shared --enable-threads --disable-nls --disable-libmudflap --enable-target-optspace --with-abi=aapcs --enable-multilib --disable-libssp --disable-libstdcxx --enable-languages=c,c++
java-6-sun
This is the standard Linux package available for most (all?) distributions.
Patches
Coming soon. I've posted a number of them on the devel mailing list so far. Eventually, I expect to provide everything necessary for people to build Android for themselves.
Images
To use the Kernel you have to adjust your u-boot environment to support a Kernel of more then 2 MB or your have to change to the Qi Bootloader
I have placed an older 2.6.26 kernel with Android support at:
uImage-android
I have put up a jffs2 image that replaces rootfs on the Freerunner at:
androidfs.jffs2
Warning: Installation of Android requires loading a new kernel and rootfs image onto your phone. I have not had time to produce a version that runs completely off an sdcard. Can someone please give us a HOWTO 'change u-boot environment' or a ready-to-download u-boot?
Installation
As noted above, this installation requires you to wipe out the existing kernel and rootfs in NAND on your Freerunner. You also must have an SDCARD and it needs to be configured with two (2) primary partitions: First is VFAT/MSDOS (16 or 32) which acts as the /sdcard storage area for pictures, movies, music, etc. and the Second is an ext3 primary partition for use of internal Android /data area to store settings, caches, etc.
The first thing I suggest is to setup an SDCARD. You can flash the NAND first, but you must have an SDCARD with two partitions as stated before you'll be able to boot. I use a 2GB card which I have split in half. fdisk shows me:
/dev/mmcblk0p1 1 2454 996310 6 FAT16
/dev/mmcblk0p2 2455 4908 996324 83 Linux
formatted as
sudo mkfs.vfat /dev/mmcblk0p1
sudo mkfs.ext3 /dev/mmcblk0p2
There is no need to populate the ext3 partition at all. The VFAT partition can be populated with media content if you so desire.
With your SDCARD all set, you are ready to flash the kernel and rootfs:
sudo {path_to}/dfu-util -d 0x1d50:0x5119 -a kernel -D uImage-android
sudo {path_to}/dfu-util -d 0x1d50:0x5119 -a rootfs -D androidfs.jffs2
Tools
To assist in debugging and to gain shell access to the phone with Android, you can
adb
You should be able to connect to the phone as long as you start it up with the USB connected to your host. I don't think it will work if you plug it in after starting. Some helpful commands are:
ADBHOST=neo ./adb logcat - like a tail -f of the android log ADBHOST=neo ./adb logcat -b radio - same as above for the radio logs ADBHOST=neo ./adb shell - bring up a command shell to the phone ADBHOST=neo ./adb kill-server - kill the background server on the host
Note: ADBHOST=neo assumes you have neo in your hosts file to point to the ip of the phone (192.168.0.202). Otherwise prefix the commands with "ADBHOST=192.168.0.202 ./adb [...]" It seems that simply adding IP to /etc/hosts doesn't work on Ubuntu, using IP address (192.168.0.202) instead neo will save your time. If you cannot to the device run "adb kill-server" before trying other commands.
Known Issues
This version of the linux kernel will not successfully wake from suspend mode. Your battery life will be significantly lowered because of this and the phone will lock up unless you setup the phones screen timeout to never.
This version of the kernel also uses a keypad hack. The buttons layout is as follows:
Aux left-hand upper button is the "back" key. Power button is: menu button when pushed quickly, end button when held for more than a second and released, power-off if held for 10 seconds.