# Compiling Linux Kernel 4.19.128 LTS for Aria

<abstract>
This article illustrates how to generate a bootable Linux Kernel image for Aria SOM starting from the 
Linux Kernel Archives.
</abstract>

## Prerequisite

* Install the ARM toolchain: @article='arm9_toolchain'
* It is advisable to have a Debug Port Interface like [DPI](/DPI) or [USB-3V-SER](/USB-3V-SER) 
to check the error messages during the kernel bootstrap

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

Open a terminal on your Linux PC and download the Linux Kernel sources from the main stream repository:

	wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.128.tar.xz

Extract the Kernel sources from the compressed file by typing:

	tar xvfJ linux-4.19.128.tar.xz

Move inside the new folder:

	cd linux-4.19.128

<!--
Create with [git](https://en.wikipedia.org/wiki/Git) a new branch of Linux Kernel sources called __acme__ 
to keep a trace of any changes from the Kernel mainline.

Install git on your PC:

	sudo apt update
	sudo apt install git

Create a local git repository and the new branch __acme__: 

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

Download the Acme Systems patch for this Kernel version. It add just the Acme boards defconfig, device trees and
small few bug fixes:

	wget https://raw.githubusercontent.com/AcmeSystems/acmepatches/master/linux-4.19.x.patch

and apply it by typing:

	patch -p1 < linux-4.19.x.patch
-->

Set the Kernet config for Aria:

	wget https://www.acmesystems.it/www/aria_compile_kernel_4_19/acme-aria_defconfig -O arch/arm/configs/acme-aria_defconfig
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-aria_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.

<!--
### Create a defconfig of your own Kernel configuration

	make ARCH=arm savedefconfig

The file <code>defconfig</code> contains your configuration. You could rename and copy it in <code>arch/arm/configs/</code>

	cp defconfig arch/arm/configs/my_defconfig
-->

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

Now compile the device tree file requested by your board by selecting one of the following commands:

	wget https://www.acmesystems.it/www/aria_compile_kernel_4_19/acme-aria.dts -O arch/arm/boot/dts/acme-aria.dts
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-aria.dtb

### Donwload a fixed driver for serial ports

	wget https://www.acmesystems.it/www/aria_compile_kernel_4_19/atmel_serial.c -O drivers/tty/serial/atmel_serial.c

### 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 <code>/lib</code> 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

Insert a [formatted microSD](/microsd_format) with the boot loader ([at91bootstrap](/at91bootstrap))
and the rootfs contents already created in your Linux PC and copy on it these files:

Write the Linux Kernel image and the device tree blob in the first microSD partition:
	
	sudo cp arch/arm/boot/zImage /media/$USER/BOOT
	sudo cp arch/arm/boot/dts/acme-aria.dtb /media/$USER/BOOT

Write the Linux Kernel modules inside the second microSD partition:
	
	sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.

### After the first boot

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

	depmod -a

<!-- 
## Usefull commands

If you want to create a patch with the changes you have made on the vanilla Linux kernel
use these commands:

	git checkout acme
	git diff master > acme.patch

To revert a patch applied type:

	patch -p1 -R < ../acme.patch

## Customize the device tree

To customize the device copy the file __arch/arm/boot/dts/acme-aria.dts__ in __arch/arm/boot/dts/acme-aria-yourname.dts__
the edit it, when ready compile it by typing:

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

Rename __acme-aria-yourname.dtb__ in __acme-aria.dtb__ and save it in the first boot partition of Aria microSD 
then boot it.
-->

## Links

* [Linux4Sam Kernel page](https://www.linux4sam.org/bin/view/Linux4SAM/LinuxKernel)
* [Linux Kernel Archives](https://www.kernel.org)


@include='bio_tanzilli'

