# Compiling Linux Kernel 4.4.X LTS

<div class="row">
	<div class="col-md-2">
		<img src="tuxcase_small.jpg" class="img-thumbnail"/>
	</div>
	<div class="col-md-10" markdown="1">

<abstract>
	This article illustrates how to generate a bootable Linux Kernel
	image for Acqua A5, Aria G25, Arietta G25 and FOX G20 boards
</abstract>

## Notes

* This procedure was tested on a Linux PC with Ubuntu 16.04.2
* The latest Kernel version we tried writing this article is 4.4.79. Probably the same procedure
will works also with most recent 4.4.x LTS versions. Check on [kernel.org](http://kernel.org) which is
the latest version available.
* More info about this Kernel version are [available here](http://free-electrons.com/blog/linux-4-2/)
* It is advisable to have a [Debug Port Interface](/DPI) or similar during the kernel bootstrap
* Before following this step by step procedure install [these packages](/arm9_toolchain)

	</div>
</div>


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

Download from the Linux Kernel repository latest version we tried:

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

or the latest version 4.4.x available on:

* [http://www.kernel.org](http://www.kernel.org)

Extract the Kernel sources from the compressed file by typing:

	tar xvfJ linux-4.4.79.tar.xz

Move inside the new folder:

	cd linux-4.4.79
	~/linux-4.4.79

At this point I suggest to create a your own personal branch
of Linux Kernel sources with [git](https://git-scm.com/) to keep a trace of any changes from the
Kernel mainline using these commands.

	git init; git add .; git commit -m "Linux vanilla"; git branch acme; git checkout acme

Download this patch file from GitHub:

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

and apply it by typing:

	patch -p1 < linux-4.4.79.patch

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

#### Acqua A5

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-acqua_defconfig

#### Arietta G25

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-arietta_defconfig

#### Aria G25

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-aria_defconfig

#### FOX Board G20

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-foxg20_defconfig

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

	make ARCH=arm menuconfig

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:

#### Acqua A5

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-acqua.dtb

#### Arietta G25

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-arietta.dtb

#### Aria G25

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-aria.dtb

#### FOX Board G20

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-foxg20.dtb

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

	make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage
	...
  	Image arch/arm/boot/zImage is ready

###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. We didn't use any [M] flag in our defconfig so this procedure 
is not requested but. in case you add something. these are the commands to use
to compile them:

	make modules -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
	...
	make modules_install INSTALL_MOD_PATH=./modules ARCH=arm
	...

##Copy the boot files into the first microSD partition

###Direct write on microSD

Insert a microSD [formatted microSD](/microsd_format) with the boot loader 
and the rootfs contents already created 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 A5

	cp arch/arm/boot/dts/acme-acqua.dtb /media/$USER/boot/at91-sama5d3_acqua.dtb
	cp arch/arm/boot/zImage /media/$USER/boot
	sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.

####Arietta G25

	cp arch/arm/boot/dts/acme-arietta.dtb /media/$USER/boot/acme-arietta.dtb
	cp arch/arm/boot/zImage /media/$USER/boot
	sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.

####Aria G25

	cp arch/arm/boot/dts/acme-aria.dtb /media/$USER/boot/at91-ariag25.dtb
	cp arch/arm/boot/zImage /media/$USER/boot
	sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.

####FOX Board G20

	cat arch/arm/boot/zImage arch/arm/boot/dts/acme-foxg20.dtb > /media/$USER/boot/uImage
	sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.

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

	scp arch/arm/boot/dts/acme-acqua.dtb root@ip_address<b>:/boot/at91-sama5d3_acqua.dtb
	scp arch/arm/boot/zImage root@ip_address:/boot
	rsync -avc modules/lib/. root@ip_address:/lib/.

####Arietta G25

	scp arch/arm/boot/dts/acme-arietta.dtb root@192.168.10.10:/boot/acme-arietta.dtb
	scp arch/arm/boot/zImage root@192.168.10.10:/boot
	rsync -avc modules/lib/. root@192.168.10.10:/lib/.

####Aria G25

	scp arch/arm/boot/dts/acme-aria.dtb root@ip_address:/boot/at91-ariag25.dtb
	scp arch/arm/boot/zImage root@ip_address:/boot
	rsync -avc modules/lib/. root@ip_address:/lib/.

####FOX Board G20

	cat arch/arm/boot/zImage arch/arm/boot/dts/acme-foxg20.dtb > uImage
	scp uImage root@ip_address:/boot
	rsync -avc modules/lib/. root@ip_address:/lib/.

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

	depmod -a

@include='bio_tanzilli'
