Android on Freerunner/zh tw

From Openmoko

(Difference between revisions)
Jump to: navigation, search
(Binutils 2.18)
(catchg)
 
(13 intermediate revisions by one user not shown)
Line 10: Line 10:
 
=== Binutils 2.18 ===
 
=== 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:
+
曾經我有使用在 armv5t程式架構下編譯的 Android,它會導致連結器產生這些blx 指令,讓它無法在armv4下使用。我無法確定這是否仍然是必要的,但我仍然有下面的變更套用到binutils:
  
 
<pre>
 
<pre>
Line 39: Line 39:
 
=== java-6-sun ===
 
=== java-6-sun ===
  
This is the standard Linux package available for most (all?) distributions.
+
它是個給大部份套件使用的標準Linux package。
  
 
== Patches ==
 
== Patches ==
Line 47: Line 47:
  
 
== Images ==
 
== Images ==
To use the Kernel you have to adjust your [http://www.denx.de/wiki/U-Boot u-boot] environment to support a Kernel of more then 2 MB or your have to change to the [http://wiki.openmoko.org/wiki/Qi Qi Bootloader]
+
要使用Kernel,你必須調整你的 [http://www.denx.de/wiki/U-Boot u-boot] 環境,讓它可以支援超過 2 MB,或者是你必須修改 [http://wiki.openmoko.org/wiki/Qi Qi Bootloader]
  
I have placed an older 2.6.26 kernel with Android support at:
+
我在下面的位置放了 使用2.6.26 版kernel 的Android :
  
 
     [http://people.openmoko.org/sean_mcneil/uImage-android uImage-android]
 
     [http://people.openmoko.org/sean_mcneil/uImage-android uImage-android]
  
I have put up a jffs2 image that replaces rootfs on the Freerunner at:
+
我已經在下列的網址放了 jffs2 image:
  
 
   [http://people.openmoko.org/sean_mcneil/androidfs.jffs2 androidfs.jffs2]
 
   [http://people.openmoko.org/sean_mcneil/androidfs.jffs2 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.
+
Warning: 安裝Android必須要載入新的 kernel rootfs image到手機當中。我並沒有時間製作一個完全不需要使用sd card的影像檔。
Can someone please give us a HOWTO 'change u-boot environment' or a ready-to-download u-boot?
+
 
 +
有人可以幫忙製作 HOWTO 'change u-boot environment' or a ready-to-download u-boot 的文件嗎?
  
 
== Installation ==
 
== 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.
+
就如上面所註明的,這個安裝需要你抺掉目前燒製在Freerunner NAND中的kernel及rootfs。 你也必須要製作出一個設定為二個主磁磁分割的SDCARD:第一個是 VFAT/MSDOS (16 or 32) ,做為 /sdcard 儲存圖片、影片、音樂...等檔案的分割區,另一個則切割為ext3 primary partition ,做為儲存 Android 設定,快取等儲存區。
  
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:
+
我建議你進行的第一個工作是設定 SD CARD。 你可以先flash  NAND,但你仍然必須要準備好包含二個分割區的SD CARD ,做為你BOOT進系統之前的前置準區。我使用的是 2GB card,我將它切割為以下的內容:
  
 
     /dev/mmcblk0p1              1        2454      996310    6  FAT16<br>
 
     /dev/mmcblk0p1              1        2454      996310    6  FAT16<br>
 
     /dev/mmcblk0p2            2455        4908      996324  83  Linux
 
     /dev/mmcblk0p2            2455        4908      996324  83  Linux
  
formatted as
+
格式化為以下的內容:
  
 
     sudo mkfs.vfat /dev/mmcblk0p1<br>
 
     sudo mkfs.vfat /dev/mmcblk0p1<br>
 
     sudo mkfs.ext3 /dev/mmcblk0p2
 
     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.
+
並不需要將資料放在 ext3 分割區, 若你希望的話,VFAT 分割區也可以放置資料。
  
With your SDCARD all set, you are ready to flash the kernel and rootfs:
+
在完全的設定好你的SDCARD後,可以準備燒製kernel及rootfs:
  
 
     sudo {path_to}/dfu-util -d 0x1d50:0x5119 -a kernel -D uImage-android<br>
 
     sudo {path_to}/dfu-util -d 0x1d50:0x5119 -a kernel -D uImage-android<br>
 
     sudo {path_to}/dfu-util -d 0x1d50:0x5119 -a rootfs -D androidfs.jffs2<br>
 
     sudo {path_to}/dfu-util -d 0x1d50:0x5119 -a rootfs -D androidfs.jffs2<br>
  
== Tools ==
+
== 工具 ==
  
To assist in debugging and to gain shell access to the phone with Android, you can
+
要支援debugging 並且取得Android 手機的shell access,你可以使用:
  
 
   [http://people.openmoko.org/sean_mcneil/adb adb]
 
   [http://people.openmoko.org/sean_mcneil/adb 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:
+
你應該可以使用USB連接手機與主機。我不覺得在你將它插入主機後,它會正常運作。你可以使用下面的指令:
  
 
     ADBHOST=neo ./adb logcat          - like a tail -f of the android log
 
     ADBHOST=neo ./adb logcat          - like a tail -f of the android log
Line 94: Line 95:
 
     ADBHOST=neo ./adb kill-server      - kill the background server on the host
 
     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.
+
Note: ADBHOST=neo 假設你的neo的ip是 (192.168.0.202)。則"ADBHOST=192.168.0.202 ./adb [...]" 做為開頭的指令。但看起來將ip加到 /etc/hosts 在 Ubuntu下並無法運作,使用IP address (192.168.0.202),而不是使用 neo做為參數,可以節省很多時間。
 +
 
 +
== 已知的問題 ==
 +
 
 +
這一個版本的 linux kernel 並無法成功的自suspend mode被喚醒。你的電池壽命也較低,因為你必須要將螢幕上鎖,將螢幕的計時關閉功能關掉。
  
== Known Issues ==
+
這一個版本也用到了 keypad hack。按鈕的配置如下:
  
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.
+
    Aux = "上一步" key.
 +
    電源按鈕=:
 +
        快速按下為選單按鈕,
 +
        按住數秒快速放掉則為end
 +
        按住十秒鐘,則為"關機"。
  
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.
+
[[Category:Android]]
    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.
+
[[category|Distribution]]
+
 
[[Category:Flashing Openmoko]]
 
[[Category:Flashing Openmoko]]

Latest revision as of 17:44, 10 July 2009

Contents

[edit] 在Freerunner上執行Android

Google 釋出了他們Android手機的開放源碼軟體套件。為了要讓它可以在Freerunner上使用,很多 patche需要在armv4 java exception上被套用、編譯。

[edit] 編譯套件

Android對於gcc 的版本相當的挑剔。若沒有修改的狀況下,針對armv4它也需要一些 java exception支援。以下是我用來build Android的工具:


[edit] Binutils 2.18

曾經我有使用在 armv5t程式架構下編譯的 Android,它會導致連結器產生這些blx 指令,讓它無法在armv4下使用。我無法確定這是否仍然是必要的,但我仍然有下面的變更套用到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

[edit] 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++

[edit] java-6-sun

它是個給大部份套件使用的標準Linux package。

[edit] 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.

[edit] Images

要使用Kernel,你必須調整你的 u-boot 環境,讓它可以支援超過 2 MB,或者是你必須修改 Qi Bootloader

我在下面的位置放了 使用2.6.26 版kernel 的Android :

   uImage-android

我已經在下列的網址放了 jffs2 image:

  androidfs.jffs2

Warning: 安裝Android必須要載入新的 kernel 及 rootfs image到手機當中。我並沒有時間製作一個完全不需要使用sd card的影像檔。

有人可以幫忙製作 HOWTO 'change u-boot environment' or a ready-to-download u-boot 的文件嗎?

[edit] Installation

就如上面所註明的,這個安裝需要你抺掉目前燒製在Freerunner NAND中的kernel及rootfs。 你也必須要製作出一個設定為二個主磁磁分割的SDCARD:第一個是 VFAT/MSDOS (16 or 32) ,做為 /sdcard 儲存圖片、影片、音樂...等檔案的分割區,另一個則切割為ext3 primary partition ,做為儲存 Android 設定,快取等儲存區。

我建議你進行的第一個工作是設定 SD CARD。 你可以先flash NAND,但你仍然必須要準備好包含二個分割區的SD CARD ,做為你BOOT進系統之前的前置準區。我使用的是 2GB card,我將它切割為以下的內容:

   /dev/mmcblk0p1               1        2454      996310    6  FAT16
/dev/mmcblk0p2 2455 4908 996324 83 Linux

格式化為以下的內容:

   sudo mkfs.vfat /dev/mmcblk0p1
sudo mkfs.ext3 /dev/mmcblk0p2

並不需要將資料放在 ext3 分割區, 若你希望的話,VFAT 分割區也可以放置資料。

在完全的設定好你的SDCARD後,可以準備燒製kernel及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

[edit] 工具

要支援debugging 並且取得Android 手機的shell access,你可以使用:

  adb

你應該可以使用USB連接手機與主機。我不覺得在你將它插入主機後,它會正常運作。你可以使用下面的指令:

   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 假設你的neo的ip是 (192.168.0.202)。則"ADBHOST=192.168.0.202 ./adb [...]" 做為開頭的指令。但看起來將ip加到 /etc/hosts 在 Ubuntu下並無法運作,使用IP address (192.168.0.202),而不是使用 neo做為參數,可以節省很多時間。

[edit] 已知的問題

這一個版本的 linux kernel 並無法成功的自suspend mode被喚醒。你的電池壽命也較低,因為你必須要將螢幕上鎖,將螢幕的計時關閉功能關掉。

這一個版本也用到了 keypad hack。按鈕的配置如下:

   Aux = "上一步" key.
   電源按鈕=:
       快速按下為選單按鈕,
       按住數秒快速放掉則為end
       按住十秒鐘,則為"關機"。
Personal tools

在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.

Distribution