#Compiling Linux Kernel 3.13.11

<img src="./tuxcase_small.jpg">

This article illustrates how to generate a bootable <b>Linux Kernel</b> 
image for all the follow Acme boards:

* [Aria G25](/aria)
* [Arietta G25](/arietta)
* [Terra](/terra)

###Hardware requirements:

* a PC with Linux <b>Ubuntu 13.10</b> installed to cross compile the Kernel
* an Acme board with Atmel MPU inside
* a microSD card
* a [Debug Port Interface](/DPI)

###Software requirements

* @article='arm9_toolchain'
* [The Kernel source tree](http://www.kernel.org)

##Step-by-step Kernel cross-compilation procedure:

Download and save in your home directory the Linux Kernel sources:

* [linux-3.13.11.tar.xz](https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.13.11.tar.xz)

Extract the Kernel sources from the compressed file by typing:

<pre class="minicom">
~$ <b>tar xvfJ linux-3.13.11.tar.xz</b>
...
</pre>

Move inside the new folder:

<pre class="minicom">
~$ <b>cd linux-3.13.11</b>
~/linux-3.13.11$
</pre>

###Applying patches

Download the patch file [ariag25.patch](./ariag25.patch) and apply it:

<pre class="minicom">
~/linux-3.13.11$ <b>patch -p1 < ariag25.patch</b>
</pre>

###Set the basic Kernel configuration

<pre class="minicom">
~/linux-3.13.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- at91-ariag25_defconfig</b>
...
# configuration written to .config
</pre>

###Customize the default Linux Kernel configuration:

If you need to customize the Kernel configuration or just taking a look
to the drivers and features activated type:

<pre class="minicom">
~/linux-3.13.11$ <b>make ARCH=arm menuconfig</b>
</pre>

and navigate inside the Kernel configuration using the arrow keys and 
following the help provided by the menuconfig interface.

###Compile the Device Tree Blob file

<pre class="minicom">
~/linux-3.13.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- at91-ariag25.dtb</b>
...
</pre>

###Compile the Kernel image

Compile the Linux Kernel sources and generate a binary 
image file to save in the first partition of microSD card.

<pre class="minicom">
~/linux-3.13.11$ <b>make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage</b>
...
  Image arch/arm/boot/uImage is ready
</pre>

On a mid-power PC the whole source compilation requires about 5 minutes. 

###Compile the Kernel modules

The image generated contains the Linux Kernel and all the built-in 
device drivers (option <b>[*]</b> in menuconfig) compiled with it.

Al the drivers compiled as external modules (option <b>[M]</b> in menuconfig)
need to be compiled and saved in the rootfs <b>/lib</b> directory on the second 
partition of the microSD. To compile them type:

<pre class="minicom">
~/linux-3.13.11$ <b>make modules -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-</b>
...
~/linux-3.13.11$ <b>make modules_install INSTALL_MOD_PATH=./modules ARCH=arm</b>
...
</pre>

#Copy the boot files into the first microSD partition

##Method 1 - Direct write on microSD

<blockquote markdown="1">
Insert a [formatted microSD](/microsd_format) in your Linux PC and copy 
on it the files directly:

Write the Linux Kernel image and Device tree blog files in the first microSD
partition:

<pre class="minicom">
~/linux-3.13.11$ <b>cp arch/arm/boot/dts/at91-ariag25.dtb /media/$USER/KERNEL/at91-ariag25.dtb</b>
~/linux-3.13.11$ <b>cp arch/arm/boot/uImage /media/$USER/KERNEL/image.bin</b>
</pre>

<span class="smallnotes">
If you are using an Ubuntu release older than 13.10 remove **$USER** in the 
path
</span>

Write the Kernel modules in the rootfs (second microSD partition):

<pre class="minicom">
~/linux-3.13.11$ <b>sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.</b>
</pre>
</blockquote>

##Method 2 - Remote writing via ssh 

<blockquote markdown="1">
Use this method if you have a working board accessible via LAN

Write the Linux Kernel image and Device tree blog files in the first microSD
partition:

<pre class="minicom">
~/linux-3.13.11$ <b>scp arch/arm/boot/dts/at91-ariag25.dtb root@ariag25.local:/media/mmc_p1</b>
~/linux-3.13.11$ <b>scp arch/arm/boot/uImage root@ariag25.local:/media/mmc_p1/image.bin</b>
</pre>

Write the Kernel modules in the rootfs (second microSD partition):

<pre class="minicom">
~/linux-3.13.11$ <b>rsync -avc modules/lib/. root@ariag25.local:/lib/.</b>
</pre>
</blockquote>

<span class="smallnotes">
If this command doesn't work verify if rsync in installed on your board. Use <b>apt-get install rsync</b>.
</span>


##After the first boot

At the first access to the board command line update the module dependencies by typing this command:

<pre class="minicom">
~# <b>depmod -a</b>
</pre>

#Use the new Kernel with EmDebian Wheezy Grip rootfs 

* @article='emdebian_grip' 

# Related links

* [Linux changes](http://kernelnewbies.org/LinuxChanges)
* [Linux Kernel mailing list archives](https://lkml.org/)
* [Kernel documentation](http://lxr.linux.no/linux+v3.13.11/Documentation)

