
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://armadeus.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=NicolasD</id>
		<title>ArmadeusWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://armadeus.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=NicolasD"/>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Special:Contributions/NicolasD"/>
		<updated>2026-04-05T22:12:12Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.3</generator>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7536</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7536"/>
				<updated>2009-10-28T16:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: add kernel path definition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/android-eclair&lt;br /&gt;
export ANDROID_KERNEL=~/android-kernel&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo'' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE&lt;br /&gt;
cd $ANDROID_SOURCE&lt;br /&gt;
mkdir bin&lt;br /&gt;
curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair&lt;br /&gt;
repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_KERNEL&lt;br /&gt;
cd $ANDROID_KERNEL&lt;br /&gt;
git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
{{Warning| Never export ARCH and CROSS_COMPILE environment variables because Android make use them too}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_KERNEL $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_KERNEL $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir $ANDROID_KERNEL/drivers/armadeus&lt;br /&gt;
cp -r $ARMADEUS/target/linux/modules/* $ANDROID_KERNEL/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generate the Linux kernel, we retrieve the default apf27 Linux configuration and modify it for start Android.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_KERNEL/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
cd $ANDROID_KERNEL&lt;br /&gt;
make ARCH=arm mrproper&lt;br /&gt;
make ARCH=arm apf27_android_defconfig&lt;br /&gt;
make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* Activate the Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
* Activate the wake lock for spi event reach to Android and include in the compiled kernel the touchscreen driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Audio kernel configuration===&lt;br /&gt;
* Include in the compiled kernel the audio driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
   &amp;lt;*&amp;gt; Sound card support  ---&amp;gt;&lt;br /&gt;
      --- Sound card support&lt;br /&gt;
      &amp;lt;*&amp;gt;   Advanced Linux Sound Architecture  ---&amp;gt;&lt;br /&gt;
         [*]   ARM sound devices  ---&amp;gt;&lt;br /&gt;
            --- ARM sound &lt;br /&gt;
            &amp;lt;*&amp;gt;   i.MX27 SSI driver&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC210x alsa driver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Modify touchscreen driver===&lt;br /&gt;
Android don't use tslib library so we should add the calibration directly in ts drivers&amp;lt;br&amp;gt;&lt;br /&gt;
edit ''$ANDROID_KERNEL/drivers/input/touchscreen/tsc2102_ts.c''&amp;lt;br&amp;gt;&lt;br /&gt;
Add new definitions for X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Send touch event to Android when the user release the touchscreen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Calibrate the touchscreen with X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
Compile the kernel and generate image kernel for U-Boot Loader&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_KERNEL&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
cp $ANDROID_KERNEL/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under ''/sys/class/power_supply'' so that to prevent the power down by low battery ''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
For activate the audio, we should retrieve Alsa android module whose not directly add in the source&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit ''$ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk'' and modify the audio divers used by Android&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit ''$ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp'' and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit ''$ANDROID_SOURCE/system/core/init/device.c'' and add audio device in Linux devices&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
      base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   // add this conditionnal block&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
      base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
             !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
      base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
      name += 4;&lt;br /&gt;
   } else&lt;br /&gt;
      base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Add audio files in Android files system&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
Edit ''$ANDROID_SOURCE/system/core/rootdir/init.rc'', comment the '''mount roofs''' in read only mode and '''mount yaffs2''' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount the SD Card partition&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on ''$ANDROID_SOURCE/tools/lib/images'' directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in ''$ANDROID_SOURCE/out/target/product/generic''. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
sudo chown -R root.root .&lt;br /&gt;
sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
setenv bootcmd run mmcboot&lt;br /&gt;
saveenv&lt;br /&gt;
run update_kernel&lt;br /&gt;
run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
export ADBHOST=w.x.y.z&lt;br /&gt;
adb kill-server&lt;br /&gt;
adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm goldfish_defconfig&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create AVD (Android Virtual Device)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-H -t 4 -s 272x480&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-L -t 4 -s 480x272&lt;br /&gt;
$ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7489</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7489"/>
				<updated>2009-10-21T14:30:35Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: move Touchscreen Driver chapter and change the path to wiki style&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo'' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE&lt;br /&gt;
cd $ANDROID_SOURCE&lt;br /&gt;
mkdir bin&lt;br /&gt;
curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
repo init -u git://android.git.kernel.org/platform/manifest.git -b donut&lt;br /&gt;
repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
{{Warning| Never export ARCH and CROSS_COMPILE environment variables because Android make use them too}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generate the Linux kernel, we retrieve the default apf27 Linux configuration and modify it for start Android.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm mrproper&lt;br /&gt;
make ARCH=arm apf27_android_defconfig&lt;br /&gt;
make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* Activate the Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
* Activate the wake lock for spi event reach to Android and include in the compiled kernel the touchscreen driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Audio kernel configuration===&lt;br /&gt;
* Include in the compiled kernel the audio driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
   &amp;lt;*&amp;gt; Sound card support  ---&amp;gt;&lt;br /&gt;
      --- Sound card support&lt;br /&gt;
      &amp;lt;*&amp;gt;   Advanced Linux Sound Architecture  ---&amp;gt;&lt;br /&gt;
         [*]   ARM sound devices  ---&amp;gt;&lt;br /&gt;
            --- ARM sound &lt;br /&gt;
            &amp;lt;*&amp;gt;   i.MX27 SSI driver&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC210x alsa driver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Modify touchscreen driver===&lt;br /&gt;
Android don't use tslib library so we should add the calibration directly in ts drivers&amp;lt;br&amp;gt;&lt;br /&gt;
edit ''$ANDROID_SOURCE/kernel/drivers/input/touchscreen/tsc2102_ts.c''&amp;lt;br&amp;gt;&lt;br /&gt;
Add new definitions for X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Send touch event to Android when the user release the touchscreen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Calibrate the touchscreen with X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
Compile the kernel and generate image kernel for U-Boot Loader&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under ''/sys/class/power_supply'' so that to prevent the power down by low battery ''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
For activate the audio, we should retrieve Alsa android module whose not directly add in the source&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit ''$ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk'' and modify the audio divers used by Android&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit ''$ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp'' and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit ''$ANDROID_SOURCE/system/core/init/device.c'' and add audio device in Linux devices&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
      base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   // add this conditionnal block&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
      base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
             !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
      base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
      name += 4;&lt;br /&gt;
   } else&lt;br /&gt;
      base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Add audio files in Android files system&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
Edit ''$ANDROID_SOURCE/system/core/rootdir/init.rc'', comment the '''mount roofs''' in read only mode and '''mount yaffs2''' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount the SD Card partition&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on ''$ANDROID_SOURCE/tools/lib/images'' directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in ''$ANDROID_SOURCE/out/target/product/generic''. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
sudo chown -R root.root .&lt;br /&gt;
sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
setenv bootcmd run mmcboot&lt;br /&gt;
saveenv&lt;br /&gt;
run update_kernel&lt;br /&gt;
run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
export ADBHOST=w.x.y.z&lt;br /&gt;
adb kill-server&lt;br /&gt;
adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm goldfish_defconfig&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create AVD (Android Virtual Device)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-H -t 4 -s 272x480&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-L -t 4 -s 480x272&lt;br /&gt;
$ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7488</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7488"/>
				<updated>2009-10-21T14:07:09Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: remove '$' from cmd line (bis)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE&lt;br /&gt;
cd $ANDROID_SOURCE&lt;br /&gt;
mkdir bin&lt;br /&gt;
curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
{{Warning| Never export ARCH and CROSS_COMPILE environment variables because Android make use them too}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generate the Linux kernel, we retrieve the default apf27 Linux configuration and modify it for start Android.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm mrproper&lt;br /&gt;
make ARCH=arm apf27_android_defconfig&lt;br /&gt;
make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* Activate the Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
* Activate the wake lock for spi event reach to Android and include in the compiled kernel the touchscreen driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Audio kernel configuration===&lt;br /&gt;
* Include in the compiled kernel the audio driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
   &amp;lt;*&amp;gt; Sound card support  ---&amp;gt;&lt;br /&gt;
      --- Sound card support&lt;br /&gt;
      &amp;lt;*&amp;gt;   Advanced Linux Sound Architecture  ---&amp;gt;&lt;br /&gt;
         [*]   ARM sound devices  ---&amp;gt;&lt;br /&gt;
            --- ARM sound &lt;br /&gt;
            &amp;lt;*&amp;gt;   i.MX27 SSI driver&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC210x alsa driver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
Compile the kernel and generate image kernel for U-Boot Loader&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
For activate the audio, we should retrieve Alsa android module whose not directly add in the source&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk''' and modify the audio divers used by Android&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp''' and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/system/core/init/device.c''' and add audio device in Linux devices&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
      base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   // add this conditionnal block&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
      base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
             !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
      base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
      name += 4;&lt;br /&gt;
   } else&lt;br /&gt;
      base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Add audio files in Android files system&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
Android don't use tslib library so we should add the calibration directly in ts drivers&amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/kernel/drivers/input/touchscreen/ts2102_ts.c'''&amp;lt;br&amp;gt;&lt;br /&gt;
Add new definitions for X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Send touch event to Android when the user release the touchscreen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Calibrate the touchscreen with X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
Edit $ANDROID_SOURCE/system/core/rootdir/init.rc, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount the SD Card partition&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
sudo chown -R root.root .&lt;br /&gt;
sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
setenv bootcmd run mmcboot&lt;br /&gt;
saveenv&lt;br /&gt;
run update_kernel&lt;br /&gt;
run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
export ADBHOST=w.x.y.z&lt;br /&gt;
adb kill-server&lt;br /&gt;
adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm goldfish_defconfig&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create AVD (Android Virtual Device)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-H -t 4 -s 272x480&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-L -t 4 -s 480x272&lt;br /&gt;
$ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7487</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7487"/>
				<updated>2009-10-21T14:04:46Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: remove '$' from cmd line&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE&lt;br /&gt;
cd $ANDROID_SOURCE&lt;br /&gt;
mkdir bin&lt;br /&gt;
curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
{{Warning| Never export ARCH and CROSS_COMPILE environment variables because Android make use them too}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generate the Linux kernel, we retrieve the default apf27 Linux configuration and modify it for start Android.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm mrproper&lt;br /&gt;
make ARCH=arm apf27_android_defconfig&lt;br /&gt;
make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* Activate the Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
* Activate the wake lock for spi event reach to Android and include in the compiled kernel the touchscreen driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Audio kernel configuration===&lt;br /&gt;
* Include in the compiled kernel the audio driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
   &amp;lt;*&amp;gt; Sound card support  ---&amp;gt;&lt;br /&gt;
      --- Sound card support&lt;br /&gt;
      &amp;lt;*&amp;gt;   Advanced Linux Sound Architecture  ---&amp;gt;&lt;br /&gt;
         [*]   ARM sound devices  ---&amp;gt;&lt;br /&gt;
            --- ARM sound &lt;br /&gt;
            &amp;lt;*&amp;gt;   i.MX27 SSI driver&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC210x alsa driver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
Compile the kernel and generate image kernel for U-Boot Loader&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
For activate the audio, we should retrieve Alsa android module whose not directly add in the source&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk''' and modify the audio divers used by Android&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp''' and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/system/core/init/device.c''' and add audio device in Linux devices&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
      base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   // add this conditionnal block&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
      base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
             !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
      base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
      name += 4;&lt;br /&gt;
   } else&lt;br /&gt;
      base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Add audio files in Android files system&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
Android don't use tslib library so we should add the calibration directly in ts drivers&amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/kernel/drivers/input/touchscreen/ts2102_ts.c'''&amp;lt;br&amp;gt;&lt;br /&gt;
Add new definitions for X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Send touch event to Android when the user release the touchscreen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Calibrate the touchscreen with X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
Edit $ANDROID_SOURCE/system/core/rootdir/init.rc, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount the SD Card partition&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
sudo chown -R root.root .&lt;br /&gt;
sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
setenv bootcmd run mmcboot&lt;br /&gt;
saveenv&lt;br /&gt;
run update_kernel&lt;br /&gt;
run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
export ADBHOST=w.x.y.z&lt;br /&gt;
adb kill-server&lt;br /&gt;
adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm goldfish_defconfig&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create AVD (Android Virtual Device)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-H -t 4 -s 272x480&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-L -t 4 -s 480x272&lt;br /&gt;
$ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7475</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7475"/>
				<updated>2009-10-13T13:30:47Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Audio kernel configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
{{Warning| Never export ARCH and CROSS_COMPILE environment variables because Android make use them too}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generate the Linux kernel, we retrieve the default apf27 Linux configuration and modify it for start Android.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm mrproper&lt;br /&gt;
make ARCH=arm apf27_android_defconfig&lt;br /&gt;
make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* Activate the Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
* Activate the wake lock for spi event reach to Android and include in the compiled kernel the touchscreen driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Audio kernel configuration===&lt;br /&gt;
* Include in the compiled kernel the audio driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
   &amp;lt;*&amp;gt; Sound card support  ---&amp;gt;&lt;br /&gt;
      --- Sound card support&lt;br /&gt;
      &amp;lt;*&amp;gt;   Advanced Linux Sound Architecture  ---&amp;gt;&lt;br /&gt;
         [*]   ARM sound devices  ---&amp;gt;&lt;br /&gt;
            --- ARM sound &lt;br /&gt;
            &amp;lt;*&amp;gt;   i.MX27 SSI driver&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC210x alsa driver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
Compile the kernel and generate image kernel for U-Boot Loader&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
For activate the audio, we should retrieve Alsa android module whose not directly add in the source&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk''' and modify the audio divers used by Android&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp''' and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/system/core/init/device.c''' and add audio device in Linux devices&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
      base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   // add this conditionnal block&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
      base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
             !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
      base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
      name += 4;&lt;br /&gt;
   } else&lt;br /&gt;
      base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Add audio files in Android files system&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
Android don't use tslib library so we should add the calibration directly in ts drivers&amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/kernel/drivers/input/touchscreen/ts2102_ts.c'''&amp;lt;br&amp;gt;&lt;br /&gt;
Add new definitions for X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Send touch event to Android when the user release the touchscreen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Calibrate the touchscreen with X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
Edit $ANDROID_SOURCE/system/core/rootdir/init.rc, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount the SD Card partition&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
sudo chown -R root.root .&lt;br /&gt;
sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
setenv bootcmd run mmcboot&lt;br /&gt;
saveenv&lt;br /&gt;
run update_kernel&lt;br /&gt;
run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
export ADBHOST=w.x.y.z&lt;br /&gt;
adb kill-server&lt;br /&gt;
adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm goldfish_defconfig&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create AVD (Android Virtual Device)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-H -t 4 -s 272x480&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-L -t 4 -s 480x272&lt;br /&gt;
$ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7474</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7474"/>
				<updated>2009-10-13T09:43:03Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Audio kernel configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
{{Warning| Never export ARCH and CROSS_COMPILE environment variables because Android make use them too}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generate the Linux kernel, we retrieve the default apf27 Linux configuration and modify it for start Android.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm mrproper&lt;br /&gt;
make ARCH=arm apf27_android_defconfig&lt;br /&gt;
make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* Activate the Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
* Activate the wake lock for spi event reach to Android and include in the compiled kernel the touchscreen driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Audio kernel configuration===&lt;br /&gt;
* Include in the compiled kernel the audio driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
   &amp;lt;*&amp;gt; Sound card support  ---&amp;gt;&lt;br /&gt;
      --- Sound card support&lt;br /&gt;
      &amp;lt;*&amp;gt;   Advanced Linux Sound Architecture  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
Compile the kernel and generate image kernel for U-Boot Loader&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
For activate the audio, we should retrieve Alsa android module whose not directly add in the source&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk''' and modify the audio divers used by Android&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp''' and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/system/core/init/device.c''' and add audio device in Linux devices&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
      base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   // add this conditionnal block&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
      base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
             !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
      base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
      name += 4;&lt;br /&gt;
   } else&lt;br /&gt;
      base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Add audio files in Android files system&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
Android don't use tslib library so we should add the calibration directly in ts drivers&amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/kernel/drivers/input/touchscreen/ts2102_ts.c'''&amp;lt;br&amp;gt;&lt;br /&gt;
Add new definitions for X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Send touch event to Android when the user release the touchscreen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Calibrate the touchscreen with X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
Edit $ANDROID_SOURCE/system/core/rootdir/init.rc, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount the SD Card partition&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
sudo chown -R root.root .&lt;br /&gt;
sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
setenv bootcmd run mmcboot&lt;br /&gt;
saveenv&lt;br /&gt;
run update_kernel&lt;br /&gt;
run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
export ADBHOST=w.x.y.z&lt;br /&gt;
adb kill-server&lt;br /&gt;
adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm goldfish_defconfig&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create AVD (Android Virtual Device)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-H -t 4 -s 272x480&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-L -t 4 -s 480x272&lt;br /&gt;
$ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7473</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7473"/>
				<updated>2009-10-13T09:28:58Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: Add comments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
{{Warning| Never export ARCH and CROSS_COMPILE environment variables because Android make use them too}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generate the Linux kernel, we retrieve the default apf27 Linux configuration and modify it for start Android.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm mrproper&lt;br /&gt;
make ARCH=arm apf27_android_defconfig&lt;br /&gt;
make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* Activate the Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Activate the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
* Activate the wake lock for spi event reach to Android and include in the compiled kernel the touchscreen driver&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
Compile the kernel and generate image kernel for U-Boot Loader&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
For activate the audio, we should retrieve Alsa android module whose not directly add in the source&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa-utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk''' and modify the audio divers used by Android&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''$ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp''' and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/system/core/init/device.c''' and add audio device in Linux devices&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
      base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   // add this conditionnal block&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
      base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
   } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
             !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
      base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
      mkdir(base, 0755);&lt;br /&gt;
      name += 4;&lt;br /&gt;
   } else&lt;br /&gt;
      base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Add audio files in Android files system&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
Android don't use tslib library so we should add the calibration directly in ts drivers&amp;lt;br&amp;gt;&lt;br /&gt;
edit '''$ANDROID_SOURCE/kernel/drivers/input/touchscreen/ts2102_ts.c'''&amp;lt;br&amp;gt;&lt;br /&gt;
Add new definitions for X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Send touch event to Android when the user release the touchscreen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Calibrate the touchscreen with X and Y ranges&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
Edit $ANDROID_SOURCE/system/core/rootdir/init.rc, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount the SD Card partition&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
sudo chown -R root.root .&lt;br /&gt;
sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
setenv bootcmd run mmcboot&lt;br /&gt;
saveenv&lt;br /&gt;
run update_kernel&lt;br /&gt;
run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
export ADBHOST=w.x.y.z&lt;br /&gt;
adb kill-server&lt;br /&gt;
adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
make ARCH=arm goldfish_defconfig&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create AVD (Android Virtual Device)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-H -t 4 -s 272x480&lt;br /&gt;
$ANDROID_SDK/tools/android create avd -n APF27-L -t 4 -s 480x272&lt;br /&gt;
$ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7441</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7441"/>
				<updated>2009-10-07T09:03:21Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Touchscreen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
edit $ANDROID_SOURCE/kernel/drivers/input/touchscreen/ts2102_ts.c&lt;br /&gt;
New definition:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt; &lt;br /&gt;
$ adb kill-server&lt;br /&gt;
$ adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7437</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7437"/>
				<updated>2009-10-06T08:36:42Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Download Android source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
List of different Android branch: [http://android.git.kernel.org/?p=platform/manifest.git;a=heads heads]&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
New definition:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt; &lt;br /&gt;
$ adb kill-server&lt;br /&gt;
$ adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7392</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7392"/>
				<updated>2009-09-24T12:21:53Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: Android with touchscreen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
New definition:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DRIVER_NAME &amp;quot;TSC210x Touchscreen&amp;quot;&lt;br /&gt;
#define X_AXIS_MAX    4000&lt;br /&gt;
#define X_AXIS_MIN    0&lt;br /&gt;
#define Y_AXIS_MAX    4200&lt;br /&gt;
#define Y_AXIS_MIN    100&lt;br /&gt;
#define PRESSURE_MIN  20&lt;br /&gt;
#define PRESSURE_MAX  40000&lt;br /&gt;
#define FACTOR        5000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_touch(int touching)&lt;br /&gt;
{&lt;br /&gt;
    if (!touching) {&lt;br /&gt;
        //input_report_abs(dev, ABS_X, 0);&lt;br /&gt;
        //input_report_abs(dev, ABS_Y, 0);&lt;br /&gt;
        input_report_key(dev, BTN_TOUCH, 0);&lt;br /&gt;
        input_report_abs(dev, ABS_PRESSURE, 0);&lt;br /&gt;
        input_sync(dev);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //input_report_key(dev, BTN_TOUCH, touching);&lt;br /&gt;
    //do_poke_blanked_console = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void tsc210x_coords(int x, int y, int z1, int z2)&lt;br /&gt;
{&lt;br /&gt;
    int p;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the touch resistance a la equation #1 */&lt;br /&gt;
    if (z1 != 0)&lt;br /&gt;
        p = x * (z2 - z1) / (z1 &amp;lt;&amp;lt; 4) * FACTOR;&lt;br /&gt;
    else&lt;br /&gt;
        p = 1;&lt;br /&gt;
        &lt;br /&gt;
    y = Y_AXIS_MAX - y;&lt;br /&gt;
    input_report_key(dev, BTN_TOUCH, 1);&lt;br /&gt;
    input_report_abs(dev, ABS_X, x);&lt;br /&gt;
    input_report_abs(dev, ABS_Y, y);&lt;br /&gt;
    input_report_abs(dev, ABS_PRESSURE, p);&lt;br /&gt;
    input_sync(dev);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int tsc210x_ts_probe(struct platform_device *pdev)&lt;br /&gt;
{&lt;br /&gt;
   int status;&lt;br /&gt;
&lt;br /&gt;
   dev = input_allocate_device();&lt;br /&gt;
   if (!dev)&lt;br /&gt;
      return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_touch_cb(tsc210x_touch);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   status = tsc210x_coords_cb(tsc210x_coords);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   dev-&amp;gt;name = DRIVER_NAME;&lt;br /&gt;
   dev-&amp;gt;dev.parent = &amp;amp;pdev-&amp;gt;dev;&lt;br /&gt;
   dev-&amp;gt;evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);&lt;br /&gt;
   dev-&amp;gt;keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);&lt;br /&gt;
   dev-&amp;gt;absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE);&lt;br /&gt;
   input_set_abs_params(dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);&lt;br /&gt;
   input_set_abs_params(dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);&lt;br /&gt;
   status = input_register_device(dev);&lt;br /&gt;
   if (status)&lt;br /&gt;
   {&lt;br /&gt;
      printk(KERN_INFO &amp;quot;Unable to register TSC210x as input device !\n&amp;quot;);&lt;br /&gt;
      goto error;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printk(DRIVER_NAME &amp;quot; driver initialized\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
   input_free_device(dev);&lt;br /&gt;
   return status;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -n -e 0x20000 --pad=0x700000 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
===Prerequisite===&lt;br /&gt;
Installing the [http://developer.android.com/sdk/1.6_r1/installing.html Android Development Tools (ADT)]&lt;br /&gt;
Trace with '''logcat''' with Eclipse-ADT&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt; &lt;br /&gt;
$ adb kill-server&lt;br /&gt;
$ adb start-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;br /&gt;
&lt;br /&gt;
==Thanks==&lt;br /&gt;
Thanks to Xavier Romanens and Fabrice Carrel form Ecole d'ingénieurs et d'architectes de Fribourg for their contributions.&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7391</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7391"/>
				<updated>2009-09-23T14:15:49Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Touchscreen kernel configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Power management options  ---&amp;gt;&lt;br /&gt;
    [*] Wake lock&lt;br /&gt;
    [*]   Wake lock stats (NEW)&lt;br /&gt;
    [*]   Userspace wake locks (NEW)&lt;br /&gt;
    [*]   Early suspend (NEW) &lt;br /&gt;
        User-space screen access (Console switch on early-suspend)  ---&amp;gt;&lt;br /&gt;
            (X) Sysfs interface &lt;br /&gt;
...&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -r -e 0x20000 --pad=0x700000 -n $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7345</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7345"/>
				<updated>2009-09-14T13:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Linux Kernel 2.6.29 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Touchscreen kernel configuration===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -r -e 0x20000 --pad=0x700000 -n $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7344</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7344"/>
				<updated>2009-09-14T13:27:21Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Touchscreen kernel configuration (2.6.29) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Touchscreen kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    Input device support  ---&amp;gt;&lt;br /&gt;
        [*]   Touchscreens  ---&amp;gt;&lt;br /&gt;
            &amp;lt;*&amp;gt;   TSC 2102 based touchscreens&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;*&amp;gt; Hardware Monitoring support  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -r -e 0x20000 --pad=0x700000 -n $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7343</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7343"/>
				<updated>2009-09-13T14:03:29Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Audio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git&lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git&lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := true&lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := true&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true&lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -r -e 0x20000 --pad=0x700000 -n $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7342</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7342"/>
				<updated>2009-09-10T14:53:00Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: JFFS2 Rootfs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| Still compilation error}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
cd $ANDROID_SOURCE/external &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐lib.git &lt;br /&gt;
git clone git://android.git.kernel.org/platform/external/alsa‐utils.git &lt;br /&gt;
cd $ANDROID_SOURCE/hardware &lt;br /&gt;
git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/build/target/board/generic/BoardConfig.mk &lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt; &lt;br /&gt;
# BOARD_USES_GENERIC_AUDIO := false  &lt;br /&gt;
# HAVE_HTC_AUDIO_DRIVER := false&lt;br /&gt;
BOARD_USES_ALSA_AUDIO := true  &lt;br /&gt;
BUILD_WITH_ALSA_UTILS := true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/hardware/alsa_sound/AudioHardwareALSA.cpp and change bufferSize to 8192 in twice StreamDefaults structures &amp;lt;br&amp;gt;&lt;br /&gt;
edit $ANDROID_SOURCE/system/core/init/device.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static struct perms_ devperms[] = {&lt;br /&gt;
    { &amp;quot;/dev/null&amp;quot;,          0666,   AID_ROOT,       AID_ROOT,       0 },&lt;br /&gt;
...&lt;br /&gt;
    { &amp;quot;/dev/qmi1&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    { &amp;quot;/dev/qmi2&amp;quot;,          0640,   AID_RADIO,      AID_RADIO,      0 },&lt;br /&gt;
    // Add this line&lt;br /&gt;
    { &amp;quot;/dev/snd/&amp;quot;,          0664,   AID_SYSTEM,     AID_AUDIO,      1 },&lt;br /&gt;
    { NULL, 0, 0, 0, 0 },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void handle_device_event(struct uevent *uevent)&lt;br /&gt;
{&lt;br /&gt;
    char devpath[96];&lt;br /&gt;
    char *base, *name;&lt;br /&gt;
    int block;&lt;br /&gt;
...&lt;br /&gt;
     } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;mtd&amp;quot;, 3)) {&lt;br /&gt;
            base = &amp;quot;/dev/mtd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        // add this conditionnal block&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;sound&amp;quot;, 5)) {&lt;br /&gt;
	    base = &amp;quot;/dev/snd/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
        } else if(!strncmp(uevent-&amp;gt;subsystem, &amp;quot;misc&amp;quot;, 4) &amp;amp;&amp;amp;&lt;br /&gt;
                    !strncmp(name, &amp;quot;log_&amp;quot;, 4)) {&lt;br /&gt;
            base = &amp;quot;/dev/log/&amp;quot;;&lt;br /&gt;
            mkdir(base, 0755);&lt;br /&gt;
            name += 4;&lt;br /&gt;
        } else&lt;br /&gt;
            base = &amp;quot;/dev/&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Audio files&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ui&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications &lt;br /&gt;
$ mkdir $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/effects/* $ANDROID_SOURCE/system/core/rootdir/media/audio/ui/ &lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Alarm_* $ANDROID_SOURCE/system/core/rootdir/media/audio/alarms/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/notifications/* $ANDROID_SOURCE/system/core/rootdir/media/audio/notifications/&lt;br /&gt;
$ cp $ANDROID_SOURCE/frameworks/base/data/sounds/Ring_* $ANDROID_SOURCE/system/core/rootdir/media/audio/ringtones/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JFFS2 Root file system===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
====Prepare the MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L data /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo mkfs.jffs2 -r -e 0x20000 --pad=0x700000 -n $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
# run update_kernel&lt;br /&gt;
# run update_rootfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7341</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7341"/>
				<updated>2009-09-09T16:08:46Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Boot setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
$ sudo mkfs.jffs2 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2 -e 0x4000 -n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on MMC/µSD card===&lt;br /&gt;
====Formatting an MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
====Copying data to the MMC/SD card====&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=/init androidboot.console=ttyS0'&lt;br /&gt;
# setenv addjffsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=jffs2 init=/init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7340</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7340"/>
				<updated>2009-09-09T16:00:45Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* init.rc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 # setup the global environment&lt;br /&gt;
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;br /&gt;
    export LD_LIBRARY_PATH /system/lib&lt;br /&gt;
    export ANDROID_BOOTLOGO 1&lt;br /&gt;
    export ANDROID_ROOT /system&lt;br /&gt;
    export ANDROID_ASSETS /system/app&lt;br /&gt;
    export ANDROID_DATA /data&lt;br /&gt;
    export EXTERNAL_STORAGE /sdcard&lt;br /&gt;
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / rw remount&lt;br /&gt;
&lt;br /&gt;
# Backward compatibility&lt;br /&gt;
    symlink /system/etc /etc&lt;br /&gt;
&lt;br /&gt;
# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;br /&gt;
    mkdir /sdcard 0000 system system&lt;br /&gt;
    mkdir /system&lt;br /&gt;
    mkdir /data 0771 system system&lt;br /&gt;
    mkdir /cache 0770 system cache&lt;br /&gt;
    mkdir /sqlite_stmt_journals 01777 root root&lt;br /&gt;
    mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;br /&gt;
&lt;br /&gt;
    mount rootfs rootfs / ro remount&lt;br /&gt;
&lt;br /&gt;
    write /proc/sys/kernel/panic_on_oops 1&lt;br /&gt;
    write /proc/sys/kernel/hung_task_timeout_secs 0&lt;br /&gt;
    write /proc/cpu/alignment 4&lt;br /&gt;
    write /proc/sys/kernel/sched_latency_ns 10000000&lt;br /&gt;
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;br /&gt;
&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    setprop EXTERNAL_STORAGE_STATE mounted&lt;br /&gt;
    mount vfat /dev/block/mmcblk0p1 /sdcard nosuid nodev&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    mount ext2 /dev/block/mmcblk0p2 /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
$ sudo mkfs.jffs2 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2 -e 0x4000 -n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on MMC/µSD card===&lt;br /&gt;
====Formatting an MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
====Copying data to the MMC/SD card====&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7339</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7339"/>
				<updated>2009-09-09T15:59:50Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Create the Android root filesystem for apf27  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 on a µSD for data.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
$ sudo mkfs.jffs2 -r $ANDROID_SOURCE/rootfs -o $TFTPBOOT/apf27-rootfs.arm.jffs2 -e 0x4000 -n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on MMC/µSD card===&lt;br /&gt;
====Formatting an MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
====Copying data to the MMC/SD card====&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7336</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7336"/>
				<updated>2009-09-09T13:30:15Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* UBIFS kernel configuration (2.6.29) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===UBIFS kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on MMC/µSD card===&lt;br /&gt;
====Formatting an MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
====Copying data to the MMC/SD card====&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7335</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7335"/>
				<updated>2009-09-09T13:07:56Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Android kernel configuration (2.6.29)  - UBIFS*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* UBIFS&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    &amp;lt;*&amp;gt; Memory Technology Device (MTD) support  ---&amp;gt;&lt;br /&gt;
        UBI - Unsorted block images  ---&amp;gt; &lt;br /&gt;
            &amp;lt;*&amp;gt; Enable UBI&lt;br /&gt;
            (4096) UBI wear-leveling threshold &lt;br /&gt;
            (1)   Percentage of reserved eraseblocks for bad eraseblocks handling&lt;br /&gt;
            [ ]   Emulate MTD devices&lt;br /&gt;
                  *** UBI debugging options ***&lt;br /&gt;
            [ ]   UBI debugging    &lt;br /&gt;
...&lt;br /&gt;
File systems  ---&amp;gt;&lt;br /&gt;
    [*] Miscellaneous filesystems  ---&amp;gt;&lt;br /&gt;
        &amp;lt;*&amp;gt;   UBIFS file system support&lt;br /&gt;
        [ ]     Extended attributes support &lt;br /&gt;
        [ ]     Advanced compression options&lt;br /&gt;
        [ ]     Enable debugging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on MMC/µSD card===&lt;br /&gt;
====Formatting an MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
====Copying data to the MMC/SD card====&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7334</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7334"/>
				<updated>2009-09-09T12:48:41Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: Android document organization + UBIFS notes + touchscreen note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Android start up===&lt;br /&gt;
====init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Create the Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Root file system on MMC/µSD card===&lt;br /&gt;
====Formatting an MMC/µSD card====&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
====Copying data to the MMC/SD card====&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv bootcmd run mmcboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Root file system on APF27 NAND memory===&lt;br /&gt;
{{Note| wait the UBIFS integration in the u-boot loader}}&lt;br /&gt;
====Boot setup====&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux. In the U-boot prompt, make the UBIFS boot.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# setenv bootcmd run ubifsboot&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7333</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7333"/>
				<updated>2009-09-09T12:21:30Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Touchscreen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
====Change init.rc====&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
# create basic filesystem structure&lt;br /&gt;
...&lt;br /&gt;
# Touchscreen section&lt;br /&gt;
    export TSLIB_CONSOLEDEVICE=none&lt;br /&gt;
    export TSLIB_FBDEVICE=/dev/fb0&lt;br /&gt;
    export TSLIB_TSDEVICE=/dev/input/event1&lt;br /&gt;
    export TSLIB_CALIBFILE=/etc/pointercal&lt;br /&gt;
    export TSLIB_CONFFILE=/etc/ts.conf&lt;br /&gt;
    export TSLIB_PLUGINDIR=/lib/ts&lt;br /&gt;
    export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
on boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formatting an MMC/µSD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Start Android==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# run mmcboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7326</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7326"/>
				<updated>2009-09-04T14:14:26Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Boot setup with UBIFS*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formatting an MMC/µSD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv addubifsargs 'setenv bootargs ${bootargs} root=/dev/mtdblock4 rootfstype=ubifs init=\init androidboot.console=ttyS0'&lt;br /&gt;
# setenv ubifsboot 'setenv bootargs ${console} ${mtdparts};run addubifsargs addipargs; setenv autostart yes;nboot.ubifs A0000000 0 ${kernel_offset}'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Start Android==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# run mmcboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7325</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7325"/>
				<updated>2009-09-03T15:28:20Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Apply the Armadeus patchset */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formatting an MMC/µSD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Start Android==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# run mmcboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7324</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7324"/>
				<updated>2009-09-03T14:28:41Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Download Android source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formatting an MMC/µSD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Start Android==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# run mmcboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7222</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7222"/>
				<updated>2009-08-13T12:49:06Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Change init.rc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / ro remount&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formatting an MMC/µSD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Start Android==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# run mmcboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Android&amp;diff=7202</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Android&amp;diff=7202"/>
				<updated>2009-08-07T13:07:39Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under_Construction}}&lt;br /&gt;
&lt;br /&gt;
[[Image:Android-logo.png]]&lt;br /&gt;
&lt;br /&gt;
This page will sumarize the efforts made to have Android running on the APF boards.&lt;br /&gt;
&lt;br /&gt;
{{Note| Due to Android requirements (at least an ARM926 core), it is impossible to have it running on the APF9328}}&lt;br /&gt;
&lt;br /&gt;
==Some readings before starting==&lt;br /&gt;
* http://developer.android.com/guide/basics/what-is-android.html&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Android installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The Armadeus [[Toolchain]], only for Armadeus patches&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux Kernel 2.6.29==&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Misc devices  ---&amp;gt;&lt;br /&gt;
        [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Device Drivers  ---&amp;gt;&lt;br /&gt;
    [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
        [ ] Exclude Staging drivers from being built (NEW)&lt;br /&gt;
        ...&lt;br /&gt;
        Android  ---&amp;gt;&lt;br /&gt;
            [*] Android Drivers&lt;br /&gt;
            [*] Android Binder IPC Driver&lt;br /&gt;
            &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
            [ ] Android RAM buffer console&lt;br /&gt;
            [*] Timed output class driver (NEW)&lt;br /&gt;
            &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
            [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
General setup  ---&amp;gt;&lt;br /&gt;
    [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp $ANDROID_SOURCE/kernel/arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android==&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Touchscreen===&lt;br /&gt;
{{Note| To do!!!}}&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir, comment the 'mount roofs' in read only mode and 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
    # mount rootfs rootfs / rw &lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making RootFS==&lt;br /&gt;
===Android Root File system===&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
===Android root filesystem for apf27===&lt;br /&gt;
Actually, Android should use a file system how support mmap function like yaffs2, ext2 or ubifs. Unfortunaly, U-Boot support only jffs2 or ext2. So we will use ext2 root file system on a µSD.&lt;br /&gt;
&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic. We will create a folder containing all Android files images. &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formatting an MMC/µSD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Start Android==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# run mmcboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Apf27_android.JPG‎]]&lt;br /&gt;
&lt;br /&gt;
==Debug 'n Test==&lt;br /&gt;
===Trace on the console===&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
Documentation on Android [http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=$ANDROID_SOURCE/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# Create AVD (Android Virtual Device)&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ $ANDROID_SDK/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID_SOURCE/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID_SOURCE/out/target/product/generic/ -kernel $ANDROID_SOURCE/kernel/arch/arm/boot/zImage -data $ANDROID_SOURCE/out/target/product/generic/userdata.img -ramdisk $ANDROID_SOURCE/out/target/product/generic/ramdisk.img -system $ANDROID_SOURCE/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://elinux.org/Android Android page on elinux.org]&lt;br /&gt;
** [http://elinux.org/Android_on_OMAP Android on OMAP portage page on elinux.org]&lt;br /&gt;
* [http://wiki.openmoko.org/wiki/Android Android on OpenMoko]&lt;br /&gt;
* http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=File:Apf27_android.JPG&amp;diff=7201</id>
		<title>File:Apf27 android.JPG</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=File:Apf27_android.JPG&amp;diff=7201"/>
				<updated>2009-08-07T13:03:22Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: Android on Armadeus apf27&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android on Armadeus apf27&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7200</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7200"/>
				<updated>2009-08-07T13:01:13Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Je suis Nicolas Duclos, j'ai 35 ans et je suis informaticien de formation avec un DESS (master) en info à Rennes.&lt;br /&gt;
&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* toujours accéder à Windows après l'(la ré-)installation de Linux... (oui oui ca arrive souvent :) )&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB.&lt;br /&gt;
{{Note| l'ordre des actions est important}}&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1 (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Participation à la documentation Armadeus Project==&lt;br /&gt;
* [[Android]]&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=MemberList&amp;diff=7199</id>
		<title>MemberList</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=MemberList&amp;diff=7199"/>
				<updated>2009-08-07T12:28:01Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Here is the list of the (active) members and their skills */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Here is the list of the (active) members and their skills==&lt;br /&gt;
&lt;br /&gt;
This list is maintained by the users themself.&lt;br /&gt;
&lt;br /&gt;
*0: Novice&lt;br /&gt;
*1: Notions. At least one successfull experiment&lt;br /&gt;
*2: Confirmed&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; summary=&amp;quot;Signal connections&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#efefef;&amp;quot;&lt;br /&gt;
! '''Name / IRC Nickname''' || '''Linux Apps'''|| '''Linux Drivers'''|| '''FPGA''' || '''Board Design''' || '''Projet/Domain'''&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:Salocin68|Nicolas Colombain / Salocin]] || 1 || 1 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienB|Julien Boibessot / Artemys]] || 2 || 2 || 0 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanBaptisteM|Jean-Baptiste Mayer / JiBee]] || 2 || 1 || 1 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasA|Nicolas Aguirre]] || 2 || 0 || 1 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BenoitC|Benoît Canet]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SonZerro|Sonzerro]] || 0 || 0 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:HenriG|Henri Geist]] || 1 || 1 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BorredonB|Bernard Borredon]] || 2 || 1 || 0 || 1 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ThomasB|Thomas Bores]] || 2 || 0 || 0 || 1 || Entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FabriceM|Fabrice Mousset / KroMignon]] || 1 || 1 || 2 || 1 || Domotics &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AmineH|Amine EL HEDADI]] || 2 || 2 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PhilippeM|Philippe Monteil]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:CedricZ|Cédric Zmyj]] || 0 || 0 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanMichelN|Jean Michel Naimo / jeanmi12 ]] || 2 || 1 || 1 || 1 || Domotics &amp;amp; entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:OlivierC|Olivier Coutanceau]] || 1 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ArnaudC|Arnaud COFFINET]] || 0 || 0 || 1 || 2 || multimedia &amp;amp; domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SylvainP|Sylvain PARRINO]] || 2 || 1 || 0 || 0 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AurelienH|Aurélien HIRON]] || 2 || 0 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:GuillaumeT|Guillaume TRANNOY]] || 0 || 0 || 0 || 2 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienN|Julien NICOLAS / jujun]] || 2 || 1 || 0 || 1 || multimedia &amp;amp; network&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:StephaneF|Stéphane Falck]] || 0 || 0 || 0 || 0 || multimedia &amp;amp; robotics &amp;amp; domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:GillesD|Gilles DUSSIN/ Sellig]] || 1 || 0 || 1 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MaximeL|Maxime Liron]] || 0 || 0 || 0 || 0 || domotics, robotics &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasC|Nicolas CHARLERY/ realniko]] || 2 || 0 || 0 || 0 || electronic&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BenoitJ|Benoit JESTER]] || 0 || 0 || 0 || 0 || robotics &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FabienM|Fabien MARTEAU/ FabM]] || 1 || 2 || 1 || 1 || robotics,domotics &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:XavierA|Xavier AZNAR]] || 1 || 1 || 0 || 0 || environment, entertainment, domotic &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AlbericA|Albéric AUBLANC / PoueT]] || 2 || 0 || 1 || 0 || domotics &amp;amp; multimedia, robotics, entertainment, &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FredericB| Frédéric Blain / creber]] || 2 || 1 || 0 || 0 || system, domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanBaptisteMa| Jean-Baptiste Maillet]] || 2 || 1 || 0 || 0 || system&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanFrancoisR| Jean-François Rousval]] || 2 || 1 || 0 || 1 || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienPeeters| Julien Peeters]] || 2 || 1 || 0 || 0 || domotics, real-time, entertainment, network&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:YoannC| Yoann Congal / Alpheb]] || 0 || 0 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MatthieuT| Matthieu Texier / weeber]] || 1 || 0 || 1 || 0 || robotics, real-time&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MartialG| Martial Guex]] || 2 || 1 || 1 || 2 || transceiver RF, real-time, wireless&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasL| Nicolas Lantz]] || 2 || 2 || 1 || 1 ||&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:GuillaumeD| Guillaume DELVIT]] || 1 || 1 || 1 || 1 || system, asynchronous CPU&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BernardR|Bernard REMOND ]] || x || x || x || x || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SamirH| Samir HAMNACHE]] || 0 || 0 || 0 || 1 || électronique&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:OlivierT|Olivier TARDIEU]] || 0 || 0 || 0 || 1 || électronique,robotics,domotics &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ThibautR|Thibault Rétornaz]] || 1 || 1 || 1 || 0 || bio-med, électronique&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BrunoS|Bruno Suarez]] || 2 || 0 || 0 || 0 || bio-med, électronique&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:guillaumeDe|Guillaume Denis]] || 0 || 0 || 2 || 1 || Electronique numérique, FPGA&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:KevinP|Kévin PETIT]] || 1 || 0 || 1 || 1 || Multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PierreBa|Pierre Baudemont / b4ud3]] || 2 || 0 || 1 || 0 || domotics, robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BrunoL|Bruno Landré]] || 0 || 0 || 0 || 0 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AntonioMB|Antonio Meléndez]] || 0 || 0 || 1 || 2 || domotics, robotics, eletcronics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MichelTe|Michel Le Mer]] || 0 || 0 || 2 || 2 || electronics, software&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienBa|Julien Baley]] || 0 || 0 || 0 || 0 || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FrankA|Frank ANJEAUX]] || 1 || 0 || 0 || 1 || software,robotics, domotics, electronics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienViaud|Julien viaud/polric]] || 2 || 0 || 1 || 1 || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasCa|Nicolas CARTIER]] || 1 || 1 || 0 || 2 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PierreAlexandreS|Pierre Alexandre SCHEMBRI]] || 2 || 1 || 2 || 2 || electronics, board design, embedded software, FPGA, robotics, low power&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AlexG|Alex GONZALEZ]] || 2 || 2 || 0 || 1 || telecommunications, network &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienL|Julien Lefrique / apapi]] || 1 || 0 || 1 || 1 ||&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PaoloB|Paolo Bernini / nihil84]] || 2 || 1 || 0 || 0 || robotics, real-time&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MichielE|Michiel Ettema]] || 0 || 0 || 0 || 1 || telecommunications, networking&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasD|Nicolas Duclos]] || 2 || 1 || 0 || 0 || telecommunications, domotics and funs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [[Members | Geographical position of the members]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7160</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7160"/>
				<updated>2009-07-31T14:43:28Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. Then, we changed to notify full battery to Android by ignoring the information under '''/sys/class/power_supply''' so that to prevent the power down by low battery '''$ANDROID_SOURCE/frameworks/base/services/jni/com_android_server_BatteryService.cpp'''&lt;br /&gt;
*Change the battery service status as TRUE&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setBooleanField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 16;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jboolean value = true; /* change false -&amp;gt; true */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      if (buf[0] == '1') {&lt;br /&gt;
         value = true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetBooleanField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the volume, voltage and temperature of battery. Return 100%.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void setIntField(JNIEnv* env, jobject obj, const char* path, jfieldID fieldID)&lt;br /&gt;
{&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   jint value = 100; /* change 0 -&amp;gt; 100 */&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   if (readFromFile(path, buf, SIZE) &amp;gt; 0) {&lt;br /&gt;
      value = atoi(buf);&lt;br /&gt;
   }&lt;br /&gt;
   */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, fieldID, value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Change the battery charged status as full and deterioration status as fair.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
   setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);&lt;br /&gt;
   setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);&lt;br /&gt;
   setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);&lt;br /&gt;
&lt;br /&gt;
   setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);&lt;br /&gt;
   setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);&lt;br /&gt;
   setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);&lt;br /&gt;
&lt;br /&gt;
   /* Change */&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusFull);&lt;br /&gt;
   env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);&lt;br /&gt;
   env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(&amp;quot;1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
   /*!!!comment out!!!&lt;br /&gt;
   const int SIZE = 128;&lt;br /&gt;
   char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));&lt;br /&gt;
&lt;br /&gt;
   if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) &amp;gt; 0)&lt;br /&gt;
      env-&amp;gt;SetObjectField(obj, gFieldIds.mBatteryTechnology, env-&amp;gt;NewStringUTF(buf));&lt;br /&gt;
   */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
| General setup  ---&amp;gt;&lt;br /&gt;
| ... &lt;br /&gt;
| Device Drivers  ---&amp;gt;&lt;br /&gt;
+ |     Generic Driver Options  ---&amp;gt;&lt;br /&gt;
  | ...&lt;br /&gt;
  | [*] Misc devices  ---&amp;gt;&lt;br /&gt;
  + | --- Misc devices&lt;br /&gt;
    | [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
| General setup  ---&amp;gt;&lt;br /&gt;
| ... &lt;br /&gt;
| Device Drivers  ---&amp;gt;&lt;br /&gt;
+ |     Generic Driver Options  ---&amp;gt;&lt;br /&gt;
  | ...&lt;br /&gt;
  | [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
  + | --- Staging drivers&lt;br /&gt;
    | [ ]   Exclude Staging drivers from being built (NEW)&lt;br /&gt;
    | ...&lt;br /&gt;
    |          Android  ---&amp;gt;&lt;br /&gt;
    + | [*] Android Drivers&lt;br /&gt;
      | [*] Android Binder IPC Driver&lt;br /&gt;
      | &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
      | [ ] Android RAM buffer console&lt;br /&gt;
      | [*] Timed output class driver (NEW)&lt;br /&gt;
      | &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
      | [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
| General setup  ---&amp;gt;&lt;br /&gt;
+ | ...&lt;br /&gt;
  | [*] Enable the Anonymous Shared Memory Subsystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Build Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo rm -rf $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with '''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# chroot /mnt/mmc /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7157</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7157"/>
				<updated>2009-07-31T09:53:10Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
| General setup  ---&amp;gt;&lt;br /&gt;
| ... &lt;br /&gt;
| Device Drivers  ---&amp;gt;&lt;br /&gt;
+ |     Generic Driver Options  ---&amp;gt;&lt;br /&gt;
  | ...&lt;br /&gt;
  | [*] Misc devices  ---&amp;gt;&lt;br /&gt;
  + | --- Misc devices&lt;br /&gt;
    | [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
| General setup  ---&amp;gt;&lt;br /&gt;
| ... &lt;br /&gt;
| Device Drivers  ---&amp;gt;&lt;br /&gt;
+ |     Generic Driver Options  ---&amp;gt;&lt;br /&gt;
  | ...&lt;br /&gt;
  | [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
  + | --- Staging drivers&lt;br /&gt;
    | [ ]   Exclude Staging drivers from being built (NEW)&lt;br /&gt;
    | ...&lt;br /&gt;
    |          Android  ---&amp;gt;&lt;br /&gt;
    + | [*] Android Drivers&lt;br /&gt;
      | [*] Android Binder IPC Driver&lt;br /&gt;
      | &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
      | [ ] Android RAM buffer console&lt;br /&gt;
      | [*] Timed output class driver (NEW)&lt;br /&gt;
      | &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
      | [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with ''''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7156</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7156"/>
				<updated>2009-07-31T09:52:17Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Android kernel configuration (2.6.29) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
*Android pmem allocator&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
| General setup  ---&amp;gt;&lt;br /&gt;
| ... &lt;br /&gt;
| Device Drivers  ---&amp;gt;&lt;br /&gt;
+ |     Generic Driver Options  ---&amp;gt;&lt;br /&gt;
  | ...&lt;br /&gt;
  | [*] Misc devices  ---&amp;gt;&lt;br /&gt;
  + | --- Misc devices&lt;br /&gt;
    | [*]   Android pmem allocator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
| General setup  ---&amp;gt;&lt;br /&gt;
| ... &lt;br /&gt;
| Device Drivers  ---&amp;gt;&lt;br /&gt;
+ |     Generic Driver Options  ---&amp;gt;&lt;br /&gt;
  | ...&lt;br /&gt;
  | [*] Staging drivers  ---&amp;gt; &lt;br /&gt;
  + | --- Staging drivers&lt;br /&gt;
    | [ ]   Exclude Staging drivers from being built (NEW)&lt;br /&gt;
    | ...&lt;br /&gt;
    |          Android  ---&amp;gt;&lt;br /&gt;
    + | [*] Android Drivers&lt;br /&gt;
      | [*] Android Binder IPC Driver&lt;br /&gt;
      | &amp;lt;*&amp;gt; Android log driver  &lt;br /&gt;
      | [ ] Android RAM buffer console&lt;br /&gt;
      | [*] Timed output class driver (NEW)&lt;br /&gt;
      | &amp;lt; &amp;gt;   Android timed gpio driver (NEW)&lt;br /&gt;
      | [*] Android Low Memory Killer &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with ''''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7155</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7155"/>
				<updated>2009-07-31T09:31:58Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Apply the Armadeus patchset */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/buildroot/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* EABI&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_AEABI=y&lt;br /&gt;
# CONFIG_OABI_COMPAT is not set&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* THUMB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_ARM_THUMB=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Android&lt;br /&gt;
#&lt;br /&gt;
CONFIG_ANDROID=y&lt;br /&gt;
CONFIG_ANDROID_BINDER_IPC=y&lt;br /&gt;
CONFIG_ANDROID_LOGGER=y&lt;br /&gt;
# CONFIG_ANDROID_RAM_CONSOLE is not set&lt;br /&gt;
CONFIG_ANDROID_TIMED_OUTPUT=y&lt;br /&gt;
CONFIG_ANDROID_LOW_MEMORY_KILLER=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with ''''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7151</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7151"/>
				<updated>2009-07-31T07:38:23Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Debug */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* EABI&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_AEABI=y&lt;br /&gt;
# CONFIG_OABI_COMPAT is not set&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* THUMB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_ARM_THUMB=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Android&lt;br /&gt;
#&lt;br /&gt;
CONFIG_ANDROID=y&lt;br /&gt;
CONFIG_ANDROID_BINDER_IPC=y&lt;br /&gt;
CONFIG_ANDROID_LOGGER=y&lt;br /&gt;
# CONFIG_ANDROID_RAM_CONSOLE is not set&lt;br /&gt;
CONFIG_ANDROID_TIMED_OUTPUT=y&lt;br /&gt;
CONFIG_ANDROID_LOW_MEMORY_KILLER=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
Trace with '''strace'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trave with ''''logcat'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# chroot /mnt/mmc /init androidboot.console=ttyS0 &amp;amp;&lt;br /&gt;
# /system/bin/logcat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7150</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7150"/>
				<updated>2009-07-31T07:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Boot setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* EABI&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_AEABI=y&lt;br /&gt;
# CONFIG_OABI_COMPAT is not set&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* THUMB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_ARM_THUMB=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Android&lt;br /&gt;
#&lt;br /&gt;
CONFIG_ANDROID=y&lt;br /&gt;
CONFIG_ANDROID_BINDER_IPC=y&lt;br /&gt;
CONFIG_ANDROID_LOGGER=y&lt;br /&gt;
# CONFIG_ANDROID_RAM_CONSOLE is not set&lt;br /&gt;
CONFIG_ANDROID_TIMED_OUTPUT=y&lt;br /&gt;
CONFIG_ANDROID_LOW_MEMORY_KILLER=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debug==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7149</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7149"/>
				<updated>2009-07-30T13:15:43Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Android kernel configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration (2.6.29)===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* EABI&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_AEABI=y&lt;br /&gt;
# CONFIG_OABI_COMPAT is not set&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* THUMB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_ARM_THUMB=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Android&lt;br /&gt;
#&lt;br /&gt;
CONFIG_ANDROID=y&lt;br /&gt;
CONFIG_ANDROID_BINDER_IPC=y&lt;br /&gt;
CONFIG_ANDROID_LOGGER=y&lt;br /&gt;
# CONFIG_ANDROID_RAM_CONSOLE is not set&lt;br /&gt;
CONFIG_ANDROID_TIMED_OUTPUT=y&lt;br /&gt;
CONFIG_ANDROID_LOW_MEMORY_KILLER=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenvmtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Debug==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7148</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7148"/>
				<updated>2009-07-30T13:10:58Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Test with Android emulatoir */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* EABI&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_AEABI=y&lt;br /&gt;
# CONFIG_OABI_COMPAT is not set&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* THUMB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_ARM_THUMB=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Android&lt;br /&gt;
#&lt;br /&gt;
# CONFIG_ANDROID_GADGET is not set&lt;br /&gt;
# CONFIG_ANDROID_RAM_CONSOLE is not set&lt;br /&gt;
CONFIG_ANDROID_POWER=y&lt;br /&gt;
CONFIG_ANDROID_POWER_STAT=y&lt;br /&gt;
CONFIG_ANDROID_LOGGER=y&lt;br /&gt;
# CONFIG_ANDROID_TIMED_GPIO is not set&lt;br /&gt;
CONFIG_ANDROID_BINDER_IPC=y&lt;br /&gt;
#AshMem &lt;br /&gt;
CONFIG_ASHMEM=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenvmtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Debug==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulator===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7147</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7147"/>
				<updated>2009-07-30T13:10:05Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formater la cle USB en fat32 (gparted)&lt;br /&gt;
* Récupérer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la clé USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la clé USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
Installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
* Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until '''Installing Repo''' chapter.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
To complete!!!&lt;br /&gt;
===Android kernel configuration===&lt;br /&gt;
Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).&lt;br /&gt;
* EABI&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_AEABI=y&lt;br /&gt;
# CONFIG_OABI_COMPAT is not set&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* THUMB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
CONFIG_ARM_THUMB=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Android drivers&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Android&lt;br /&gt;
#&lt;br /&gt;
# CONFIG_ANDROID_GADGET is not set&lt;br /&gt;
# CONFIG_ANDROID_RAM_CONSOLE is not set&lt;br /&gt;
CONFIG_ANDROID_POWER=y&lt;br /&gt;
CONFIG_ANDROID_POWER_STAT=y&lt;br /&gt;
CONFIG_ANDROID_LOGGER=y&lt;br /&gt;
# CONFIG_ANDROID_TIMED_GPIO is not set&lt;br /&gt;
CONFIG_ANDROID_BINDER_IPC=y&lt;br /&gt;
#AshMem &lt;br /&gt;
CONFIG_ASHMEM=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# mount mtd partitions&lt;br /&gt;
    # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;br /&gt;
    # mount yaffs2 mtd@system /system &lt;br /&gt;
    # mount yaffs2 mtd@system /system ro remount&lt;br /&gt;
&lt;br /&gt;
    # We chown/chmod /data again so because mount is run as root + defaults&lt;br /&gt;
    # mount yaffs2 mtd@userdata /data nosuid nodev&lt;br /&gt;
    chown system system /data&lt;br /&gt;
    chmod 0771 /data&lt;br /&gt;
&lt;br /&gt;
    # Same reason as /data above&lt;br /&gt;
    # mount yaffs2 mtd@cache /cache nosuid nodev&lt;br /&gt;
    chown system cache /cache&lt;br /&gt;
    chmod 0770 /cache&lt;br /&gt;
&lt;br /&gt;
    # This may have been created by the recovery system with odd permissions&lt;br /&gt;
    chown system system /cache/recovery&lt;br /&gt;
    chmod 0770 /cache/recovery&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your mmc/µSD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenvmtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Debug==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Test with Android emulatoir===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7146</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7146"/>
				<updated>2009-07-30T09:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recent changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
===GRUB sur clé USB===&lt;br /&gt;
Voici une petite astuce pour :&lt;br /&gt;
* ne plus perdre GRUB lors de la réinstallation de Windows&lt;br /&gt;
* ne plus avoir accès à Windows après l'installation de Linux&lt;br /&gt;
* rendre inaccessible la partition Linux sur votre machine&lt;br /&gt;
L'astuce est d'installer '''que''' GRUB sur une clé USB. '''Attention, l'ordre des actions est important'''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
===make gconfig===&lt;br /&gt;
installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographe comme il se doit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
Install these package for build the kernel image and for format the mmc/µSD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage mtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Je n'ai pas indiqué (a faire) dans les pré-requit, il faut naturelle avoir installé et compilé le projet Armadeus-3.1.&lt;br /&gt;
Dans un second temps, j'indiquerai les différentes actions pour ne pas être obliger à compiler le projet Armadeus, notamment pour la rustine patch-2.6.29.4.bz2&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
A effectuer!!!!&lt;br /&gt;
===update android kernel configuration for APF27===&lt;br /&gt;
C'est un point délicat, Google/Android ne donne '''aucune''' informations dessus&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
To do!!!!&lt;br /&gt;
===Formatting an MMC/SD card===&lt;br /&gt;
We will create two partitions on our mmc/sd card, The first one will use for Android memory card, the second one will use for Android file system.&lt;br /&gt;
First connect your card reader to your workstation, with the MMC/SD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ dmesg&lt;br /&gt;
...&lt;br /&gt;
[ 9145.613954]  sdb: sdb1 sdb2&lt;br /&gt;
[ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
[ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.&amp;lt;br&amp;gt;&lt;br /&gt;
In a terminal edit partitions with fdisk:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo fdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete any existing partition with the d command.&amp;lt;br&amp;gt;&lt;br /&gt;
Now, create the boot partition:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): n&lt;br /&gt;
Command action&lt;br /&gt;
   e   extended&lt;br /&gt;
   p   primary partition (1-4)&lt;br /&gt;
p&lt;br /&gt;
Partition number (1-4): 1&lt;br /&gt;
First cylinder (1-495, default 1): 1&lt;br /&gt;
Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change its type to FAT32:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
Command (m for help): t&lt;br /&gt;
Selected partition 1&lt;br /&gt;
Hex code (type L to list codes): c&lt;br /&gt;
Changed system type of partition 1 to c (W95 FAT32 (LBA))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using the n command again, create a second partition filling up the rest of your card (just accept default values).&amp;lt;br&amp;gt;&lt;br /&gt;
Now, format the partitions in your card:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1&lt;br /&gt;
sudo mkfs.ext2 -L AndroidFS /dev/sdb2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Remove and insert your card again. Your new partitions should be mounted automatically.&amp;lt;br&amp;gt;&lt;br /&gt;
===Copying data to the MMC/SD card===&lt;br /&gt;
Now copy the Android root filesystem to the second partition.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finish by unmounting your MMC/SD partitions:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /media/MemoryCard&lt;br /&gt;
sudo umount /media/AndroidFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Boot setup==&lt;br /&gt;
The last thing left to do is to specify how the board boots Linux.&amp;lt;br&amp;gt;&lt;br /&gt;
In the U-boot prompt, make the mmc boot is on second partition of the MMC/SD card&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the kernel command line arguments&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
# saveenvmtd-utils&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Debug==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Tester android avec l'emulateur===&lt;br /&gt;
[http://developer.android.com/guide/developing/tools/emulator.html emulator]&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Android Root File system==&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
* '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
* '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.&lt;br /&gt;
* '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
'''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.&amp;lt;br&amp;gt;&lt;br /&gt;
The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7145</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7145"/>
				<updated>2009-07-29T15:20:03Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Copying the Android root filesystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recents changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine, voici un truc pour installer '''que''' GRUB sur une clé USB&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
For build kernel image for the apf27 Armadeus plateform, we should install uboot-mkimage program&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Je n'ai pas indiqué (a faire) dans les pré-requit, il faut naturelle avoir installé et compilé le projet Armadeus-3.1.&lt;br /&gt;
Dans un second temps, j'indiquerai les différentes actions pour ne pas être obliger à compiler le projet Armadeus, notamment pour la rustine patch-2.6.29.4.bz2&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
A effectuer!!!!&lt;br /&gt;
===update android kernel configuration for APF27===&lt;br /&gt;
C'est un point délicat, Google/Android ne donne '''aucune''' informations dessus&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs (or '''sudo rm -rf *''' if the folder already exist )&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
&lt;br /&gt;
==modifier les arguments pour le démarage du noyau==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#installer MTD Utilies&lt;br /&gt;
sudo apt-get install mtd-utils&lt;br /&gt;
mkfs.jffs2 -r ./android-source/out/target/product/generic/system -n -o /tftpboot/apf27-rootfs.arm.jffs2a&lt;br /&gt;
&lt;br /&gt;
#installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# modifier le fichier d'init.&lt;br /&gt;
/home/rennes/dev/android-source/out/target/product/generic/root/init.rc&lt;br /&gt;
&lt;br /&gt;
$ cd $YOUR_PATH&lt;br /&gt;
$ mkdir rootfs&lt;br /&gt;
$ cd rootfs&lt;br /&gt;
$ rm -rf *&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/root/* .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/system/ .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/data/ .&lt;br /&gt;
$ tar cfvz ../apf27-rootfs-android.tar.gz ./&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
$ sudo mkfs.ext2 /dev/sdd1   (replace X with your MMC reader drive letter, if your Laptop has an integrated MMC reader then use mmcblk0p1 instead of sdX1)&lt;br /&gt;
$ sudo mkdir -p /media/mmc&lt;br /&gt;
$ sudo mount /dev/sdd1 /media/mmc &lt;br /&gt;
$ sudo tar xvf apf27-rootfs-android.tar.gz -C /media/mmc&lt;br /&gt;
$ sudo chmod -R 777 /media/mmc/*&lt;br /&gt;
&lt;br /&gt;
Sur l'APF27&lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&lt;br /&gt;
# tester android avec l'emulateur&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
# cf http://developer.android.com/guide/developing/tools/emulator.html&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android Root File system ¶&lt;br /&gt;
&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
&lt;br /&gt;
    * ramdisk.img&lt;br /&gt;
    * system.img&lt;br /&gt;
    * userdata.img&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is gziped cpio archive. ramdisk image is very small and contains configuration files, and some executable files such as init and recovery. The init file is not a regular system V init. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
&lt;br /&gt;
system.img and userdata.img are VMS Alpha executable. system.img and userdata.img have the contents of /system and /data directory on root file system. They are mapped on NAND devices with yaffs2 file system. /dev/block/mtdblock0 for /system and /dev/block/mtdblock1 for /data.&lt;br /&gt;
&lt;br /&gt;
/system directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ApiDemos.apk package.&lt;br /&gt;
&lt;br /&gt;
The main services are zygote(/system/bin/app_process), runtime(/system/bin/runtime), and dbus(/system/bin/dbus-daemon). You can see the /etc/init.rc file on the Android ramdisk image.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions on ramdisk, userdata, and system img files&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature.&lt;br /&gt;
&lt;br /&gt;
system.img is a partition image that will be mounted as / and thus contains all system binaries&lt;br /&gt;
userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
The build system generates these files, which can later be flashed to a real device, however the emulator uses them in a different way:&lt;br /&gt;
&lt;br /&gt;
    * system.img is copied into a temporary file, which is used by the emulator session. So any change you make to / as root in the emulator are lost when the program exits&lt;br /&gt;
&lt;br /&gt;
    * userdata.img is only used when you use -wipe-data. Instead, it uses ~/.android/userdata-qemu.img (on Unix) as the persistent /data partition image. Using -wipe-data simply copes the content of userdata.img into userdata-qemu.img&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7144</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7144"/>
				<updated>2009-07-29T15:09:57Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Copying the Android root filesystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recents changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine, voici un truc pour installer '''que''' GRUB sur une clé USB&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
For build kernel image for the apf27 Armadeus plateform, we should install uboot-mkimage program&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Je n'ai pas indiqué (a faire) dans les pré-requit, il faut naturelle avoir installé et compilé le projet Armadeus-3.1.&lt;br /&gt;
Dans un second temps, j'indiquerai les différentes actions pour ne pas être obliger à compiler le projet Armadeus, notamment pour la rustine patch-2.6.29.4.bz2&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
A effectuer!!!!&lt;br /&gt;
===update android kernel configuration for APF27===&lt;br /&gt;
C'est un point délicat, Google/Android ne donne '''aucune''' informations dessus&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Copying the Android root filesystem===&lt;br /&gt;
Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/out/target/product/generic&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ cp -a root/* $ANDROID_SOURCE/rootfs/&lt;br /&gt;
$ cp -a system/* $ANDROID_SOURCE/rootfs/system/&lt;br /&gt;
$ cd $ANDROID_SOURCE/rootfs&lt;br /&gt;
$ sudo chown -R root.root .&lt;br /&gt;
$ sudo chmod -R a+rwX data system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
&lt;br /&gt;
==modifier les arguments pour le démarage du noyau==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#installer MTD Utilies&lt;br /&gt;
sudo apt-get install mtd-utils&lt;br /&gt;
mkfs.jffs2 -r ./android-source/out/target/product/generic/system -n -o /tftpboot/apf27-rootfs.arm.jffs2a&lt;br /&gt;
&lt;br /&gt;
#installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# modifier le fichier d'init.&lt;br /&gt;
/home/rennes/dev/android-source/out/target/product/generic/root/init.rc&lt;br /&gt;
&lt;br /&gt;
$ cd $YOUR_PATH&lt;br /&gt;
$ mkdir rootfs&lt;br /&gt;
$ cd rootfs&lt;br /&gt;
$ rm -rf *&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/root/* .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/system/ .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/data/ .&lt;br /&gt;
$ tar cfvz ../apf27-rootfs-android.tar.gz ./&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
$ sudo mkfs.ext2 /dev/sdd1   (replace X with your MMC reader drive letter, if your Laptop has an integrated MMC reader then use mmcblk0p1 instead of sdX1)&lt;br /&gt;
$ sudo mkdir -p /media/mmc&lt;br /&gt;
$ sudo mount /dev/sdd1 /media/mmc &lt;br /&gt;
$ sudo tar xvf apf27-rootfs-android.tar.gz -C /media/mmc&lt;br /&gt;
$ sudo chmod -R 777 /media/mmc/*&lt;br /&gt;
&lt;br /&gt;
Sur l'APF27&lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&lt;br /&gt;
# tester android avec l'emulateur&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
# cf http://developer.android.com/guide/developing/tools/emulator.html&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android Root File system ¶&lt;br /&gt;
&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
&lt;br /&gt;
    * ramdisk.img&lt;br /&gt;
    * system.img&lt;br /&gt;
    * userdata.img&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is gziped cpio archive. ramdisk image is very small and contains configuration files, and some executable files such as init and recovery. The init file is not a regular system V init. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
&lt;br /&gt;
system.img and userdata.img are VMS Alpha executable. system.img and userdata.img have the contents of /system and /data directory on root file system. They are mapped on NAND devices with yaffs2 file system. /dev/block/mtdblock0 for /system and /dev/block/mtdblock1 for /data.&lt;br /&gt;
&lt;br /&gt;
/system directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ApiDemos.apk package.&lt;br /&gt;
&lt;br /&gt;
The main services are zygote(/system/bin/app_process), runtime(/system/bin/runtime), and dbus(/system/bin/dbus-daemon). You can see the /etc/init.rc file on the Android ramdisk image.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions on ramdisk, userdata, and system img files&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature.&lt;br /&gt;
&lt;br /&gt;
system.img is a partition image that will be mounted as / and thus contains all system binaries&lt;br /&gt;
userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
The build system generates these files, which can later be flashed to a real device, however the emulator uses them in a different way:&lt;br /&gt;
&lt;br /&gt;
    * system.img is copied into a temporary file, which is used by the emulator session. So any change you make to / as root in the emulator are lost when the program exits&lt;br /&gt;
&lt;br /&gt;
    * userdata.img is only used when you use -wipe-data. Instead, it uses ~/.android/userdata-qemu.img (on Unix) as the persistent /data partition image. Using -wipe-data simply copes the content of userdata.img into userdata-qemu.img&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7143</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7143"/>
				<updated>2009-07-29T14:53:21Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Construction of Android environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recents changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine, voici un truc pour installer '''que''' GRUB sur une clé USB&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
For build kernel image for the apf27 Armadeus plateform, we should install uboot-mkimage program&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Construction of Android environment==&lt;br /&gt;
===Download Android source===&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Apply the Armadeus patchset===&lt;br /&gt;
Je n'ai pas indiqué (a faire) dans les pré-requit, il faut naturelle avoir installé et compilé le projet Armadeus-3.1.&lt;br /&gt;
Dans un second temps, j'indiquerai les différentes actions pour ne pas être obliger à compiler le projet Armadeus, notamment pour la rustine patch-2.6.29.4.bz2&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Battery patch===&lt;br /&gt;
At the beginning, reboot happened over again even though Android logo appeared on board.&lt;br /&gt;
Result of investigation, we found that battery power was returned with 0 when boot.. &lt;br /&gt;
A effectuer!!!!&lt;br /&gt;
===update android kernel configuration for APF27===&lt;br /&gt;
C'est un point délicat, Google/Android ne donne '''aucune''' informations dessus&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===compile Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm mrproper&lt;br /&gt;
$ make ARCH=arm apf27_android_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Making SD card for boot==&lt;br /&gt;
===Steps to make===&lt;br /&gt;
===Change init.rc===&lt;br /&gt;
&lt;br /&gt;
==modifier les arguments pour le démarage du noyau==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#installer MTD Utilies&lt;br /&gt;
sudo apt-get install mtd-utils&lt;br /&gt;
mkfs.jffs2 -r ./android-source/out/target/product/generic/system -n -o /tftpboot/apf27-rootfs.arm.jffs2a&lt;br /&gt;
&lt;br /&gt;
#installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# modifier le fichier d'init.&lt;br /&gt;
/home/rennes/dev/android-source/out/target/product/generic/root/init.rc&lt;br /&gt;
&lt;br /&gt;
$ cd $YOUR_PATH&lt;br /&gt;
$ mkdir rootfs&lt;br /&gt;
$ cd rootfs&lt;br /&gt;
$ rm -rf *&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/root/* .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/system/ .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/data/ .&lt;br /&gt;
$ tar cfvz ../apf27-rootfs-android.tar.gz ./&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
$ sudo mkfs.ext2 /dev/sdd1   (replace X with your MMC reader drive letter, if your Laptop has an integrated MMC reader then use mmcblk0p1 instead of sdX1)&lt;br /&gt;
$ sudo mkdir -p /media/mmc&lt;br /&gt;
$ sudo mount /dev/sdd1 /media/mmc &lt;br /&gt;
$ sudo tar xvf apf27-rootfs-android.tar.gz -C /media/mmc&lt;br /&gt;
$ sudo chmod -R 777 /media/mmc/*&lt;br /&gt;
&lt;br /&gt;
Sur l'APF27&lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&lt;br /&gt;
# tester android avec l'emulateur&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
# cf http://developer.android.com/guide/developing/tools/emulator.html&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android Root File system ¶&lt;br /&gt;
&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
&lt;br /&gt;
    * ramdisk.img&lt;br /&gt;
    * system.img&lt;br /&gt;
    * userdata.img&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is gziped cpio archive. ramdisk image is very small and contains configuration files, and some executable files such as init and recovery. The init file is not a regular system V init. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
&lt;br /&gt;
system.img and userdata.img are VMS Alpha executable. system.img and userdata.img have the contents of /system and /data directory on root file system. They are mapped on NAND devices with yaffs2 file system. /dev/block/mtdblock0 for /system and /dev/block/mtdblock1 for /data.&lt;br /&gt;
&lt;br /&gt;
/system directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ApiDemos.apk package.&lt;br /&gt;
&lt;br /&gt;
The main services are zygote(/system/bin/app_process), runtime(/system/bin/runtime), and dbus(/system/bin/dbus-daemon). You can see the /etc/init.rc file on the Android ramdisk image.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions on ramdisk, userdata, and system img files&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature.&lt;br /&gt;
&lt;br /&gt;
system.img is a partition image that will be mounted as / and thus contains all system binaries&lt;br /&gt;
userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
The build system generates these files, which can later be flashed to a real device, however the emulator uses them in a different way:&lt;br /&gt;
&lt;br /&gt;
    * system.img is copied into a temporary file, which is used by the emulator session. So any change you make to / as root in the emulator are lost when the program exits&lt;br /&gt;
&lt;br /&gt;
    * userdata.img is only used when you use -wipe-data. Instead, it uses ~/.android/userdata-qemu.img (on Unix) as the persistent /data partition image. Using -wipe-data simply copes the content of userdata.img into userdata-qemu.img&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7142</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7142"/>
				<updated>2009-07-29T14:15:34Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Download Android source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recents changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine, voici un truc pour installer '''que''' GRUB sur une clé USB&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
For build kernel image for the apf27 Armadeus plateform, we should install uboot-mkimage program&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Android source==&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===patch Android kernel source===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
$ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
$ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===compil Android kernel===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ cd $ANDROID_SOURCE/kernel&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
$ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==modifier les arguments pour le démarage du noyau==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt; &lt;br /&gt;
# setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
# setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#installer MTD Utilies&lt;br /&gt;
sudo apt-get install mtd-utils&lt;br /&gt;
mkfs.jffs2 -r ./android-source/out/target/product/generic/system -n -o /tftpboot/apf27-rootfs.arm.jffs2a&lt;br /&gt;
&lt;br /&gt;
#installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# modifier le fichier d'init.&lt;br /&gt;
/home/rennes/dev/android-source/out/target/product/generic/root/init.rc&lt;br /&gt;
&lt;br /&gt;
$ cd $YOUR_PATH&lt;br /&gt;
$ mkdir rootfs&lt;br /&gt;
$ cd rootfs&lt;br /&gt;
$ rm -rf *&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/root/* .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/system/ .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/data/ .&lt;br /&gt;
$ tar cfvz ../apf27-rootfs-android.tar.gz ./&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
$ sudo mkfs.ext2 /dev/sdd1   (replace X with your MMC reader drive letter, if your Laptop has an integrated MMC reader then use mmcblk0p1 instead of sdX1)&lt;br /&gt;
$ sudo mkdir -p /media/mmc&lt;br /&gt;
$ sudo mount /dev/sdd1 /media/mmc &lt;br /&gt;
$ sudo tar xvf apf27-rootfs-android.tar.gz -C /media/mmc&lt;br /&gt;
$ sudo chmod -R 777 /media/mmc/*&lt;br /&gt;
&lt;br /&gt;
Sur l'APF27&lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&lt;br /&gt;
# tester android avec l'emulateur&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
# cf http://developer.android.com/guide/developing/tools/emulator.html&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android Root File system ¶&lt;br /&gt;
&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
&lt;br /&gt;
    * ramdisk.img&lt;br /&gt;
    * system.img&lt;br /&gt;
    * userdata.img&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is gziped cpio archive. ramdisk image is very small and contains configuration files, and some executable files such as init and recovery. The init file is not a regular system V init. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
&lt;br /&gt;
system.img and userdata.img are VMS Alpha executable. system.img and userdata.img have the contents of /system and /data directory on root file system. They are mapped on NAND devices with yaffs2 file system. /dev/block/mtdblock0 for /system and /dev/block/mtdblock1 for /data.&lt;br /&gt;
&lt;br /&gt;
/system directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ApiDemos.apk package.&lt;br /&gt;
&lt;br /&gt;
The main services are zygote(/system/bin/app_process), runtime(/system/bin/runtime), and dbus(/system/bin/dbus-daemon). You can see the /etc/init.rc file on the Android ramdisk image.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions on ramdisk, userdata, and system img files&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature.&lt;br /&gt;
&lt;br /&gt;
system.img is a partition image that will be mounted as / and thus contains all system binaries&lt;br /&gt;
userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
The build system generates these files, which can later be flashed to a real device, however the emulator uses them in a different way:&lt;br /&gt;
&lt;br /&gt;
    * system.img is copied into a temporary file, which is used by the emulator session. So any change you make to / as root in the emulator are lost when the program exits&lt;br /&gt;
&lt;br /&gt;
    * userdata.img is only used when you use -wipe-data. Instead, it uses ~/.android/userdata-qemu.img (on Unix) as the persistent /data partition image. Using -wipe-data simply copes the content of userdata.img into userdata-qemu.img&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7141</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7141"/>
				<updated>2009-07-29T13:45:37Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Update the environment variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recents changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine, voici un truc pour installer '''que''' GRUB sur une clé USB&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
For build kernel image for the apf27 Armadeus plateform, we should install uboot-mkimage program&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Android source==&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/downloads/&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel . patch-2.6.29.4.bz2&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/buildroot/toolchain/kernel-headers&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel ./kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel ./2.6.29 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir /home/rennes/dev/android-source/kernel/drivers/armadeus&lt;br /&gt;
cp -r /home/rennes/dev/armadeus-3.1/target/linux/modules/* /home/rennes/dev/android-source/kernel/drivers/armadeus&lt;br /&gt;
&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
cp ./arch/arm/boot/uImage /tftpboot/apf27-linux.bin&lt;br /&gt;
&lt;br /&gt;
# modifier les arguments pour le démarage du noyau&lt;br /&gt;
setenv bootargs console=ttySMX0,115200 mtdparts=mxc_nand.0:640k(U-boot)ro,384k(U-boot_env),512k(firmware),5M(kernel),-(rootfs) root=/dev/mtdblock4 rootfstype=jffs2 ip=192.168.1.24:192.168.1.189:192.168.1.1:255.255.255.0:apf27::off&lt;br /&gt;
setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
&lt;br /&gt;
#installer MTD Utilies&lt;br /&gt;
sudo apt-get install mtd-utils&lt;br /&gt;
mkfs.jffs2 -r ./android-source/out/target/product/generic/system -n -o /tftpboot/apf27-rootfs.arm.jffs2a&lt;br /&gt;
&lt;br /&gt;
#installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# modifier le fichier d'init.&lt;br /&gt;
/home/rennes/dev/android-source/out/target/product/generic/root/init.rc&lt;br /&gt;
&lt;br /&gt;
$ cd $YOUR_PATH&lt;br /&gt;
$ mkdir rootfs&lt;br /&gt;
$ cd rootfs&lt;br /&gt;
$ rm -rf *&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/root/* .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/system/ .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/data/ .&lt;br /&gt;
$ tar cfvz ../apf27-rootfs-android.tar.gz ./&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
$ sudo mkfs.ext2 /dev/sdd1   (replace X with your MMC reader drive letter, if your Laptop has an integrated MMC reader then use mmcblk0p1 instead of sdX1)&lt;br /&gt;
$ sudo mkdir -p /media/mmc&lt;br /&gt;
$ sudo mount /dev/sdd1 /media/mmc &lt;br /&gt;
$ sudo tar xvf apf27-rootfs-android.tar.gz -C /media/mmc&lt;br /&gt;
$ sudo chmod -R 777 /media/mmc/*&lt;br /&gt;
&lt;br /&gt;
Sur l'APF27&lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&lt;br /&gt;
# tester android avec l'emulateur&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
# cf http://developer.android.com/guide/developing/tools/emulator.html&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android Root File system ¶&lt;br /&gt;
&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
&lt;br /&gt;
    * ramdisk.img&lt;br /&gt;
    * system.img&lt;br /&gt;
    * userdata.img&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is gziped cpio archive. ramdisk image is very small and contains configuration files, and some executable files such as init and recovery. The init file is not a regular system V init. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
&lt;br /&gt;
system.img and userdata.img are VMS Alpha executable. system.img and userdata.img have the contents of /system and /data directory on root file system. They are mapped on NAND devices with yaffs2 file system. /dev/block/mtdblock0 for /system and /dev/block/mtdblock1 for /data.&lt;br /&gt;
&lt;br /&gt;
/system directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ApiDemos.apk package.&lt;br /&gt;
&lt;br /&gt;
The main services are zygote(/system/bin/app_process), runtime(/system/bin/runtime), and dbus(/system/bin/dbus-daemon). You can see the /etc/init.rc file on the Android ramdisk image.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions on ramdisk, userdata, and system img files&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature.&lt;br /&gt;
&lt;br /&gt;
system.img is a partition image that will be mounted as / and thus contains all system binaries&lt;br /&gt;
userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
The build system generates these files, which can later be flashed to a real device, however the emulator uses them in a different way:&lt;br /&gt;
&lt;br /&gt;
    * system.img is copied into a temporary file, which is used by the emulator session. So any change you make to / as root in the emulator are lost when the program exits&lt;br /&gt;
&lt;br /&gt;
    * userdata.img is only used when you use -wipe-data. Instead, it uses ~/.android/userdata-qemu.img (on Unix) as the persistent /data partition image. Using -wipe-data simply copes the content of userdata.img into userdata-qemu.img&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7140</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7140"/>
				<updated>2009-07-29T13:31:23Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Download Android source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recents changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine, voici un truc pour installer '''que''' GRUB sur une clé USB&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
For build kernel image for the apf27 Armadeus plateform, we should install uboot-mkimage program&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere! &lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&lt;br /&gt;
==Download Android source==&lt;br /&gt;
The [http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/downloads/&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel . patch-2.6.29.4.bz2&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/buildroot/toolchain/kernel-headers&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel ./kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel ./2.6.29 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir /home/rennes/dev/android-source/kernel/drivers/armadeus&lt;br /&gt;
cp -r /home/rennes/dev/armadeus-3.1/target/linux/modules/* /home/rennes/dev/android-source/kernel/drivers/armadeus&lt;br /&gt;
&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
cp ./arch/arm/boot/uImage /tftpboot/apf27-linux.bin&lt;br /&gt;
&lt;br /&gt;
# modifier les arguments pour le démarage du noyau&lt;br /&gt;
setenv bootargs console=ttySMX0,115200 mtdparts=mxc_nand.0:640k(U-boot)ro,384k(U-boot_env),512k(firmware),5M(kernel),-(rootfs) root=/dev/mtdblock4 rootfstype=jffs2 ip=192.168.1.24:192.168.1.189:192.168.1.1:255.255.255.0:apf27::off&lt;br /&gt;
setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
&lt;br /&gt;
#installer MTD Utilies&lt;br /&gt;
sudo apt-get install mtd-utils&lt;br /&gt;
mkfs.jffs2 -r ./android-source/out/target/product/generic/system -n -o /tftpboot/apf27-rootfs.arm.jffs2a&lt;br /&gt;
&lt;br /&gt;
#installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# modifier le fichier d'init.&lt;br /&gt;
/home/rennes/dev/android-source/out/target/product/generic/root/init.rc&lt;br /&gt;
&lt;br /&gt;
$ cd $YOUR_PATH&lt;br /&gt;
$ mkdir rootfs&lt;br /&gt;
$ cd rootfs&lt;br /&gt;
$ rm -rf *&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/root/* .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/system/ .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/data/ .&lt;br /&gt;
$ tar cfvz ../apf27-rootfs-android.tar.gz ./&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
$ sudo mkfs.ext2 /dev/sdd1   (replace X with your MMC reader drive letter, if your Laptop has an integrated MMC reader then use mmcblk0p1 instead of sdX1)&lt;br /&gt;
$ sudo mkdir -p /media/mmc&lt;br /&gt;
$ sudo mount /dev/sdd1 /media/mmc &lt;br /&gt;
$ sudo tar xvf apf27-rootfs-android.tar.gz -C /media/mmc&lt;br /&gt;
$ sudo chmod -R 777 /media/mmc/*&lt;br /&gt;
&lt;br /&gt;
Sur l'APF27&lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&lt;br /&gt;
# tester android avec l'emulateur&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
# cf http://developer.android.com/guide/developing/tools/emulator.html&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android Root File system ¶&lt;br /&gt;
&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
&lt;br /&gt;
    * ramdisk.img&lt;br /&gt;
    * system.img&lt;br /&gt;
    * userdata.img&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is gziped cpio archive. ramdisk image is very small and contains configuration files, and some executable files such as init and recovery. The init file is not a regular system V init. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
&lt;br /&gt;
system.img and userdata.img are VMS Alpha executable. system.img and userdata.img have the contents of /system and /data directory on root file system. They are mapped on NAND devices with yaffs2 file system. /dev/block/mtdblock0 for /system and /dev/block/mtdblock1 for /data.&lt;br /&gt;
&lt;br /&gt;
/system directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ApiDemos.apk package.&lt;br /&gt;
&lt;br /&gt;
The main services are zygote(/system/bin/app_process), runtime(/system/bin/runtime), and dbus(/system/bin/dbus-daemon). You can see the /etc/init.rc file on the Android ramdisk image.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions on ramdisk, userdata, and system img files&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature.&lt;br /&gt;
&lt;br /&gt;
system.img is a partition image that will be mounted as / and thus contains all system binaries&lt;br /&gt;
userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
The build system generates these files, which can later be flashed to a real device, however the emulator uses them in a different way:&lt;br /&gt;
&lt;br /&gt;
    * system.img is copied into a temporary file, which is used by the emulator session. So any change you make to / as root in the emulator are lost when the program exits&lt;br /&gt;
&lt;br /&gt;
    * userdata.img is only used when you use -wipe-data. Instead, it uses ~/.android/userdata-qemu.img (on Unix) as the persistent /data partition image. Using -wipe-data simply copes the content of userdata.img into userdata-qemu.img&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7139</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7139"/>
				<updated>2009-07-29T13:29:48Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: /* Tips */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Désolé de pourrir les 'recents changes' :)&lt;br /&gt;
==Truc utile==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine, voici un truc pour installer '''que''' GRUB sur une clé USB&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Récuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérée avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;br /&gt;
&lt;br /&gt;
==Banc à sable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites for Linux installation==&lt;br /&gt;
===Install needed software packages===&lt;br /&gt;
For build kernel image for the apf27 Armadeus plateform, we should install uboot-mkimage program&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo apt-get install uboot-mkimage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Update the environment variables===&lt;br /&gt;
Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere! &lt;br /&gt;
export ANDROID_SOURCE=~/apf27droid&lt;br /&gt;
export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3&lt;br /&gt;
export ARMADEUS=~/armadeus-3.1&lt;br /&gt;
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin&lt;br /&gt;
&lt;br /&gt;
==Download Android source==&lt;br /&gt;
The [ http://source.android.com/download getting Android source] document describes how to set up our local work environment. &lt;br /&gt;
Follow theses instructions until ''Installing Repo''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir ANDROID_SOURCE&lt;br /&gt;
$ cd $ANDROID_SOURCE&lt;br /&gt;
$ mkdir bin&lt;br /&gt;
$ curl http://android.git.kernel.org/repo &amp;gt;$ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ chmod a+x $ANDROID_SOURCE/bin/repo&lt;br /&gt;
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source, &lt;br /&gt;
We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir $ANDROID_SOURCE/kernel&lt;br /&gt;
cd $ANDROID_SOURCE/kernel&lt;br /&gt;
git clone git://android.git.kernel.org/kernel/common.git android-2.6.29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/downloads/&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel . patch-2.6.29.4.bz2&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/buildroot/toolchain/kernel-headers&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel ./kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}&lt;br /&gt;
#/home/rennes/dev/armadeus-3.1/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4&lt;br /&gt;
./patch-kernel.sh /home/rennes/dev/android-source/kernel ./2.6.29 \*.patch{,.gz,.bz2}&lt;br /&gt;
mkdir /home/rennes/dev/android-source/kernel/drivers/armadeus&lt;br /&gt;
cp -r /home/rennes/dev/armadeus-3.1/target/linux/modules/* /home/rennes/dev/android-source/kernel/drivers/armadeus&lt;br /&gt;
&lt;br /&gt;
make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage&lt;br /&gt;
cp ./arch/arm/boot/uImage /tftpboot/apf27-linux.bin&lt;br /&gt;
&lt;br /&gt;
# modifier les arguments pour le démarage du noyau&lt;br /&gt;
setenv bootargs console=ttySMX0,115200 mtdparts=mxc_nand.0:640k(U-boot)ro,384k(U-boot_env),512k(firmware),5M(kernel),-(rootfs) root=/dev/mtdblock4 rootfstype=jffs2 ip=192.168.1.24:192.168.1.189:192.168.1.1:255.255.255.0:apf27::off&lt;br /&gt;
setenv mmcroot '/dev/mmcblk0p2 rw'&lt;br /&gt;
setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'&lt;br /&gt;
&lt;br /&gt;
#installer MTD Utilies&lt;br /&gt;
sudo apt-get install mtd-utils&lt;br /&gt;
mkfs.jffs2 -r ./android-source/out/target/product/generic/system -n -o /tftpboot/apf27-rootfs.arm.jffs2a&lt;br /&gt;
&lt;br /&gt;
#installer les bibliothèques pour lancer make gconfig&lt;br /&gt;
sudo apt-get install libgtk2.0-dev  libglib2.0-dev  libglade2-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# modifier le fichier d'init.&lt;br /&gt;
/home/rennes/dev/android-source/out/target/product/generic/root/init.rc&lt;br /&gt;
&lt;br /&gt;
$ cd $YOUR_PATH&lt;br /&gt;
$ mkdir rootfs&lt;br /&gt;
$ cd rootfs&lt;br /&gt;
$ rm -rf *&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/root/* .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/system/ .&lt;br /&gt;
$ cp -Rfp ../android-source/out/target/product/generic/data/ .&lt;br /&gt;
$ tar cfvz ../apf27-rootfs-android.tar.gz ./&lt;br /&gt;
$ cd ..&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
$ sudo mkfs.ext2 /dev/sdd1   (replace X with your MMC reader drive letter, if your Laptop has an integrated MMC reader then use mmcblk0p1 instead of sdX1)&lt;br /&gt;
$ sudo mkdir -p /media/mmc&lt;br /&gt;
$ sudo mount /dev/sdd1 /media/mmc &lt;br /&gt;
$ sudo tar xvf apf27-rootfs-android.tar.gz -C /media/mmc&lt;br /&gt;
$ sudo chmod -R 777 /media/mmc/*&lt;br /&gt;
&lt;br /&gt;
Sur l'APF27&lt;br /&gt;
# mount /dev/mmcblk0p2 /mnt/mmc&lt;br /&gt;
# strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
# strace  chroot /mnt/mmc /init androidboot.console=ttyS0&lt;br /&gt;
&lt;br /&gt;
# tester android avec l'emulateur&lt;br /&gt;
$ make ARCH=arm goldfish_defconfig&lt;br /&gt;
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi&lt;br /&gt;
# créer des AVD (Android Virtual Device)&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480&lt;br /&gt;
$ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272&lt;br /&gt;
# cf http://developer.android.com/guide/developing/tools/emulator.html&lt;br /&gt;
$ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android Root File system ¶&lt;br /&gt;
&lt;br /&gt;
Android emulator has 3 basic images on tools/lib/images directory.&lt;br /&gt;
&lt;br /&gt;
    * ramdisk.img&lt;br /&gt;
    * system.img&lt;br /&gt;
    * userdata.img&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is gziped cpio archive. ramdisk image is very small and contains configuration files, and some executable files such as init and recovery. The init file is not a regular system V init. It is made just for the Android and do special things to start up the Android system.&lt;br /&gt;
&lt;br /&gt;
system.img and userdata.img are VMS Alpha executable. system.img and userdata.img have the contents of /system and /data directory on root file system. They are mapped on NAND devices with yaffs2 file system. /dev/block/mtdblock0 for /system and /dev/block/mtdblock1 for /data.&lt;br /&gt;
&lt;br /&gt;
/system directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ApiDemos.apk package.&lt;br /&gt;
&lt;br /&gt;
The main services are zygote(/system/bin/app_process), runtime(/system/bin/runtime), and dbus(/system/bin/dbus-daemon). You can see the /etc/init.rc file on the Android ramdisk image.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
zygote {&lt;br /&gt;
    exec /system/bin/app_process&lt;br /&gt;
    args {&lt;br /&gt;
        0 -Xzygote&lt;br /&gt;
        1 /system/bin&lt;br /&gt;
        2 --zygote&lt;br /&gt;
    }&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
runtime {&lt;br /&gt;
    exec /system/bin/runtime&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
dbus {&lt;br /&gt;
    exec /system/bin/dbus-daemon&lt;br /&gt;
    args.0 --system&lt;br /&gt;
    args.1 --nofork&lt;br /&gt;
    autostart 1&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions on ramdisk, userdata, and system img files&lt;br /&gt;
&lt;br /&gt;
ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature.&lt;br /&gt;
&lt;br /&gt;
system.img is a partition image that will be mounted as / and thus contains all system binaries&lt;br /&gt;
userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.&lt;br /&gt;
&lt;br /&gt;
The build system generates these files, which can later be flashed to a real device, however the emulator uses them in a different way:&lt;br /&gt;
&lt;br /&gt;
    * system.img is copied into a temporary file, which is used by the emulator session. So any change you make to / as root in the emulator are lost when the program exits&lt;br /&gt;
&lt;br /&gt;
    * userdata.img is only used when you use -wipe-data. Instead, it uses ~/.android/userdata-qemu.img (on Unix) as the persistent /data partition image. Using -wipe-data simply copes the content of userdata.img into userdata-qemu.img&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7138</id>
		<title>User:NicolasD</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=User:NicolasD&amp;diff=7138"/>
				<updated>2009-07-29T13:23:51Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasD: New page: ==Tips== Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt; ou tout simplement rendre inaccessible la...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Tips==&lt;br /&gt;
Marre de perdre GRUB lors de la réinstallation de Windows ou de perdre l'accès à Windows après à installer Linux (c'est mon cas)&amp;lt;br&amp;gt;&lt;br /&gt;
ou tout simplement rendre inaccessible la partition Linux sur votre machine&amp;lt;br&amp;gt;&lt;br /&gt;
''Attention, l'ordre des actions est important''&lt;br /&gt;
* Formatter la cle USB en fat32 (gparted)&lt;br /&gt;
* Recuperer la liste des disques monter ainsi que leur ID &lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo blkid&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;CC5C86435C862872&amp;quot; TYPE=&amp;quot;ntfs&amp;quot; &lt;br /&gt;
/dev/sda5: UUID=&amp;quot;aad30bf1-d620-4244-9fb5-42f4a38075fb&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
/dev/sda6: TYPE=&amp;quot;swap&amp;quot; UUID=&amp;quot;e3163bab-1fcc-4bcd-844d-7dcabc35015c&amp;quot; &lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;4C9D-547F&amp;quot; TYPE=&amp;quot;vfat&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* installer Grub sur la cle USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1  (remplacer sdb1 par la valeur récupérer avec la commande précédente)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* demonter le disque USB&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo umount /media/disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Installer le MBR&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo install-mbr /dev/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Mettre le flag boot sur la cle USB (gparted)&lt;/div&gt;</summary>
		<author><name>NicolasD</name></author>	</entry>

	</feed>