#Compiling Linux Kernel 4.1.11

<div class="row">
	<div class="col-md-2">
		<img src="tuxcase_small.jpg" class="img-thumbnail"/>
	</div>
	<div class="col-md-10">
		<div class="text-success lead">
			This article illustrates how to generate a bootable Linux Kernel
			image for Acqua A5, Aria G25 and Arietta G25 boards
		</div>
	</div>
</div>

###Hardware requirements:

* an Ubuntu 15.04 Linux PC 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'

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

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

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

Extract the Kernel sources from the compressed file by typing:

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

Move inside the new folder:

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

At this point I suggest to create a your own personal branch
on Linux Kernel sources to keep a trace of any changes from the
Kernel mainline using these commands.

<pre class="minicom">
~/linux-4.1.11$ <b>git init</b>
~/linux-4.1.11$ <b>git add .</b>
~/linux-4.1.11$ <b>git commit -m "Linux vanilla"</b>
~/linux-4.1.11$ <b>git branch acme</b>
~/linux-4.1.11$ <b>git checkout acme</b>
</pre>

Download this patch file from GitHub:

* [linux-4.1.11.patch](https://raw.githubusercontent.com/AcmeSystems/acmepatches/master/linux-4.1.11.patch)

and apply it by typing:

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

Then select the right Linux configuration for your board
by typing one of these commands:

<pre class="minicom">
~/linux-4.1.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-</b><i>acqua-a5</i><b>_defconfig</b>
~/linux-4.1.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-</b><i>arietta-g25</i><b>_defconfig</b>
~/linux-4.1.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-</b><i>aria-g25</i><b>_defconfig</b>
...
# configuration written to .config
</pre>

###Customize the default Linux Kernel configuration:

If you need to customize the Kernel configuration or you just want to take a look
around the Kernel setup type:

<pre class="minicom">
~/linux-4.1.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.

###Generate the Device Tree Blob file (.dtb)

Now compile the the device tree file requested by your board by typing one of these commands:

<pre class="minicom">
~/linux-4.1.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-</b><i>acqua-a5</i><b>.dtb</b>
~/linux-4.1.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-</b><i>arietta-g25</i><b>.dtb</b>
~/linux-4.1.11$ <b>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-</b><i>aria-g25</i><b>.dtb</b>
...
</pre>

###Compile the Kernel image

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

<pre class="minicom">
~/linux-4.1.11$ <b>make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage</b>
...
  Image arch/arm/boot/zImage 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-4.1.11$ <b>make modules -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-</b>
...
~/linux-4.1.11$ <b>make modules_install INSTALL_MOD_PATH=./modules ARCH=arm</b>
...
</pre>

##Copy the boot files into the first microSD partition

<ul class="nav nav-tabs">
	<li class="nav active"><a href="#local" data-toggle="tab">Local write</a></li>
	<li class="nav"><a href="#remote" data-toggle="tab">Remote write</a></li>
</ul>

<div class="tab-content">
	<div class="tab-pane fade in active" id="local" markdown="1">

###Direct write on microSD

Insert a [formatted microSD](/microsd_format) in your Linux PC and copy 
on it the files directly:

Write the Linux Kernel image, the Device tree blog files in the first microSD
partition and uncompress the modules in <b>/modules/lib</b> directory inside the second
microSD partition:

####Acqua

<pre class="minicom">
~/linux-4.1.11$ <b>cp arch/arm/boot/dts/acme-acqua-a5.dtb /media/$USER/kernel/at91-sama5d3_acqua.dtb</b>
~/linux-4.1.11$ <b>cp arch/arm/boot/zImage /media/$USER/kernel</b>
~/linux-4.1.11$ <b>sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.</b>
</pre>

####Arietta

<pre class="minicom">
~/linux-4.1.11$ <b>cp arch/arm/boot/dts/acme-arietta-g25.dtb /media/$USER/kernel/acme-arietta-g25</b>
~/linux-4.1.11$ <b>cp arch/arm/boot/zImage /media/$USER/kernel</b>
~/linux-4.1.11$ <b>sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.</b>
</pre>

####Aria

<pre class="minicom">
~/linux-4.1.11$ <b>cp arch/arm/boot/dts/acme-aria-g25.dtb /media/$USER/kernel/at91-ariag25.dtb</b>
~/linux-4.1.11$ <b>cp arch/arm/boot/zImage /media/$USER/kernel</b>
~/linux-4.1.11$ <b>sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.</b>
</pre>

	</div>

	<div class="tab-pane fade" id="remote" markdown="1">


###Remote writing via ssh 

Use this method if you have a working board accessible via LAN, WiFi or USB

Write the Linux Kernel image, the Device tree blog files in the first microSD
partition and uncompress the modules in <b>/modules/lib</b> directory inside the second
microSD partition:

####Acqua

<pre class="minicom">
~/linux-4.1.11$ <b>scp arch/arm/boot/dts/acme-acqua-a5.dtb root@</b>ip address<b>:/boot/at91-sama5d3_acqua.dtb</b>
~/linux-4.1.11$ <b>scp arch/arm/boot/zImage root@</b>ip address<b>:/boot</b>
~/linux-4.1.11$ <b>rsync -avc modules/lib/. root@</b>ip address<b>:/lib/.</b>
</pre>

####Arietta

<pre class="minicom">
~/linux-4.1.11$ <b>scp arch/arm/boot/dts/acme-arietta-g25.dtb root@192.168.10.10:/boot/acme-arietta-g25</b>
~/linux-4.1.11$ <b>scp arch/arm/boot/zImage root@192.168.10.10:/boot</b>
~/linux-4.1.11$ <b>rsync -avc modules/lib/. root@192.168.10.10:/lib/.</b>
</pre>

####Aria

<pre class="minicom">
~/linux-4.1.11$ <b>scp arch/arm/boot/dts/acme-aria-g25.dtb root@</b>ip address<b>:/media/mmc_p1/at91-ariag25.dtb</b>
~/linux-4.1.11$ <b>scp arch/arm/boot/zImage root@</b>ip address<b>:/media/mmc_p1</b>
~/linux-4.1.11$ <b>rsync -avc modules/lib/. root@</b>ip address<b>:/lib/.</b>
</pre>

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

	</div>
</div>

##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>
