[[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~