[[Android]]
- Contents
#contents

*Android-x86 1.6-r2 Donut [#w300a32c]
>
This section explain how to create a bootable USB drive for Android-x86 1.6-r2 for x86 processors.~
This section is tested with single board computers, which are equippwith Intel Atom Z500 series~
CPU. Since the single board computers do notThe porting process is quite simple. Obtain and build~
This section explain how to create a bootable USB drive for Android-x86 1.6-r2. This Android x86~
is developed at [[android-x86.org:http://www.android-x86.org]].This section is tested with single board computers, which are~
equippwith Intel Atom Z500 series CPU. Since the single board computers do not have any~
storage, the boards use USB drive as storage. The porting process is quite simple. Obtain and build~
the source files, and write the built files into a bootable USB drive. The single board computers are~
booted from the USB drive.~

** Obtaining and Building Source Files. [#o55de2be]
> 
Ubuntu 8.04 is used as the building environment.
- Obtain the source files.
The source files are downloaded form android-x86.org. At the preparation,~
create a directory will house the downloaded files. The first command line creates the new directly,~
then move down to the newly created directly. The third command lines identifies the location of~
the source files, and the the fourth command line downloads (syncs) these files form the depository.~
 $ mkdir android-x86-1.6r2
 $ cd android-x86-1.6r2
 $ repo init -u git://git.android-x86.org/platform/manifest.git -b donut-x86
 $ repo sync 
-Build
First, identify the x86 machine. This targets an embedded system, which comes with Atom~
Z500 family, but the x86 machine is defined as '''eeepc''' for a practical reason. Then build. 
 $ make usb_img TARGET_PRODUCT=eeepc
After the build is completed, the directly '''android-x86-1.6r2/out/target/product/eeepc/usb_boot''' has~
been created, and in this directory, a holder '''android-system''' exists. If a kernel and three image files,~
such as, '''initrd.img''', '''install.img''', '''kernel''', '''ramdisk.img''', and '''system.img''' are  in the '''android-system'''~
holder, it indicates that the build process has been successful.~
 $ cd ~/android-x86-1.6r2/out/target/product/eeepc/usb_boot
 $ ls android-system
 initrd.img  install.img  kernel  ramdisk.img  system.img

** Boot from USB derive [#z33dde67]
>
Format a USB device (2GB) in ext3. Then, copy '''android-system''' into the USB device. At this moment,~
this device can be bootable as '''vfat''' is used. However, this section describes the case that the devoice~
is mounted at '''/media/disk/'''.
 $ sudo cp -fr android-system /media/disk/
- Install grub
Caution: Pay attention to the directory below '''/dev''' of USB device.
 $ sudo grub-install --root-directory=/media/disk --no-floppy /dev/sdb
-  Configure grub
Edit '''menu.lst''' of grub
 $ sudo vi /media/disk/boot/grub 
 $ sudo vi menu.lst
The contents of ''' menue.lst''' in the bootable USB drive are almost identical to the contents of '''memu.lst''',~
which is located at '''/android-x86-1.6r2/out/target/product/eeepc/usb_boot'''. Since the chipset of the~
targeted single board computer is US15W, the board is booted in VESA mode.~
 default=0
 root (hd0,0)
 
 title Live USB - VESA Mode
         kernel /android-system/kernel root=/dev/ram0 androidboot_hardware=eeepc acpi_sleep=s3_bios,s3_mode quiet vga=788 SRC=/android-system
         initrd /android-system/initrd.img
 title Live USB - Debug Mode
         kernel /android-system/kernel root=/dev/ram0 androidboot_hardware=eeepc acpi_sleep=s3_bios,s3_mode vga=788 SRC=/android-system DEBUG=1
         initrd /android-system/initrd.img

>
This is the end of creation of bootable USB drive. To boot the single board computer, insert the bootable~
USB drive. After turning power on, check the boot order by BIOS, then select VESA mode in the menu~
of grub. Android starts booting. (Once Android is in suspend mode, it cannot be released.)~


*AOSP for x86 (Installing android-2.6.29 kernel)[#s04c09ab]
>
This explains how to build the kernel of Android Open Source Project (AOSP) for x86.~
To follow the standard building procedure, two errors occur and interrupt the building~
process. This identifies the causes of the errors and shows how to fix these errors.


** Get kernel [#w122ae7a]
>
To prepare for building the kernel for x86, obtain the 2.6.29 kernel from the repository. 
 $ mkdir kernel
 $ cd kernel
 $ git clone git://android.git.kernel.org/kernel/common.git android_kernel
 $ cd android_kernel
The first two commands create an empty directory which is called '''kernel''' and move into~
the directory, respectively. The third command makes the '''android_kernel''' folder under~
the '''kernel''' directly, and the original repository is copied into the '''android_kernel''' directory.~
Then, move into this directory.
 $ git checkout --track -b android-2.6.29 origin/android-2.6.29
The command above creates a new branch for '''android-2.6.29''' and switches to it in one command line.~
The preparation is completed.

** android-2.6.29 [#y025882f]
>
This section explains how to build the '''android-2.6.29 kernel''' for x86 as well as how to fix~
errors which occur during its building process. To build '''android-2.6.29''' for x86, there are two known~
errors in two files. Overall three parts of the two files are needed to be fixed. 

>At the beginning, the kernel modules are needed to be configured. By the first two commands,~
move down to the '''android_kernel''' directory in which the '''android-2.6.29 kernel''' is located.~
The third command  copies the configuration file, '''.config''', from '''arch/x86/configs/i386_defconfig'''.
 $ cd ~/
 $ cd kernel/android_kernel
 $ cp arch/x86/configs/i386_defconfig .config
 $ make menuconfig
The fourth command displays a curses-based terminal configuration menu and helps the configuration of~
the kernel modules. The modules are need to be selected and deselected. For the minimum requirements,~
the configurations of the modules are listed below.
|CENTER:Module|Enable|Disable|
|Enable the Anonymous Shared Memory Subsystem|CENTER:x||
|Wake lock|CENTER:x||
|Android pmem allocator||CENTER:x|
|Android alarm driver|CENTER:x||
|Android Drivers|CENTER:x||
|Android Binder IPC Driver|CENTER:x||
|Android log driver|CENTER:x||
|Android RAM buffer console|CENTER:x||
|Android Low Memory Killer|CENTER:x||


*** kernel/cpuset.c [#w37c4ae7]
>After start building the kernel, the first error is detected in '''cpuset.c'''. 
 kernel/cpuset.c: In function ‘cpuset_can_attach’:
 kernel/cpuset.c:1360: error: ‘task’ undeclared (first use in this function)
 kernel/cpuset.c:1360: error: (Each undeclared identifier is reported only once
 kernel/cpuset.c:1360: error: for each function it appears in.)
This error is caused by a simple typo. At the line of 1354 in '''cpuset.c,''' '''task''' is supposed to be '''tsk'''. 

>
 static int cpuset_can_attach(struct cgroup_subsys *ss,
                              struct cgroup *cont, struct task_struct *tsk)
 {
         struct cpuset *cs = cgroup_cs(cont);
         int ret = 0;
 + // change task->tsk
 + //      if ((current != task) && (!capable(CAP_SYS_ADMIN))) {
 +       if ((current != tsk) && (!capable(CAP_SYS_ADMIN))) {
                const struct cred *cred = current_cred(), *tcred;
 
                 if (cred->euid != tcred->uid && cred->euid != tcred->suid)
                         return -EPERM;
         }
 
         if (cpumask_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed))
                 return -ENOSPC; 
  
         if (tsk->flags & PF_THREAD_BOUND) {
>
After '''task''' is changed to '''tsk''', making process should be continued.


*** drivers/rtc/alarm.c [#zfb67774]
>The second error occurs in the '''alarm.c''' file. The error message suggests that '''time.h''' cannot be found~
under the '''asm''' directly.
>
   CC      drivers/rtc/alarm.o
 drivers/rtc/alarm.c:16:27: error: asm/mach/time.h: No such file or directory
 drivers/rtc/alarm.c: In function ‘alarm_suspend’:
>
First, examine contents of the '''asm''' directly.
 $ ls include/asm
 asm-offsets.h
'''time.h''' is not detected. Only '''asm-offsets.h''' is recognized under the directly. This means that~
the missing directly or file causes this error.
>
To fix this error, '''#include <asm/mach/time.h>''' is needed to be defined appropriately.~
This preprocessor command is treated as a part of  a set of conditional compilation.~
Three preprocessor commands are added around the line 12 of '''#include <asm/mach/time.h>'''.~
The changes are shown below.~
>
  * GNU General Public License for more details.
  *
  */
 + #ifdef __i386__
 + #else
 #include <asm/mach/time.h>
 + #endif
 
 #include <linux/android_alarm.h>
 #include <linux/device.h>
>
To respond to the changes described above, a set of conditional compilation and a function are~
needed to be added. This set of conditional compilation is coordinated with the previously added~
conditional compilation above and contains the newly added function. The newly added function is~
ported from '''arch/arm/kernel/time.c.'''
>
The conditional compilations and ported function are inserted after '''alarm_triggered_function''', which~
ends at the line 325. The details are shown below. 
>
 static void alarm_triggered_func(void *p)
 {
         struct rtc_device *rtc = alarm_rtc_dev;
         if (!(rtc->irq_data & RTC_AF))
                   return;
          ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INT, "rtcalarm triggered\n");
          wake_lock_timeout(&alarm_rtc_wake_lock, 1 * HZ);
  } 
  
  
 + #ifdef __i386__
 + // Port this function from arch/arm/kernel/time.c
 + /**
 + * save_time_delta - Save the offset between system time and RTC time
 + * @delta: pointer to timespec to store delta
 + * @rtc: pointer to timespec for current RTC time
 + *
 + * Return a delta between the system time and the RTC time, such
 + * that system time can be restored later with restore_time_delta()
 + */
 + static void save_time_delta(struct timespec *delta, struct timespec *rtc)
 + {
 +         set_normalized_timespec(delta,
 +         xtime.tv_sec - rtc->tv_sec,
 +         xtime.tv_nsec - rtc->tv_nsec);
 + }
 + #endif
 int alarm_suspend(struct platform_device *pdev, pm_message_t state)
 {
        int                 err = 0;
>
The two errors are fixed. The building process of the '''android-2.6.29 kernel''' should be completed. 

*Reference [#a7cc8926]
-Reference for the error in '''kernel/cpuset.c'''
--http://www.mail-archive.com/android-kernel@googlegroups.com/msg00368.html ~
--http://zash-egg.seesaa.net/article/131182492.html (in Japanese)
-Reference for the error in '''drivers/rtc/alarm.c'''
--https://review.source.android.com/#patch,sidebyside,6751,1,drivers/rtc/alarm.c~

Front page   Edit Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   RSS of recent changes