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

	<entry>
		<id>http://www.armadeus.org/wiki/index.php?title=Android&amp;diff=7622</id>
		<title>Android</title>
		<link rel="alternate" type="text/html" href="http://www.armadeus.org/wiki/index.php?title=Android&amp;diff=7622"/>
				<updated>2009-11-16T19:38:37Z</updated>
		
		<summary type="html">&lt;p&gt;BenjaminC: small typo&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/devices.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>BenjaminC</name></author>	</entry>

	</feed>