# Compiling Linux Kernel 5.4 LTS

<abstract>
	This article illustrates how to generate a bootable Linux Kernel image for RoadRunner SOM
</abstract>

<img class="img-responsive" src="./roadrunner_tux.jpg">

It is advisable to have a [Debug Port Interface](/DPI) or [similar](/USB-3V-SER) during the kernel bootstrap

If you are using a Linux PC with Ubuntu or Debian follow this article:

* @article='arm9_toolchain'

If you are using a Raspberry Pi board consider that the programs (gcc, g++, ...), 
required to compile the Linux Kernel, are already installed by default on Raspbian OS
so probably you have to install just to add few programs more:

	sudo apt update
	sudo apt install bc bison libssl-dev flex

It is possible to use the Raspberry Pi native gcc compiler so remove this parameter:
		
	CROSS_COMPILE=arm-linux-gnueabihf-

from the command provided below

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

Procedure tested on a __Linux Ubuntu__ , __Debian__ and on a __Raspberry Pi 4 Raspbian Buster Lite__.

### Kernel sources download

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

	wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.163.tar.xz

Extract the Kernel sources from the compressed file by typing:

	tar xvfJ linux-5.4.163.tar.xz

Move inside the new folder just created:

	cd linux-5.4.163

### Compile the Kernel image

Download the Kernel configuration file for Roadrunner by typing:

	wget https://www.acmesystems.it/www/roadrunner_compile_kernel_5_4/acme-roadrunner_defconfig -O arch/arm/configs/acme-roadrunner_defconfig

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

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- acme-roadrunner_defconfig

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

	make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
	...
	Image arch/arm/boot/zImage is ready

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

Download our example of device tree source by typing:

	wget https://www.acmesystems.it/www/roadrunner_compile_kernel_5_4/acme-roadrunner.dts -O arch/arm/boot/dts/acme-roadrunner.dts

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

	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- acme-roadrunner.dtb

### 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 -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
	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 (zImage) and the device tree blob (acme-roadrunner.dtb) 
inside the first microSD partition:

	sudo cp arch/arm/boot/dts/acme-roadrunner.dtb /media/$USER/boot
	sudo cp arch/arm/boot/zImage /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

## Files

* Sources:
	* [acme-roadrunner_defconfig](./acme-roadrunner_defconfig)
	* [acme-roadrunner.dts](./acme-roadrunner.dts)
* Binaries:
	* [zImage](./zImage)
	* [acme-roadrunner.dtb](./acme-roadrunner.dtb)

## Links

* [Official Kernel sources on kernel.org (v 5.4.163)](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/?h=v5.4.163)
* [Linux versions changelog](https://kernelnewbies.org/Linux_5.4)

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

