You are on page 1of 5

Android: Building Kernel from source

1 2 1 Install CyanogenMod on the device 2 Install development support packages 1 2 3 4 5 6 7 8 9 2.1 Debian based Linux distributions 2.2 Red Hat based Linux distributions

3 Setup Repo 4 Download ROM Source Code 5 Download Kernel Source Code 6 Congure the Build 7 Make the build 8 Merge the build 9 Compiling wi kernel module

10 10 Installing kernel modules for debian chroot installation 11 11 Sources

Install CyanogenMod on the device


First, you will need to get a working install on the device: Installing CyanogenMod on the device.

Install development support packages


Install the following packages using your favorite package manager:

Debian based Linux distributions


32bit and 64bit systems: git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev 64bit only: ia32-libs lib32z1-dev lib32ncurses5-dev gcc-multilib g++-multilib

Setup Repo
Make sure you have a ~/bin directory, and setup repo. mkdir -p ~/bin curl http://android.git.kernel.org/repo > ~/bin/repo chmod a+x ~/bin/repo echo $PATH|grep ~/bin>/dev/null||export PATH="${PATH}":~/bin hash -r To validate the repo command is in your path, type 'which repo'. If you do not have ~/bin in $PATH by default and are using bash, do the following: echo "export PATH=\"\${PATH}\":~/bin" >>~/.bashrc eval . ~/.bashrc

Download ROM Source Code


mkdir -p ~/android/system cd ~/android/system repo init -u git://github.com/CyanogenMod/android.git -b gingerbread repo sync
This may take 1.5 hours, more or less, depending on your connection. Create an environment variable denoting the location of the android toolchain as follows:

export CCOMPILER=${HOME}/android/system/prebuilt/linux-x86/ toolchain/arm-eabi-4.4.0/bin/arm-eabi-

Download Kernel Source Code


mkdir -p ~/android/kernel cd ~/android/kernel git clone git://github.com/CyanogenMod/cm-kernel.git cd cm-kernel

Congure the Build


Retrieve a working kernel cong from the device, and unzip it:

adb pull /proc/config.gz /home/user_name/android/kernel/cmkernel/config.gz gunzip config.gz && mv config .config


Alternatively, you can pull the .cong from the newest boot.img

scripts/extract-ikconfig boot.img > .config


Congure the build. Just enter to accept defaults, or customize as needed:

make ARCH=arm CROSS_COMPILE=$CCOMPILER oldconfig make ARCH=arm CROSS_COMPILE=$CCOMPILER menuconfig

Make the build


make ARCH=arm CROSS_COMPILE=$CCOMPILER -j`grep 'processor' / proc/cpuinfo | wc -l`
This step may take a while, depending on your computer. At this point you should have a kernel stored in

~/android/kernel/cm-kernel/arch/arm/boot/zImage

Merge the build


You will need to merge this le with a working cyanogen ramdisk in order to create a boot image suitable for ashing. Follow these instructions here. If all goes well, you should now be running your own custom CyanogenMod kernel on the device. Note: If you are building for Nexus One, you should use --base 0x20000000 when running mkbootimg.

Compiling wi kernel module


After installing a custom kernel, the wi module may be unstable or unusable. The solution is to recompile the module, linking it to the new kernel build.

cd ~/android/system/system/wlan/ti/sta_dk_4_0_4_32 KERNEL_DIR=~/android/kernel CROSS_COMPILE=$CCOMPILER ARCH=arm make -j`grep 'processor' /proc/cpuinfo | wc -l`


A le named wlan.ko will be produced in the current directory. You must install the new module to the device.

adb shell mount -o remount,rw /system adb shell cp /system/lib/modules/wlan.ko /system/lib/modules/ wlan.ko.backup adb push wlan.ko /system/lib/modules/wlan.ko
Reboot the device. If all goes well, you should be using the newly compiled 'wlan.ko'.

Installing kernel modules for debian chroot installation


If you have a debian chroot install on the device, you will want to add to it the loadable modules that were built along with the kernel. This is necessary to use things like fuse, cifs, etc. First tar up and transfer over the modules

cd ~/android/kernel tar -czf modules.tgz `find . | grep ko$` adb push modules.tgz /sdcard
Then, Copy the modules to your debian install (Replace <debian_root> with the root of your debian installation)

adb shell mkdir <debian_root>/lib/modules/`uname -r` cd <debian_root/lib/modules/`uname -r` tar -zxf /sdcard/modules.tgz

Last, Install the modules from debian (must be done as root). Log in to your debian installation using your method of choice, then:

depmod -a
If all goes well, depmod should produce no output. At this point you may load a kernel module from within debian by typing (as root):

modprobe <module_name> where <module_name> is the name of the kernel module without the .ko extension. You may remove a module by typing: modprobe -r <module_name>

You might also like